에 대한 const
및 static 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)
가 선호됩니다 (모두 short
는 object
이지만 모두 object
는 아닙니다 short
). 따라서 y
로 변환되고 short
과부하가 사용됩니다. 그런 다음 동일한 값의 Equals
두 개 short
를 비교 하면 true
.
때 y
상수가 아닌, 어떤 암시 의 변환 int
에는 short
존재하지 않는다. 이는 일반적으로 int
에 맞지 않을 정도로 너무 클 수 있기 때문입니다 short
. ( 명시적인 변환은 존재하지만 나는 말하지 않았 Equals((short)y)
으므로 관련이 없습니다.) 우리는 과부하가 하나만 적용되는 것을 볼 수 Equals(object)
있습니다. 그래서 y
에 박스입니다 object
. 그런 다음 Equals
a System.Int16
와 a 를 비교 System.Int32
하고 런타임 유형이 동의하지 않기 때문에 결과가됩니다 false
.
우리는 일부 (드문) 경우에 const
유형 멤버를 static readonly
필드로 변경 하거나 가능한 경우 다른 방법으로 프로그램의 동작을 변경할 수 있다고 결론을 내립니다 .
답변
참고로 한 가지가있다 CONST (예외가 문자열 인) 원시적 / 값 유형으로 제한됩니다
답변
정적 읽기 전용 : static
런타임시 생성자를 통해 값을 변경할 수 있습니다 . 그러나 멤버 함수를 통해서는 아닙니다.
상수 : 기본적으로 static
. 어디에서나 값을 변경할 수 없습니다 (Ctor, Function, runtime 등).
읽기 전용 : 런타임시 생성자를 통해 값을 변경할 수 있습니다. 그러나 멤버 함수를 통해서는 아닙니다.
내 repo : C # 속성 유형을 살펴볼 수 있습니다 .
답변
readonly
키워드는 다른 const
키워드. const
필드는 필드의 선언에서 초기화 할 수 있습니다. readonly
필드는 선언이나 생성자에 하나 초기화 할 수 있습니다. 따라서 readonly
사용 된 생성자에 따라 필드의 값이 다를 수 있습니다. 또한 const
필드는 컴파일 타임 상수이지만 readonly
런타임 상수에 필드를 사용할 수 있습니다