2010-08-04 66 views
17

Trong khi duyệt các tài liệu MSDN trên Ghi đè bằng, một điểm thu hút sự chú ý của tôi.Tại sao truyền tới đối tượng khi so sánh với giá trị rỗng?

Trên ví dụ về this specific page, một số kiểm tra rỗng được thực hiện, và các đối tượng được đúc để loại System.Object khi thực hiện việc so sánh:

public override bool Equals(System.Object obj) 
{ 
    // If parameter is null return false. 
    if (obj == null) 
    { 
     return false; 
    } 

    // If parameter cannot be cast to Point return false. 
    TwoDPoint p = obj as TwoDPoint; 
    if ((System.Object)p == null) 
    { 
     return false; 
    } 

    // Return true if the fields match: 
    return (x == p.x) && (y == p.y); 
} 

Có một lý do cụ thể để sử dụng dàn diễn viên này, hoặc là nó chỉ là một số "vô dụng" mã quên trong ví dụ này?

Trả lời

15

Có thể cho một loại quá tải toán tử ==. Các diễn viên để đối tượng đảm bảo rằng định nghĩa ban đầu được sử dụng.

+0

do đó làm cho mã exmaple an toàn để sao chép và dán. –

7

Tôi tin rằng truyền tới System.Object sẽ giúp bạn xung quanh bất kỳ toán tử quá tải nào mà TwoDPoint có thể có.

0

Điều này có thể là một phần của mẫu lớn hơn khi toán tử == bị quá tải. Trong trường hợp đó, sử dụng obj == null có thể dẫn đến StackOverflow nếu TwoDPoint.Equals (object) được gọi như một phần của định nghĩa ==.

15

Như những người khác đã nói, loại có thể ghi đè toán tử ==. Do đó, truyền tới Object tương đương với if (Object.ReferenceEquals(p, null)) { ... }.

+4

+1 Sử dụng ReferenceEquals rõ ràng hơn đối với tôi so với cách truyền tới đối tượng – Justin

+0

+1 Mục đích hiển thị rõ ràng hơn bằng cách sử dụng ReferenceEquals. –

1

Có thể tồn tại để tránh nhầm lẫn với toán tử == bị quá tải. Hãy tưởng tượng nếu dàn diễn viên không tồn tại và toán tử == bị quá tải. Bây giờ dòng p == null sẽ có khả năng liên kết với toán tử ==. Nhiều việc triển khai toán tử == chỉ đơn giản là trì hoãn phương thức Equals bị ghi đè. Điều này có thể dễ dàng gây ra một tràn tình hình ngăn xếp

public static bool operator==(TwoDPoint left, TwoDPoint right) { 
    return left.Equals(right); 
} 

public override bool Equals(System.Object obj) { 
    ... 
    TwoDPoint p = obj as TwoDPoint; 
    if (p == null) { // Stack overflow!!! 
     return false; 
    } 

    ... 
} 

By đúc để Object tác giả đảm bảo một tấm séc tham khảo đơn giản cho null sẽ xảy ra (đó là những gì được dự định).

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