2009-09-30 6 views
6

Podam przykład:Najlepsza praktyka dla właściwości Auto-implementacji C# i zmiennej lokalnej różniących się tylko przypadkiem?

public class MyClass 
{ 
    public string MyProperty { get; set; } 

    public MyClass(string myProperty) 
    { 
     MyProperty = myProperty; // bad? 
     this.MyProperty = myProperty; // good? 
    } 
} 

Wziąłem do korzystania this w tym scenariuszu, ponieważ mam drobne paranoję, że opierając się na razie w spokoju może być mylące lub gorzej w rzeczywistości może prowadzić do błędów.

Co to jest "najlepsza praktyka" tutaj?

EDIT:

tej pory, to brzmi jak to jest dużo bardziej subiektywne niż myślałem. Domyśliłem się, że ludzie zejdą mocno z jednej lub drugiej strony.

+0

StyleCop "zdecydowanie zachęca" do używania 'tego. –

+0

@ 280Z28, StyleCop * zawsze * zachęca do używania' this', lub tylko w przypadkach, gdy istnieje zmienna lokalna, która różni się tylko przypadkiem? – devuxer

+0

Byłem w sklepach, które robią obie - usunąć lub zlecić włączenie. Tak czy inaczej nie odczuwam tego zbyt mocno :) – womp

Odpowiedz

12

Użycie "this." jest zbędne w dowolnej klasie. Od twojego sklepu deweloperskiego zależy wyznaczenie standardu jego używania.

Zaletą używania "this." jest to, że niektórym programistom łatwiej jest skojarzyć je w umyśle z instancją klasy, gdy czytają kod, a jak wspomniałeś, spraw, aby były jaśniejsze podczas pracy z podobnie nazwanymi przedmiotami.

Wady są takie, że niektórzy ludzie postrzegają to jako zagracenie twojego pliku kodu i jeśli używasz narzędzi takich jak ReSharper, domyślnie oznaczyli go jako kod nadmiarowy.

+0

BTW - Resharper ma opcje wymuszania tego, szczególnie jeśli używasz czegoś takiego jak StyleCop dla Resharper. –

+2

"ten" nie jest całkowicie zbędny. Jeśli masz lokalną zmienną o nazwie "myThing" i zmienną instancji o nazwie "myThing", to "myThing" odwołuje się do zmiennej lokalnej, a "this.myThing" odwołuje się do zmiennej instancji. –

+1

Moje wspomnienie jest takie, że 'this.myVariable' jest zalecany, aby uniknąć użycia węgierskiej notacji. W tym przypadku zaleca się 'this.myVariable' zamiast' m_myVariable'. –

0

Obie opcje zależą wyłącznie od przypadku. Nie ma różnicy między tymi wersjami.

+0

Pewnie, że jest. Jeden ma 5 dodatkowych znaków, które czyta każdy, kto ogląda kod, co może pomóc lub przeszkodzić czytelnikowi w zrozumieniu. – Brian

+1

Czekaj, ale czy w rzeczywistości * nie powiedzie się 'MyProperty = this.myProperty?'. Innymi słowy, czy "to" nie gwarantuje, że to, co nadejdzie, jest własnością lub zmienną na poziomie klasy? Jeśli tak, jak można powiedzieć, że jedyna różnica to przypadek? – devuxer

5

Jak powiedział womp. "to" jest zbędne, ale czyni kod łatwiejszym do odczytania. Lub raczej trudniejsze do odczytania.

0

Moim zdaniem "najlepsza praktyka" to "nie rób tego". Jeśli natknę się na to w recenzowanym przeze mnie kodzie, natychmiast go podbiję. Posiadanie dwóch zmiennych różniących się tylko przypadkiem to nieporozumienie, które tylko czeka. To zbyt proste, aby programista obsługi technicznej pojawił się kilka miesięcy lub lat później i nieumyślnie dokonał przypisania do myThing zamiast MyThing.

Dodano później:

commenter poprosił o moją propozycją zastąpienia górna/dolna przypadku konwencji nazewnictwa. Do tego potrzebuję konkretnego przykładu. Załóżmy, że masz prosty Book klasę, która ma tylko jedną właściwość: Title:

public class Book 
{ 
    public string Title { get; private set; } 
} 

teraz trzeba konstruktora. Wspólna konwencja jest użycie małą wersję właściwości:

public Book(string title) 
{ 
    Title = title; 
} 

