W jakich sytuacjach należy rozważyć przeciążenie operatora w .NET?Przeciążanie operatora w .NET
Odpowiedz
- 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! =.
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).
Więc myślisz, że szkoda, że (powiedzmy) przeciążenia ciągów ==? Wiem, że nie ... –
'string' jest na pewno wyjątkiem, ale także będzie odniesieniem równym, jeśli zostanie internowany, więc to prawdopodobnie ma sens. –
Większość strun, z którymi pracuję, nie jest internowanych ... –
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 -
.
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
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.
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
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. –
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.
Nice. Cieszę się, że tak naprawdę nie jest to tak dalekie od tego :-) –
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
- 1. Przeciążanie operatora w C++
- 2. Przeciążanie operatora + w C++
- 3. Przeciążanie i ważność operatora
- 4. Przeciążanie statycznego operatora C++
- 5. Przeciążanie operatora dla manipulatorów
- 6. Przeciążanie operatora C++
- 7. Przeciążanie operatora -> * w C++
- 8. Przeciążanie operatora <i operatora> w tej samej klasie
- 9. Przeciążanie operatora w C++ i dereferencji
- 10. Przeciążanie operatora nawiasów kwadratowych do wartości akceptowanej
- 11. przeciążanie operatora << dla tablic
- 12. Przeciążanie operatora C++, zdefiniuj negatyw obiektu.
- 13. Przeciążanie ** w C++
- 14. Przeciążanie operatora równości w szybkich podsumowaniach z powiązanymi wartościami
- 15. Przeciążanie operatora dla wszystkich struktur z cechą w Rust
- 16. C++: Przeciążanie operatora [] w celu odczytu i zapisu
- 17. Przeciążanie operatora C# z listą <T>
- 18. Weird operatora przeciążanie, "operator T &() const noexcept {return * _ptr;}"
- 19. przeciążanie operatora przyjaciela << dla szablonu klasy
- 20. Przeciążanie operatora C++: brak znanej konwersji z obiektu na odniesienie?
- 21. Przeciążenie operatora w Clojure
- 22. Przeciążanie + operator z szablonami
- 23. C++ przeciążanie operatorów konwersji
- 24. Przeciążanie int() w Pythonie
- 25. Przeciążanie właściwości w C#
- 26. Przeciążanie w Ocaml
- 27. przeciążanie unittest.testcase w pythonie
- 28. Przeciążanie rozdzielczości
- 29. Przeciążanie static_cast?
- 30. C++ Przeciążanie operatora wyodrębniania - Błąd nie może uzyskać dostępu do elementu prywatnego zadeklarowanego w klasie
Nie jestem sprzedawany z nadpisaniem '==', gdy nadpisujesz '.Equals'. Może to tło Java (chociaż przypuszczam, że też to masz). Tylko moje osobiste preferencje. –
Nie podoba mi się, jeśli == i! = Nie odnoszą się do porównania dla typów odniesienia. –
stefan: agreed. –