C# string.GetHashCode和IEqualityComparer之间的差异<;字符串>;。Default.GetHashCode

C# string.GetHashCode和IEqualityComparer之间的差异<;字符串>;。Default.GetHashCode,c#,.net,C#,.net,我想对我的数据使用Distinct(),声明为IEnumerable。在这种情况下,我必须实现自己的IEqualityComparer,我的问题是: 以下实现之间有什么区别吗 public int GetHashCode(KeyValuePair<IdentType, string> obj) { return EqualityComparer<string>.Default.GetHashCode(obj.Value); } public int GetHas

我想对我的数据使用
Distinct()
,声明为
IEnumerable
。在这种情况下,我必须实现自己的
IEqualityComparer
,我的问题是:

以下实现之间有什么区别吗

public int GetHashCode(KeyValuePair<IdentType, string> obj) {
    return EqualityComparer<string>.Default.GetHashCode(obj.Value);
}
public int GetHashCode(KeyValuePair obj){
返回EqualityComparer.Default.GetHashCode(obj.Value);
}

public int GetHashCode(KeyValuePair obj){
返回obj.Value.GetHashCode();
}

不,它没有。实现将是相同的,因为它们都对实际类调用
GetHashCode()
,在本例中为
string

最后,
EqualityComparer
an中的方法及其实现是:


在这种情况下,
obj
将是原始的
字符串
,您可以在其中调用
GetHasCode
。唯一使其行为不同的情况是当
字符串
null
时只有一个:如果字符串为null,等式比较器的
GetHashCode
将返回0,而第二个实现将抛出一个异常。

一个区别是,当您将
null
传递给它时,
EqualityComparer.Default.GetHashCode
不会崩溃

using System;
using System.Collections.Generic;

public class Test
{
    public static void Main()
    {
        var n = EqualityComparer<string>.Default.GetHashCode(null);
        Console.WriteLine(n);
    }
}
使用系统;
使用System.Collections.Generic;
公开课考试
{
公共静态void Main()
{
var n=EqualityComparer.Default.GetHashCode(null);
控制台写入线(n);
}
}
除此之外,结果在设计上是相同的,因为
System.String
实现了
IEquatable

默认属性检查类型T是否实现了
System.IEquatable
通用接口,如果是,则返回调用
IEquatable.Equals
方法实现的
EqualityComparer
。否则,它将返回一个由
T
提供的
EqualityComparer


你的两种方法只有一点不同

如果类执行
iequatable
(哪个字符串执行),则将返回类型为的类。因此,
GetHashCode(obj.Value)
被调用到

    public override int GetHashCode(T obj) {
        if (obj == null) return 0;
        return obj.GetHashCode();
    }
这与调用
obj.Value.GetHashCode()相同
directly,但如果有空字符串,则默认比较器将返回0,直接调用版本将抛出空引用异常

using System;
using System.Collections.Generic;

public class Test
{
    public static void Main()
    {
        var n = EqualityComparer<string>.Default.GetHashCode(null);
        Console.WriteLine(n);
    }
}
    public override int GetHashCode(T obj) {
        if (obj == null) return 0;
        return obj.GetHashCode();
    }