216 votes

Initialisation des propriétés automatiques C #

Je suis habitué à l'écriture de classes comme ceci:

public class foo {
  private string mBar = "bar";
  public string Bar {
    get { return mBar; }
    set { mBar = value; }
  }
  //... other methods, no constructor ...
}

La conversion de Barre à un auto-propriété semble pratique et concis, mais comment puis-je conserver l'initialisation sans l'ajout d'un constructeur et de mettre de l'initialisation là?

public class foo2theRevengeOfFoo {
  //private string mBar = "bar";
  public string Bar { get; set; }
  //... other methods, no constructor ...
  //behavior has changed.
}

Vous avez pu voir que l'ajout d'un constructeur n'est pas en ligne avec l'effort d'épargne que je suis censé obtenir de l'auto-propriétés.

Quelque chose comme cela aurait plus de sens pour moi:

public string Bar { get; set; } = "bar";

256voto

Jon Skeet Points 692016

C'est dommage qu'il n'y a pas moyen de faire de ce droit maintenant. Vous devez définir la valeur dans le constructeur. (À l'aide du constructeur de chaînage peut aider à éviter les doubles emplois.)

Mis en place automatiquement les propriétés sont à portée de main en ce moment, mais pourrait certainement être encore plus belle. Je ne me sens pas vouloir ce genre d'initialisation comme souvent en lecture seule automatiquement mise en œuvre de la propriété qui ne peut être établi que dans le constructeur et serait soutenu par un champ en lecture seule.

Ce n'est pas arrivé jusqu'à et y compris C# 5, mais est prévu pour le C# 6 - à la fois en termes de permettre l'initialisation au moment de la déclaration, et permettant à lire automatiquement les propriétés implémentées être initialisée dans un constructeur de corps.

36voto

Aaron Powell Points 15598

Vous pouvez le faire via le constructeur de votre classe:

public class foo {
  public foo(){
    Bar = "bar";
  }
  public string Bar {get;set;}
}

Si vous avez un autre constructeur (c'est à dire, celui qui prend paramétrée) ou un tas de constructeurs, vous pouvez toujours avoir ce (appelé constructeur de série):

public class foo {
  private foo(){
    Bar = "bar";
    Baz = "baz";
  }
  public foo(int something) : this(){
    //do specialized initialization here
    Baz = string.Format("{0}Baz", something);
  }
  public string Bar {get; set;}
  public string Baz {get; set;}
}

Si vous avez toujours de la chaîne d'appeler le constructeur par défaut, vous pouvez avoir toutes les propriétés par défaut d'initialisation de l'ensemble. Lors de la chaîne, chaîne constructeur sera appelé avant l'appel du constructeur de sorte que votre plus spécialisés constructeurs seront en mesure de définir des valeurs par défaut différentes selon le cas.

3voto

Matthew Scharley Points 43262

Dans le constructeur par défaut (et les autres que ceux par défaut si vous en avez bien sûr):

 public foo() {
    Bar = "bar";
}
 

Ce n'est pas moins performant que votre code original, je crois, puisque c'est ce qui se passe de toute façon dans les coulisses.

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