[c#] 정적 읽기 전용 대 const

에 대한 conststatic readonly필드를 읽었습니다 . 상수 값만 포함하는 클래스가 있습니다. 우리 시스템의 다양한 것들에 사용됩니다. 따라서 내 관찰이 올바른지 궁금합니다.

이러한 종류의 상수 값은 항상 static readonly공개 된 모든 것이 어야합니까 ? const내부 / 보호 / 개인 값 에만 사용 합니까?

추천 메뉴가 무엇인가요? static readonly필드를 사용하지 말고 속성을 사용해야합니까?



답변

public static readonly필드는 조금 이례적입니다. public static속성 ( get) 만 더 일반적 일 것입니다 (아마도 private static readonly필드로 지원).

const값은 호출 사이트에 직접 레코딩됩니다. 이것은 양날입니다.

  • 런타임에 값을 가져 오면 쓸모가 없습니다. 아마도 설정에서
  • const 값을 변경하면 모든 클라이언트를 다시 작성해야합니다.
  • 그러나 메소드 호출을 피하기 때문에 더 빠를 수 있습니다 …
  • … 어쨌든 JIT에 의해 때때로 인라인되었을 수 있습니다.

값이 절대로 변하지 않으면 const는 괜찮습니다.-const는 Zero합리적입니다 .p 그 외에는 static속성이 더 일반적입니다.


답변

소비자 가 다른 어셈블리에있는 static readonly경우 사용 합니다 . 데 와 소비자 두 개의 서로 다른 어셈블리 것은 좋은 방법입니다 스스로 발을 쏠 .const


답변

주목할만한 몇 가지 더 관련 사항 :

const int a

  • 초기화해야합니다.
  • 초기화는 컴파일 타임에 있어야합니다 .

읽기 전용 int a

  • 초기화하지 않고 기본값을 사용할 수 있습니다.
  • 런타임에 초기화를 수행 할 수 있습니다 (편집자 : 생성자 내에서만).

답변

이것은 다른 답변에 대한 보충 일뿐입니다. 나는 그것들을 반복하지 않을 것이다 (현재 4 년 후).

a const와 non-const가 다른 의미를 갖는 상황이 있습니다 . 예를 들면 다음과 같습니다.

const int y = 42;

static void Main()
{
  short x = 42;
  Console.WriteLine(x.Equals(y));
}

True반면에 출력 :

static readonly int y = 42;

static void Main()
{
  short x = 42;
  Console.WriteLine(x.Equals(y));
}

씁니다 False.

그 이유는 메소드 x.Equals에 두 개의 과부하가 있기 때문입니다 . 하나는 short( System.Int16)를 사용하고 다른 하나는 object( System.Object)를 사용합니다. 이제 문제는 하나 또는 둘 다 내 y주장에 적용되는지 여부 입니다.

경우 y(리터) 컴파일 시간 상수는 상기 const케이스는, 거기 암시 적 변환이 존재하는 것이 중요해진다 로부터 int short (가)가 제공 int정수이며, 단, 그 값이 범위 내에 있는지 C # 컴파일러를 확인한다 short( 이는 42임). C # 언어 사양의 암시 적 상수 식 변환 을 참조하십시오 . 따라서 두 가지 과부하를 모두 고려해야합니다. 과부하 Equals(short)가 선호됩니다 (모두 shortobject이지만 모두 object는 아닙니다 short). 따라서 y로 변환되고 short과부하가 사용됩니다. 그런 다음 동일한 값의 Equals두 개 short를 비교 하면 true.

y상수가 아닌, 어떤 암시 의 변환 int에는 short존재하지 않는다. 이는 일반적으로 int에 맞지 않을 정도로 너무 클 수 있기 때문입니다 short. ( 명시적인 변환은 존재하지만 나는 말하지 않았 Equals((short)y)으므로 관련이 없습니다.) 우리는 과부하가 하나만 적용되는 것을 볼 수 Equals(object)있습니다. 그래서 y에 박스입니다 object. 그런 다음 Equalsa System.Int16와 a 를 비교 System.Int32하고 런타임 유형이 동의하지 않기 때문에 결과가됩니다 false.

우리는 일부 (드문) 경우에 const유형 멤버를 static readonly필드로 변경 하거나 가능한 경우 다른 방법으로 프로그램의 동작을 변경할 수 있다고 결론을 내립니다 .


답변

참고로 한 가지가있다 CONST (예외가 문자열 인) 원시적 / 값 유형으로 제한됩니다


답변

정적 읽기 전용 : static런타임시 생성자를 통해 값을 변경할 수 있습니다 . 그러나 멤버 함수를 통해서는 아닙니다.

상수 : 기본적으로 static. 어디에서나 값을 변경할 수 없습니다 (Ctor, Function, runtime 등).

읽기 전용 : 런타임시 생성자를 통해 값을 변경할 수 있습니다. 그러나 멤버 함수를 통해서는 아닙니다.

내 repo : C # 속성 유형을 살펴볼 수 있습니다 .


답변

readonly키워드는 다른 const키워드. const필드는 필드의 선언에서 초기화 할 수 있습니다. readonly필드는 선언이나 생성자에 하나 초기화 할 수 있습니다. 따라서 readonly사용 된 생성자에 따라 필드의 값이 다를 수 있습니다. 또한 const필드는 컴파일 타임 상수이지만 readonly런타임 상수에 필드를 사용할 수 있습니다

여기서 짧고 명확한 MSDN 참조