2010-01-27 11 views
19

Pensi che sia sempre meglio rendere i membri della classe protetti una proprietà protetta auto-implementata per mantenere l'isolamento o renderlo protetto campo è sufficiente?C# proprietà protetta o campo

protected bool test { get; set; } 

o

protected bool test; 

risposta

20

In generale, è consigliabile utilizzare autoproperties - questo permette di aggiungere facilmente la verifica, o qualsiasi altra cosa è necessario in seguito. Ciò è particolarmente importante se il membro protetto verrà utilizzato da classi esterne all'assembly, in quanto l'aggiunta di tale codice non interromperà il contratto con loro, mentre la modifica di un campo a un metodo o proprietà lo farà.

+0

In che modo l'utilizzo delle autoproprie facilita l'aggiunta della verifica? – Rod

+5

È possibile modificare le proprietà autoproprie in seguito, e aggiungere il codice desiderato e le persone che utilizzano la DLL non dovranno ricompilare per utilizzare gli assembly aggiornati. – thecoop

3

proprietà, supportato da un campo privato.

This question potrebbe essere utile

+0

Qual è il vantaggio effettivo su un campo protetto? L'incapsulamento –

+1

per uno, e la possibilità di interrompere il debugger quando vi si accede lo rende anche utile. –

+0

Un vantaggio è la possibilità di inviare notifiche di modifica delle proprietà con, ad esempio, INotifyPropertyChanged. In generale, questo approccio (proprietà protetta supportata da un campo privato) promuove l'incapsulamento, cioè l'occultamento delle informazioni. Non rivelare l'implementazione a meno che tu non abbia una buona ragione per farlo. (Suppongo che la domanda sia incentrata su proprietà protette perché è coinvolta un'eredità.) – JMD

7

La pratica suggerita è quella di ne fanno una proprietà. La firma cambia a seconda che si tratti di un campo o di una proprietà, che può causare problemi se si attraversano gli assiemi. Se ne fai una proprietà per cominciare, non avrai mai questo problema. (spesso in seguito si desidera aggiungere logica quando la proprietà viene letta o scritta.)

In C#, l'implementazione automatica della proprietà è così semplice, non c'è motivo di non farlo.

Inoltre, rende le cose più chiare. Se è davvero pensato per essere usato dal mondo esterno come parte del funzionamento dell'oggetto, rendilo una proprietà. Altrimenti, un futuro programmatore potrebbe chiedersi se hai fatto un campo protetto invece che privato per sbaglio.

3

Non si dovrebbe mai consentire l'accesso diretto a una variabile membro al di fuori della propria classe. Utilizzare una proprietà generata automaticamente o una proprietà con un campo di supporto. Se si consente l'accesso diretto, può portare ad alcuni problemi di debug molto gravi quando più metodi cambiano quel valore in una catena di derivazione e non si sa quale sia la causa del bug.

2

So che questa domanda è obsoleta, ma vorrei rispondere in base all'ambito del valore e al punto in cui deve essere inizializzato o scritto. Cerco di usare il più stretto possibile. Speriamo che la seguente vi renderà più chiaro su come decidere:

valori protette: questo assume il valore ha solo bisogno di essere accessibile dalla classe base e/o la classe che eredita, e non da un codice esterno .. .

  1. Quando la classe eredita deve leggere, ma non deve modificare il valore:

    • Se il valore può essere scritto una volta nel costruttore della classe base, utilizzare il seguente, che previene la sottoclasse dalla scrittura ad esso, e fa un passo avanti e consente solo di essere impostato nel costruttore:

      protected readonly bool test;

    • Se il valore può essere scritto in un metodo diverso dal costruttore, ma solo nella classe base, utilizzare quanto segue, che impedisce alla classe ereditata di scrivervi, ma consente di leggere:

      protected bool Test { get; private set; }

  2. Quando la sottoclasse può modificare il valore, utilizzare i seguenti, che permette sia la sottoclasse e la classe di base per scrivere ad essa in qualsiasi punto:

    protected bool test;

valori private:. questo presuppone il valore ha solo bisogno di essere accessibile dall'interno della classe che viene dichiarata in

  1. Se può essere impostato solo una volta nel costruttore, utilizzare:

    readonly bool test;

  2. Se può essere impostato in qualsiasi punto della classe, utilizzare:

    bool test;

Inoltre, non dimenticare che se si dichiara come una proprietà, dovrebbe utilizzare PascalCase. Se lo dichiari come variabile membro, dovrebbe usare camelCase. Ciò renderà più semplice per gli sviluppatori la comprensione dell'ambito.

Problemi correlati