정적 클래스 내에서 사전 선언


90

정적 클래스 내에서 정적 사전 객체를 선언하는 방법은 무엇입니까? 나는 시도했다

public static class ErrorCode
{
    public const IDictionary<string, string> ErrorCodeDic = new Dictionary<string, string>()
    {
        { "1", "User name or password problem" }     
    };
}

그러나 컴파일러는 " 문자열이 아닌 참조 유형의 const 필드는 null로만 초기화 될 수 있습니다 "라고 불평합니다 .


1
사전 유형에는 const를 사용할 수 없으며 스칼라 값에만 사용할 수 있습니다. (내 대답 확인) msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx
Yona

답변:


214

사전을 한 번 선언하고 변경하지 않으려면 읽기 전용으로 선언하십시오.

private static readonly Dictionary<string, string> ErrorCodes
    = new Dictionary<string, string>
{
    { "1", "Error One" },
    { "2", "Error Two" }
};

딕셔너리 항목이 읽기 전용이되도록하려면 (참조뿐만 아니라 컬렉션의 항목도) IDictionary를 구현하는 읽기 전용 딕셔너리 클래스를 만들어야합니다.

참조를 위해 ReadOnlyCollection을 확인하십시오.

BTW const는 스칼라 값을 인라인으로 선언 할 때만 사용할 수 있습니다.


클래스 수준 개인 정적 변수 개인 정적 Dictionary <string, string> ErrorCodes를 사용하고 각 함수에서 루프에서 사용될 때 캐시 값에 if (ErrorCodes == null) {fill dictionary}를 확인하는 것은 어떻습니까?
LifeOfPi

1
사전을 변경하지 않으려면 사전을 ReadOnlyDictionary. 더 효율적이지만 덜 안전한 옵션은 IReadOnlyDictionary유형 에 할당하는 것 입니다.
Ramon de Klein

8

올바른 구문 (VS 2008 SP1에서 테스트 됨)은 다음과 같습니다.

public static class ErrorCode
{
    public static IDictionary<string, string> ErrorCodeDic;
     static ErrorCode()
    {
        ErrorCodeDic = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
    }
}

그러나 이것이 소비 클래스가 콘텐츠를 수정하는 것을 막지는 않습니다.
Everts

4

오래된 질문이지만 유용하다는 것을 알았습니다. 결과적으로 키와 값 모두에 문자열을 사용하는 사전에 대한 특수 클래스도 있습니다.

private static readonly StringDictionary SegmentSyntaxErrorCodes = new StringDictionary
{
    { "1", "Unrecognized segment ID" },
    { "2", "Unexpected segment" }
};

편집 : 아래 Chris의 의견에 따라 Dictionary<string, string>over를 사용 하는 StringDictionary것이 일반적으로 선호되지만 상황에 따라 다릅니다. 이전 코드 기반을 다루는 경우 StringDictionary. 또한 다음 행에 유의하십시오.

myDict["foo"]

경우는 null을 반환합니다 myDictA는 StringDictionary하지만, 예외가 경우에 발생합니다 Dictionary<string, string>. 자세한 내용은 그가 언급 한 SO 게시물을 참조하십시오 .



그것이 바로 제가 연결 한 질문입니다.
Chris Morgan

1
Ha wow, 인식조차하지 못했습니다. 우연히 같은 것을 찾았습니다. 댓글을 수정할 수 없어서 게시물을 수정하여 한곳에 요약했습니다. 감사!
areyling dec.

1

초기 예제의 문제는 주로 const보다는 static; C #에서는 null이 아닌 const 참조를 만들 수 없습니다.

나는 이것이 또한 효과가 있었을 것이라고 믿는다.

public static class ErrorCode
{
    public static IDictionary<string, string> ErrorCodeDic
        = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
}

또한 Y Low가 지적했듯이 추가 readonly하는 것도 좋은 생각이며 여기에 설명 된 수정 자 중 어느 것도 사전 자체가 수정되는 것을 막을 수 없습니다.


1

사전에 값을 추가하는 정적 생성자를 만듭니다.

enum Commands
{
    StudentDetail
}
public static class Quires
{
    public static Dictionary<Commands, String> quire
        = new Dictionary<Commands, String>();
    static Quires()
    {
        quire.add(Commands.StudentDetail,@"SELECT * FROM student_b");
    }
}

1
quire 또는 query?
Ash

0

정적 / 클래스 생성자를 사용하여 사전을 초기화 할 수 있습니다.

public static class ErrorCode
{
    public const IDictionary<string, string> ErrorCodeDic;
    public static ErrorCode()
    {
        ErrorCodeDic = new Dictionary<string, string>()
            { {"1", "User name or password problem"} };
    }
}

1
사전을 정적으로 만들려고 했습니까? const를 가질 수 없습니다. 오류 메시지에서 알 수 있듯이 값 유형, 문자열 또는 null 만 const
Orion Edwards

0

사전을 정적으로 만들고 정적 개체의 액터 외부에 추가하지 마십시오. C #에서 정적 / 상수 규칙을 조작하는 것보다 더 간단한 솔루션 인 것 같습니다.



-2
public static class ErrorCode
{
    public const IDictionary<string , string > m_ErrorCodeDic;

    public static ErrorCode()
    {
      m_ErrorCodeDic = new Dictionary<string, string>()
             { {"1","User name or password problem"} };             
    }
}

아마도 생성자에서 초기화하십시오.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.