WAŻNA AKTUALIZACJA (12 kwietnia 2016):
Zwrócono nam uwagę, że wewnętrzny standard zespołu .NET CoreFX kładzie nacisk na używanie notacji podkreślenia bez podania przyczyny. Jednak jeśli przyjrzymy się bliżej Zasada # 3 staje się oczywiste, że nie jest to system _, t_, s_przedrostków, które sugeruje, dlaczego _został wybrany w pierwszej kolejności.
- Używamy
_camelCasedo pól wewnętrznych i prywatnych i używamy tylko do odczytu, jeśli to możliwe. Przedrostki pól instancji za pomocą _, pola statyczne z polami statycznymi s_i łącz je za pomocą t_. Przy stosowaniu na polach statycznych, readonlypowinny pochodzić po static(czyli static readonlyniereadonly static ).
- Unikamy,
this.chyba że jest to absolutnie konieczne.
Więc jeśli jesteś jak zespół .NET CoreFX pracujący nad jakimś krytycznym dla wydajności, wielowątkowym kodem na poziomie systemu , to MOCNIE SUGEROWANE jest, że:
- przestrzegać ich standardów kodowania i
- użyj notacji podkreślenia i
- nie czytaj dalej tej odpowiedzi
W przeciwnym razie czytaj dalej ...
ORYGINALNA ODPOWIEDŹ:
Najpierw ustalmy, o czym mówimy. Pytanie brzmi, w jaki sposób uzyskujemy dostęp do elementów członkowskich instancji z metod niestatycznych i konstruktorów klasy / podklas, jeśli pozwalają na to modyfikatory widoczności.
Notacja z podkreśleniem
- sugeruje użycie przedrostka „_” w nazwach pól prywatnych
- mówi też, że nigdy nie powinieneś używać „tego”, chyba że jest to absolutnie konieczne
Ten zapis
- sugeruje, aby zawsze używać „tego”. aby uzyskać dostęp do dowolnego członka instancji
Dlaczego istnieje ta notacja?
Ponieważ tak właśnie jest
- odróżniają parametr od pola, gdy mają tę samą nazwę
- upewnij się, że pracujesz w kontekście bieżącej instancji
Przykład
public class Demo
{
private String name;
public Demo(String name) {
this.name = name;
}
}
Dlaczego istnieje notacja podkreślenia?
Niektórzy ludzie nie lubią wpisywać „to”, ale nadal potrzebują sposobu na odróżnienie pola od parametru, więc zgodzili się użyć znaku „_” przed polem
Przykład
public class Demo
{
private String _name;
public Demo(String name) {
_name = name;
}
}
Można by pomyśleć, że to kwestia osobistego gustu, a oba sposoby są równie dobre / złe. Istnieją jednak pewne aspekty, w których ten zapis jest lepszy od znaku podkreślenia:
Przejrzystość
- znaki podkreślenia zaśmiecają nazwy
- ten zapis utrzymuje nazwy w stanie nienaruszonym
Ładunek kognitywny
podkreślenie-notacja jest niespójna, sprawia, że traktujesz pola w specjalny sposób, ale nie możesz go używać z innymi członkami, za każdym razem, gdy musisz zadać sobie pytanie, czy potrzebujesz właściwości lub pola
ten zapis jest spójny, nie musisz myśleć, po prostu zawsze używasz „tego” w odniesieniu do dowolnego członka
AKTUALIZACJA: jak wskazano, poniższe nie są zaletą
Konserwacja
podkreślenie-notacja wymaga _zwrócenia uwagi podczas refaktoryzacji, powiedzmy, że zmienisz pole we właściwości (usuń _) lub odwrotnie (dodaj _)
ta notacja nie ma takiego problemu
Autouzupełnianie
Kiedy chcesz zobaczyć listę członków instancji:
- notacja podkreślenia nie pomaga zbytnio, ponieważ po wpisaniu „_” wyskakujące okienko autouzupełniania pokazuje pola prywatne i wszystkie typy dostępne w połączonych zestawach zmieszane z pozostałymi członkami instancji
- ta notacja daje jasną odpowiedź, wpisując „to” widzisz tylko listę członków i nic więcej
Dwuznaczność
Czasami masz do czynienia z kodem bez pomocy Intellisense. Na przykład, gdy przeglądasz kod lub przeglądasz kod źródłowy online.
podkreślenie-notacja jest niejednoznaczne: kiedy widzisz Something.SomethingElse, nie możesz stwierdzić, czy Something jest klasą, a SomethingElse jest jego statyczną właściwością ... lub może Something jest bieżącą właściwością instancji, która ma własną właściwość SomethingElse
ta notacja jest jasna: Kiedy widzisz Something.SomethingElse, może to oznaczać tylko klasę z właściwością statyczną, a kiedy widzisz this.Something.SomethingElse, wiesz, że Something jest składnikiem, a SomethingElse jest jego własnością
Metody rozszerzające
Nie możesz używać metod rozszerzeń w samej instancji bez użycia „this”.
- podkreślenie-notacja wymaga, abyś nie używał "this", jednak z metodami rozszerzającymi musisz
- ta notacja chroni cię przed wahaniem, zawsze używasz „tego”, kropka.
Obsługa programu Visual Studio
Oficjalne rekomendacje
Istnieje wiele oficjalnych wskazówek, które wyraźnie mówią „nie używaj podkreśleń”, zwłaszcza w języku C #