2010-01-13 3 views
1

Si j'ai un objet de collection qui est vide mais doit être rempli et va être utilisé par une classe (disons classe Foo), alors est-il préférable de faire le remplissage dans le constructeur?Dois-je remplir des collections en ctor ou en méthode statique privée?

Quelque chose comme:

List<string> strings = new List<string(); 
strings.Add("sjsjhsj"); 
// So on... 

Ou devrait-il être dans un cteur privé statique? L'état n'est pas changé de la classe contenant donc ceci peut être statique, non?

BTW, si j'écris ceci.Nom = nom; ou:

john.Name = name; 
// Instance method passing in john as a Person object. 

Ces deux éléments sont-ils connus pour changer d'état et ne devraient donc pas être statiques? Ou est-ce seulement avec l'instance?

Si j'ai besoin d'une collection dont je veux pouvoir changer le contenu sans recompiler, je devrais utiliser un fichier txt ou xml comme source. Quel est le plus rapide lors de l'utilisation pour les collections? Le fichier Txt utilisera ReadAllLines(); et XML utilisera un NodeNavigator (pas sûr du nom exact de la méthode/de l'objet).

Merci

+2

Je pense qu'il y a au moins trois questions différentes ici. Puis-je suggérer de leur demander trois différentes questions SO? –

Répondre

3

En premier lieu, les constructeurs statiques ne peuvent pas être public/privé. Ils existent simplement.

Si la même instance de votre collection va être partagée entre toutes les instances de la classe propriétaire, elle peut être statique. Statique ne signifie pas qu'il ne change pas d'état. Cela peut encore changer. La différence est que les champs statiques sont partagés entre toutes les instances de la classe, donc les opérations mutables sur ce champ doivent être coordonnées. Si toutes les instances de la classe utilisent utilisent toujours les mêmes données, rendez-le statique. Si un fichier texte ou un fichier xml est plus rapide pour vous, cela dépend des données.

2

Je pense que vous avez un malentendu sur la signification de "statique". "Statique", en C#, ne signifie pas que l'état ne change pas. Vous pouvez avoir des variables statiques qui ont un état changeant. En C#, "statique" fait référence à la portée de la variable - et non à sa mutabilité. Lorsque vous définissez une variable comme statique (et utilisez un ctor statique), vous travaillez au niveau de la classe au lieu du niveau de l'instance.

Si votre variable est spécifique à la classe et non une instance de la classe, il peut être approprié de la rendre statique.

0

Si la collection a un ensemble statique, connu des valeurs au moment de la compilation, vous pouvez, en C# 3.0 (VS 2008), l'utilisation collection syntaxe initialiseur dans votre définition de classe:

private static readonly IList<string> strings = new ReadOnlyCollection<string>(
    new List<string>(5) 
    { 
     "sjsjhsj", 
     "string 2", 
     "string 3", 
     "string 4", 
     "string 5" 
    }); 

ReadOnlyCollection vit dans la System.Collections.ObjectModel espace de noms. Le 5 dans le constructeur List<string> se réfère à sa capacité et, si vous connaissez le nombre à l'avance, entraînera l'optimisation de l'exécution.

Questions connexes