it-swarm.com.de

Deklarieren Sie ein Dictionary in einer statischen Klasse

Wie deklariere ich ein statisches Dictionary-Objekt in einer statischen Klasse? Ich habe es versucht

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

Der Compiler beschwert sich jedoch über "Ein const-Feld eines anderen Referenztyps als string kann nur mit null initialisiert werden".

86
Graviton

Wenn Sie das Wörterbuch einmal deklarieren und niemals ändern möchten, deklarieren Sie es als schreibgeschützt:

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

Wenn Sie möchten, dass Wörterbuchelemente schreibgeschützt sind (nicht nur die Referenz, sondern auch die Elemente in der Auflistung), müssen Sie eine schreibgeschützte Wörterbuchklasse erstellen, die IDictionary implementiert.

Lesen Sie ReadOnlyCollection als Referenz.

BTW const kann nur verwendet werden, wenn skalare Werte inline deklariert werden.

206
Yona

Die korrekte Syntax (wie in VS 2008 SP1 getestet) lautet wie folgt:

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

Alte Frage, aber ich fand das nützlich. Es stellt sich heraus, dass es auch eine spezielle Klasse für ein Wörterbuch gibt, die eine Zeichenfolge sowohl für den Schlüssel als auch für den Wert verwendet:

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

Bearbeiten: Laut Chris 'Kommentar wird die Verwendung von Dictionary<string, string> Gegenüber StringDictionary im Allgemeinen bevorzugt, hängt jedoch von Ihrer Situation ab. Wenn Sie mit einer älteren Codebasis arbeiten, sind Sie möglicherweise auf StringDictionary beschränkt. Beachten Sie auch, dass die folgende Zeile:

myDict["foo"]

gibt null zurück, wenn myDict ein StringDictionary ist, aber bei Dictionary<string, string> wird eine Ausnahme ausgelöst. Weitere Informationen finden Sie im SO-Beitrag, den er erwähnt hat . Dies ist die Quelle dieser Bearbeitung.

4
areyling

Das Problem mit Ihrem ersten Beispiel war hauptsächlich auf die Verwendung von const anstelle von static zurückzuführen. Sie können in C # keine Nicht-Null-Konstantenreferenz erstellen.

Ich glaube das hätte auch geklappt:

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

Wie Y Low hervorhebt, ist das Hinzufügen von readonly ebenfalls eine gute Idee, und keiner der hier diskutierten Modifikatoren verhindert, dass das Wörterbuch selbst geändert wird.

1
Charlie

Erstellen Sie einen statischen Konstruktor, um Werte im Dictionary hinzuzufügen

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 - also arbeite ich in ASP 2.x (nicht meine Wahl ... aber hey, wer meckert?).

Keines der Beispiele zum Initialisieren des Wörterbuchs würde funktionieren. Dann bin ich auf Folgendes gestoßen: http://kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing-dictionaries-and-collections.aspx

... was mich auf die Tatsache brachte, dass man die Kollektionsinitialisierung in ASP 2.x nicht verwenden kann.

0
jray

Machen Sie das Wörterbuch statisch und fügen Sie es niemals außerhalb des Ctors Ihres statischen Objekts hinzu. Das scheint eine einfachere Lösung zu sein, als mit den statischen/const-Regeln in C # herumzuspielen.

0
Jeff Hubbard