Albo, jeśli chcesz, aby upewnić się, że nie ma dwuznaczności: this.Title = title.

Można argumentować, że jest to w porządku w konstruktorach. I może tak być, gdyby wszyscy konstruktorzy byli tak prości. Ale moje doświadczenie było takie, że gdy konstruktor wykracza poza zaledwie kilka linii, rozróżnienie pomiędzy Title i title zostaje utracone. Problem staje się gorszy, gdy mówimy o metodach innych niż konstruktorzy. Tak czy inaczej, potrzebujesz innej konwencji.

Czego używać? Różnie używałem i widziałem używane skróty w parametrach: ttl, na przykład.Lub coś w rodzaju bookTitle, które jest bardziej opisowe podczas używania IntelliSense. Moim zdaniem albo jest lepsze od konwencji używania nazwy, która różni się tylko przypadkiem.

+0

Czy masz konwencję nazewnictwa, która pozwala uniknąć tego problemu? Nienawidzę zacząć nazywać wszystkich moich lokalnych "localMyThing". Jest to w zasadzie węgierska notacja. – devuxer

+0

To jest trywialne, aby ustawić StyleCop tak, że wszelkie odniesienia do właściwości (i pól) muszą być kwalifikowane przez "to", które renderuje "zbyt łatwo nieumyślnie przydzielić niewłaściwą rzecz" argumentem argumentu. –

+0

@ Jim, dzięki za wyjaśnienie. Lubię "bookTitle". – devuxer

2

C# jest zdecydowanie wielkość liter, więc nie ma żadnego ryzyka w użyciu ...

myProperty = myProperty;

Tak więc szukałbym innych najlepszych praktyk, takich jak pisanie najmniejszej ilości kodu potrzebnego do osiągnięcia celu (podczas samodzielnego dokumentowania). Prawda jest taka, że ​​nie jest wymagana, minimalistyczni mogą powiedzieć, że ją opuścili.

1

W moim miejscu pracy standardy kodowania nakazują zapisywanie właściwości LikeThis, podczas gdy zmienne lokalne są napisane tak. This is this. Ponieważ w języku C# rozróżniana jest wielkość liter, jest to dobre narzędzie do rozróżniania zmiennych. Jeśli jednak znajdziesz się z właściwością i zmienną lokalną o dokładnie takiej samej nazwie, użycie tego słowa kluczowego zdecydowanie rozróżni użycie.

2

Oto jak ja obecnie zainicjować właściwości za swój przykład (zarówno auto-wdrożone i nie)

 public class MyClass 
    { 
     public string MyProperty { get; set; } 

     public string AnotherProperty 
     { 
      get { return _anotherProperty; } 
      set { _anotherProperty = value; } 
     } 
     private string _anotherProperty; 

     public MyClass(string myProperty, string anotherProperty) 
     { 
      MyProperty = myProperty; // auto-implemented property initialization 
      _anotherProperty = anotherProperty; //property with member variable initialization     
     } 
    } 

rozsianych w użyciu „to” jest nad specyfikacją do mnie. Wiem, że jest to lokalna właściwość, ponieważ jest pisana wielką literą. Wszystkie właściwości powinny być ograniczone do siebie. Wiem, że zmienna "_anotherProperty" ma zasięg klasy ze względu na podkreślenie. Wcześniej pomijałem podkreślenia ze zmiennych na poziomie klasy. Kod jest dla mnie łatwiejszy do odczytania, gdy pojawi się podkreślenie, ponieważ od razu poznałem zakres bez konieczności przesuwania kursora myszy nad zmienną, aby zobaczyć deklarację w etykiecie narzędzi z VS. Ponadto uzyskuję korzyść z używania tej samej nazwy dla zmiennych lokalnych, po prostu pomijając podkreślenie. To sprawia, że ​​twoje początki wyglądają na czyste. Inną korzyścią podkreślenia jest to, że możesz wpisać podkreślenie i nacisnąć ctrl + spacja, a wszystkie zmienne z zakresu klasy są pogrupowane.

+0

Dzięki, lubię twoje wyjaśnienie. Zdecydowanie używam podkreślnika do tworzenia kopii pól z dokładnie tych powodów, o których wspomniałeś. I nigdy nie używam słowa kluczowego "this", chyba że istnieje zmienna lokalna w tym samym zakresie o tej samej nazwie i innym przypadku. – devuxer