web-dev-qa-db-fra.com

Initialisation des propriétés automatiques C #

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

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

La conversion de Bar en propriété automatique semble pratique et concise, mais comment puis-je conserver l'initialisation sans ajouter de constructeur ni y placer l'initialisation?

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

Vous avez pu constater que l'ajout d'un constructeur ne correspond pas aux économies en termes d'effort que je suis censé obtenir des propriétés automatiques.

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

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

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 string Bar { get; set; } = "bar";
}

Vous pouvez aussi écrire des propriétés implémentées automatiquement en lecture seule, qui ne peuvent être insérées que dans le constructeur (mais peuvent également recevoir une valeur initiale par défaut:

public class Foo
{
    public string Bar { get; }

    public Foo(string bar)
    {
        Bar = bar;
    }
}

Il est regrettable qu'il n'y ait aucun moyen de faire cela pour le moment. Vous devez définir la valeur dans le constructeur. (L'utilisation d'un chaînage de constructeur 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 trouve pas souvent à vouloir ce type d'initialisation aussi souvent qu'une propriété en lecture seule implémentée automatiquement qui ne peut être définie que dans le constructeur et qui serait sauvegardée par un champ en lecture seule.

Cela n’est pas arrivé jusqu’à C 5 inclus, mais est planifié pour C 6, ce qui permet l’initialisation au moment de la déclaration, et permet aux propriétés implémentées automatiquement en lecture seule initialisé dans un corps de constructeur.

207
Jon Skeet

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 qui prend des paramètres) 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 = string.Format("{0}Baz", something);
  }
  public string Bar {get; set;}
  public string Baz {get; set;}
}

Si vous chaînez toujours un appel au constructeur par défaut, vous pouvez 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, selon le cas.

34
Aaron Powell

Ce sera possible en C # 6.0:

public int Y { get; } = 2;
25
romanoza

Dans le constructeur par défaut (et tous ceux qui ne le sont pas si vous en avez bien sûr aussi):

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

Ceci n’est pas moins performant que votre code original je crois, puisque c’est ce qui se passe quand même dans les coulisses.

3
Matthew Scharley