proprietà in C #

Perché siamo in grado di scrivere

public int RetInt { get;set; } 

invece di

 public int RetInt { get{return someInt;}set{someInt=value;} } 

Qual è la differenza tra i due?

Questa funzione è chiamata proprietà implementate automaticamente e introdotte con C # 3.0

In C # 3.0 e versioni successive, le proprietà auto-implementate rendono la dichiarazione di proprietà più concisa quando non è richiesta alcuna logica aggiuntiva negli accessor di proprietà. Inoltre, consentono al codice client di creare oggetti. Quando si dichiara una proprietà come illustrato nell’esempio seguente, il compilatore crea un campo di backup anonimo privato a cui è ansible accedere solo tramite gli attributi get e set della proprietà .

 class Customer { // Auto-Impl Properties for trivial get and set public double TotalPurchases { get; set; } public string Name { get; set; } public int CustomerID { get; set; } 

Per la tua domanda

Qual è la differenza tra i due?

Nel tuo caso, nessuno. Dato che non stai facendo nulla durante l’impostazione o il recupero del valore, ma supponiamo di voler fare qualche convalida o di voler eseguire altri tipi di controllo, allora:

 private int someInt; public int RetInt { get { if (someInt > 0) return someInt; else return -1; } set { someInt = value; } // same kind of check /validation can be done here } 

Quanto sopra non può essere fatto con le proprietà Auto implementate.

Un’altra cosa in cui è ansible vedere la differenza è quando si inizializza una proprietà del tipo di class personalizzata.

Se hai un elenco di MyClass in caso di proprietà Normal, il suo campo di supporto può essere inizializzato / istanziato diverso dal costruttore.

 private List list = new List(); public List List { get { return list; } set { list = value; } } 

In caso di proprietà implementata automaticamente,

 public List SomeOtherList { get; set; } 

Puoi solo inizializzare SomeOtherList nel costruttore, non puoi farlo a livello di campo.

Come sono questi due diversi?

Ci sono diversi almeno di 2 punti:

  1. Nella proprietà normale devi definire un campo prima ( someInt nel tuo caso)
  2. Nella proprietà normale è ansible impostare un punto di interruzione nel set/get modificatori, invece nella proprietà auto non può farlo.

In altre parole: se hai bisogno di “solo proprietà”, usa le proprietà automatiche, se hai bisogno di più controllo sul stream di lavoro (genera un evento sul set , esegui il debug, esegui altre cose all’interno), usa proprietà “normali”.

Queste sono proprietà auto implementate. Per ulteriori informazioni, consultare http://msdn.microsoft.com/en-us/library/bb384054.aspx .

Il motivo principale per cui questi sono stati introdotti è stato quello di ridurre il sovraccarico del programmatore nella creazione di una variabile privata come someInt che aveva poco senso dell’uso in una proprietà.

In realtà questi non sono molto diversi, in entrambi i casi hai un campo privato che corrisponde alla tua proprietà, ma nel primo caso viene generato dal compilatore e nascosto.

Se hai bisogno di usare la variabile dietro la proprietà abbastanza spesso nella tua class, penso sia meglio dichiarare la tua proprietà alla vecchia maniera (2a), perché ogni volta che accederai a questo chiamerai il getter se lo farai ” nuovo modo.

Se ne hai solo bisogno da usare al di fuori della tua class (o nella maggior parte dei casi), allora puoi andare con il “nuovo” modo (1 °)