Dans son excellent livre, CLR Via C #, Jeffrey Richter a déclaré qu'il n'aime pas les propriétés et recommande de ne pas les utiliser. Il a donné une raison, mais je ne comprends pas vraiment. Quelqu'un peut-il m'expliquer pourquoi je devrais ou ne devrais pas utiliser des propriétés? En C # 3.0, avec les propriétés automatiques, cela change-t-il?
À 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 lisible et inscriptible. Si vous définissez une propriété, il est préférable de proposer à la fois des méthodes d'accesseur get et set.
• Une méthode de propriété peut lever une exception; l'accès aux champs ne lève jamais d'exception.
• Une propriété ne peut pas être transmise en tant que paramètre out ou ref à une méthode; un champ peut. Par 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);
}
}
• Une méthode de propriété peut prendre un certain temps à s'exécuter; l'accès au champ se termine toujours immédiatement. Une raison courante d'utiliser des propriétés est d'effectuer la synchronisation des threads, ce qui peut arrêter le thread pour toujours, et par conséquent, une propriété ne doit pas être utilisée si la synchronisation des threads est requise. Dans cette situation, une méthode est préférée. En outre, si votre classe est 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érée à une propriété. À mon avis, les classes dérivées de MarshalByRefObject ne devraient jamais utiliser de propriétés.
• Si elle est appelée plusieurs fois de suite, une méthode de propriété peut renvoyer une valeur différente à chaque fois; un champ renvoie la même valeur à chaque fois. La classe System.DateTime a une propriété en lecture seule Now qui renvoie la date et l'heure actuelles. Chaque fois que vous interrogez cette propriété, elle renvoie une valeur différente. C'est une erreur, et Microsoft souhaite pouvoir corriger la classe en faisant de Now une méthode au lieu d'une propriété.
• Une méthode de propriété peut provoquer des effets secondaires observables; l'accès sur le terrain ne le fait jamais. En d'autres termes, un utilisateur d'un type doit être capable de définir diverses propriétés définies par un type dans n'importe quel ordre de son choix sans remarquer aucun comportement différent dans le 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 réellement partie de l'état de l'objet, donc la modification de l'objet retourné n'a aucun effet sur l'objet d'origine; l'interrogation d'un champ renvoie toujours une référence à un objet dont il est garanti qu'il fait partie de l'état de l'objet d'origine. Travailler avec une propriété qui renvoie une copie peut être très déroutant pour les développeurs, et cette caractéristique n'est souvent pas documentée.