2013-10-30 2 views
15

새로운 프로젝트를 진행하고 있으며 확실하지 않은 코드를 발견했습니다. 질문을하기 위해 사용하고있는 이름과 가치는 가짜입니다.문자열 상수 클래스가 정적이어야합니까?

내 논리를 들어
public class MyConsts //Should it be static? 
{ 
    public const string MyConst1 = "a"; 
    public const string MyConst2 = "b"; 
    public const string MyConst3 = "c"; 
    public const string MyConst4 = "d"; 
    .... 
} 

(즉에만 consts 값을 포함)이 클래스의 정적이어야한다, 그래서 옵션이 초기화하지 않으려면 아무 의미가없는, 내가 수정입니까?

EDIT : 문자열과 const의 순서를 혼동하므로 코드 블라인드를 쓰고 있습니다. 문제의 대상이 아니기 때문에 이것을 수정했습니다.

+1

클래스가 전혀 존재하지 않아야합니다. 대신 리소스를 사용하려고합니다. –

+3

@JoelCoehoorn이 정확한 접근 방식이 적합하고 리소스가 최상의 이점을 제공하지 못하는 경우를 많이 보았습니다. 나는. 'HtmlTags.Div = "div"'는 상수 컬렉션처럼 완벽하지만 리소스에 넣을 경우 현지화를 피하기 위해 특별한주의가 필요합니다. –

+2

@JoelCoehoorn - 아니요, 그는 자원에서 상수를 읽고 IOC 컨테이너를 사용하여 상수를 주입하는'ConstantsFactory'에 의해 상속받은'IAbstractFactory'를 가져야합니다. – Davor

답변

32

예, 정적 인 것은 당연합니다. 즉 등, 당신의 의도을 의미에도 해당 유형의 변수를 선언에서 클라이언트를 방지

당신은 전에 const 수정 이동 비록 일부를 입력해야합니다 :

public const string MyConst1 = "a"; 
... 

경우] 값이 변경 될 수 있지만 const 대신 public static readonly 필드를 사용하는 것이 좋습니다. 그렇지 않으면 값이 변경되면 클라이언트 코드를 다시 작성해야한다는 의미에서 상수를 참조하는 코드로 값이 구워집니다.

는 (또 다른 옵션은 상수를 만들기 위해 internal 대신 public이다.) 값을 변경하지 않을 경우

+1

고맙습니다. 정적 변경은 메모리 또는 성능에 영향을 미칩니 까? (정적 클래스가 호출 될 때가 아니라 어플리케이션의 시작 부분에서 정적 클래스가 컴파일된다는 것을 알고 있기 때문에) –

+2

@MishaZaslavsky : 아니요. 정적 클래스의 차이에 대한 "지식"은 내가 아는 한 사실이 아닙니다. –

+0

정적 클래스는 다른 모든 것들이 컴파일 될 때 컴파일되며 처음 액세스 할 때 초기화됩니다. – Brad

2

예, 그것은 정적이어야한다. 말했듯이 클라이언트 코드가 인스턴스를 생성하도록 허용하는 것은 의미가 없습니다.

1

const 만 포함되어 있고 다른 것을 포함하지 않으면 인스턴스화를 막고 막히는 것을 방지하기 위해 정적 클래스로 만드는 것이 좋습니다.

5

예 클래스는 static이어야합니다. 그러나 그 값들은 실제로 const일까요?

const으로 선언 된 항목은 참조하는 어셈블리로 컴파일되므로이 클래스 라이브러리 인 경우 해당 const 값을 변경 한 새 버전을 배치하면 해당 어셈블리에서 선택되지 않습니다. 그들을 참조하십시오.

그 특별한 경우에는 public static readonly string이 적합합니다.

그러나 특정 어셈블리 (예 : 콘솔 응용 프로그램 또는 WinForms 응용 프로그램)에서만 볼 수있는 경우 해당 클래스 internal을 선언하고 const을 그대로 유지해야합니다.

0

정말, 여러분에게 달려 있습니다. 정적은 순전히 유틸리티 클래스에 유용합니다.

정적 클래스는 봉인됩니다. 그것은에서 상속받을 수 없습니다.