2009-09-09 13 views

Odpowiedz

17
  • bym zdecydowanie rozważyć przeciążenia == i! = Nigdzie zastąpić Equals
  • uważam (znacznie słabiej) przeciążania operatorów porównania gdziekolwiek zaimplementować IComparable<T>
  • uważam przeciążania operatorów arytmetycznych za fundamentalnie numeryczny typy
  • chciałbym rozważyć wprowadzenie jawnych konwersji dla typów „Otulina” (jak Nullable<T>)
  • bym bardzo rzadko rozważyć zapewnienie niejawne konwersje

Złota zasada jest nie przeciążać operatory jeśli sens nie jest do końca oczywiste. Na przykład, myślę, że byłoby całkiem dziwnie mieć operatora + na Stream - może to oznaczać "tworzenie zapisywalnego T tutaj, więc zapisywanie do wyniku zapisu do obu" lub może oznaczać "czytać jeden po drugim" lub prawdopodobnie inne rzeczy.

Z mojego doświadczenia wynika, że ​​bardzo rzadko można przeciążać cokolwiek innego niż == i! =.

+0

Nie jestem sprzedawany z nadpisaniem '==', gdy nadpisujesz '.Equals'. Może to tło Java (chociaż przypuszczam, że też to masz). Tylko moje osobiste preferencje. –

+2

Nie podoba mi się, jeśli == i! = Nie odnoszą się do porównania dla typów odniesienia. –

+0

stefan: agreed. –

3

zrobiłem prośbę o zamknięcie tego, ale być może on pozostać otwarte (starałem się zmienić zdanie, ale widocznie nie można cofnąć ścisły wniosek: P)

Odpowiem osobiście: nigdy.

Nigdy nie sądzę, że dobrym pomysłem jest wdrożenie przeciążania operatorów. Jest tylko jeden wyjątek: jeśli piszę jakąś kolekcję (nie zdarza się to zbyt często) i chcę zaimplementować indeksatory [].

Moim osobistym zdaniem, nie uważam, aby kiedykolwiek nadpisywać == i inne tego typu rzeczy. Ale znowu nie pracuję w złożonych dziedzinach matematyki i finansów, gdzie takie rzeczy mogą być przydatne. Ale nie mogę mówić z doświadczenia w tej sprawie (właściwie, mogę w świecie finansów, a my tego nie zrobiliśmy).

+1

Więc myślisz, że szkoda, że ​​(powiedzmy) przeciążenia ciągów ==? Wiem, że nie ... –

+1

'string' jest na pewno wyjątkiem, ale także będzie odniesieniem równym, jeśli zostanie internowany, więc to prawdopodobnie ma sens. –

+1

Większość strun, z którymi pracuję, nie jest internowanych ... –

2

Chciałbym rozważyć użycie przeciążenia operatora dla operacji arytmetycznych na typach, które reprezentują wartość logiczną. Na przykład zdarzały się sytuacje, w których chciałem, aby Point miał przeciążenie dla operatorów + i -.

+0

Oto pytanie, które wyraża ten sam sentyment: [Jak sprawić, aby operator + działał, dodając do siebie dwa punkty?] (Http://stackoverflow.com/q/10663499/1497596) – DavidRR

3

uważam nadrzędne operatorów mogę to przypadki:

  • == = a gdy jest to prosty typ wartości i zaimplementować porównanie wartości!. W innych typach spodziewam się, że == i! = Tak porównanie porównawcze, a także nie są drogie.
  • operatory porównania (>,> = itp.) W tym samym przypadku co powyżej, jeśli jest to tylko wartość liczbowa.
  • Właściwie nigdy nie przeciążam operatorów arytmetycznych, ale robiłbym to dla tego samego rodzaju wartości liczbowych, jeśli poprawiłoby to użyteczność.
  • operatory odlewania, jeśli typ może być bezstratny, został przekształcony w odpowiedni inny typ.
+0

Właśnie przeładowałem>,> =, <, <= dla ciągów. Porównuję uprawnienia dla obiektów MembershipUser, aby określić, czy mają one rolę równą, wyższą lub niższą od poziomu obowiązkowego, aby wykonać pewne działanie. Zasadniczo jest to tworzenie hierarchicznych uprawnień. Czy moje podejście jest niewskazane? – splatto

+1

MemebershipUser nie brzmi jak wartość liczbowa. Myślę, że operatory porównania są zbyt niejawne, możesz nie rozumieć, co one oznaczają podczas czytania kodu. Metoda zwana 'HasSufficientPermission' lub' IsSameOrHigherLevel' lub czymkolwiek jest autodokumentowaniem. Z drugiej strony, kiedy twoja klasa nazywa się "PermissionLevel" lub tym podobne, jest całkiem jasne, co to znaczy, gdy PermissionLevel jest większa od drugiej. Ale te same, jawne metody są dużo łatwiejsze do zrozumienia i nie tracisz niczego. –

16

myślę Framework design guidelines zapewnić pewne godnej radę:

  • uniknąć definiowania przeciążenia operatora, z wyłączeniem w rodzaju, że powinien czuć się jak prymitywnych (wbudowane) typów.
  • CONSIDER definiuje przeciążenia operatora w typie, który powinien wyglądać jak typ pierwotny.
  • Definiuje przeciążenia operatorów w strukturach reprezentujących liczby (na przykład System.Decimal).
  • NIE bądź urocza podczas definiowania przeciążenia operatora.
  • NIE podawaj przeciążenia operatora, chyba że co najmniej jeden z operandów jest typu określającego przeciążenie.
  • DO przeciążania operatorów w sposób symetryczny.
  • CONSIDER dostarczanie metod przyjaznych nazw, które odpowiadają każdemu przeciążonemu operatorowi.
+0

Nice. Cieszę się, że tak naprawdę nie jest to tak dalekie od tego :-) –

+0

Tak, jest dobrze, gdy twoje własne poglądy pokrywają się z poglądami podręcznika Wytycznych do projektowania ramowego - to naprawdę jest dobre. – RichardOD

Powiązane problemy