2009-08-18 12 views
33

Powiel możliwe:
Properties vs MethodsMetoda vs Nieruchomości w C# - co za różnica

W metodzie można wpisać kodu i właściwości zbyt. Na przykład mam nazwę właściwości. Kiedy zmienia się nazwa klasy, chciałbym pobrać trochę danych z bazy danych i zmienić stan mojego obiektu. Mogę dodać ten kod, aby ustawić część mojej własności. Innym rozwiązaniem jest zmiana części zestawu na prywatną i dodanie metody o nazwie SetName. W tej metodzie dodaj mój kod.

Jaka jest różnica? Kiedy jest moment, w którym nie warto wstawiać kodu do gettera/setera i kiedy tworzymy własną metodę, która służy do zmiany mojej własności i innych części mojej klasy?

Odpowiedz

50

Tutaj jest dobry zestaw wytycznych do kiedy należy użyć właściwości vs metod z Bill Wagner (stałe łącze)

  • Użyj obiekt, gdy wszystkie są prawdziwe: W pozyskiwaniu powinny być proste, a zatem mało prawdopodobne rzucać wyjątki. Należy zauważyć, że nie oznacza to dostępu do sieci (lub bazy danych). Albo może się nie powieść, a zatem rzuciłby wyjątek.
  • Nie powinny one mieć zależności od siebie. Należy pamiętać, że będzie to obejmować ustawienie jednej właściwości i jej wpływ na inną. (Na przykład ustawienie właściwości FirstName wpłynęłoby na właściwość FullName tylko do odczytu, która składa się z właściwości first name + last name, implikuje taką zależność).
  • Powinny być ustawialne w dowolnej kolejności
  • Getter nie ma możliwości obserwacji efekt uboczny Uwaga: ta wskazówka nie wyklucza niektórych form leniwego oceniania w nieruchomości.
  • Metoda musi zawsze natychmiast powrócić. (Należy zauważyć, że wyklucza to właściwość, która wykonuje wywołanie dostępu do bazy danych, wywołanie usługi sieci Web lub inną podobną operację).
  • Użyj metody, jeśli element zwraca tablicę.
  • Wielokrotne wywołania gettera (bez kodu pośredniczącego) powinny zwracać tę samą wartość.
  • Powtórne połączenia z seterem (o tej samej wartości) nie powinny powodować żadnych różnic w stosunku do pojedynczego połączenia.

  • Wynik nie powinien zwracać odwołania do wewnętrznych struktur danych (patrz punkt 23). Metoda może zwrócić głęboką kopię i może uniknąć tego problemu.

+2

+1 za wywoływanie go jako linii pomocniczych zamiast reguł - na przykład leniwego ładowania LUB mapper zazwyczaj narusza wiele z tych wytycznych. –

+0

Absolutnie wszystko jest względne - stosuje się tylko wtedy, gdy ma zastosowanie. –

+1

