developer tip

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

copycodes 2020. 9. 13. 10:51
반응형

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


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

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

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


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

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

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

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

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


올바른 구문 (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"} };
    }
}

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

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 게시물을 참조하십시오 .


초기 예에 대한 문제는의 사용에 주로 기인 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하는 것도 좋은 생각이며 여기에 설명 된 수정 자 중 어느 것도 사전 자체가 수정되는 것을 막을 수 없습니다.


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

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");
    }
}

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


좋아-그래서 나는 ASP 2.x에서 일하고 있습니다 (내 선택이 아닙니다 ...하지만 헤이 누가 괴롭습니까?).

초기화 사전 예제는 작동하지 않습니다. 그런 다음 이것을 발견했습니다 : http://kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing-dictionaries-and-collections.aspx

... ASP 2.x에서 컬렉션 초기화를 사용할 수 없다는 사실을 알게되었습니다.


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

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

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"} };             
    }
}

Probably initialise in the constructor.

참고URL : https://stackoverflow.com/questions/313324/declare-a-dictionary-inside-a-static-class

반응형