Initialisation des propriétés auto C #

J’ai l’habitude d’écrire des cours comme celui-ci:

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

Convertir Bar en auto-propriété semble pratique et concis, mais comment conserver l’initialisation sans append de constructeur et y insérer l’initialisation?

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

Vous pouvez voir que l’ajout d’un constructeur n’est pas en ligne avec les économies d’effort que je suis censé obtenir des propriétés automatiques.

Quelque chose comme ça aurait plus de sens pour moi:

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

Mise à jour – la réponse ci-dessous a été écrite avant l’arrivée de C # 6. En C # 6, vous pouvez écrire:

 public class Foo { public ssortingng Bar { get; set; } = "bar"; } 

Vous pouvez également écrire des propriétés implémentées automatiquement en lecture seule, qui sont uniquement accessibles en écriture dans le constructeur (mais peuvent également recevoir une valeur initiale par défaut:

 public class Foo { public ssortingng Bar { get; } public Foo(ssortingng bar) { Bar = bar; } } 

C’est dommage qu’il n’y ait aucun moyen de le faire maintenant. Vous devez définir la valeur dans le constructeur. (L’utilisation du chaînage des constructeurs peut aider à éviter les doublons.)

Les propriétés implémentées automatiquement sont pratiques en ce moment, mais pourraient certainement être plus agréables. Je ne me retrouve pas à vouloir ce type d’initialisation aussi souvent qu’une propriété implémentée en lecture seule qui ne pourrait être définie que dans le constructeur et serait soutenue par un champ en lecture seule.

Cela n’a pas été le cas jusqu’à C # 5, mais est prévu pour C # 6 – à la fois pour permettre l’initialisation au sharepoint déclaration et pour permettre l’initialisation des propriétés implémentées en lecture seule dans un constructeur.

Vous pouvez le faire via le constructeur de votre classe:

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

Si vous avez un autre constructeur (par exemple, un constructeur qui prend des parameters) ou un groupe de constructeurs, vous pouvez toujours avoir ceci (appelé chaînage de constructeur):

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

Si vous appelez toujours un appel au constructeur par défaut, vous pouvez y définir toutes les initialisations de propriétés par défaut. Lors du chaînage, le constructeur chaîné sera appelé avant le constructeur appelant afin que vos constructeurs plus spécialisés puissent définir différentes valeurs par défaut, le cas échéant.

Ce sera possible en C # 6.0:

 public int Y { get; } = 2; 

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.