2011-02-01 12 views
6

Po prostu zastanawiam się ...Czy istnieje jakikolwiek powód, aby nie używać właściwości "chronionych"?

Czy istnieją jakieś powody, dla których nie należy używać chronionych właściwości?

Znaczy zamiast korzystania z tego:

public abstract class Foo 
{ 
    protected Bar { get; private set; } 
} 

korzystać z tego jeden:

public abstract class Foo 
{ 
    private Bar _bar; 

    protected Foo(Bar bar) 
    { 
     _bar = bar; 
    } 

    protected GetBar() 
    { 
     return _bar; 
    } 
} 
+7

Druga to doskonale poprawna Java; więc jeśli widzisz taki kod C#, najbardziej prawdopodobnym powodem jest to, że został napisany przez programistę Java, który jeszcze nie przystosował się do C#. –

+2

Używasz 'protected' dla dostępności, nie ma nic wspólnego z właściwościami. – leppie

Odpowiedz

9

Nie widzę żadnego powodu, dla którego chcesz użyć GetXXX() metodę zamiast własności niezależnie od to modyfikatory.

Od czasu, gdy oznaczyłeś to pytanie tagiem C#, zalecam stosowanie pierwszego podejścia. Do tego służą właściwości.

Użyj metody tylko wtedy, gdy wartość zwracana przez nią może być różna za każdym razem, gdy ją wywołasz niezależnie od jej stanu. Na przykład DateTime.Now było błędem i powinno być metodą.

Aby uzyskać więcej informacji, zobacz Property Usage Guidelines on MSDN. Na marginesie, to zaskakujące, że nie musieli go zmieniać od Framework 1.1.

+1

Jak wspomniano powyżej przez ammoQ, jest to prawdopodobnie kod przeniesiony z Java lub programista Java - to standard w Javie. –

+0

Nie ma wymogu, aby właściwość była idempotentna. Powinien być "czysty" bez żadnych skutków ubocznych. – leppie

+0

@leppie: Jeśli spojrzeć na wytyczne, jest jeden na liście, gdy powinny być stosowane metody, które mówią: "Wywołanie członka dwa razy z rzędu daje różne wyniki." Oczywiście wspomina również o braku efektów ubocznych. – decyclone

0

Tylko jeśli masz non zapisu lub nie czytelne atrybutów wewnątrz klasy

+0

Proszę wyjaśnij, twoja odpowiedź nie jest wcale jasna. – leppie

1

Jeszcze kilka powodów, aby zamiast wykorzystywać właściwości metod: Wiązanie

  • Dane mogą zobaczyć tylko właściwości
  • Ty może używać semantyki tylko do odczytu lub zapisu.
0

Pytanie nie jest tak naprawdę o protected ma więcej z: dlaczego powinienem używać właściwości?

Propeties są logicznie równoważne z getter/setter parami metody, co można zrobić z ze Name {get{} \ set{}} można zrobić z GetName() \ SetName() pary i odwrotnie, zwłaszcza w C# ma getter i setter akcesorów, dzięki czemu możemy grać z także dostępność.

Są jednak osoby, które uważają, że publiczne (lub chronione) właściwości są trochę jak oszustwa z perspektywy OOP, szczególnie, jeśli wszystko, co robi własność, po prostu pokazuje pole wsparcia. Mimo wszystko wydaje się, że zmienia on stan obiektu na zewnątrz, podczas gdy person.SetName("SWeko") jedynie informuje obiekt, że potrzebuje zmienić jego stan. I z czysto teoretycznego punktu widzenia uważam, że te obiekcje mają wartość.

Jednak nie wszyscy mamy luksus życia w wieżach z kości słoniowej, więc pojęcie własności jest naprawdę użyteczne, ponieważ jest bardziej czytelne, mniej podatne na błędy, a IMHO, bliżej modelu realnego świata. Dostarcza nam również pewnego rodzaju dychotomii, gdy piszę coś takiego:

person.Name = "SWeko"; 
person.Work(); 

Spodziewam się, że pierwsza linia będzie szybki przydział, a nie mają skutków ubocznych, a spodziewam się, że druga linia zrobi coś więcej i prawdopodobnie wpłynie na stan wewnętrzny obiektu.Kiedy używam metody Gettera i Settera, żadna taka uwaga nie jest od razu oczywista:

person.SetName("SWeko"); 
person.Work(); 
+0

IMHO, właściwości zapisu i odczytu powinny zachowywać się jak zmienne. Jeśli obiekt implementuje niektóre właściwości do odczytu i zapisu, zapisanie ich, a następnie odczytanie w dowolnej kolejności bez żadnych ingerujących * wywołań metod * powinno spowodować odczytanie zapisanych wartości. Nie mam problemu z właściwościami, które można zapisać, zmieniając wartości właściwości tylko do odczytu lub wywołując metody zmieniające wartości dowolnych lub wszystkich właściwości (tylko do odczytu lub do odczytu i zapisywania), ale nie lubię połączonego odczytu i zapisu odczytu i zapisu nieruchomości. IMHO, coś takiego jak StringBuilder.Length powinno być własnością tylko do odczytu, w połączeniu z metodą SetLength. – supercat

+0

@supercat Byłoby to bardzo żmudne działanie z kontrolkami interfejsu użytkownika, ponieważ mają one zazwyczaj wiele właściwości zależnych od siebie nawzajem w oczekiwany i logiczny sposób (np. AutoSize wpływa na właściwości Width i Height). – SWeko

+0

@SWeko: Paradygmat, którego według mnie brakuje w częściach Form, a który pomógłby ulepszyć jego użyteczność, to oddzielenie właściwości "ustawień" od "bieżącego zachowania". Na przykład "Widoczne" powinno zostać podzielone na "Wymagana widoczność" i "Wyświetlane". "RequestedVisibility" powinno być właściwością do odczytu i zapisu, która zawsze zwracałaby zapisaną wartość; "IsShown" powinno być właściwością tylko do odczytu, wskazującą, czy kontrola i wszyscy jej rodzice mają ustawioną opcję RequestedVisibility. W przypadku rozmiarów, powinny istnieć właściwości o żądanym rozmiarze i wielkości rzeczywistej, przy czym pierwszy z nich odczytuje i zapisuje ten drugi tylko do odczytu. – supercat

Powiązane problemy