C#에서 `const``와 `readonly``의 차이점은 무엇인가요?
어떤 경우에 둘 중 하나를 사용하나요?
별도로 차이를 보이는
미묘한 차이가 있다. '클래스' 에 정의된 고려해보십시오 아서 블라이아.
public class Const_V_Readonly
{
public const int I_CONST_VALUE = 2;
public readonly int I_RO_VALUE;
public Const_V_Readonly()
{
I_RO_VALUE = 3;
}
}
'코드' 와 '참조입니다 아서 블라이아 아서 블라이브' 이 값을 사용한다. 이거 끝나면 컴파일됨,
그래서 상수 값을 변경할 경우 won& 사용할 수 있다고 확신합니다. # 39, t '상수'.
public const int CM_IN_A_METER = 100;
그러나 일정한 경우 (예를 들면 w.r.t. 변경할 수 있는 precision). 의심스러우면 readonlyfrom '또는' 사용합니다.
public readonly float PI = 3.14;
[1]: http://www.amazon.com/effective-specific-improve-software-development/dp/ 0321245660
그냥 참조할 수 없는 값을 readonlyfrom 추가, readonlyfrom 추상형데이터타입 디렉토리에만 참조. 예를 들면 다음과 같습니다.
public class Const_V_Readonly
{
public const int I_CONST_VALUE = 2;
public readonly char[] I_RO_VALUE = new Char[]{'a', 'b', 'c'};
public UpdateReadonly()
{
I_RO_VALUE[0] = 'V'; //perfectly legal and will update the value
I_RO_VALUE = new char[]{'V'}; //will cause compiler error
}
}
여기에 설명이 있습니다. 요약: const는 선언 시 초기화해야 하며, 읽기 전용은 생성자에서 초기화할 수 있습니다(따라서 사용된 생성자에 따라 다른 값을 가질 수 있습니다).
편집: 미묘한 차이점에 대해서는 위의 기슈의 해답을 참고하세요.
작은 readonlyfrom 함께 있다는 것이 장점. 여러 번 내의 구성자를 (s) 는 readonlyfrom 필드를 설정할 수 있습니다. 두 개의 다른 값을 설정한 체인된 구성자를 경우에도 그대로 사용할 수 있습니다.
< pre> < code>;;; public class 샘플링합니다 { 개인 readonlyfrom 구체화하십시오 전달된다.
public Sample() {
ro = "set";
}
public Sample(string value) : this() {
ro = value; // this works even though it was set in the no-arg ctor
}
} < /code> < /pre>;;;
컴파일 타임에 정의되는 상수 멤버 언제든지 변경할 수 없는 런타임용으로 개발하십시오. '상수' 키워드를 사용하여 상수입니다 선언하는 필드로 초기화되어야 하며 이 둘은 선언했다.
public class MyClass
{
public const double PI1 = 3.14159;
}
'A' 와 같은 구성 요소가 있다는 점에서 일정한 값을 readonlyfrom 변하지 않는 나타냅니다. 이 차이점은 '수' 의 멤버 readonlyfrom 초기화되어야 런타임에 구성자를 초기화되어야 수 없게 되는 것은 물론 이들이 선언했다.
public class MyClass1
{
public readonly double PI2 = 3.14159;
//or
public readonly double PI3;
public MyClass2()
{
PI3 = 3.14159;
}
}
# 39 의 Here& 다른 링크 # 39, const isn& 방법을 설명하기 위해, 또는 관련 t 버전 안전하다구요 참조 유형을.
또 다른 잡았다. 의해, devious" " readonlyfrom 값을 변경할 수 있습니다. 코드를 통해 반사.
var fi = this.GetType()
.BaseType
.GetField("_someField",
BindingFlags.Instance | BindingFlags.NonPublic);
fi.SetValue(this, 1);
[내가 받을 전용 readonlyfrom 상속됨 필드를 사용하여 C # 로 반사?] [1] [1]: # 1401499 https://stackoverflow.com/questions/1401458/can-i-change-a-private-readonly-inherited-field-in-c-using-reflection/1401499
팀 멤버 중 한 때 const 정적 및 사용할 수 있는 우리 사무실 제공한 다음 안내지침 readonlyfrom:
한 최종 참고: 하지만 보색으로 const 정적 필드를 한 것은 사실이 아니다.
그러나 이들은 모두 상수입니다 컴파일 타임에 const 사용할 수 있다. 즉, 한 측면을 차이는 없지만 const com/go/4e6b330a_kr 입력으로 사용할 수 있는 속성 구성자를 readonlyfrom com/go/4e6b330a_kr.
예:
public static class Text {
public const string ConstDescription = "This can be used.";
public readonly static string ReadonlyDescription = "Cannot be used.";
}
public class Foo
{
[Description(Text.ConstDescription)]
public int BarThatBuilds {
{ get; set; }
}
[Description(Text.ReadOnlyDescription)]
public int BarThatDoesNotBuild {
{ get; set; }
}
}
또한, const 정적 변수가 특정 인스턴스 변수는 readonlyfrom 본질적으로 반면, 필요한 경우.
C # .Net 에서 const 와 readonlyfrom 필드용 아니오표 차이가 있습니다.
기본적으로 활성화됨 const 정적 및 상수 값을 함께 할 수 없는 초기화되어야, 나중에 수정할 수 있습니다. 너무 구성자를 에서 변경된 값을 사용할 수 없습니다. 이 모든 데이터 형식 함께 사용할 수 없습니다. Ex - 대한 DateTime. Datatype DateTime 함께 사용할 수 없습니다.
public const DateTime dt = DateTime.Today; //throws compilation error
public const string Name = string.Empty; //throws compilation error
public readonly string Name = string.Empty; //No error, legal
정적 수 있지만, readonlyfrom 로 선언할 필요가 없습니다. 당시 선언 초기화하지 필요가 없습니다. 또는 그 값을 사용하여 변경할 구성자를 지정할 수 있습니다. 그래서 사용될 때, 이를 통해 장점을 인스턴스입니다 클래스 멤버. 두 개의 다른 값을 readonlyfrom 필드이므로 인스턴스 다를 수 있습니다. Emailxtender 대해 -
class A
{
public readonly int Id;
public A(int i)
{
Id = i;
}
}
그 후 즉시 초기화 될 수 있는 특정 값을 다음과 같이 readonlyfrom 필드
A objOne = new A(5);
A objTwo = new A(10);
여기서 10 개의 값을 가질 오브존 인스턴스입니다 readonlyfrom 필드 등 5 개 및 오비에트보. 이는 const 사용할 수 없습니다.
,, 다른 < I> gotcha< /I> .< P>. Const 데이터 유형, 이후 정말 국한됨 수행됨 작업하려는 경우 기본 클래스, forced" " 느낄 수 있습니다. readonlyfrom 사용할 수 있습니다. 그러나 이 트랩할 두려워! Readonlyfrom 있다는 의미입니다 다른 객체와 객체 바꿀 수 없습니다 (rec.601 can& # 39, t make it 다른 객체 참조). 하지만 어떤 프로세스가 객체에 대한 참조가 자유롭게 사용할 수 있는 값을 수정하십시오 <;;;;;;; /B> < /I> inside< I> < B> 객체에는! < P>; 그래서 don& # 39, t, t change can& # 39 로 사용자가 readonlyfrom 혼동할 생각을 한다는 것. C # 의 간단한 문법을 막을 수 없는 한 클래스의 인스턴스 (내린 것으로 알고) 은 내부 값을 변경할 필요가 없습니다.
지금 우리가 해야 할 때 const 필드 값을 제공하십시오 정의된다. 이 상수의 값은 컴파일러 어졌다면 절약합니다 국회 메타데이터입니다. 즉, 다시 같은 유형 및 챨 부울을 대해서만 상수입니다 정의할 수 있습니다, 바이트입니다 드릴링됩니다. 항상 고정 멤버가 아닌 것으로 상수입니다 인스턴스입니다 멤버.
Readonlyfrom 필드용 런타임에 해결 가능하다. 즉, 우리는 값을 사용하여 정의할 수 있는 값을 유형에 대한 구성자를 필드는 선언했다. 완료되어도 검증을 통해 그 이외의 어떠한 방법으로든 구성자를 readonlyfrom 필드용 컴파일러와의 기록되지 않습니다.
모두 대한 자세한 내용은 여기 이 글에서 "고