2010-01-27 21 views
19

Czy uważasz, że lepiej jest zawsze czynić chronionymi członkami klasy automatycznie zaimplementowaną własność chronioną, aby zachować izolację lub uczynić ją chronioną polem?Właściwość chroniona C# lub pole

protected bool test { get; set; } 

lub

protected bool test; 

Odpowiedz

20

Generalnie, należy użyć autoproperties - to pozwala na łatwe dodawanie weryfikacji, czy cokolwiek innego, czego potrzeba w przyszłości. Jest to szczególnie ważne, jeśli chroniony członek będzie używany przez klasy spoza twojego zespołu, ponieważ dodanie takiego kodu nie naruszy twojej umowy z nimi, podczas gdy zmiana pola na metodę lub właściwość będzie. Właściwość

+0

W jaki sposób użycie autoproperties ułatwia weryfikację? – Rod

+5

Możesz zmienić autoproperties na normalne właściwości później i dodać dowolny kod, a ludzie używający biblioteki dll nie będą musieli rekompilować, aby użyć zaktualizowanych zestawów. – thecoop

3

, wsparta przez prywatne pole.

This question może być przydatna

+0

Jaka jest rzeczywista przewaga nad chronionym polem? –

+1

hermetyzacja dla jednego, a możliwość przełamania debuggera, gdy jest dostępny, czyni go użytecznym. –

+0

Jedną z zalet jest możliwość powiadamiania o zmianie właściwości za pomocą, na przykład, INotifyPropertyChanged. Ogólnie rzecz biorąc, takie podejście (chroniona własność wspierana przez prywatne pole) promuje enkapsulację, tj. Ukrywanie informacji. Nie ujawniaj wdrożenia, chyba że masz ku temu dobry powód. (Przyjmuję, że pytanie koncentruje się na chronionych właściwościach, ponieważ wiąże się z pewnym spadkiem). – JMD

7

Sugerowana praktyką jest sprawiają, że nieruchomość. Podpis zmienia się w zależności od tego, czy jest to pole lub właściwość, co może powodować problemy podczas przekraczania złożeń. Jeśli sprawisz, że będzie to właściwość na samym początku, nigdy nie będziesz mieć tego problemu. (często później chcesz dodać logikę, gdy właściwość jest odczytywana lub zapisywana).

W języku C# automatyczne wdrażanie własności jest tak proste, że nie ma powodu, aby tego nie robić.

Ponadto sprawia, że ​​sprawy stają się bardziej przejrzyste. Jeśli naprawdę ma być używany przez świat zewnętrzny jako część funkcjonowania obiektu, spraw, aby był on własnością. W przeciwnym razie przyszły programista może się zastanawiać, czy przypadkiem nie utworzyłeś pola chronionego zamiast prywatnego.

3

Nigdy nie należy zezwalać na bezpośredni dostęp do zmiennej członkowskiej spoza klasy. Użyj właściwości generowanej automatycznie lub właściwości z polem pomocniczym. Jeśli zezwolisz na bezpośredni dostęp, może to prowadzić do naprawdę złych błędów w debugowaniu, gdy wiele metod zmieni tę wartość w łańcuchu wyprowadzeń i nie wiesz, który z nich powoduje błąd.

2

Wiem, że to pytanie jest stare, ale odpowiedziałbym na nie w oparciu o zakres wartości oraz miejsce, w którym należy je zainicjować lub napisać. Staram się korzystać z możliwie jak najmniejszego zakresu. Mam nadzieję, że dodaje się uczynić go bardziej jasne, w jaki sposób zdecydować:

chronione wartości: ta zakłada, że ​​wartość musi jedynie być dostępne przez klasę bazową i/lub klasy dziedziczenie, a nie przez jakiegokolwiek kodu na zewnątrz .. .

  1. Gdy klasa dziedziczenia musi czytać, ale nie musi zmodyfikować wartość:

    • Jeżeli wartość może być napisany raz w konstruktorze klasy bazowej, należy użyć następującego, który zapobiega dziedziczy klasę od pisania do niego i idzie o krok dalej i tylko pozwala na jej ustawienie w konstruktora:

      protected readonly bool test;

    • Jeśli wartość można zapisać w innej metodzie, innej niż konstruktor, ale nadal tylko w klasie bazowej, użyj poniższego, co zapobiega zapisywaniu klasy dziedziczącej, ale pozwala mu odczytać:

      protected bool Test { get; private set; }

  2. gdy klasa dziedziczenia może zmieniać wartość należy stosować następujące, które umożliwia zarówno klasa dziedziczenia i klasa bazowa zapisu do niej w każdym punkcie:

    protected bool test;

wartości indywidualnego. ta zakłada, że ​​wartość musi jedynie być dostępne od wewnątrz klasy jest zadeklarowany w

  1. Jeżeli można ustawić tylko raz w konstruktorze, należy:

    readonly bool test;

  2. Jeżeli można ustawić w dowolnym miejscu w klasie, należy:

    bool test;

Nie należy również zapominać, że jeśli zadeklarować ją jako właściwość, należy użyć PascalCase. Jeśli zadeklarujesz to jako zmienną składową, powinieneś użyć camelCase. Ułatwi to innym programistom zrozumienie zakresu.

Powiązane problemy