Question

    

Cette question a déjà une réponse ici:

         

Je suis habitué à é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 pouvez voir que l'ajout d'un constructeur n'est pas intégré aux économies que je suis censé obtenir grâce aux propriétés automatiques.

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

public string Bar { get; set; } = "bar";
Était-ce utile?

La solution

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 également é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 le faire 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 cette initialisation aussi souvent qu'une propriété en lecture seule implémentée automatiquement qui ne pourrait être définie que dans le constructeur et serait sauvegardée par un champ en lecture seule.

Cela n’est pas arrivé jusqu’à C 5 inclus, mais est prévu pour C 6 - pour permettre l’initialisation au moment de la déclaration, et autorisant la lecture seule, automatiquement implémenté propriétés à initialiser dans un corps de constructeur.

Autres conseils

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 un constructeur qui prend des paramètres) ou un groupe de constructeurs, vous pouvez toujours avoir ceci (appelé chaînage du 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 des valeurs par défaut différentes, le cas échéant.

Cela sera possible en C # 6.0:

public int Y { get; } = 2;

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

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top