web-dev-qa-db-ja.com

静的クラス内で辞書を宣言する

静的クラス内で静的辞書オブジェクトを宣言する方法は?私は試した

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

しかし、コンパイラは「文字列以外の参照型のconstフィールドはnullでのみ初期化できる」と文句を言います。

86
Graviton

辞書を一度宣言し、決して変更しない場合は、読み取り専用として宣言します。

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

辞書項目を読み取り専用にしたい場合(参照だけでなく、コレクション内の項目も)、IDictionaryを実装する読み取り専用辞書クラスを作成する必要があります。

参照用にReadOnlyCollectionを確認してください。

BTW constは、インラインでスカラー値を宣言する場合にのみ使用できます。

206
Yona

正しい構文(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"} };
    }
}
8
Graviton

古い質問ですが、これは便利だと思いました。キーと値の両方に文字列を使用するディクショナリ専用のクラスもあります:

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

編集:以下のChrisのコメントによると、Dictionary<string, string>StringDictionaryよりも使用することが一般的に好まれますが、状況によって異なります。古いコードベースを扱っている場合、StringDictionaryに制限される可能性があります。また、次の行に注意してください。

myDict["foo"]

myDictStringDictionaryの場合はnullを返しますが、Dictionary<string, string>の場合は例外がスローされます。詳細については、この編集のソースである SOが言及したSOポスト を参照してください。

4
areyling

最初の例の問題は、主に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
Charlie

辞書に値を追加する静的コンストラクターを作成します

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

OK-だから私はASP 2.x(私の選択ではありません...しかし、ちょっとうんざりしているのは誰ですか?)で働いています。

辞書の初期化の例はどれも機能しません。その後、私はこれに遭遇しました: http://kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing-dictionaries-and-collections.aspx

... ASP 2.x.でコレクションの初期化を使用できないという事実に私を悩ませました。

0
jray

辞書を静的にし、静的オブジェクトのctorの外部に決して追加しないでください。これは、C#のstatic/constルールをいじるよりも簡単な解決策のようです。

0
Jeff Hubbard