Déclarez un dictionnaire dans une classe statique

Comment déclarer un object de dictionnaire statique dans une classe statique? j’ai essayé

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

Mais le compilateur se plaint que ” Un champ const d’un type de référence autre que ssortingng ne peut être initialisé qu’avec null “.

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

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

Si vous voulez que les éléments du dictionnaire soient en lecture seule (pas seulement la référence mais aussi les éléments de la collection), vous devrez créer une classe de dictionnaire en lecture seule qui implémente IDictionary.

Découvrez ReadOnlyCollection pour référence.

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

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

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

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

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

Edit: Selon le commentaire de Chris ci-dessous, l’utilisation de Dictionary sur SsortingngDictionary est généralement préférée, mais dépendra de votre situation. Si vous avez affaire à une ancienne base de code, vous pourriez être limité au SsortingngDictionary . Notez également que la ligne suivante:

 myDict["foo"] 

renverra null si myDict est un SsortingngDictionary , mais une exception sera levée dans le cas de Dictionary . Voir le message SO qu’il a mentionné pour plus d’informations, qui est la source de cette édition.

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

Je crois que cela aurait aussi fonctionné:

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

De même, comme le souligne Y Low, append readonly est également une bonne idée, et aucun des modificateurs présentés ici n’empêchera la modification du dictionnaire lui-même.

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

 enum Commands { StudentDetail } public static class Quires { public static Dictionary quire = new Dictionary(); static Quires() { quire.add(Commands.StudentDetail,@"SELECT * FROM student_b"); } } 

Rendez le dictionnaire statique, et ne l’ajoutez jamais en dehors du moteur de votre object statique. Cela semble être une solution plus simple que de manipuler les règles stat / const en C #.

OK – donc je travaille dans ASP 2.x (pas mon choix … mais bon, qui bitching?).

Aucun des exemples d’initialisation du dictionnaire 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 fait comprendre que l’on ne peut pas utiliser l’initialisation des collections dans ASP 2.x.

Vous pouvez utiliser le constructeur static / class pour initialiser votre dictionnaire:

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

Probablement initialiser dans le constructeur.