gpt4 book ai didi

c# - EqualityComparer.Default 不够聪明

转载 作者:太空狗 更新时间:2023-10-29 19:39:57 28 4
gpt4 key购买 nike

我正在阅读 EqualityComparer<T>.Default 的源代码并发现它并没有那么聪明。这是一个例子:

enum MyEnum : int { A, B }
EqualityComparer<MyEnum>.Default.Equals(MyEnum.A, MyEnum.B)
//is as fast as
EqualityComparer<int>.Default.Equals(0, 1)

enum AnotherEnum : long { A = 1L, B = 2L }
//is 8x slower than
EqualityComparer<long>.Default.Equals(1L, 2L)

从EqualityComparer中私有(private)方法的源码中可以看出原因。

private static EqualityComparer<T> CreateComparer()
{
//non-important codes are ignored
if (c.IsEnum && (Enum.GetUnderlyingType(c) == typeof(int)))
{
return (EqualityComparer<T>) RuntimeTypeHandle.CreateInstanceForAnotherGenericParameter((RuntimeType) typeof(EnumEqualityComparer<int>), c);
}
return new ObjectEqualityComparer<T>();
}

我们可以看到EqualityComparer<int>.Default , EqualityComparer<MyEnum>.DefaultEqualityComparer<long>.Default找一个聪明的比较者,他的 Equals方法看起来像:

public static bool Equals(int x, int y)
{
return x == y; //or return x.Equals(y); here
//I'm not sure, but neither causes boxing
}

public static bool Equals(MyEnum x, MyEnum y)
{
return x == y; //it's impossible to use x.Equals(y) here
//because that causes boxing
}

上面两个聪明,但是EqualityComparer<AnotherEnum>.Default运气不好,从方法上看最后得到了一个ObjectEqualityComparer<T>() , 谁的 Equals方法可能看起来像:

public static bool Equals(AnotherEnum x, AnotherEnum y)
{
return x.Equals(y); //too bad, the Equals method is from System.Object
//and it's not override, boxing here!
//that's why it's so slow
}

我觉得这个条件Enum.GetUnderlyingType(c) == typeof(int)毫无意义,如果枚举的基础类型是 int 类型,则该方法可以转换 int 的默认比较器到此枚举。但是为什么不能基于 long 的枚举呢?这不是我想的那么难吗?有什么特别的原因吗?构造一个类似 x == y 的比较器枚举并不难,对吧?为什么最后它给出了一个缓慢的 ObjectEqualityComparer<T>对于枚举(即使它工作正常)?

最佳答案

我认为负责添加此功能的团队没有令人信服的理由。所有功能都有实现成本,其中包括(除其他外)记录、编码和测试的时间。

有几个令人信服的原因可以解释为什么到目前为止没有选择此特定功能而不是其他功能(并且可能永远不会削减 IMO):

  • 它只适用于非常狭窄的场景(比较由 int 以外的东西支持的 enums,并在某个内部循环中执行)
  • 如果给您带来问题,有一个非常直接且可发现的解决方案(编写您自己的比较器)

关于c# - EqualityComparer<T>.Default 不够聪明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5829441/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com