Dans son excellent livre, CLR Via C#, Jeffrey Richter dit qu'il n'aime pas les propriétés, et recommande de ne pas les utiliser. Il a donné quelques raisons, mais je ne comprends pas vraiment. Quelqu'un peut-il m'expliquer pourquoi je devrais ou ne devrais pas utiliser les propriétés ? Dans C# 3.0, avec les propriétés automatiques, cela change-t-il ?
A titre de référence, j'ai ajouté les opinions de Jeffrey Richter :
- Une propriété peut être en lecture seule ou en écriture seule ; l'accès aux champs est toujours en lecture et en écriture. Si vous définissez une propriété, il est préférable de proposer des méthodes d'accès get et set.
- Une méthode de propriété peut déclencher une exception ; l'accès à un champ ne déclenche jamais d'exception.
- Une propriété ne peut pas être transmise comme paramètre out ou ref à une méthode ; un champ peut l'être. Pour exemple, le code suivant ne sera pas compilé :
using System;
public sealed class SomeType
{
private static String Name
{
get { return null; }
set {}
}
static void MethodWithOutParam(out String n) { n = null; }
public static void Main()
{
// For the line of code below, the C# compiler emits the following:
// error CS0206: A property or indexer may not
// be passed as an out or ref parameter
MethodWithOutParam(out Name);
}
}
- L'exécution d'une méthode de propriété peut prendre beaucoup de temps ; l'accès aux champs se termine toujours immédiatement. Une raison courante d'utiliser les propriétés est d'effectuer une synchronisation de fil, qui peut arrêter définitivement le thread. Par conséquent, une propriété ne doit pas être utilisée si la synchronisation du thread est nécessaire. Dans cette situation, il est préférable d'utiliser une méthode. De plus, si votre classe peut être accessible à distance (par exemple, votre classe est dérivée de System.MashalByRefObject), l'appel de la méthode de propriété sera très lent, et par conséquent, une méthode est préférable à une propriété. A mon avis, les classes dérivées de MarshalByRefObject ne devraient jamais utiliser de propriétés.
- Si elle est appelée plusieurs fois dans une rangée, une méthode de propriété peut renvoyer une valeur différente à chaque fois. valeur différente à chaque fois ; un champ renvoie la même valeur à chaque fois. La classe System.DateTime possède une propriété Now en lecture seule. Now qui renvoie la date et l'heure actuelles. Chaque fois que vous interrogez cette propriété cette propriété, elle renvoie une valeur différente. Il s'agit là d'une erreur, et Microsoft aurait souhaité pouvoir corriger la classe en faisant de Now une méthode plutôt qu'une propriété.
- Une méthode de propriété peut provoquer des effets secondaires observables ; l'accès aux champs ne le fait jamais. En d'autres termes En d'autres termes, l'utilisateur d'un type doit être en mesure de définir diverses propriétés définies par un type dans l'ordre de son choix sans que l'on remarque un comportement différent du type. dans l'ordre de son choix sans remarquer un comportement différent du type.
- Une méthode de propriété peut nécessiter de la mémoire supplémentaire ou renvoyer une référence à quelque chose qui ne fait pas partie de l'état de l'objet. qui ne fait pas réellement partie de l'état de l'objet, de sorte que la modification de l'objet renvoyé n'a pas d'effet sur l'objet original. n'a aucun effet sur l'objet d'origine ; l'interrogation d'un champ renvoie toujours une référence à un objet dont l'appartenance à l'état de l'objet est garantie. qui est garanti comme faisant partie de l'état de l'objet original. Travailler avec une propriété qui qui renvoie une copie peut être très déroutant pour les développeurs, et cette caractéristique n'est souvent pas documentée. pas documentée.