c #: getter / setter

109

Widziałem gdzieś coś podobnego do następującego i zastanawiałem się, co to oznacza. Wiem, że są to metody pobierające i ustawiające, ale chcę wiedzieć, dlaczego typ ciągu jest zdefiniowany w ten sposób. Dziękuję za pomoc.

public string Type { get; set; }
Maya
źródło
4
Nazywa się to Auto-Property, spójrz na to: msdn.microsoft.com/en-us/library/bb384054.aspx
Allov.
To jest definicja nazwanej właściwości "Type", której typem .NET jest System.string. Nie ma w tym nic więcej.
Jon
2
Myślę, że może mylić nazewnictwo Auto-Property z klasą Reflection System.Type. msdn.microsoft.com/en-us/library/system.type.aspx
eandersson

Odpowiedzi:

178

Są to właściwości zaimplementowane automatycznie (w skrócie właściwości automatyczne).

Kompilator automatycznie wygeneruje odpowiednik następującej prostej implementacji:

private string _type;

public string Type
{
    get { return _type; }
    set { _type = value; }
}
Justin Niessner
źródło
2
@barlop jako osoba pochodząca z Google, bez pojęcia, co należy zaktualizować? Czy pan Hassans odpowiada, co masz na myśli? dzięki.
Aethenosity,
1
@Aethenosity z perspektywy czasu Myślę, że jest w porządku .. Myślałem w kategoriach przykładów ustawiacza getter. Osoba pytająca ma poprawny przypadek ustawiającego getter, który jest znacznie bardziej zwięzły (jako jeden liniowiec / nie jest potrzebne drugie pole). Możesz również wpisać public int b { get { return b * 2; } } drugie pole nie jest potrzebne. Ale myślę, że jeśli masz setera z ciałem, potrzebujesz drugiego pola. A ten przedstawia setera z ciałem. Chociaż robi to samo, co jedna linijka pytającego.
barlop
2
@Aethenosity istnieje również c # 7, dzięki czemu na pewno potrzebujesz drugiego pola, gdy ustawiacz ma treść, ale ma =>składnię i nie ma słowa kluczowego return. Chociaż nie o to mi chodziło. Miałem na myśli to, że drugie pole jest niepotrzebne, chociaż od tego czasu stwierdziłem, że drugie pole jest czasami potrzebne. W tym przykładzie drugie pole nie jest konieczne (bo zrobiłby to domyślny ustawiacz bez ciała), ale osoba odpowiadająca wstawiała je (treść ustawiająca i drugie pole), aby wyjaśnić pytającemu, jaka jest ich linia bez elementu drugie pole robiło.
barlop
33

To jest własność automatyczna i jest to skrótowa notacja:

private string type;
public string Type
{
  get { return this.type; }
  set { this.type = value; }
}
Teoman Soygul
źródło
4
... poza tym, że pole zapasowe nie jest dostępne.
Vlad
7
... dlatego nazywa się to polem zapasowym .
Teoman Soygul
5
Niemniej jednak powinieneś widzieć to jak <Type>k__BackingFieldz refleksją.
Vlad
25

W C # 6:

Teraz można zadeklarować właściwości automatyczne jako pole:

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

Właściwości automatyczne tylko do odczytu

public string FirstName { get;} = "Ropert";
M.Hassan
źródło
13
public string Type { get; set; } 

Nie różni się od robienia

private string _Type;

public string Type
{    
get { return _Type; }
set { _Type = value; }
}
Security Hound
źródło
5

Jest to właściwość wspierana automatycznie, w zasadzie odpowiednik

private string type;
public string Type
{
   get{ return type; }
   set{ type = value; }
}
Jamiec
źródło
4

Nazywa się to właściwościami automatycznymi.

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

Funkcjonalnie (i pod względem skompilowanej IL) są takie same jak właściwości z polami zapasowymi.

Jeff
źródło
1
Czy nadal możesz odwoływać się do prywatnego _typu lub typu w klasie, czy po prostu używasz Type?
mikey
2
Nie, ALE możesz określić modyfikator dla właściwości auto: public string Type {get; zestaw prywatny; }
Jeff,
W takim przypadku nie możesz uzyskać dostępu do _type.
Security Hound
1
W takim razie this.Type = "foo"; powinno być OK, ale z zewnątrz instance.Type = "foo"; nie będzie .. Te rekwizyty automatyczne są z pewnością pomocnym dodatkiem do języka. Dzięki.
mikey
1

Wiem, że to stare pytanie, ale wraz z wydaniem C # 6 możesz teraz zrobić coś takiego dla prywatnych nieruchomości.

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

public string myProp { get; }
Anonimowy
źródło
2
możesz ustawić wartość początkową bezpośrednio w C # 6: public string myProp {get; } = "jakaś wartość") bez konstruktora;
M.Hassan
1

Możesz również użyć wyrażenia lambda

public string Type
{
    get => _type;
    set => _type = value;
}
Ahmad Aghazadeh
źródło