2010-02-12 13 views
7

Vedo questo tutto il tempo:Perché si usano variabili private con C# getter/setter?

private int _myint; 

    public int MyInt 
    { 
     get 
     { 
      return _myint; 
     } 
     set 
     { 
      _myint = value; 
     } 
    } 

A me questo sembra identica a:

public int MyInt{ get; set; } 

Allora perché non tutti fare la prima ... PERCHE 'IL VAR privato a tutti ?!

+6

C'è una variabile privata in * entrambi * casi, tuttavia nel secondo caso viene generata dal compilatore. –

risposta

31

Prima di tutto, questo è nuovo per C# 3.0, non c'era prima. In secondo luogo, se si desidera aggiungere una logica personalizzata al proprio getter e setter, non si ha scelta. Quindi sì, nel tuo esempio in cui non esiste una logica personalizzata, è la stessa cosa (in effetti il ​​compilatore genera ciò per te dietro le quinte) ma se vuoi generare un evento per esempio, o qualcosa del genere, devi essere esplicito a proposito.

+3

esempio perfetto di ciò a cui si riferisce BFree per gli eventi è in MVVM, dove è necessario aumentare PropertyChanged per far sì che la GUI rifletta il nuovo valore di associazione dati. – Dave

4

Prima di tutto, la sintassi che hai usato è nuova. Non esisteva nelle versioni precedenti di C#.

In secondo luogo, è necessaria la variabile privata se si ha un valore predefinito o pigro-caricare il risultato.

2

Ti piace qualcuno che non conosci scherzare con le tue parti intime? Spero di no. Questo è un modo per fornire ciò che è essenzialmente un proxy per qualcosa che possiedi ma non vuoi cedere il controllo. Se decidi di voler convalidare che gli int sono positivi, puoi iniziare a farlo se codifichi come mostrato.

C# rende questo trasparente ora con proprietà automatiche.

2

Prima di C# 3, quello era l'unico modo per farlo. Le proprietà implicitamente tipizzate non erano ancora disponibili. La gente voleva ancora ritirare il membro privato. Se gli sviluppatori continuano a farlo in C# 3, non sono a conoscenza delle nuove modifiche o devono fornire una logica get/set personalizzata.

1

era una funzionalità aggiunta in C# 3.0 denominata Proprietà automatiche. C# 2.0 non supporta questo e richiede la variabile privata con getter e setter espliciti. Pertanto, un codice molto più vecchio o un codice compatibile all'indietro utilizzerà i getter e setter espliciti.

2

Questo è il vecchio modo di farlo. Il modo in cui preferisci ("proprietà automatiche") è un costrutto relativamente nuovo nella lingua. Alcuni anni fa, abbiamo sempre dovuto usare variabili private.

Potrebbero esserci altri motivi per utilizzare anche variabili private, sebbene non nel semplice esempio fornito dall'utente. Se, ad esempio, è necessario inizializzare la proprietà con un valore predefinito, non è possibile farlo in modo pulito con le proprietà automatiche; invece è necessario inizializzarsi nei costruttori.

6

mi piacerebbe vedere di più

public int MyInt{ get; private set; } 

,;)

ma @BFree inchiodato

+0

bene come farei il "set privato" allora in quella classe? – herzmeister

+0

@hdw: puoi impostarlo nella classe, non puoi impostarlo al di fuori della classe. – Steve

+0

Io uso molto questo modello nel caso di classi in cui ho "proprietà di dumping"; tuttavia, come menzionato in altre risposte, la proprietà automatica preclude qualsiasi logica personalizzata che potrebbe dover essere necessaria durante l'acquisizione o l'impostazione. –

1

Se si guarda l'output prodotto dal compilatore con uno strumento come un riflettore campo privato è stato aggiunto

4

Un esempio di espansione su ciò che @BFree sta dicendo:

private int _Whatever; 
public int Whatever 
{ 
    get {return _Whatever;} 
    set 
    { 
     if(value != _Whatever) 
     { 
      // It changed do something here... 
      // maybe fire an event... whatever 

     } 

     _Whatever = value; 

    } 
} 
Problemi correlati