Niewielkie warianty formularzy opublikowane przez kilka innych ...
using System;
...
public override bool Equals (object obj) {
return Equals(obj as SomeClass);
}
public bool Equals (SomeClass someInstance) {
return Object.ReferenceEquals(this, someInstance)
|| (!Object.ReferenceEquals(someInstance, null)
&& this.Value == someInstance.Value);
}
public static bool operator ==(SomeClass lhs, SomeClass rhs) {
if(Object.ReferenceEquals(lhs, null)) {
return Object.ReferenceEquals(rhs, null);
}
return lhs.Equals(rhs);
//OR
return Object.ReferenceEquals(lhs, rhs)
|| (!Object.ReferenceEquals(lhs, null)
&& !Object.ReferenceEquals(rhs, null)
&& lhs.Value == rhs.Value);
}
public static bool operator !=(SomeClass lhs, SomeClass rhs) {
return !(lhs == rhs);
// OR
return (Object.ReferenceEquals(lhs, null) || !lhs.Equals(rhs))
&& !Object.ReferenceEquals(lhs, rhs);
}
Starając się znaleźć sposób, aby realizować za pomocą operatora == równa uniknąć duplikowania porównania wartość logiki ... bez zbędnych testów (ReferenceEquals wzywa w/takich samych parametrach) lub niepotrzebnych badań (to nie może be null w metodzie instance.Equals) i bez żadnych wyraźnych warunków warunkowych ("ifs"). Więcej zwiastunu niż cokolwiek pożytecznego.
Najbliższy mogę myśleć to jest, ale to czuje jak powinno być możliwe bez dodatkowej metody :)
public bool Equals (SomeClass someInstance) {
return Object.ReferenceEquals(this, someInstance)
|| (!Object.ReferenceEquals(someInstance, null) && EqualsNonNullInstance(someInstance);
}
public static bool operator ==(SomeClass lhs, SomeClass rhs) {
return Object.ReferenceEquals(lhs, rhs)
|| (!Object.ReferenceEquals(lhs, null) && !Object.ReferenceEquals(rhs, null) && lhs.EqualsNonNullInstance(rhs));
}
//super fragile method which returns logical non-sense
protected virtual bool EqualsNonNullInstance (SomeClass someInstance) {
//In practice this would be a more complex method...
return this.Value == someInstance.Value;
}
pamiętając, jak żmudne i podatne na błędy to wszystko (jestem niemal pewny jest błąd w powyższym kodzie ... który wciąż jest do bani, ponieważ kto chce podklasować Type po prostu, aby kontrole równości były nieco prostsze?), myślę, że po prostu utworzę statyczne metody, które będą obsługiwać wszystkie kontrole zerowe i zaakceptuj delegata lub wymagaj i interfejs do przeprowadzenia porównania wartości (jedyna część, która naprawdę zmienia typ na typ).
Byłoby świetnie, gdybyśmy mogli po prostu dodać atrybuty do pól/właściwości/metod, które muszą być porównane i pozwolić kompilatorowi/środowisku wykonawczemu obsłużyć wszystkie nudy.
Upewnij się również, że wartości GetHashCode() są równe dla wszystkich wystąpień, w których może wystąpić wyrażenie .Equals (object) true lub crazy shit.
Wont to wysadzić jeśli 'obiekt obj' jest struct? – row1
@ row1 Nie. Struktura będzie pudełkowa, a struktura pudełkowa będzie miała wartość 'null', gdy oceniany jest operator' as'. Jeśli zdefiniowany typ jest strukturą, to musisz użyć rzutowania jawnego, zamiast używać 'as' (lub użyć zerowej wersji struktury). Usunąłbyś także kontrole zerowe, gdyby była to struktura nie-nullable. – Servy
Woow bardzo prosta i spójna Wdrażanie, podoba mi się, thanx. –