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


90

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

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

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


1
constをDictionaryタイプでは使用できません。スカラー値でのみ使用できます。(私の答えを確認してください
Yona

回答:


214

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

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

アイテムを読み取り専用にするには(参照だけでなく、コレクション内のアイテムも)、IDictionaryを実装する読み取り専用辞書クラスを作成する必要があります。

参照のためにReadOnlyCollectionをチェックしてください。

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


クラスレベルのプライベートスタティック変数プライベートスタティックディクショナリ<string、string> ErrorCodesを用意し、それぞれの関数でif(ErrorCodes == null){辞書に入力}をチェックして、ループで使用するときに値をキャッシュしますか?
LifeOfPi 2017

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

しかし、これはコンテンツを変更する消費クラスを妨げません。
エバーツ

4

古い質問ですが、これは役に立ちました。結局のところ、キーと値の両方に文字列を使用するDictionary専用のクラスもあります。

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

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

myDict["foo"]

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



それはまさに私がリンクした質問です。
Chris Morgan

1
ええと、それも聞き取れませんでした。たまたま同じものを見つけました。コメントを編集できなかったので、投稿を編集して1か所にまとめました。ありがとう!
2012

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
照会または照会?
Ash

0

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



-1

static / classコンストラクタを使用して、辞書を初期化できます。

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にすることはできません。エラーメッセージに示されているように、constにできるのは値の型、文字列、またはnullのみです
Orion Edwards

-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.