L'incapsulamento è ovviamente utile ed essenziale quando si accede ai membri dall'esterno della classe, ma quando ci si riferisce alle variabili di classe internamente, è meglio chiamare i propri membri privati o usare i loro getter? Se il tuo getter restituisce semplicemente la variabile, c'è qualche differenza di prestazioni?Quali sono i vantaggi dell'utilizzo delle proprietà internamente?
risposta
Non ci dovrebbe essere una differenza di prestazioni significativa, e il motivo per cui ci si attiene all'uso delle proprietà è perché questo è l'intero punto di incapsulamento. Mantiene tutti gli accessi di questi membri privati coerenti e controllati. Quindi, se vuoi cambiare il getter/setter della proprietà, non devi pensare "devo duplicare la stessa funzionalità altrove nei luoghi in cui ho deciso di accedere direttamente al membro privato?"
Il vantaggio sarebbe nei casi in cui è stata effettuata la convalida su Get o Set. Questo sarebbe in un posto e sempre chiamato.
Per quanto ne so (da altre domande su Stack Overflow) quando Getter restituisce semplicemente il valore generato dal codice generato per accedere direttamente alla variabile.
L'accesso diretto al campo o l'utilizzo del getter di solito non fa una grande differenza, a meno che il getter non esegua un'inizializzazione pigra o altra elaborazione. Quindi dipende da cosa fa il getter, ma la mia regola è di usare sempre il getter tranne in casi specifici.
Per assegnare un valore al campo, non dimenticare che i setter includono spesso un codice di convalida o un evento. In tal caso dovresti sempre usare il setter.
+1: questa è una buona regola empirica. C'è una tendenza generale a usare il membro privato .. "Non sto facendo nulla nel getter e/o setter..it sarebbe inutile chiamare un metodo ... Farò solo un incarico ... figo ". (colpevole .. lo ammetto) Poi più tardi tu, o peggio qualcun altro, aggiungi qualche conferma al setter e ... bang ... il tuo bersaglio a chi ha sparato alla riunione del coniglio. Come ha detto Thomas ... c'è sempre una stanza per un caso speciale di esenzione ... per abitudine usa il setter. – Rusty
In ogni caso, semplici getter o setter sono solitamente delineati dal compilatore JIT, quindi non è nemmeno un'ottimizzazione accedere direttamente al campo ... –
La differenza di prestazioni è trascurabile, in circa il 98% del tempo.
È consigliabile utilizzare sempre le proprietà anche se il proprio getter o setter ottiene o imposta il proprio membro privato. Ciò ti consentirà di apportare modifiche man mano che l'applicazione si evolverà. In questo modo, sarai in grado di introdurre alcune restrizioni o qualche altro incapsulamento all'interno delle tue proprietà senza rompere il tuo codice. Altrimenti, una volta deciso di scrivere le proprietà a causa di un motivo X, ti troverai obbligato a rifattorizzare tutto il tuo codice per ottenere o impostare la proprietà invece del tuo membro privato.
Mi piace usare le proprietà interne per l'inizializzazione pigra, dove nella proprietà ci si assicura che l'oggetto sia inizializzato. Questo assicura che non sto usando variabili di livello di classe che non sono ancora state inizializzate.
TestClass1 _class1
internal TestClass1
{
get
{
if (_class == null)
_class = new TestClass1()
return _class1
}
}
prova a chiedere il vostro sé questa domanda: se si ritiene che il proprio estratto conto (che non vedo alcun motivo per cui non si dovrebbe) "Encapsulation è ovviamente utile ed essenziale quando si accede a membri al di fuori della classe", quindi cercare di venire con una solida argomentazione sul perché le cose dovrebbero essere diverse se hai rimosso le ultime quattro parole. Se non riesci a sapere, puoi usare gli stessi argomenti :) –
@ChrisF: quella discussione è praticamente del tutto estranea a questa domanda – fearofawhackplanet
Link a quella che è risultata essere una domanda irrilevante cancellata. – ChrisF