Biến thể nhẹ của biểu mẫu đã được đăng bởi nhiều người khác ...
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);
}
Cố gắng tìm một cách để thực hiện điều hành == sử dụng Equals để tránh sao chép logic so sánh giá trị ... mà không cần bất kỳ kiểm tra dư thừa (ReferenceEquals gọi w/các thông số tương tự) hoặc xét nghiệm không cần thiết (điều này có thể không null trong phương thức instance.Equals) và không có bất kỳ điều kiện rõ ràng nào ("ifs"). Nhiều hơn một lời trêu ghẹo tâm trí hơn bất cứ điều gì hữu ích.
gần nhất tôi có thể nghĩ ra được điều này, nhưng nó cảm thấy như nó phải là có thể mà không một phương pháp thêm :)
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;
}
Nhớ cách tẻ nhạt và dễ bị lỗi này tất cả là (tôi gần như chắc chắn có một lỗi trong mã trên ... mà vẫn còn hút vì ai muốn phân lớp một loại chỉ để kiểm tra bình đẳng đơn giản hơn một chút?), tôi nghĩ tôi sẽ tạo một số phương thức tĩnh xử lý tất cả các kiểm tra rỗng và chấp nhận một đại biểu hoặc yêu cầu và giao diện để thực hiện so sánh các giá trị (phần duy nhất thực sự thay đổi Type to Type).
Thật tuyệt vời nếu chúng ta chỉ có thể thêm thuộc tính vào các trường/thuộc tính/phương thức cần so sánh và để trình biên dịch/thời gian chạy xử lý tất cả các tedium.
Cũng đảm bảo các giá trị GetHashCode() bằng nhau cho bất kỳ trường hợp nào trong đó .Equals (đối tượng) trả về true hoặc crazy shit có thể xảy ra.
Wont này thổi lên nếu 'đối tượng obj' là một cấu trúc? – row1
@ row1 No. Cấu trúc sẽ được đóng hộp và cấu trúc đóng hộp sẽ dẫn đến 'null' khi toán tử' as' được đánh giá. Nếu kiểu được định nghĩa là một cấu trúc thì bạn cần phải thực hiện một diễn viên rõ ràng thay vì sử dụng 'as' (hoặc sử dụng phiên bản có thể vô hiệu của cấu trúc). Bạn cũng sẽ loại bỏ các kiểm tra null nếu nó là một cấu trúc không nullable. – Servy
Woow rất đơn giản và consise Thực hiện, tôi thích nó, thanx. –