2010-10-11 4 views
0

http://www.dreamincode.net/forums/user/335389-sergio-tapia/Quelle collection C# dois-je utiliser pour ce cas d'utilisation?

Je suis le groupe d'assistance, actuellement il y a d'autres groupes. Je veux écrire tous les groupes possibles dans une classe C# ou quelque chose et à l'avenir, lorsque d'autres groupes seront créés, je modifierai simplement cette "collection de groupes".

Ma question est, quelle structure C# dois-je utiliser pour ce cas d'utilisation?

Editer: Modifié la question et une partie du corps pour plus de clarté.

+0

Que voulez-vous dire par efficacité? – Xaqron

+0

Je ne comprends absolument pas votre question. Pourriez-vous ajouter un exemple? Pourquoi voulez-vous mettre l'énumération "sur un autre fichier"? –

Répondre

1

La modification des énumérations est complexe, mais peut être limitée. Considérez:

public enum SomeColors 
{ 
    Black, 
    blue, 
    red 
} 

code dans un autre assembly compilé pour utiliser SomeColors.blue cassera si nous:

public enum SomeColors 
{ 
    Black, 
    Green, 
    blue, 
    red 
} 

Parce qu'il aura la valeur 1 compilé dans ce qui est maintenant la valeur de SomeColors.Green en SomeColors.blue est maintenant 2.

De plus, si nous devions changer le premier à avoir la même capitalisation tout au long de:

public enum SomeColors 
{ 
    Black, 
    Blue, 
    Red 
} 

Puis l'exécution de code fonctionnerait toujours, mais recompiler aurait des erreurs du compilateur, comme SomeColors.Blue ne fonctionnerait pas. En outre, Enum.Parse (dans ce cas, en fonction du paramètre de sensibilité à la casse) fonctionnerait en fonction de la version de SomeColors disponible pour le code en cours d'exécution. Toutefois, l'ajout de valeurs n'est pas un changement de rupture. Si nous avons pris le premier et changé à:

public enum SomeColors 
{ 
    Black, 
    blue, 
    red, 
    green 
} 

Ensuite, tout le code existant serait correct, mais bien sûr sais pas moins green trouvé avec Enum.Parse. Donc, si vous allez seulement ajouter, et si vous ne pouvez compter sur personne pour essayer une chaîne à partir d'une version plus récente, alors cela fonctionnera.

La même chose est vraie pour les valeurs const.

Si vous avez besoin d'avoir des valeurs soient modifiables avec les versions, vous devez utiliser:

public static class SomeColors 
{ 
    public static readonly int Black = 0; 
    public static readonly int Blue = 1; 
    public static readonly int Red = 2; 
} 

Comme ceux-ci ne sont pas constantes, mais les champs affectés statiquement, ils seront utilisés à partir de la classe plutôt que compilé en et les changements apportés à la classe changeront ce qui est utilisé. On peut donner plus de sécurité dans certains cas en leur donnant des propriétés plutôt que des champs; En particulier, si vous voulez faire les propriétés calculées dans le futur, ce serait un changement de rupture si elles sont actuellement des champs mais pas si elles sont déjà des propriétés.

Si vous souhaitez que les valeurs soient dynamiques au moment de l'exécution, vous avez besoin d'une classe avec un indexeur qui prend une chaîne et renvoie un entier.

Questions connexes