2009-09-03 20 views
42

Questa è probabilmente una questione di preferenze personali, ma quando si usa proprietà invece di funzioni nel codiceQuando utilizzare le proprietà invece di funzioni

Ad esempio per ottenere un log degli errori ho potuto dire

string GetErrorLog() 
{ 
     return m_ErrorLog; 
} 

o potrei

string ErrorLog 
{ 
    get { return m_ErrorLog; } 
} 

Come si fa a decidere quale usare? Mi sembra incoerente nel mio utilizzo e sto cercando una buona regola generale. Grazie.

+0

duplicato di almeno 3 risposte in http://stackoverflow.com/search?q=c%23+properties. –

risposta

68

tendo a utilizzare le proprietà se la seguente condizione:

  • La proprietà restituirà un singolo valore, la logica
  • Poca o nessuna logica è coinvolto (in genere solo restituire un valore, o di fare un piccolo controllare/valore di ritorno)

tendo a usare metodi se soddisfa il seguente requisito:

    ci
  • i Sarà un lavoro significativo coinvolto nel restituire il valore - cioè: verrà recuperato da un DB, o qualcosa che potrebbe richiedere "tempo"
  • C'è un po 'di logica in gioco, sia nel prendere o impostare il valore

Inoltre, vi consiglio di guardare Microsoft's Design Guidelines for Property Usage. Suggeriscono:

Utilizzare una proprietà quando il membro è un membro di dati logici.

Utilizzare un metodo quando:

  • L'operazione è una conversione, ad esempio Object.ToString.
  • L'operazione è abbastanza costosa da consentire all'utente di comunicare all'utente la possibilità di prendere in considerazione il caching del risultato.
  • L'ottenimento di un valore di proprietà utilizzando la funzione di accesso get avrebbe un effetto collaterale osservabile.
  • La chiamata del membro due volte in successione produce risultati diversi.
  • L'ordine di esecuzione è importante. Si noti che le proprietà di un tipo dovrebbero poter essere impostate e recuperate in qualsiasi ordine.
  • Il membro è statico ma restituisce un valore che può essere modificato.
  • Il membro restituisce un array. Le proprietà che restituiscono gli array possono essere molto fuorvianti. Di solito è necessario restituire una copia dell'array interno in modo che l'utente non possa modificare lo stato interno. Questo, unito al fatto che un utente può facilmente presumere che sia una proprietà indicizzata, porta a un codice inefficiente. Nell'esempio di codice seguente, ogni chiamata alla proprietà Methods crea una copia dell'array. Di conseguenza, verranno create 2n + 1 copie dell'array nel seguente loop.
+2

Vorrei aggiungere che i tuoi metodi dovrebbero avere una sola responsabilità. Non creare metodi massicci queste risme di codice facendo cose diverse. Dividere ogni lavoro diverso in metodi privati ​​o anche in metodi in un'altra classe – skyfoot

+0

Zoooom !! Ho risposto e ottenuto 12 upvotes in 5 minuti. – AnthonyWJones

+0

@AnthonyWJones: È sempre una bella sorpresa quando succede :) –

12

Ecco le linee guida di Microsoft:

Choosing Between Properties and Methods

  • considerare l'utilizzo di una proprietà se il membro rappresenta un attributo di logica del tipo.

  • Utilizzare una proprietà, anziché un metodo, se il valore della proprietà è archiviato nella memoria del processo e la proprietà fornirebbe solo l'accesso al valore.

  • Utilizzare un metodo, anziché una proprietà, nelle seguenti situazioni.

    • L'operazione è di ordini di grandezza più lenta di un set di campo. Se si sta anche considerando di fornire una versione asincrona di un'operazione per evitare il blocco del thread, è molto probabile che l'operazione sia troppo costosa per essere una proprietà. In particolare, le operazioni che accedono alla rete o al file system (diverse da una volta per l'inizializzazione) dovrebbero molto probabilmente essere metodi, non proprietà.

    • L'operazione è una conversione, ad esempio il metodo Object.ToString.

    • L'operazione restituisce un risultato diverso ogni volta che viene chiamato, anche se i parametri non cambiano. Ad esempio, il metodo NewGuid restituisce un valore diverso ogni volta che viene chiamato.

    • L'operazione ha un effetto collaterale significativo e osservabile. Si noti che il popolamento di una cache interna non è generalmente considerato un effetto collaterale osservabile.

    • L'operazione restituisce una copia di uno stato interno (ciò non include le copie degli oggetti di tipo valore restituiti nello stack).

    • L'operazione restituisce un array.

2

non avevo mai utilizzare una proprietà se potevo essere che interessano più di un campo - avevo sempre utilizzare un metodo.

In genere, utilizzo solo la stringa pubblica ErrorLog {get; set privato; } Sintassi per Proprietà e metodi di utilizzo per tutto il resto.

2

In aggiunta alla risposta di Reed quando la proprietà è solo un getter come ottenere una risorsa come un registro eventi potrebbe essere. Cerco di utilizzare solo le proprietà quando la proprietà sarà priva di effetti collaterali.

2

Se c'è qualcosa di più banale in una proprietà, dovrebbe essere un metodo. Ad esempio, se la proprietà getter di ErrorLog stava effettivamente andando e leggendo i file, allora dovrebbe essere un metodo. L'accesso a una proprietà dovrebbe essere veloce, e se sta facendo molta elaborazione, dovrebbe essere un metodo. Se ci sono effetti collaterali dell'accesso a una proprietà che l'utente della classe potrebbe non aspettarsi, allora dovrebbe probabilmente essere un metodo.

C'è il libro .NET Framework Design Guidelines che copre questo genere di cose in modo molto dettagliato.

4

Io uso le proprietà quando è chiaro che la semantica è "Ottieni qualcosa dall'oggetto". Tuttavia, l'utilizzo di un metodo è un buon modo per comunicare "questo potrebbe richiedere un po 'più di un semplice sforzo per tornare".

Ad esempio una raccolta potrebbe avere una proprietà Count. È ragionevole supporre che un oggetto collezione sappia quanti oggetti sono attualmente conservati senza doverli effettivamente scorrere e contarli.

Sulla mano questa ipotetica collezione potrebbe avere il metodo GetSum() che restituisce il totale dell'insieme di elementi detenuti. La collezione ha semplicemente una proprietà Sum, ma usando un metodo comunica l'idea che la collezione dovrà fare del lavoro reale per ottenere una risposta.

Problemi correlati