Nel suo eccellente libro, CLR Via C #, Jeffrey Richter ha detto che non gli piacciono le proprietà e consiglia di non usarle. Ha dato qualche ragione, ma non capisco davvero. Qualcuno può spiegarmi perché dovrei o non dovrei usare le proprietà? In C # 3.0, con proprietà automatiche, questa modifica?
Come riferimento, ho aggiunto le opinioni di Jeffrey Richter:
• Una proprietà può essere di sola lettura o di sola scrittura; l'accesso al campo è sempre leggibile e scrivibile. Se si definisce una proprietà, è meglio offrire sia i metodi di accesso get che set.
• Un metodo di proprietà può generare un'eccezione; l'accesso al campo non genera mai un'eccezione.
• Una proprietà non può essere passata come parametro out o ref a un metodo; un campo può. Ad esempio, il codice seguente non verrà compilato:
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'esecuzione di un metodo di proprietà può richiedere molto tempo; l'accesso al campo viene sempre completato immediatamente. Un motivo comune per utilizzare le proprietà è eseguire la sincronizzazione del thread, che può arrestare il thread per sempre e, pertanto, una proprietà non deve essere utilizzata se è necessaria la sincronizzazione del thread. In quella situazione, è preferibile un metodo. Inoltre, se è possibile accedere alla classe in remoto (ad esempio, la classe è derivata da System.MashalByRefObject), la chiamata al metodo della proprietà sarà molto lenta e, pertanto, un metodo è preferito a una proprietà. A mio parere, le classi derivate da MarshalByRefObject non dovrebbero mai utilizzare proprietà.
• Se chiamato più volte di seguito, un metodo di proprietà può restituire ogni volta un valore diverso; un campo restituisce ogni volta lo stesso valore. La classe System.DateTime ha una proprietà Now di sola lettura che restituisce la data e l'ora correnti. Ogni volta che si esegue una query su questa proprietà, verrà restituito un valore diverso. Questo è un errore e Microsoft desidera poter correggere la classe rendendo Now un metodo anziché una proprietà.
• Un metodo di proprietà può causare effetti collaterali osservabili; l'accesso al campo non lo fa mai. In altre parole, un utente di un tipo dovrebbe essere in grado di impostare varie proprietà definite da un tipo in qualsiasi ordine scelga senza notare alcun comportamento diverso nel tipo.
• Un metodo di proprietà può richiedere memoria aggiuntiva o restituire un riferimento a qualcosa che non fa effettivamente parte dello stato dell'oggetto, quindi la modifica dell'oggetto restituito non ha alcun effetto sull'oggetto originale; l'interrogazione di un campo restituisce sempre un riferimento a un oggetto che è garantito essere parte dello stato dell'oggetto originale. Lavorare con una proprietà che restituisce una copia può creare confusione per gli sviluppatori e questa caratteristica spesso non è documentata.