2009-12-24 22 views
6

myślę, że było w .NET 2.0, Microsoft wprowadził akcesor, który został skrócony do czegoś jakaccessor Public .net

public string Name { get; set; }

Ale czy istnieje prawdziwa różnica pomiędzy powyższym kodem, i po prostu:

public string Name; 
+1

Możesz przeczytać to: http://stackoverflow.com/questions/1019571/why-do-we-use-net-properties-instead-of-plain-old-get-set-functions –

+1

http: //stackoverflow.com/questions/1272521/propertywith-no-extra-processing-vs-public-field – Groo

+1

To jest funkcja aC# 3.0 (.NET 3.5), aby być dokładnym –

Odpowiedz

6

Główną różnicą jest to, że jeśli później trzeba dodać logikę do swojej getter i setter i innych bibliotek DLL zostały już skompilowane przeciwko Ciebie, można łatwo zmienić

public string Name { get; set; } 

do

public string Name { get{/*special code*/} set{/*special code*/} } 

i nie będzie to przełomowa zmiana w celu opublikowania nowej biblioteki DLL, a inne pliki DLL nie będą rekompilowane.


natomiast jeśli zmieniłeś

public string Name; 

do

public string Name { get{/*special code*/} set{/*special code*/} } 

następnie musisz upewnić się, że wszystkie pliki DLL są zrekompilowane wykorzystują je, ponieważ zmieniają one dostęp do pola dostęp do nieruchomości.

Jest to oczywiście większy problem, gdy dostarczane DLL do innych programistów (jako projekt open source lub jako składnik sprzedawca na przykład) niż jeśli jesteś po prostu budowanie aplikacji dla własnego self/pracodawcy

+0

Interesujące, dlaczego w drugim przypadku skompilowany kod jest inny. Jaki jest cel kompilowania pola, aby wszyscy klienci wymagali przebudowania, gdy tylko pole zostanie zastąpione przez właściwość. –

+0

ponieważ w MSIL dostęp do właściwości jest specjalnym rodzajem wywołania metody, podczas gdy dostęp do pola to tylko dostęp do pola. –

+2

Jako przykład różnicy: możesz użyć pola jako parametru "out" lub "ref" dla pewnej metody, ale nie możesz tego zrobić dla właściwości. Więc kod, który używał pola w ten sposób, ulegnie zerwaniu, jeśli zmienisz go na właściwość. –

4

różnica pomiędzy Field i Property. Pole jest po prostu zmienną składową w instancji klasy. Natomiast właściwość jest skrótem dla dwóch odrębnych działań - get i set:

public string Name 
{ 
    get 
    { 
     return _name; 
    } 
    set 
    { 
     _name = value; 
    } 
} 

private string _name; 

To jest zbyt uproszczony przykład, jako własność po prostu „zawija” pole prywatnym poprzez odesłanie go w getter i ustawienie go w setera. Jednak właściwości stają się bardzo przydatne, gdy stają się "bramami" do wartości bazowej. Jeśli program wymaga przepływu coś się stało za każdym razem wartość pola jest ustawiony (powiedzmy, zdarzenie jest zwolniony), może być zwolniony z seter nieruchomości:

set 
{ 
    this.InvokePropertyChangedEvent(); 
    _name = value; 
} 

dokładnej składni pytasz o jest nazywane Auto-Implemented Properties, co jest skrótem dla prostego przykładu, który podałem powyżej. Kompilator tworzy prywatnego członka, który został ustawiony i ustawiony przez właściwość.

+1

@Rex: Ale nie o to pytano. Pytanie dotyczy różnicy między deklaracjami, a nie różnicy między polem a własnością. –

+0

@ Pełne wyjaśnienie różnicy między tymi dwiema deklaracjami wymaga informacji w tle, że nie możemy założyć, że OP już istnieje. Krótki kawałek, którego szukasz, jest na końcu. –

+0

Chciałem napisać o podniesieniu wydarzeń w mojej odpowiedzi, ale znowu to nie jest pytanie. –

4

Właściwości automatyczne zostały po raz pierwszy wprowadzone w języku C# 3.0. Różnica pomiędzy:

public string Name { get; set; } 

i

public string Name; 

jest to, że najpierw deklaruje property natomiast druga field. W właściwościach OOP są używane do enkapsulacji pól. Właściwość może mieć wartość setter lub getter lub obie i można również określić inny poziom dostępności dla każdego z nich.

1

Tak, kod w drugiej linii udostępniasz bezpośrednio członkowi w pamięci, podczas gdy w pierwszym wierszu masz jeden poziom niezależności, w którym możesz dodać logikę w przyszłości, aby sprawdzić i leniwy przydzielić.

Ponadto, jeśli użyjesz odbicia, będziesz musiał wyszukać Setter właściwości i Getter dla pierwszej przykładowej linii i dla sekundy, którą musisz bezpośrednio pobrać zmienną składową.

Zazwyczaj użycie właściwości jest o wiele lepszym projektem.

2

Różnica między skróconą deklaracją właściwości jest taka, że ​​można ją zdefiniować w ten sposób.

public string Name { get; private set; } 

Oznacza to, że nieruchomość może być czytana publicznie, ale mogą ją wpisać tylko członkowie prywatni. Nie możesz zrobić czegoś takiego dla pola.

Jeśli spojrzeć na wygenerowanym IL z oświadczeniach majątkowych krótki ręki, będzie okaże się, że kompilator dodała /generowanych automatycznie członków pól do właściwości będzie czytać z lub pisać na.

+0

Umożliwia dodanie modyfikatora dostępu. Używał różnego dostępu w geterze i selektorze wiele razy, ale nie w deklaracji skróconej. Zastanawiam się również nad tym pytaniem, ale nie mogłem zawracać sobie głowy pytaniem. Teraz jest jaśniej. Chociaż nie będę zaskoczony, jeśli pojawią się inne różnice. –

2

Nie ma żadnej różnicy funkcjonalnej w zakresie pisania kodu, aby uzyskać wartość lub zapisać ją. Ale zdarzają się sytuacje, w których osoba dzwoniąca może oczekiwać pola lub własności i zaakceptowałaby tylko jedno lub drugie, używając refleksji. Na przykład WPF może wiązać tylko do właściwości, a nie do pola.

0

Jedną z użytecznych różnic, które znalazłem dla użytkowników propertygrid było to, że używając publicznego ciągu znaków Nazwa {get; zestaw; } możemy ustawić dane źródłowe w Propertygrid łatwo.

podczas zadeklarowania publicznej nazwy ; nie będzie pełnić funkcji Propertygrid.

Powiązane problemy