61 votes

Classe statique C # vs structure pour les chaînes prédéfinies

Un collègue vient de créer la construction suivante en C # (l'exemple de code est simplifié). Son objectif était de raccourcir la notation de toutes les chaînes prédéfinies dans le reste du code.

 public struct PredefinedStrings
{
    public const string VeryLongName = "Very Long Name";
    public const string AnotherVeryLongName = "Another Very Long Name";
    public const string TheLastVeryLongName = "The Last Very Long Name";
}

public static void MethodThatUsesTheNames()
{
    Console.WriteLine(PredefinedStrings.VeryLongName);
    Console.WriteLine(PredefinedStrings.AnotherVeryLongName);
    Console.WriteLine(PredefinedStrings.TheLastVeryLongName);
}
 

Bien que cela semble bien fonctionner pour lui, je ne peux pas m'empêcher de me demander s'il aurait dû utiliser une classe statique au lieu d'une structure ou s'il existe un moyen plus élégant d'y parvenir.

Quelle serait la meilleure façon de procéder? Veuillez également expliquer pourquoi.

58voto

AakashM Points 32891

Avec l' struct de la solution, il n'y a rien pour arrêter d'autres codes faire new PredefinedStrings(), ce qui ne sera pas faire quelque chose de mauvais, mais c'est quelque chose qu'il est sémantiquement source de confusion pour permettre. Avec un statique de la classe, le compilateur va interdire la création pour vous. Et il va sans dire que la classe statique est la meilleure façon de fournir des constantes dans le Cadre.

edit pour ajouter, j'ai dit que la deuxième partie sans preuves depuis, j'ai cherché et assez rapidement trouvé System.Net.Mime.DispositionTypeNames et System.Net.WebRequestMethods.Http.

32voto

Andrew Points 14278

Je préférerais que les chaînes soient toutes dans un fichier de ressources et non intégrées dans le code - principalement pour des raisons d'internationalisation. Celui-ci est ensuite accessible via une classe statique avec les valeurs en tant que membres de la propriété.

27voto

KP. Points 8241

Outre un static class et struct , pourquoi ne pas envisager d'utiliser des fichiers resource pour des chaînes constantes? Celles-ci sont accessibles très facilement en SomeNamespace.ResourceName.KeyName , et selon où elles se trouvent dans votre projet peuvent être gérées en externe sans recompilation si besoin est ...

14voto

Konstantin Spirin Points 5347

Règle générale simple: n'utilisez jamais de structures tant que vous n'avez pas d'autre choix.

Les constantes ont quelques inconvénients:

  • seuls les types simples peuvent être utilisés (chaînes, chiffres, etc.)
  • des constantes sont injectées dans les assemblys de référence. Si vous recompilez l'assembly avec des constantes et ne recompilez pas l'assembly qui utilise des constantes, vous aurez des ennuis

J'écrirais votre code comme ceci (notez que vous renommez également le refactoring):

 public static class KnownNames
{
    public static readonly string VeryLong = "Very Long Name";
    public static readonly string AnotherVeryLong = "Another Very Long Name";
    public static readonly string TheLastVeryLong = "The Last Very Long Name";
}
 

6voto

stack Points 374

Il semble que vous recherchiez un fichier de ressources (.resx). C'est un endroit décent pour stocker de telles chaînes, et en résumant vos chaînes dans un .resx, il sera plus facile de localiser votre application à l'avenir. La page MSDN à http://msdn.microsoft.com/en-us/library/1ztca10y.aspx est un bon début pour plus d'informations.

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