Kiedy używać właściwości zamiast funkcji

Jest to prawdopodobnie kwestia osobistych preferencji, ale kiedy używasz właściwości zamiast funkcji w kodzie

Na przykład, aby uzyskać dziennik błędów mogę powiedzieć

string GetErrorLog()
{
      return m_ErrorLog;
}

Or I could

string ErrorLog
{
     get { return m_ErrorLog; }
}

Jak zdecydować, który z nich użyć? Wydaje się, że jestem niekonsekwentny w moim użyciu i Szukam dobrej ogólnej zasady. Dzięki.

Author: svick, 2009-09-03

6 answers

Zwykle używam właściwości, jeśli są prawdziwe:

  • właściwość zwróci pojedynczą wartość logiczną
  • W przypadku braku logiki (Zwykle zwracana jest tylko wartość, lub małe sprawdzenie / zwrócenie wartości)

Używam metod, jeśli są prawdziwe:

  • zwrócenie wartości będzie wymagało znaczącej pracy - ie: zostanie pobrane z DB, lub coś, co może zająć "czas"
  • jest sporo logiki udział w pozyskiwaniu lub ustawianiu wartości

Ponadto, polecam przyjrzeć się Microsoft ' s Design Guidelines for Property Usage. Sugerują:

Użyj właściwości, gdy element jest logicznym składnikiem danych.

Użyj metody, gdy:

  • operacja jest konwersją, np. Object.ToString.
  • operacja jest na tyle kosztowna, że chcesz komunikować się z użytkownikiem, że powinien rozważyć buforowanie wynik.
  • uzyskanie wartości nieruchomości przy użyciu get accessor miałoby obserwowalny efekt uboczny.
  • Dwukrotne wywołanie członka daje różne wyniki.
  • kolejność wykonania jest ważna. Należy pamiętać, że właściwości typu powinny być ustawiane i pobierane w dowolnej kolejności.
  • Element jest statyczny, ale zwraca wartość, którą można zmienić.
  • Element zwraca tablicę. Właściwości zwracające tablice mogą być bardzo mylące. Zazwyczaj jest konieczne zwrócenie kopii tablicy wewnętrznej, aby użytkownik nie mógł zmienić stanu wewnętrznego. To, w połączeniu z faktem, że użytkownik może łatwo założyć, że jest to indeksowana właściwość, prowadzi do nieefektywnego kodu. W poniższym przykładzie kodu każde wywołanie właściwości Methods tworzy kopię tablicy. W rezultacie 2n+1 kopii tablicy zostanie wytworzona w następującej pętli.
 68
Author: Reed Copsey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-03 18:40:50

Oto wytyczne Microsoftu:

Wybór pomiędzy właściwościami i metodami

  • Rozważ użycie właściwości, jeśli element reprezentuje logiczny atrybut typu.

  • Należy użyć właściwości, a nie metody, jeśli wartość właściwości jest przechowywana w pamięci procesu i właściwość ta zapewnia tylko dostęp do wartości.

  • Użyj metody, a nie Właściwości, w następujących sytuacjach.

    • Operacja jest o rząd wielkości wolniejsza niż zestaw pól. Jeśli nawet rozważasz dostarczenie asynchronicznej wersji operacji, aby uniknąć blokowania wątku, jest bardzo prawdopodobne, że operacja jest zbyt kosztowna, aby mogła być własnością. W szczególności operacje, które uzyskują dostęp do sieci lub systemu plików (inne niż jednorazowa inicjalizacja), powinny najprawdopodobniej być metodami, a nie właściwościami.

    • Operacja jest konwersją, np. Obiekt.Metoda ToString.

    • Operacja zwraca inny wynik za każdym razem, gdy jest wywołana, nawet jeśli parametry nie ulegają zmianie. Na przykład metoda NewGuid zwraca inną wartość przy każdym wywołaniu.

    • Operacja ma znaczący i obserwowalny efekt uboczny. Należy pamiętać, że wypełnienie wewnętrznej pamięci podręcznej nie jest ogólnie uważane za obserwowalny efekt uboczny.

    • Operacja zwraca kopię stanu wewnętrznego (nie zawierać kopie obiektów typu value zwracanych na stosie).

    • Operacja zwraca tablicę.

 12
Author: Ryan Lundy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-12 14:12:24

Używam właściwości, gdy jest jasne, semantycznym jest "Get somevalue from the object". Jednak korzystanie z metody jest dobrym sposobem, aby komunikować się "to może zająć trochę więcej niż trywialny wysiłek, aby powrócić".

Na przykład kolekcja może mieć właściwość Count. Rozsądne jest założenie, że obiekt kolekcji wie, ile przedmiotów jest obecnie przechowywanych, bez konieczności ich przeszukiwania i liczenia.

Na dłoni Ten hipotetyczny zbiór może mieć metodę GetSum() który zwraca sumę posiadanych pozycji. Zbiór po prostu łatwo ma właściwość Sum, ale za pomocą metody komunikuje ideę, że zbiór będzie musiał wykonać prawdziwą pracę, aby uzyskać odpowiedź.

 5
Author: AnthonyWJones,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-03 15:57:04

Nigdy nie użyłbym właściwości, gdybym mógł wpływać na więcej niż jedno pole - zawsze używałbym metody.

Ogólnie używam tylko public string ErrorLog { get; private set; } składnia dla właściwości i używać metod dla wszystkiego innego.

 2
Author: ssg31415926,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-03 15:54:07

Oprócz odpowiedzi Reeda, gdy właściwość będzie tylko getterem, jak uzyskanie zasobu, takiego jak dziennik zdarzeń może być. Staram się używać właściwości tylko wtedy, gdy nieruchomość będzie wolna od skutków ubocznych.

 2
Author: JoshBerke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-03 15:54:52

Jeśli w danej właściwości dzieje się więcej niż coś trywialnego, to powinna to być metoda. Na przykład, jeśli właściwość Getter ErrorLog rzeczywiście przechodziła i czytała Pliki, to powinna to być metoda. Dostęp do właściwości powinien być szybki, a jeśli robi dużo przetwarzania, powinna to być metoda. Jeśli są skutki uboczne dostępu do właściwości, których użytkownik klasy może się nie spodziewać, to prawdopodobnie powinna to być metoda.

Istnieje . Net Framework Design Guidelines książka, która obejmuje tego rodzaju rzeczy w najdrobniejszych szczegółach.

 2
Author: AaronLS,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-09-03 15:55:33