Je me demandais quelles étaient les différences entre ces déclarations de passeurs et de régleurs et s’il y avait une méthode préférée (et pourquoi). Le premier peut être généré automatiquement par Visual Studio. Qu’en est-il des autres? Merci
1er
ssortingng _myProperty { get; set; }
2ème
ssortingng _myProperty; public ssortingng myProperty { get { return _myProperty; } set { _myProperty = value; } }
3ème
ssortingng _myProperty; public ssortingng getMyProperty() { return this._myProperty; } public void setMyProperty(ssortingng value) { this._myProperty = value; }
Les propriétés sont utilisées pour encapsuler certaines données. Vous pouvez utiliser un champ simple:
public ssortingng MyField
Mais ce champ est accessible à tous les utilisateurs extérieurs de votre classe. Les personnes peuvent insérer des valeurs illégales ou modifier la valeur de manière inattendue.
En utilisant une propriété, vous pouvez encapsuler la manière dont vos données sont consultées. C # a une belle syntaxe pour transformer un champ en propriété:
ssortingng MyProperty { get; set; }
Cela s’appelle une propriété implémentée automatiquement . Lorsque le besoin s’en fait sentir, vous pouvez agrandir votre propriété pour:
ssortingng _myProperty; public ssortingng MyProperty { get { return _myProperty; } set { _myProperty = value; } }
Vous pouvez maintenant append du code qui valide la valeur de votre setter
:
set { if (ssortingng.IsNullOrWhiteSpace(value)) throw new ArgumentNullException(); _myProperty = value; }
Les propriétés peuvent également avoir des accesseurs différents pour le getter et le setter:
public ssortingng MyProperty { get; private set; }
De cette façon, vous créez une propriété qui peut être lue par tout le monde mais ne peut être modifiée que par la classe elle-même.
Vous pouvez également append une implémentation entièrement personnalisée pour votre getter
:
public ssortingng MyProperty { get { return DateTime.Now.Second.ToSsortingng(); } }
Lorsque C # comstack votre propriété implémentée automatiquement, il génère un langage intermédiaire (IL). Dans votre IL, vous verrez une méthode get_MyProperty
et set_MyProperty
. Il crée également un champ de sauvegarde appelé
(normalement, ce serait un nom illégal en C # mais en IL, il est valide. De cette façon, vous ne rencontrerez aucun conflit entre les types générés et votre propre code). Cependant, vous devez utiliser la syntaxe de propriété officielle en C #. Cela crée une expérience plus agréable en C # (par exemple avec IntelliSense).
Par convention, vous ne devez pas utiliser de propriétés pour les opérations qui prennent beaucoup de temps.
Eh bien, les deux premiers génèrent quelque chose comme le troisième à la fin. Cependant, n’utilisez pas le troisième lorsque vous avez une syntaxe pour les propriétés.
Enfin, si vous n’avez pas de travail à faire dans le set
ou le set
, utilisez le premier.
Au final, le premier et le second ne sont qu’une forme de sucre syntaxique, mais pourquoi coder plus que nécessaire?
// more code == more bugs
Et pour vous amuser, considérez ceci:
public ssortingng A { get; private set; }
Maintenant, c’est beaucoup plus simple, n’est-ce pas? Le modificateur public
est implicite à la fois sur get
et sur l’ set
, mais il peut être remplacé. Ce serait bien sûr la même règle pour tout modificateur utilisé lors de la définition de la propriété elle-même.
1er
ssortingng _myProperty { get; set; }
Cela s’appelle une propriété automatique dans le monde .NET. C’est juste du sucre syntaxique pour # 2.
2ème
ssortingng _myProperty; public ssortingng myProperty { get { return _myProperty; } set { _myProperty = value; } }
C’est la manière habituelle de le faire, qui est requirejse si vous devez effectuer une validation ou un code supplémentaire dans votre propriété. Par exemple, dans WPF, si vous devez déclencher un événement de modification de propriété. Si vous ne le faites pas, utilisez simplement la propriété auto, c’est à peu près la norme.
3
ssortingng _myProperty; public ssortingng getMyProperty() { return this._myProperty; } public ssortingng setMyProperty(ssortingng value) { this._myProperty = value; }
Le mot this
clé ici est redondant. Pas du tout nécessaire. Ce ne sont que des méthodes qui obtiennent et définissent par opposition aux propriétés, comme la façon de faire de Java.
Avec cela, vous pouvez effectuer du code dans la scope get
ou set
.
private ssortingng _myProperty; public ssortingng myProperty { get { return _myProperty; } set { _myProperty = value; } }
Vous pouvez également utiliser des propriétés automatiques:
public ssortingng myProperty { get; set; }
Et .Net Framework gérera pour vous. Il a été créé parce que c’est une bonne pratique et qu’il est facile à faire.
Vous pouvez également contrôler la visibilité de ces étendues, par exemple:
public ssortingng myProperty { get; private set; } public ssortingng myProperty2 { get; protected set; } public ssortingng myProperty3 { get; }
Maintenant, en C #, vous pouvez initialiser la valeur d’une propriété. Comme échantillon:
public int Property { get; set; } = 1;
Si aussi peut le définir et le rendre en lecture seule, sans set.
public int Property { get; } = 1;
Et enfin, vous pouvez définir une fonction de flèche.
public int Property { get; } => GetValue();
Juste pour clarifier, dans votre 3ème exemple, _myProperty n’est pas réellement une propriété. C’est un champ avec les méthodes get et set (et comme cela a déjà été mentionné, les méthodes get et set doivent spécifier les types de retour).
En C #, la 3ème méthode doit être évitée dans la plupart des situations. Vous ne l’utiliseriez vraiment que si le type que vous vouliez retourner était un tableau, ou si la méthode get faisait beaucoup de travail plutôt que de simplement renvoyer une valeur. Ce dernier point n’est pas vraiment nécessaire, mais pour des raisons de clarté, la méthode get d’une propriété qui fait beaucoup de travail est trompeuse.
Le premier est le défaut, quand il n’y a rien de spécial à retourner ou à écrire. 2ème et 3ème sont fondamentalement les mêmes où 3ème est une version un peu plus étendue de 2ème
Commençons par 3. Cela ne marcherait pas. public getMyProperty()
n’a pas de retour typ.
Et les numéros 1 et 2 sont en fait les mêmes choses. 2 est ce que le numéro 1 devient après la compilation.
Donc, 1 et 2 sont les mêmes choses. avec deux, vous pouvez avoir une validation ou une mise en cache dans votre modèle.
à part cela, ils deviennent les mêmes.
Le premier est la forme «courte» – vous l’utilisez lorsque vous ne voulez pas faire quelque chose de compliqué avec vos getters et vos créateurs. Il n’est pas possible d’exécuter une méthode ou quelque chose du genre dans cette forme.
Les deuxième et troisième formes sont presque identiques, bien que la seconde soit compressée sur une seule ligne. Cette forme est déconseillée par stylecop car elle semble quelque peu étrange et n’est pas conforme à C ‘Stylguides.
J’utiliserais la troisième forme si je m’attendais à utiliser mes getters / setters pour quelque chose de spécial, par exemple utiliser une construction paresseuse ou plus.