Propriétés automatiques avec ou sans champ de sauvegarde – préférence?

Je sais que lors de l’utilisation des propriétés automatiques, le compilateur crée son propre champ de support derrière l’écran. Cependant, dans beaucoup de programmes que je lis pour apprendre, je vois des gens écrire explicitement

private int _backingField; public int Property { get { return _backingField; } } 

Quelle est la différence entre ci-dessus et ci-dessous?

 public int Property { get; private set; } 

Je comprends qu’il est évident d’utiliser la propriété lorsque des effets secondaires se produisent dans le getter ou le setter, mais ce n’est souvent pas le cas. De plus, je comprends que vous devez utiliser explicitement le champ de sauvegarde dans le cas de structures, vous ne pouvez pas accéder à leurs membres via des propriétés.

La seule différence que j’ai pu constater est que la manière d’appeler la valeur est différente dans la classe dans laquelle elle est définie. champ? Des conventions simples?

    Il n’y a pas beaucoup de différence entre ces deux extraits – vous ne pouvez pas transmettre une propriété par référence, par exemple, mais c’est rarement un problème. Cependant, si vous voulez que le champ soit en lecture seule, comme ceci:

     private readonly int _backingField; public int Property { get { return _backingField; } } 

    alors il y a une différence. Le code que j’ai écrit ci-dessus empêche la modification de la valeur ailleurs dans la classe, indiquant clairement que cela est réellement supposé être immuable. J’aimerais vraiment pouvoir déclarer un champ en lecture seule avec une propriété en lecture seule à implémenter automatiquement, configurable uniquement dans le constructeur – mais ce n’est pas disponible pour le moment.

    C’est assez déroutant, au fait:

    De plus, je comprends que vous devez utiliser explicitement le champ de sauvegarde dans le cas de structures, vous ne pouvez pas accéder à leurs membres via des propriétés.

    Que voulez-vous dire? Vous pouvez certainement utiliser des propriétés dans les structures. Parlez-vous des champs de support qui sont des structures mutables, c’est-à-dire la différence entre:

     foo.someField.X = 10; 

    et

     foo.SomeProperty.X = 10; 

    ? Si c’est le cas, j’évite normalement que ce soit un problème en rendant mes structs immuables pour commencer 🙂