gpt4 book ai didi

c# - 当我比较一个对象(类型)时,它是否使用特定类的 IEquatable?

转载 作者:行者123 更新时间:2023-11-30 20:10:38 25 4
gpt4 key购买 nike

我的方法接收两个参数,都是Object 类型。它们具有相同的类型,实现了 IEquatable

我的问题是:当我这样做时:param1 == param2 框架是使用特定类的 IEquatable 运算符覆盖进行比较还是使用 对象.Equals 只是比较两个对象的内存指针?

哪种方法最好?是否具有泛型和派生约束?

最佳答案

实际上,两者都没有。 ==默认情况下,运算符将测试引用相等性,无论您的 Equals 的重写行为如何方法(如果你覆盖了它,如果你实现了 IEquatable<T> ,你当然应该拥有它)。

也就是说,如果您的变量类型为 object但您想使用自己的自定义相等比较,请使用 Equals(x, y)而不是 x == y .

那么,即使你已经实现了 IEquatable<T> , 请务必仍然覆盖 object.Equals ,像这样:

class MyType : IEquatable<MyType>
{
public bool Equals(MyType other)
{
// Whatever you want.
}

public override bool Equals(object other)
{
// Presumably you check for null above.
return Equals(other as MyType);
}
}

当然你也可以重载 ==!=对于您的类型的运算符,如果您引用了这种类型的对象,而这些对象只是 object,这将不会完成任何事情。变量,像这样:

object x = new MyType();
object y = new MyType();
Console.WriteLine(Equals(x, y));
Console.WriteLine(x == y);

上面的代码不会像你预期的那样工作(如果你已经重载了 == 并且期望它被使用)因为 ==重载必须在编译时解决;自 xy类型为任意对象,C# 编译器将选择 object类型的 ==运算符,同样,它只是测试引用相等性。


更新:现在,您可以确保您的 ==如果您的变量类型为定义它的类更派生的类型,则使用运算符。例如,给定以下类型:

class A
{
public static bool operator ==(A x, A y) { return true; }
public static bool operator !=(A x, A b) { return false; }
}

class B : A { }

class AComparer<T> where T : A
{
public bool CompareEqual(T x, T y) { return x == y; }
}

AComparer<T>.CompareEqual上面的方法将使用你重载的 == 任何类型的运算符 T源自 A .

要记住的关键是 ==static,这意味着它的重载解析是在编译时执行的,而不是在运行时使用 vtable 执行的(除非您使用的是 dynamic ,但那完全是另一回事)。所以请注意,无论何时您使用 ==代码中的运算符,并且您希望重载解析为自定义类型的重载。

关于c# - 当我比较一个对象(类型)时,它是否使用特定类的 IEquatable?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4830977/

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