2009-03-26 11 views
32

Więc tutaj jest trochę składni, której nigdy wcześniej nie widziałem, czy ktoś może mi powiedzieć, co to oznacza? Nie jestem pewien, czy ma to być skrót na abstrakcyjną deklarację własności lub coś lub co.C# Stenografia skrócona Właściwość Pytanie

public Class1 myVar { get; set; } 

Na ile to możliwe, Klasa 1 jest klasą abstrakcyjną.

Odpowiedz

82

W języku C# 3.0 i nowszych wersjach auto-implemented properties deklaracja właściwości jest bardziej zwięzła, gdy nie jest wymagana dodatkowa logika w akcesoriach właściwości. Umożliwiają one również kod klienta do tworzenia obiektów Po zadeklarowaniu właściwości, jak pokazano w poniższym przykładzie, kompilator tworzy prywatne, anonimowe pole pomocnicze, do którego dostęp można uzyskać tylko za pomocą właściwości get i set accessors.

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

Chciałbym zagłosować za bardziej szczegółowym wyjaśnieniem, ale nie mogę się doczekać dnia. – TheTXI

0

Automatyczne programy pobierające i ustawiające.

7

To się nazywa właściwość automatyczna lub auto-implemented i nie jest abstrakcyjna. Możesz użyć tej właściwości tak, jak jest. Kompilator utworzy dla niego magazyn zaplecza za kulisami.

To bardzo przypomina użycie pola zamiast właściwości, ale uzyskuje się semantykę właściwości i można jej używać do takich funkcji, jak wiązanie danych wymagających właściwości.

+0

Później możesz przejść do jawnej implementacji bez zmiany interfejsu dla swoich rozmówców. –

27

Jest to składnia, która pozwala kompilatorowi utworzyć dla Ciebie (ukryte) pole.

Również bardzo przydatny jest:

public Class1 myVar{ get; private set; } 
+0

'protected" działa również. Podobnie jak "prywatny". Jestem prawie pewien, że możesz ustawić dostępność dla 'get', ale nigdy nie próbowałem. –

+1

+1 to jest dokładnie to, czego szukałem. Chciałem coś dołączyć w skrócie, więc operacja 'set' może być wykonana tylko przez funkcje klasy. Dzięki :-) – shashwat

7

Jest skrótem dla nieruchomości, która nie robi nic więcej, że przechowywanie wartości w polu. Więc byłoby to równoznaczne z:

private Class1 _myVar; 

public Class1 myVar 
{ 
    get{ return _myVar; } 
    set{ _myVar = value;} 
} 

jej tylko prostego nieruchomości, która mogłaby zastąpić rdr o bardziej skomplikowanej evantuation w późniejszym czasie bez zmiany interfejsu.

2

Są to właściwości Auto-implementacji. Pozwalają ci uczynić twój kod bardziej zwięzłym. Możesz przeczytać więcej o nich tutaj:

Auto-Implement

Można również dokonać akcesory mają różne poziomy dostępu:

public int MyVar {get; prywatny zestaw; }

Umożliwia to ujawnienie właściwości na zewnątrz klasy i nadal ustawia ją wewnętrznie.

22

Może to wyglądać jak abstrakcyjna właściwość lub własność z interfejsu, ale jest daleko od niej. Aby zachęcić programistów do korzystania z właściwości (ponieważ są to najlepsze praktyki z wielu powodów) firma Microsoft zdecydowała się włączyć tę funkcję do języka C# 3, aby umożliwić użytkownikowi łatwiejsze deklarowanie właściwości.

Oto standardowy sposób tworzenia właściwość:

String foo; 

public String Foo 
{ 
    get { return this.foo } 
    set { this.foo = value; } 
} 

Teraz to wymaga sporo pisania, jak i programiści są leniwi do rdzenia czasami jesteśmy kuszeni, aby utworzyć pola publiczne tylko zaoszczędzić trochę czasu .

Teraz z kompilatora C# 3 możemy to zrobić:

public String Foo { get; set; } 

Choć wygląda to nieco dziwnie, za pracę, że kompilator robi w Twoim imieniu. Poprzedni kod zostanie skompilowany do tego:

[CompilerGenerated]  
private string <Foo>k__BackingField; 

public string Foo 
{ 
    [CompilerGenerated] 
    get 
    { 
     return this.<Foo>k__BackingField; 
    } 
    [CompilerGenerated] 
    set 
    { 
     this.<Foo>k__BackingField = value; 
    } 
} 

Więc choć składnia wygląda nieco dziwnie nadal tworząc własność dokładnie tak, jak jesteśmy przyzwyczajeni.