簡體   English   中英

為什么 ReferenceEquals 仍然與值類型一起使用?

[英]Why is ReferenceEquals still used with value types?

有一個很好的解釋為什么object.ReferenceEquals(this, obj)不能用於值類型:

使用 ReferenceEquals 比較值時,如果 objA 和 objB 是值類型,則在將它們傳遞給 ReferenceEquals 方法之前將它們裝箱。 這意味着即使 objA 和 objB 都表示值類型的同一實例,ReferenceEquals 方法仍然返回 false

但是,我發現類似於以下代碼段的代碼:

internal readonly struct Foo
{
    public override bool Equals(object obj)
    {
        if (object.ReferenceEquals(this, obj))
        {
            return true;
        }

        if (obj is Foo other)
        {
            return this.Equals(other);
        }

        return false;
    }

    public bool Equals(Foo other)
    {
        // ..
        return true;
    }
}

這是錯誤的還是存在ReferenceEquals可能對值類型(尤其是結構)有用(即評估為真)的邊緣情況?

不應該。 編寫的代碼很糟糕,因為它不必要地為永遠無法工作的測試打包了一些東西。 為了完整起見,在這種情況下,更有用和慣用的模式是:

// custom Foo equality implementation
public bool Equals(Foo other)
{
    // ...
}
// default object implemenentation
public override int GetHashCode() {...} // must match Equals(Foo) logic
public override bool Equals(object obj) => obj is Foo other && Equals(other);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM