簡體   English   中英

EqualityComparer <T> 。默認誤解?

[英]EqualityComparer<T>.Default misunderstanding?

我有一個Person類,它從IEquatable<Person>實現Equals()方法(也覆蓋了Object.Equals方法,現在讓我們忽略GetHashcode()方法)

class Person : IEquatable<Person>
{
    public string Name { get; set; }

    public bool Equals(Person other)
    {
        return this.Name == other.Name;
    }
    public override bool Equals(object obj)
    {
        var person = obj as Person;
        return person != null && person.Name == Name;
    }
}

好的,讓我們開始:

Person p1 = new Person() { Name = "a" };
Person p2 = new Person() { Name = "a" };

List<Person> lst1 = new List<Person>() { p1 };
List<Person> lst2 = new List<Person>() { p2 };

讓我們來談談這一行:

 bool b = lst1.SequenceEqual(lst2, EqualityComparer<Person>.Default);

理解這部分我有一個問題:

EqualityComparer<Person>.Default

我聽說EqualityComparer<Person>.Default將檢查該類是否正在實現IEquatable - 它將采用Equals(Person other)方法而不是Equals(object obj) 它有避免拳擊的優勢

在此輸入圖像描述

Equals(Person other)使用或withOUT EqualityComparer<Person>.Default運行EqualityComparer<Person>.Default (因為它正在實現IEquatable)

那么我們在談論什么拳擊? 沒有!

Equals(object obj)運行的唯一時間是:

bool b = lst1.SequenceEqual(lst2,EqualityComparer<Object>.Default);

我是一名程序員! 當它實際上是一個Person時,我永遠不會發送一個object

我錯過了什么? 我在理解EqualityComparer<Object>.Default的好處時遇到了麻煩。 有人可以舉個例子來證明我錯了嗎?

如果你傳入null作為第二個參數或者根本沒有傳入第二個參數(基本相同),則SequenceEquals的實現將調用EqualityComparer<T>.Default本身(反編譯Enumerable以查看此內容) 。 這就解釋了為什么你沒有看到是否提供EqualityComparer<T>.Default的區別。

所以最后,如果你想使用 EqualityComparer<T>.Default 之外的相等比較器,第二個參數才有意義。

您可以傳入IEqualityComparer<object>.Default是.NET 4中添加的通用逆變的影響。

本質上,只要需要IEqualityComparer<DerivedType> ,就可以使用IEqualityComparer<BaseType> ,其中DerivedType : BaseType 由於Person派生自Object ,這意味着IEqualityComparer<Object>可以在需要IEqualityComparer<Person>任何地方使用。

答案在這里: http//msdn.microsoft.com/en-us/library/ms131187(v = vs.110).aspx

對於值類型,您應始終實現IEquatable並重寫Object.Equals(Object)以獲得更好的性能。 Object.Equals框值類型並依賴於反射來比較兩個值的相等性。 你的Equals實現和你對Object.Equals的重寫應該返回一致的結果。

如果你不重寫Equals和GetHashCode,EqualityComparer.Default實際上會為你處理。

暫無
暫無

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

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