2009-03-06 42 views
5

Quá tải các toán tử so sánh, làm thế nào để so sánh nếu hai biến trỏ tới cùng một đối tượng (nghĩa là. Không giá trị)Sau khi quá tải toán tử ==, cách so sánh nếu hai biến trỏ vào cùng một đối tượng?

public static bool operator ==(Landscape a, Landscape b) 
{ 
    return a.Width == b.Width && a.Height == b.Height; 
} 

public static bool operator !=(Landscape a, Landscape b) 
{ 
    return !(a.Width == b.Width && a.Height == b.Height); 
} 
+1

Tôi cố gắng tránh quá tải các toán tử này cho các kiểu tham chiếu vì hầu hết mọi người sẽ mong đợi == để kiểm tra sự bình đẳng đối tượng. –

Trả lời

8

Sử dụng Object.ReferenceEquals phương pháp tĩnh.

Tất nhiên, để phương thức == và! = Duy trì chức năng đầy đủ của chúng, bạn cũng nên ghi đè Equals và GetHashCode để chúng trả về một bộ phản hồi nhất quán cho người gọi.

4
+0

'ReferenceEquals (đối tượng, đối tượng)' là một phương thức tĩnh của lớp 'Object' và nó không thể được sử dụng như thế trừ khi bạn viết một phương thức mở rộng cho nó. Để sử dụng nó, người ta phải gọi: 'object.ReferenceEquals (a, b)' –

4

Để kiểm tra xem cả hai điểm có cùng một đối tượng hay không. Bạn nên sử dụng phương thức Object.ReferenceEquals. Nó sẽ trả về true nếu cả hai đều giống nhau hoặc nếu cả hai đều rỗng. Khác nó sẽ trả về false

0

Tôi biết câu hỏi cũ của nó, nhưng nếu bạn đang quá tải phương thức == hoặc Object.Equals, bạn cũng nên quá tải toán tử đảo ngược! =.

Và trong trường hợp này, vì bạn đang so sánh số nội bộ, bạn nên quá tải các toán tử so sánh khác <,>, < =,> =.

Những người tiêu thụ lớp học của bạn trong tương lai, cho dù đó là người tiêu dùng bên thứ ba hoặc nhà phát triển tiếp quản mã của bạn, có thể sử dụng một cái gì đó như CodeRush hoặc Refactor, điều đó sẽ tự động "lật" logic (còn gọi là đảo ngược) các điều kiện) và sau đó san bằng nó, để thoát ra khỏi 25 lồng nhau nếu hội chứng. Nếu mã của chúng thực hiện điều đó và bạn đã quá tải toán tử == mà không làm quá tải toán tử! =, Nó có thể thay đổi ý nghĩa của mã của bạn.

Các vấn đề liên quan