2009-02-26 3 views
2

Si vous avez un objet comme celui-ci:Valeur par défaut d'une propriété

public class Foo 
{ 
    private int _id; 

    public int id 
    { 
     get { return _id; } 
     set { _id = value; } 
    } 

    private string _name; 

    public string name 
    { 
     get { return _name; } 
     set { _name = value; } 
    } 
} 

Et vous voulez initialiser id -1 et nom String.Empty quelle est la meilleure pratique? (Et pourquoi)

Faire:

private int _id = -1 

Ou

Réglage _id = -1 et name = String.Empty dans le constructeur?

+0

Cela ressemble à un doublon de http://stackoverflow.com/questions/298183/c-member-variable-initialization-best-practice – aranasaurus

Répondre

7

Il s'agit plus d'une question de style qu'autre chose. Il y a seulement quelques cas où c'est un problème fonctionnel

  1. Lorsque vous avez beaucoup de constructeurs qui initialisent tous les champs à la même valeur. À ce stade, vous disposez d'un code redondant et vous devez refactoriser vos constructeurs ou utiliser des initialiseurs de champs.
  2. N'utilisez pas un initialiseur de champ s'il dépend de la valeur d'un autre champ de la même hiérarchie de classes. En l'absence de classes partielles, le résultat est prévisible, mais peut encore jeter des gens pour une boucle ..
+0

Je suis d'accord que c'est surtout une chose stylistique. La considération la plus importante est d'être cohérent avec l'approche que vous utilisez dans votre application. – JohnFx

+0

@JohnFx, en fait, je pense que le plus important est d'amener le groupe à être d'accord. ;) – JaredPar

0

Le paramétrer "inline" plutôt que d'utiliser le constructeur semble, selon moi, mieux indiquer l'intention. Fonctionnellement, ils sont les mêmes.

2

dépend du moment où vous voulez qu'il soit mis ...

private int _id = -1 

REINITIALISERA _id avant que le constructeur est appelé.

0

Un assistant CLR pourrait me corriger, mais je crois que ces deux approches sont fonctionnellement identiques, mais vous pouvez faire un argument que définir les valeurs par défaut dans le constructeur est plus explicite et évident, mais aussi un peu plus compliqué.

2

L'approche terrain est concise, qui obtient beaucoup de voix, mais ma préférence (pour les propriétés simples) serait d'utiliser les propriétés d'auto, auquel cas vous êtes forcé d'utiliser le constructeur:

public Foo() { 
     Id = -1; 
     Name = ""; 
    } 
    public int Id {get;set;} 
    public string Name {get;set;} 

Vous pouvez également utiliser [DefaultValue(-1)] etc., ce qui aide les concepteurs et les sérialiseurs, mais et non affecte la valeur initiale d'une propriété implémentée automatiquement (ou une propriété standard) - il s'agit uniquement d'informations supplémentaires.

0

L'initialisation en ligne est ajoutée en haut du constructeur par le compilateur C#, donc il n'y a vraiment aucune différence. Personnellement, je préfère toujours ajouter des constructeurs même si ce n'est qu'un constructeur par défaut.

0

C'est principalement la question de la préférence de style. Je les assigne généralement dans le constructeur, parce que c'est un endroit sain pour toutes les données et procédures qui ont lieu quand l'objet est instancié.