2010-07-09 15 views
12

Podczas definiowania nowej klasy w projekcie, jaka jest najlepsza/najlepsza praktyka w tym zakresie? W przeszłości stworzyły zajęcia takie jak:Jak prawidłowo zdefiniować właściwości klasy?

public class MyClass 
    { 
     public string FirstName {get; set;} 
     public string LastName {get; set;} 
    } 

Normalnie bym użyć klasy takich jak to do stworzenia kolekcji w ramach projektu.

Jednak jak ja nadal się uczyć i czytać więcej o C Sharp widzę przykłady, gdzie klasy są definiowane jako:

class MyClass //not set to public 
    { 
     private string _firstName; //first defined as fields 
     private string _lastName; 

     public string FirstName // then defined as properties 
     { 
      get { return _firstName; } 
      set { _firstName = value; } 
     } 
     public string LastName 
     { 
      get { return _lastName; } 
      set { _lastName = value; } 
     } 
    } 

Czy pierwsze podejście błędne w definicji czy też jest to akceptowane skróconą wersję w ciągu C#? Jako najlepszą praktykę należy zawsze najpierw zdefiniować klasę z prywatnymi polami, a następnie zdefiniować je jako właściwości używając get/set do wartości?

Pytam, ponieważ jestem samoukiem w języku C# i staram się ulepszać i lepiej rozumieć poprawne podejście do rozwoju, a niektóre samouczki i tutoriale po prostu przedstawiają podejścia bez solidnego wyjaśnienia, dlaczego preferowane jest jedno podejście (lub powinno być zrobione) nad drugim.

góry dzięki

+0

W drugim przykładzie nie powinno być klamry zamykającej po polu _nazwa nazwy. To powinno być na końcu definicji klasy. Właściwości są nadal zdefiniowane w bloku klasy. (chyba, że ​​tam coś nie wiem o C#) –

Odpowiedz

16

Twój pierwszy przykład:

public class MyClass 
{ 
    public string FirstName {get; set;} 
    public string LastName {get; set;} 
} 

jest specjalnie Auto-Implemented Properties, wprowadzony w C# 3.0. Żaden format nie jest prawidłowy. Pierwszy jest bardziej "stenograficzny".

Przy bardziej złożonych typów, czasem jest nadal użyteczny używać starego stylu, i wystawiać tylko pewne właściwości lub wartości ze zmiennej prywatnej, takie jak:

public class MyClass 
{ 
    private Dictionary<int, List<string>> _someInternalDictionary; 

    public int MyValuesCount 
    { 
     get 
     { 
      return _someInternalDictionary.Values.Count; 
     } 
    } 

} 

surowy przykład, ale mam nadzieję, że masz mój pomysł.

+5

+1; pierwszy jest dużo wygodniejszy dla głupich właściwości i może być łatwo przekształcony w drugi, jeśli okaże się, że potrzebujesz logiki. – tzaman

+0

@tzaman: dobrze powiedziane. Moje myśli dokładnie. –

+0

jeszcze lepiej: pierwszy "głupi" można zautomatyzować od nowa do np. INOTifyPropertyChanged w czasie kompilacji z np. PostSharp – quetzalcoatl

13

skrótowej składni (auto realizowane Właściwości) w swoim pierwszym przykładzie został wprowadzony w C# 3.0, i nie było ważne przed potem. Kompilator faktycznie konwertuje je do pełnej postaci z polami kopii.

Przed C# 3.0 jedynym prawidłowym sposobem definiowania właściwości była obsługa pól.

Nawet jeśli używasz C# 3.0, jeśli chcesz mieć jakąkolwiek logikę we właściwościach, musisz przekonwertować je, aby użyć pól pomocniczych.

W skrócie - w przypadku właściwości niemych (tych, które nie robią nic), należy użyć właściwości automatycznych. Sprawiają, że kod jest prostszy i łatwiejszy do odczytania i można go przekonwertować.

+0

Dziękuję za wzmiankę o potencjalnym kroku konwersji automatycznych właściwości. Chciałbym również dodać, że publikowanie tych wartości jako właściwości automatycznych oznacza, że ​​można je później zmienić na właściwości ręcznie wspierane bez naruszania interfejsu na poziomie binarnym. Natomiast pola publiczne (ick!) Nie są binarnie zgodne z właściwościami publicznymi o tej samej nazwie. –

4

Te dwie klasy są w praktyce identyczne pod względem funkcjonalności i funkcji.

Celem automatycznej składni właściwości (pierwszej klasy) jest przedstawienie szybkiego sposobu zadeklarowania, co jest zasadniczo takie samo, jak druga klasa, którą pokazujesz.

chciałbym trzymać się pierwszej wersji, aż trzeba dodać kod do getter i setter (jak sprawdzanie nowej wartości dla właściwości.)

Celem automatycznego składni nieruchomości jest podwójny, to było częściowo dodane w celu ułatwienia Linq, a częściowo dodane w celu ułatwienia po prostu zadeklarowania właściwości, a nie pól publicznych.

Jeśli zadeklarujesz klasę przy użyciu właściwości automatycznych (ponownie, pierwsza wersja), wtedy wszystkie inne zestawy skompilowane z twoim kodem będą wiedzieli, że twoja klasa deklaruje te rzeczy jako właściwości, a nie pola. Jeśli później zdecydujesz, że musisz dodać kod, np. Sprawdzanie poprawności, te inne złożenia nie muszą być rekompilowane, ponieważ wciąż znajdują te właściwości.

+0

Czy mógłbyś wyjaśnić, w jaki sposób automatyczne właściwości ułatwiają LINQ? Sam nie widzę połączenia. – LukeH

+0

Zostały one dodane jako część pakietu anonimowych typów. –

+1

OK, nadal nie rozumiem, dlaczego były potrzebne dla Linq. Hm ... –

0

Można również użyć modyfikatora dostępu do pobierania i ustawiania ...

public {ReturnType} MyProperty { {Access Modifier}get; {Access Modifier}set; } 

I zakładamy, że masz już wiedzę Access Modifier.

Powiązane problemy