117 votes

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 " Un champ const d'un type de référence autre que string ne peut être initialisé qu'avec null ".

1 votes

Vous ne pouvez pas utiliser const avec le type Dictionnaire, mais uniquement avec des valeurs scalaires. (voir ma réponse) msdn.microsoft.com/en-us/library/e6w8fe1b(VS.71).aspx

267voto

Yona Points 5205

Si vous souhaitez déclarer le dictionnaire une seule fois et ne jamais le modifier, 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 aussi les éléments de la collection), vous devez créer une classe de dictionnaire en lecture seule qui implémente IDictionary.

Consultez ReadOnlyCollection à titre de référence.

BTW const ne peut être utilisé que pour déclarer des valeurs scalaires en ligne.

0 votes

Pourquoi ne pas avoir une variable statique privée au niveau de la classe (private static variable private static Dictionary<string, string> ErrorCodes) et ensuite dans la fonction respective vérifier si (ErrorCodes == null) { remplir le dictionnaire} pour mettre en cache la valeur lorsqu'il est utilisé dans la boucle ?

1 votes

Si vous ne voulez pas que le dictionnaire soit modifié, vous pouvez l'intégrer dans un fichier ReadOnlyDictionary . Une option plus efficace (mais moins sûre) consiste à l'assigner à un IReadOnlyDictionary type.

8voto

Graviton Points 28358

La syntaxe correcte (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"} };
    }
}

1 votes

Mais cela n'empêche pas une classe consommatrice de modifier le contenu.

5voto

areyling Points 893

Vieille question, mais j'ai trouvé cela utile. Il s'avère qu'il existe également une classe spécialisée pour un dictionnaire utilisant une chaîne de caractères à la fois pour la clé et la valeur :

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

Edita: Selon le commentaire de Chris ci-dessous, l'utilisation de Dictionary<string, string> plus StringDictionary est généralement préférable, mais cela dépend de votre situation. Si vous avez affaire à une base de code plus ancienne, vous pouvez être limité à l'option StringDictionary . Notez également que la ligne suivante :

myDict["foo"]

renverra null si myDict es un StringDictionary mais une exception sera levée en cas de Dictionary<string, string> . Voir le SO post qu'il a mentionné pour plus d'informations, qui est la source de cet éditorial.

0 votes

C'est exactement la question à laquelle j'ai fait référence.

1 votes

Ha wow, je ne l'avais même pas remarqué, je suis tombé sur le même. Je n'ai pas pu éditer le commentaire, alors j'ai juste édité le post pour résumer en un seul endroit. Je vous remercie !

1voto

Charlie Points 17807

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

Je pense 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, l'ajout de readonly est également une bonne idée, et aucun des modificateurs discutés ici n'empêchera le dictionnaire lui-même d'être modifié.

1voto

Jeff Hubbard Points 5292

Faites du dictionnaire un objet 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 statiques/const en C#.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X