web-dev-qa-db-fra.com

Déclarer un dictionnaire dans une classe statique

Comment déclarer un objet dictionnaire statique dans une classe statique? j'ai essayé

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

Mais le compilateur se plaint que "n champ const d'un type de référence autre que chaîne ne peut être initialisé qu'avec null".

86
Graviton

Si vous voulez déclarer le dictionnaire une fois et ne jamais le changer, déclarez-le en lecture seule:

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

Si vous souhaitez que les éléments du dictionnaire soient en lecture seule (non seulement la référence, mais également les éléments de la collection), vous devrez créer une classe de dictionnaire en lecture seule mettant en œuvre IDictionary.

Consultez ReadOnlyCollection pour référence.

BTW const ne peut être utilisé que lors de la déclaration de valeurs scalaires en ligne.

206
Yona

La syntaxe correcte (telle que testée dans VS 2008 SP1) est la suivante:

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

Vieille question, mais j'ai trouvé cela utile. En fait, il existe également une classe spécialisée pour un dictionnaire utilisant une chaîne pour la clé et la valeur:

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

Edit: Par le commentaire de Chris ci-dessous, en utilisant Dictionary<string, string> sur StringDictionary est généralement préféré, mais cela dépend de votre situation. Si vous utilisez une base de code plus ancienne, vous pouvez être limité au StringDictionary. Notez également que la ligne suivante:

myDict["foo"]

retournera null si myDict est un StringDictionary, mais une exception sera levée dans le cas de Dictionary<string, string>. Voir le message SO il a mentionné pour plus d'informations, qui est la source de cette modification.

4
areyling

Le problème avec votre exemple initial était principalement dû à l'utilisation de const plutôt que de static; vous ne pouvez pas créer une référence const non-null en C #.

Je crois que cela aurait également fonctionné:

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

En outre, comme le souligne Y Low, ajouter readonly est également une bonne idée, et aucun des modificateurs décrits ici n'empêchera la modification du dictionnaire lui-même.

1
Charlie

Créer un constructeur statique pour ajouter des valeurs dans le dictionnaire

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

OK - donc je travaille dans ASP 2.x (ce n'est pas mon choix ... mais bon, qui est en train de chier?).

Aucun des exemples initialize Dictionary ne fonctionnerait. Puis je suis tombé sur ceci: http://kozmic.pl/archive/2008/03/13/framework-tips-viii-initializing-dictionaries-and-collections.aspx

... ce qui m'a conduit au fait qu'il est impossible d'utiliser l'initialisation des collections dans ASP 2.x.

0
jray

Faites en sorte que le dictionnaire devienne statique et n'y ajoutez jamais rien en dehors du ctor de votre objet statique. Cela semble être une solution plus simple que de jouer avec les règles static/const en C #.

0
Jeff Hubbard