Dans la majeure partie du code que j'ai vu (sur SO, thecodeproject.com et moi-même avons tendance à le faire dans mon propre code), j'ai vu des propriétés publiques être créées pour chaque champ privé qu'une classe contient, même s'ils sont les plus type de base de get; set;
comme:
private int myInt;
public int MyInt
{
get { return myInt; }
set { myInt = value }
}
Ma question est la suivante: en quoi est-ce différent?
public int MyInt;
et si nous devrions utiliser des propriétés plutôt que des champs publics, pourquoi devrions-nous les utiliser dans ce cas particulier? (Je ne parle pas d'exemples plus complexes où les accesseurs effectuent quelque chose de spécial ou il n'y a qu'un seul get ou set (lecture/écriture uniquement) plutôt que de simplement renvoyer/définir une valeur d'un champ privé). Il ne semble pas ajouter d’encapsulation supplémentaire, il suffit de donner une icône Nice dans IntelliSense et d’être placé dans une section spéciale des diagrammes de classes!
Voir cet article http://blog.codinghorror.com/properties-vs-public-variables/
Plus précisément
Trois raisons:
Je suis sûr qu'il y a d'autres raisons pour lesquelles je ne pense tout simplement pas.
Dans .Net 3.x, vous pouvez utiliser des propriétés automatiques comme ceci:
public int Age { get; set; }
au lieu de la vieille école avec déclarer vos champs privés vous-même comme ceci:
private int age;
public int Age
{
get { return age; }
set { age = value; }
}
Cela le rend aussi simple que de créer un champ, mais sans la question du changement de rupture (entre autres).
Lorsque vous créez un champ privé name et une propriété publique simple Name qui obtient et définit réellement la valeur du champ name
public string Name
{
get { return name; }
}
et vous utilisez cette propriété partout en dehors de votre classe et un jour, vous décidez que la propriété Name de cette classe fera en réalité référence au champ lastName (ou que vous souhaitez renvoyer une chaîne "Mon nom:" + nom), vous changez simplement le code dans la propriété:
public string Name
{
get { return lastName; //return "My name: "+name; }
}
Si vous utilisiez le champ publicnompartout dans le code extérieur, vous devrez alors modifiernomennom_fampartout où vous l'avez utilisé.
Cela fait une différence. Les données publiques peuvent être modifiées sans que l'instance d'objet le sache. À l'aide de getters et de setters, l'objet est toujours conscient du fait qu'une modification a été apportée.
N'oubliez pas que l'encapsulation des données n'est que le premier pas vers une conception mieux structurée, ce n'est pas un objectif en soi.
Vous devez utiliser des propriétés dans les cas suivants:
Ça dépend?
J'utilise toujours des accesseurs et des setters, car ils ont créé ce raccourci:
public int Foo {get; ensemble; }
Au moment de la compilation, il est traduit. Maintenant, vous ne pouvez pas en avoir envie, mais c'est là, et si vous avez besoin de fantaisie, vous devez simplement l'épeler plus tard.
Quoiqu'il en soit public, privé, protégé ... tout dépend de qui vous voulez pouvoir modifier les données. Nous utilisons beaucoup l'héritage et c'est une méthode très courante pour nous, afin que seuls les enfants puissent éditer certaines propriétés.
protected _foo;
public Foo
{
get { return _foo; }
} //lack of set intentional.
En termes plus simples, la réponse à votre question est celle des modificateurs d’accès, c’est-à-dire publics et privés.
Si tu utilises:
public int myInt;
public int MyInt
{
get { return myInt; }
set { myInt = value }
}
alors la propriété MyInt et la variable myInt sont toutes deux disponibles dans le projet à modifier . Cela signifie que si votre classe suppose que A hérite de la classe suppose B, alors myInt et MyInt sont disponibles pour modification et aucune vérification ne peut être effectuée. apply . Supposons que vous souhaitiez que la valeur myInt puisse être définie dans la classe derive si une condition particulière réussit.
Cela ne peut être réalisé qu'en rendant le champ privé et que la propriété soit publique . Ainsi, seule la propriété est disponible et les conditions peuvent être définies en conséquence.
Il y a plusieurs raisons pour lesquelles.
Principalement:
Le problème est le suivant: que se passe-t-il si, plus tard dans la ligne, vous voulez vous assurer que chaque fois que myInt
est référencé, il se produit quelque chose de spécial (un fichier journal est écrit dans, il est changé en 42, etc.)? Vous ne pouvez pas faire cela sans geters et setters. Parfois, il est sage de programmer pour ce dont vous pourriez avoir besoin, pas pour ce dont vous avez besoin maintenant.
En fait, si vous utilisez Silverlight, vous vous rendrez compte que les champs ne peuvent pas être définis comme des ressources statiques et vous devrez donc utiliser une propriété (même pour accéder à une const
).
Je me suis rendu compte que lorsque j'ai essayé de fédérer les noms de région que j'utilise dans PRISM (Composite Guidance).
Cependant, il ne s'agit que d'une limitation de la langue et à part des champs static
/const
, j'utilise toujours des propriétés.
L'idée est que vous ne devez pas modifier accidentellement/involontairement la valeur d'un champ privé de classe en dehors de . Lorsque vous utilisez get et set, cela signifie que vous modifiez le champ privé de classe intentionnellement et en connaissance de cause.
La définition d'une valeur dans un champ privé modifie uniquement ce champ, mais en les définissant comme une propriété, vous pouvez gérer d'autres arguments, par exemple, vous pouvez appeler une méthode après avoir défini une valeur.
chaîne privée _email; chaîne publique Email { obtenir { return this._email; } ensemble { this._email = valeur; ReplaceList (); //** } }