Łącze dostarczone przez @ChrisBallance zwraca 404. Działającym linkiem do wytycznych Billa Wagnera jest [tutaj] (http://www.srtsolutions.com/properties-vs-methods). +1 dla tego linku, Chris. –

12

Biorąc pod uwagę właściwości jak ten

private string _name; 
public string Name { get { return _name; } set { _name = value; } } 

jest możliwe napisanie dwóch następujących metod:

public string get_Name() { return _name; } 
public void set_Name(string value) { _name = value; } 

które działają identycznie. W rzeczywistości jest to dokładnie to, co kompilator robi dla ciebie, gdy tworzysz własność.

Ogólnie rzecz biorąc, odbiegam od właściwości, gdy kod w nich zaczyna wydawać się "drogi", jeśli ma to jakiś sens. Chcę, aby właściwości czuły się jak pola (z kontrolowanymi efektami ubocznymi, które zachodzą w określonym czasie), więc powinny być lekkie.

8

Własność to tylko cukier syntaktyczny. W niektórych przypadkach lepiej jest zdefiniować właściwość zamiast metody, ponieważ jest bardziej przejrzysta/czytelniejsza.

W wytycznych dotyczących projektowania stwierdza się, że gdy wdrażana funkcja jest kosztowna, należy preferować metodę względem właściwości.

w rzeczywistości właściwość jest zaimplementowana jako jedna lub dwie metody; w zależności od tego, czy twoja posiadłość ma setera, czy nie. Właściwość jest tłumaczona na metodę get_xxx i metodę set_xxx.

3

Ilekroć natknąłem się na potrzebę umieszczenia kodu w programie pobierającym/ustawiającym, umieszczam kod w prywatnej metodzie i wywołuje tę metodę z wewnątrz programu pobierającego/ustawiającego. W ten sposób kod jest dostępny w wywołaniu metody, jeśli potrzebuję go gdzie indziej. Nie jestem pewien, czy jest to odpowiedź, której szukałeś, ale jest to tylko metodologia, której używam.

+0

Całkowicie się zgadzam. Projekt dla rozciągliwości, nie na chwilę ... na pół upieczony hack. I robienie tego jest proste, nic nie przesadza, oddzielasz rzeczy, sprawiając, że stają się SUCHE, a nawet jeśli kod, który przeniosłeś do metody, nie jest REUSED NOW ... nigdy nie wiesz, kiedy ktoś inny niż ty lub obecny proces biznesowy lub wymaganie może wymagać użycia tego samego kodu PÓŹNIEJ. To jest projekt jakości. Hacki nie są dobre. Odtworzenie tego kodu z twojej własności i metody sprawia, że ​​jest on bardziej czytelny, jak równie łatwy w obsłudze i otwarty do łatwego ponownego użycia później ... nie ma potrzeby refaktoryzacji – PositiveGuy

1

Zasadniczo właściwość to kilka metod - getProperty i setProperty. To tylko konwencja/uproszczenie rzeczy.

Przyjmuje się, że getter właściwości nie ma żadnych skutków ubocznych (cóż, mogą one wywoływać określone skutki uboczne, takie jak leniwy ładowanie).

0

Metody zrobić coś. Dlatego zazwyczaj mają one czasowniki w nazwach.

Podczas gdy właściwość zwraca dane.

Linia jest prosta, właściwość powinna stać się metodą, jeśli robi coś innego niż dostęp do wewnętrznych magazynów danych klasy.

Na przykład, jeśli jesteś własnością o nazwie NumberOfQuetions dla użytkowników.Jeśli ma przejść do bazy danych, aby uzyskać liczbę pytań, które powinny być metodą. Jeśli zwraca wewnętrzny magazyn, nawet jeśli logika jest wykonana w wewnętrznym sklepie, możesz zachować to w get.

1

To prawdopodobnie nie jest najważniejsza różnica, ale jedną z różnic jest to, że debugger może być skonfigurowany do punktu nad właściwościami (zakładając, że ich kod jest trywialne).

1

Zasadniczo nie ma różnicy (z wyjątkiem zarezerwowanego identyfikatora "wartość" w setera).

Programy pobierające i ustawiające są wewnętrznie tłumaczone na standardowe metody, tak aby środowisko wykonawcze nie miało pojęcia, czy jakiś program pobierający lub ustawiający jest powiązany z określoną właściwością. Określenie cukier syntaktyczny jest często stosowane w takich konstruktach wygody.

Jednak istnieje ważna zaleta inżynierii oprogramowania: Twój kod jest łatwiejszy do zrozumienia, jeśli ograniczysz się do używania modułów pobierających i ustawiających z semantyką "pobierz i ustaw". To znaczy. wykonuj tylko kroki niezbędne do zapewnienia odpowiedniej właściwości.

Powszechnie stosowanym przypadkiem do wykonania dodatkowej pracy jest na przykład ustawienie lub uzyskanie właściwości, która nie jest bezpośrednio poparta przez pole członka. Na przykład masz klasę, która zawiera wartość reprezentującą odległość. Twoja klasa może zapewnić dwie właściwości: Kilometry i mile z odpowiednimi ustawieniami i pobierającymi. Następnie można wykonać proste konwersje w jednej parze i zapisać się, aby zapisać wartość dwukrotnie.

Ogólną zasadą jest, że nie należy umieszczać kodu w pobierającym, który ma efekty uboczne. Ponadto, jedynym efektem ubocznym, który powinien mieć koder w ustawieniu, jest zmiana stanu w obiekcie, do którego odnosi się nastawnik.

3

Myśląc o tym, Właściwości to coś więcej niż cukier składniowy. Są publiczną twarzą danych członkowskich do kodu użytkownika.

Dzięki temu otrzymujesz czystą warstwę do pobierania lub wprowadzania pojedynczego aspektu danych użytkownika z twojego kodu.

DTO na przykład to tylko kilka dobrze napisanych właściwości, wydajnie oddzielających dane i zachowanie. Bez DTO mógłbyś wyobrazić sobie ścisłe powiązanie swojej DataGrid lub Dropdown ze złożoną logiką biznesową?

Mówiąc prościej, metody faktycznie wykonują zadanie ... Właściwości albo wywołują akcję, albo uzyskują status.

Chociaż można użyć kodu metody wewnątrz swoich właściwości ... nie jest to tym, do czego są przeznaczone. Nawet, jeśli musisz, lepiej zrobić czyste wezwanie do innej metody wewnątrz nieruchomości, zamiast faktycznie pisać w niej kod. HTH!

Powiązane problemy