C # const
과 의 차이점은 무엇입니까 readonly
?
언제 다른 것을 사용 하시겠습니까?
답변
명백한 차이를 제외하고
const
VSreadonly
값을 정의 할 때 값을 선언 해야하는 것은 동적으로 계산 될 수 있지만 생성자가 종료되기 전에 할당되어야합니다.- ‘const ‘s는 암시 적으로
static
있습니다.ClassName.ConstantName
표기법을 사용 하여 액세스합니다.
미묘한 차이가 있습니다. 에 정의 된 클래스를 고려하십시오AssemblyA
.
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;
}
}
AssemblyB
참조 AssemblyA
코드에서 이러한 값을 하고 사용합니다. 이것이 컴파일되면
const
값 의 경우 찾기 대치와 같으며 값 2는 ‘AssemblyB
IL에 ‘구워집니다 ‘ . 이는 내일이면I_CONST_VALUE
향후 20으로 업데이트 될 것임을 의미합니다 .AssemblyB
내가 다시 컴파일 할 때까지 여전히 2가있을 것 입니다.readonly
값 의 경우ref
메모리 위치 와 같습니다 . 이 값은AssemblyB
IL에 구워지지 않습니다 . 즉, 메모리 위치가 업데이트AssemblyB
되면 재 컴파일하지 않고 새 값을 가져옵니다. 따라서I_RO_VALUE
30으로 업데이트 되면 빌드 만하면AssemblyA
됩니다. 모든 클라이언트를 다시 컴파일 할 필요는 없습니다.
따라서 상수 값이 변경되지 않을 것이라고 확신한다면 const
.
public const int CM_IN_A_METER = 100;
그러나 변경 될 수있는 상수 (예 : 정밀도)가 있거나 의심스러운 경우을 사용하십시오 readonly
.
public readonly float PI = 3.14;
업데이트 : Aku는 먼저 이것을 지적한 coz를 언급해야합니다. 또한 이것을 배운 곳에 꽂아야합니다. 효과적인 C #-Bill Wagner
답변
const가있는 문제가 있습니다! 다른 어셈블리에서 상수를 참조하면 해당 값이 호출 어셈블리로 바로 컴파일됩니다. 이렇게하면 참조 된 어셈블리에서 상수를 업데이트 할 때 호출 어셈블리에서 변경되지 않습니다!
답변
상수
- 상수는 기본적으로 정적입니다
- 컴파일 타임에 값을 가져야합니다 (예 : 3.14 * 2를 가질 수 있지만 메소드를 호출 할 수는 없습니다)
- 함수 내에서 선언 가능
- 그것들을 사용하는 모든 어셈블리에 복사됩니다 (모든 어셈블리는 로컬 값의 사본을 얻습니다)
- 속성에서 사용 가능
읽기 전용 인스턴스 필드
- 생성자가 종료 될 때까지 값을 설정해야합니다.
- 인스턴스 생성시 평가
정적 읽기 전용 필드
- 코드 실행이 클래스 참조에 도달 할 때 평가됩니다 (새 인스턴스가 작성되거나 정적 메소드가 실행될 때)
- 정적 생성자가 완료 될 때까지 평가 된 값이 있어야합니다
- 이것들에 ThreadStaticAttribute를 넣지 않는 것이 좋습니다 (정적 생성자는 하나의 스레드에서만 실행되며 스레드의 값을 설정합니다. 다른 모든 스레드는이 값을 초기화하지 않습니다)
답변
추가하기 위해 참조 유형의 ReadOnly는 값이 아닌 참조 만 읽기 전용으로 만듭니다. 예를 들면 다음과 같습니다.
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는 선언시 초기화되어야하며 읽기 전용은 생성자에서 초기화 될 수 있으므로 사용 된 생성자에 따라 다른 값을 가질 수 있습니다.
편집 : 미묘한 차이점은 위의 Gishu의 gotcha를 참조하십시오.
답변
const
: 어디서나 변경할 수 없습니다.
readonly
:이 값은 생성자에서만 변경할 수 있습니다. 일반 기능에서는 변경할 수 없습니다.
답변
읽기 전용의 작은 문제가 있습니다. 생성자 내에서 읽기 전용 필드를 여러 번 설정할 수 있습니다. 값이 두 개의 서로 다른 체인 생성자에 설정되어 있어도 여전히 허용됩니다.
public class Sample {
private readonly string ro;
public Sample() {
ro = "set";
}
public Sample(string value) : this() {
ro = value; // this works even though it was set in the no-arg ctor
}
}
