c #: getter / setter


109

Ho visto qualcosa di simile da qualche parte e mi chiedevo cosa significasse. So che sono getter e setter, ma voglio sapere perché la stringa Type è definita in questo modo. Grazie per aiutarmi.

public string Type { get; set; }


4
Questo è chiamato un Auto-proprietà, dare un'occhiata a questo: msdn.microsoft.com/en-us/library/bb384054.aspx
Allov

Questa è la definizione di una proprietà denominata "Type", il cui tipo .NET è System.string. Non c'è più niente da fare.
Jon

2
Penso che potrebbe confondere la denominazione della proprietà automatica con la classe di riflessione System.Type. msdn.microsoft.com/en-us/library/system.type.aspx
eandersson

Risposte:


178

Quelle sono proprietà implementate automaticamente (proprietà automatiche in breve).

Il compilatore genererà automaticamente l'equivalente della seguente semplice implementazione:

private string _type;

public string Type
{
    get { return _type; }
    set { _type = value; }
}

2
@barlop come qualcuno che viene da google, senza idea, cosa deve essere aggiornato? M. Hassans risponde a quello che intendi? Grazie.
Etenosità

1
@ Etenosity in retrospettiva Penso che sia ok .. Stavo pensando in termini di esempi di getter setter. L'interrogante ha un caso valido di getter setter che è molto più succinto (come una riga / nessun secondo campo necessario) .. Puoi anche scrivere public int b { get { return b * 2; } } nessun secondo campo necessario. Ma penso che quando hai il palleggiatore con un corpo allora hai bisogno del secondo campo. E questo mostra un setter con un corpo. Anche se fa lo stesso della battuta dell'interrogante.
barlop

2
@Aethenosity c'è anche c # 7 per cui sicuramente hai ancora bisogno del secondo campo quando il setter ha un corpo, ma ha una =>sintassi e nessuna parola chiave di ritorno. Anche se non era quello che avevo in mente. Pensavo che il secondo campo non fosse necessario, anche se da allora ho scoperto che il secondo campo a volte è necessario. Nell'esempio qui il secondo campo non è necessario (perché un setter predefinito senza corpo lo farebbe), ma chi ha risposto lo stava inserendo (corpo del setter e secondo campo), per spiegare all'interrogante quale sia la loro linea senza il secondo campo stava facendo.
barlop

33

Questa è una proprietà automatica ed è la notazione abbreviata per questo:

private string type;
public string Type
{
  get { return this.type; }
  set { this.type = value; }
}

4
... tranne che il campo di supporto non è accessibile.
Vlad

7
... motivo per cui si chiama backing field .
Teoman Soygul

5
Tuttavia, dovresti essere in grado di vederlo come se <Type>k__BackingFieldriflettesse.
Vlad

25

In C # 6:

È ora possibile dichiarare le proprietà automatiche solo come un campo:

public string FirstName { get; set; } = "Ropert";

Proprietà automatiche di sola lettura

public string FirstName { get;} = "Ropert";

13
public string Type { get; set; } 

Non è diverso quindi fare

private string _Type;

public string Type
{    
get { return _Type; }
set { _Type = value; }
}


5

È una proprietà supportata automaticamente, sostanzialmente equivalente a

private string type;
public string Type
{
   get{ return type; }
   set{ type = value; }
}

4

Queste sono chiamate proprietà auto.

http://msdn.microsoft.com/en-us/library/bb384054.aspx

Funzionalmente (e in termini di IL compilato), sono gli stessi delle proprietà con campi di supporto.


1
Puoi ancora fare riferimento al tipo o al tipo privato all'interno della classe, oppure usi semplicemente Type?
mikey

2
No, MA puoi specificare il modificatore per la proprietà auto: public string Type {get; set privato; }
Jeff

In questo caso non sarai in grado di accedere a _type.
Segugio della sicurezza

1
Quindi in questo caso this.Type = "foo"; dovrebbe essere OK, ma dall'esterno instance.Type = "foo"; non .. Questi oggetti di scena per auto sono sicuramente un'utile aggiunta alla lingua. Grazie.
mikey

1

So che questa è una vecchia domanda, ma con il rilascio di C # 6, ora puoi fare qualcosa di simile per le proprietà private.

public constructor()
{
   myProp = "some value";
}

public string myProp { get; }

2
puoi impostare il valore iniziale direttamente in C # 6: public string myProp {get; } = "qualche valore") senza costruttore;
M. Hassan

1

Puoi anche usare un'espressione lambda

public string Type
{
    get => _type;
    set => _type = value;
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.