En C#, qu'est-ce qui différencie un champ d'une propriété, et quand faut-il utiliser un champ au lieu d'une propriété ?
Réponses
Trop de publicités?DIFFERENCES - UTILISATIONS (quand et pourquoi)
A champ est une variable qui est déclarée directement dans une classe ou une structure. Une classe ou une structure peut avoir des champs d'instance, des champs statiques ou les deux. En général, vous devez utiliser les champs seulement pour les variables qui ont une accessibilité privée ou protégée . Les données que votre classe expose au code client doivent être fournies par des méthodes, des propriétés et des indexeurs. En utilisant ces constructions pour l'accès indirect aux champs internes, vous pouvez vous prémunir contre les valeurs d'entrée invalides.
A propriété est un membre qui fournit un mécanisme flexible pour lire, écrire ou calculer la valeur d'un champ privé. Les propriétés peuvent être utilisées comme s'il s'agissait de membres de données publiques, mais il s'agit en fait de méthodes spéciales appelées accesseurs . Cela permet d'accéder facilement aux données tout en contribuant à promouvoir l'image de marque de l'entreprise. la sécurité et la flexibilité des méthodes . Les propriétés permettent à une classe d'exposer un moyen public d'obtenir et de définir des valeurs, tout en cachant le code d'implémentation ou de vérification. Un accesseur de propriété get est utilisé pour retourner la valeur de la propriété, et un accesseur set est utilisé pour attribuer une nouvelle valeur.
Les propriétés ont pour principal avantage de vous permettre de modifier la façon dont les données d'un objet sont accessibles sans rompre son interface publique. Par exemple, si vous avez besoin d'ajouter une validation supplémentaire ou de transformer un champ stocké en un champ calculé, vous pouvez le faire facilement si vous avez initialement exposé le champ comme une propriété. Si vous exposez un champ directement, vous devrez modifier l'interface publique de votre classe pour ajouter la nouvelle fonctionnalité. Cette modification entraînerait la rupture des clients existants, qui devraient être recompilés avant de pouvoir utiliser la nouvelle version de votre code.
Si vous écrivez une bibliothèque de classes conçue pour une large consommation (comme le .NET Framework, qui est utilisé par des millions de personnes), cela peut être un problème. Cependant, si vous écrivez une classe utilisée en interne dans une petite base de code (disons <= 50 K lignes), ce n'est pas vraiment un problème, car personne ne sera affecté par vos changements. Dans ce cas, c'est une question de préférence personnelle.
Les propriétés prennent en charge l'accès asymétrique, c'est-à-dire que vous pouvez avoir soit un getter et un setter, soit un seul des deux. De même, les propriétés prennent en charge l'accessibilité individuelle pour le getter/setter. Les champs sont toujours symétriques, c'est-à-dire que vous pouvez toujours à la fois obtenir et définir la valeur. L'exception à cette règle concerne les champs en lecture seule qui ne peuvent évidemment pas être définis après l'initialisation.
Les propriétés peuvent s'exécuter pendant très longtemps, avoir des effets secondaires et même lever des exceptions. Les champs sont rapides, sans effets secondaires, et ne lèvent jamais d'exceptions. En raison d'effets secondaires, une propriété peut renvoyer une valeur différente à chaque appel (comme cela peut être le cas pour DateTime.Now, c'est-à-dire que DateTime.Now n'est pas toujours égal à DateTime.Now). Les champs renvoient toujours la même valeur.
Les champs peuvent être utilisés pour les paramètres out / ref, mais pas les propriétés. Les propriétés supportent une logique additionnelle - cela pourrait être utilisé pour implémenter le chargement paresseux entre autres choses.
Les propriétés prennent en charge un niveau d'abstraction en encapsulant tout ce qui permet d'obtenir/de définir la valeur.
Utilisez les propriétés dans la plupart / tous les cas, mais essayez d'éviter les effets secondaires.
En arrière-plan, une propriété est compilée en méthodes. Ainsi, une Name
est compilé en get_Name()
et set_Name(string value)
. Vous pouvez le constater si vous étudiez le code compilé. Il y a donc un (très) léger surcoût de performance lorsqu'on les utilise. Normalement, vous utiliserez toujours une propriété si vous exposez un champ à l'extérieur, et vous l'utiliserez souvent en interne si vous devez valider la valeur.
Lorsque vous voulez que votre variable privée (champ) soit accessible aux objets de votre classe depuis d'autres classes, vous devez créer des propriétés pour ces variables.
par exemple si j'ai des variables nommées "id" et "name" qui sont privées. mais il peut y avoir une situation où cette variable est nécessaire pour une opération de lecture/écriture en dehors de la classe. Dans ce cas, la propriété peut m'aider à obtenir cette variable en lecture/écriture en fonction de la fonction get/set définie pour la propriété. Une propriété peut être en lecture seule, en écriture seule ou en lecture-écriture.
voici la démo
class Employee
{
// Private Fields for Employee
private int id;
private string name;
//Property for id variable/field
public int EmployeeId
{
get
{
return id;
}
set
{
id = value;
}
}
//Property for name variable/field
public string EmployeeName
{
get
{
return name;
}
set
{
name = value;
}
}
}
class MyMain
{
public static void Main(string [] args)
{
Employee aEmployee = new Employee();
aEmployee.EmployeeId = 101;
aEmployee.EmployeeName = "Sundaran S";
}
}