[C#] C #에서 const와 readonly의 차이점은 무엇입니까?

C # const과 의 차이점은 무엇입니까 readonly?

언제 다른 것을 사용 하시겠습니까?



답변

명백한 차이를 제외하고

  • constVS readonly값을 정의 할 때 값을 선언 해야하는 것은 동적으로 계산 될 수 있지만 생성자가 종료되기 전에 할당되어야합니다.
  • ‘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는 ‘ AssemblyBIL에 ‘구워집니다 ‘ . 이는 내일이면 I_CONST_VALUE향후 20으로 업데이트 될 것임을 의미합니다 .AssemblyB내가 다시 컴파일 할 때까지 여전히 2가있을 것 입니다.
  • readonly값 의 경우 ref메모리 위치 와 같습니다 . 이 값은 AssemblyBIL에 구워지지 않습니다 . 즉, 메모리 위치가 업데이트 AssemblyB되면 재 컴파일하지 않고 새 값을 가져옵니다. 따라서 I_RO_VALUE30으로 업데이트 되면 빌드 만하면 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
    }
}