2011-11-10 9 views
9

Zgodnie z MSDN: Większość typów referencyjnych nie może przeciążać operatora równości, nawet jeśli zastępują one Równania. Jednak jeśli implementujesz typ odwołania, który ma mieć semantykę wartości, na przykład złożony typ liczb, musisz zastąpić operatora równości.Dlaczego firma Microsoft zaleca pominięcie implementacji operatora równości dla typów odniesienia?

Co to jest najlepsze praktyki do wdrożenia równa sposób i równości operatora dla typowego podmiotu domen, np Klientem?

powinien on realizować równa metodę powrotu prawdziwą jeśli tożsamość obu podmiotów są takie same? Co jeśli jednostka nie jest niezmienna? Co jeśli obie jednostki są nowe, a ich tożsamości mają puste wartości. A co z operatorem równości?

Jako JaredPar wymienione hereRówne będą faktycznie mierzyć równość wartości podczas gdy == będzie mierzyć, czy są one tym samym odniesienia.

+3

Podany link nie pokazuje tego tekstu dla mnie - czy możesz wyjaśnić, skąd pochodzi? (W szczególności używa on słowa "przesłonięcie" niepoprawnie pod koniec, co budzi pewne podejrzenia ...) –

+0

http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx – wRAR

+0

Bezpośredni [link] (http://msdn.microsoft.com/en-us/library/bsc2ak47.aspx). Zobacz * Uwagi dla programistów *. – Jekas

Odpowiedz

4

Od MSDN:

Większość typów referencyjne nie mogą przeciążać operator równości, nawet jeśli one przesłonić równymi. Jednak jeśli implementujesz typ odwołania, który ma mieć semantykę wartości, na przykład złożony typ liczb, musisz zastąpić operatora równości.

Firma Microsoft uważa, że ​​== powinno być używane tylko w przypadku typów wartościowych, np. typy liczbowe, takie jak Complex, BigInt itp. Typy złożone, takie jak Person, nie powinny zastępować operatora równości. Jest to kwestia stylu kodowania, a Microsoft merly sugeruje, że postępujesz zgodnie z tą wytyczną. Wątpię, aby skompilowany wynik był znacznie inny.

+0

Ooops, pojawiłam się zaznaczone pole wyboru wiki społeczności :) – larsmoa

3

Zazwyczaj nie będę implementował (= operator lub Equals() dla moich klas, np. Klient).

Zdecydowanie nie należy przesłonić operatora =, ponieważ programiści używający twoich klas oczekują = aby porównać wskaźniki, a nie same instancje, zmiana tego zachowania spowoduje tylko błędy, ponieważ ludzie nie oczekują, że będzie działać w ten sposób.

Jeśli chcesz uwzględnić sposób na porównanie semantyczne, to właśnie jest to metoda Equals() i możesz ją zastąpić, aby wdrożyć kontrolę równości w dowolny sposób ma sens, jak chcesz go użyć w swoim kod.

+0

Re: _developers używający twoich klas oczekiwać == do porównania pointers_. Rzeczywiście: wzorzec 'if (param == null)' jest bardzo częsty! –

Powiązane problemy