2012-02-13 5 views
11

Nie ma (jednoznacznego) odniesienia do pierwszej zmiennej prywatnej, którą FirstName ma ukrywać. Czy możesz wyjaśnić, jak to działa? Zakładam, że istnieje pewna zmienna prywatna, która jest pobierana i ustawiana. Dzięki.Gdzie/czym jest prywatna zmienna we własnościach z automatycznym wdrożeniem?

// auto-implemented property FirstName 
public string FirstName { get; set; } 
+0

To jest duplikatem. Zobacz powiązane linki z boku. – leppie

+0

możliwy duplikat [C# 3.0: Właściwości automatyczne - jaka byłaby nazwa zmiennej prywatnej utworzonej przez kompilator] (http://stackoverflow.com/questions/1277018/c-sharp-3-0-automatic-properties-what- to-be-the-name-of-private-variable-c) – nawfal

Odpowiedz

25

Zasadniczo kompilator konwertuje kod na coś takiego:

private string <__>firstName; 

public string FirstName 
{ 
    get { return <__>firstName; } 
    set { <__>firstName = value; } 
} 

to jest mało prawdopodobne, aby być dokładną nazwę, ale użycie nawiasów ostrych w nazwie jest ważne - ponieważ sprawia, że ​​jest to niewymowna nazwa . (To nieoficjalna terminologia, ale szeroko stosowana - nie wiem, czy Eric Lippert ją ukuł, czy był po prostu pierwszą osobą, która użyła go w czymś, co przeczytałem.) Jest to nazwa, która nie jest prawidłowym identyfikatorem C#, ale z której CLR jest zadowolony. Że ma dwie zalety:

  • Kompilator nie trzeba się martwić o kolizji nazewnictwa z swoimi identyfikatorów
  • Kompilator nie trzeba się martwić o to, czy starasz się odnieść do pola w twój własny kod - nie możesz, bo nazwa jest niewypowiedziana!

Wykorzystuje tę samą technikę dla wszelkiego rodzaju innego kodu wygenerowanego - anonimowych typów, funkcje anonimowe, bloki iteracyjnej itp

+7

Myślę, że nauczyłem się tego argot od Andersa; Nie wiem, skąd go wziął. –

8

tak, the compiler creates a private, anonymous backing field that can only be accessed through the property's get and set accessors. (c) msdn

EDIT:
Podczas definiowania własności, kompilator będzie emitować 2 metody: get_XXX i set_XXX. Gdy kompilator C# zobaczy kod, który próbuje uzyskać lub ustawić właściwość, kompilator faktycznie wysyła wywołanie do jednej z tych metod. (c) "CLR przez C#"

2

innych facetów nie odpowiedział, ale trochę dalej ... informacji można znaleźć pole podkładową w czasie wykonywania przy użyciu odbicia. Poszukaj pól z nazwami takimi jak < < PropertyName >> k__BackingField.

Kolejny post, które mogą pomóc:

Powiązane problemy