Domanda

Ho visto la maggior parte delle persone usa le variabili dei membri in una classe come:

string _foo;
public string foo { get { return _foo; }; private set { _foo = value}; }
.

Ma qual è la differenza di questo a questo?

public string foo { get; private set; }
.

È stato utile?

Soluzione

In casi semplici come quello è lo stesso ma in casi più complessi in cui gli eventi antincendio o qualcosa di cui hai bisogno di codice aggiuntivo nell'ottuale e impostato in modo da avere bisogno del membro ex:

private string _name;
public string Name
{
   get{ return _name; }
   set
   {
      SomeHandler("Name", value);
      _name = value;
   }
}
.

Altri suggerimenti

Finché l'implementazione della proprietà non fa in realtà nulla, ma ottenere e impostato, la differenza è piuttosto minore. Le ragioni per l'utilizzo possono essere:

    .
  • codice legacy prima di c # 3.0 (che ha aggiunto le proprietà automatiche, cioè. La sintassi public string Name { get; set; }.
  • aspettando di dover modificare l'implementazione del getter / setter ad un certo punto.
  • Requisiti per qualche serializzazione personalizzata.
  • Utilizzo del campo sottostante nel codice per qualsiasi motivo. Un buon esempio potrebbe utilizzare il campo di supporto come parametro ref su qualche metodo. Questo include anche cose come usare il valore in Interop nativo (GCHandle ecc.).
  • Semplice preferenza utente. Di solito non uso le proprietà automatiche, perché mi piace specificare manualmente i campi di supporto.
  • Utilizzo di un campo di supporto readonly è impossibile quando si utilizzano le proprietà automatiche.

Questa è solo la punta dell'iceberg. Ci sono anche tonnellate di ragioni strane, dicono di dover dichiarare esplicitamente il campo in modo che qualcuno possa accedervi usando la riflessione, per qualsiasi motivo.

Prima dell'introduzione di "Proprietà automatiche", dobbiamo usare un po 'di "campo di supporto" per le vocale.La maggior parte del tempo in cui le Propoerties restituiranno semplicemente il valore / impostare il valore nel "campo di supporto" come nel seguente esempio.

public string Name
{
   get { return _name; }
   set { _name=value; }
}
.

Con l'introduzione di "Proprietà automatiche" Possiamo semplicemente ignorare il "campo di supporto" (o non dobbiamo fornire uno).Questo è per lo più adatto se il tuo design è come l'esempio sopra, ma se è necessario applicare un 'tipo' di logica personalizzata durante il recupero del valore o prima di impostare il valore, abbiamo ancora bisogno di seguire il "buon vecchio design" (cioè conIl campo di supporto)

Diversi scenari danno vari vantaggi.

string _FirsName;   
string _LastName;   

public string FullName 
{ 
   get 
   { 
      return _FirsName + _LastName;
   }
   set; 
} 

public string ReverseName 
{ 
   get 
   { 
      return _LastName + ", " + _FirsName;
   }
   set; 
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top