퍼블릭 상수가“나쁜”가요? … 그러나 두 번째는

이거 :

public MyClass
{
    public const string SomeString = "SomeValue";
}

이것보다 더 나쁜 :

public MyClass
{
    public static string SomeString { get{ return "SomeValue";}}
}

둘 다 같은 방식으로 참조 할 수 있습니다.

if (someString == MyClass.SomeString)
     ...

그러나 두 번째는 재산의 보호를받습니다. 그러나 실제로 이것이 const보다 얼마나 낫습니까?

나는 공공 장소의 위험을 여러 번 배웠다. 따라서 공용 필드에서 이러한 상수를 사용하는 코드를 보았을 때 속성으로 리팩토링하는 즉시 설정했습니다. 그러나 중간 쯤에 상수보다 정적 속성을 갖는 것이 어떤 이점이 있는지 궁금해졌습니다.

어떤 아이디어?



답변

C #에서는이 스레드에 언급 된 이유가 전혀 없기 때문에 매우 나쁩니다.

C #의 공개 상수는 참조 어셈블리로 구워집니다. 즉, MyClass의 SomeString을 참조하는 별도의 어셈블리에 SomeOtherClass가있는 경우 SomeOtherClass에 대해 생성 된 CIL에는 하드 코드 된 “SomeValue”문자열이 포함됩니다.

MyClass를 포함하지만 SomeOtherClass는 포함하지 않은 dll을 재배치하고 const를 변경하면 SomeOtherClass는 원래의 값을 포함한다고 생각하는 것을 포함하지 않습니다.

100 % 긍정적이라면 Pi와 같은 보편적 인 상수입니다. 그렇지 않으면 조심스럽게 밟습니다.

더 나은 설명이 있습니다 : https : //.com/questions/55984/what-is-the-difference-between-const-and-readonly


답변

필드를 속성으로 변경하는 것은 중요한 변경입니다. 이진, 소스 및 리플렉션 호환성이 손실됩니다.

게다가:

  • 속성이있는 세분화 된 액세스 제어가 있습니다. 공개적으로 얻을 수 있어야하지만 실제로는 보호 된 액세스로만 설정하기를 원하십니까? 문제 없습니다 (적어도 C # 2부터).
  • 값이 변경 될 때마다 디버거에 침입하고 싶습니까? setter에 중단 점을 추가하십시오.
  • 모든 액세스를 기록 하시겠습니까? getter에 로깅을 추가하십시오.
  • 속성은 데이터 바인딩에 사용됩니다. 필드가 없습니다.

http://csharpindepth.com/articles/chapter8/propertiesmatter.aspx

그러나 API가 더 이상 상수가 아닌 방식으로 변경되지 않는 한 상수가 이에 의해 실제로 어떤 영향을 받는지 알 수 없습니다 (특히 위의 기능이 필요하지 않은 경우).


답변

퍼블릭 필드의 위험은 변경 가능 하고 그 기반 구현 이 변경 될 수 있다는 사실 에 있습니다.

const이것에 관해서 는 일반적으로 문제가 아닙니다 (공개 열거와 유사합니다)- const변경 가능성 이 있다고 생각하지 않고 언젠가 접근 자 주위에 캡슐화가 필요 하다고 생각하지 않는 한 (얼마나 많은 시간이 보 였는지 기록해야 함) 위와 같이 공개적으로 유지할 수도 있습니다 const.


답변

상수는 데이터입니다. 속성은 값을 “보는”만큼 행동 할 가능성을 암시합니다.

데이터가 일정한 번들링 동작 (또는 향후 가능성)은 잘못되었습니다. 대부분의 시스템에서는 실제로 중요하지 않지만 가능합니다.

값이 “PI”이고 시스템 계산에 광범위하게 사용된다고 가정하겠습니다. 속성 뒤에 배치하면 클라이언트 프로그래머가 방어 적으로 프로그래밍해야합니다. 값을 중복 상수에 할당해야합니다. 그들이 속이지 않으면, 다음 버전의 라이브러리는 속성 뒤에 원하지 않는 “동작”이 도입 될 수 있습니다. 속성의 동작 (컴파일 된 라이브러리에있는 경우)은 알려져 있지 않습니다. 테스트에서는 잘 수행되지만 특별한 조건이 충족되면 실행되는 숨겨진 코드가있을 수 있습니다. 이것은 조기 최적화가 아닙니다. 특히 실시간 시스템의 경우 사람들의 삶이 좌우됩니다.

언어가 속성 값을 중복 상수에 할당하도록 허용하지 않을 수 있으므로 클라이언트 프로그래머는 상수의 안전을 잃을 수도 있습니다.

또한 프로그래머가 속성 값을 자신의 상수에 할당하도록 강요하면 속성으로 수행하려는 모든 동작을 효과적으로 무효화합니다.

진정한 상수 데이터는 캡슐화가 필요하지 않습니다.


답변