gpt4 book ai didi

C# Overriding Equals using "as"和用于正确性、灵活性和性能的专门方法

转载 作者:行者123 更新时间:2023-11-30 15:13:05 25 4
gpt4 key购买 nike

我想知道在 C# 中实现正确、灵活和快速的 Equals 的最佳方法,它几乎可以用于任何类和情况。我认为性能需要一个专门的 Equals(将实际类的对象作为参数)。为了避免代码重复,一般的 Equals 应该调用专门的 Equals。空检查应该只执行一次,即使在继承的类中也是如此。

我终于想到了这个设计:


class MyClass
{
public Int32 SomeValue1 = 1;
public Int32 SomeValue2 = 25;

// Ignoring GetHashCode for simplicity.

public override bool Equals(object obj)
{
return Equals (obj as MyClass);
}

public bool Equals(MyClass obj)
{
if (obj == null) {
return false;
}

if (!SomeValue1.Equals (obj.SomeValue1)) {
return false;
}

if (!SomeValue2.Equals (obj.SomeValue2)) {
return false;
}

return true;
}
}

class MyDerivedClass : MyClass
{
public Int32 YetAnotherValue = 2;

public override bool Equals(object obj)
{
return Equals (obj as MyDerivedClass);
}

public bool Equals(MyDerivedClass obj)
{
if (!base.Equals (obj)) {
return false;
}

if (!YetAnotherValue.Equals (obj.YetAnotherValue)) {
return false;
}

return true;
}
}

重要思想:

  • “as”运算符的使用。这样我们就不必检查一般 Equals 中的空值。错误的类类型将减少为 null,并将在专门的 Equals 中进行分类。
  • 只在一点进行 Null 检查,即使对于派生类也是如此。
  • 逐个检查属性可提供清晰的结构。

这个概念是否存在缺陷,或者我是否遗漏了任何条件?

最佳答案

当涉及不同类型时,您的 Equals 方法不是自反的:

MyDerivedClass mdc = new MyDerivedClass();
MyClass mc = new MyClass();
Object omdc = mdc;
Object omc = mc;

// mc.Equals(mdc) - true
// mdc.Equals(mc) - true by calling the right overload
// omc.Equals(omdc) - true
// omdc.Equals(omc) - false, the "as" in MyDerivedClass will result in null

正常的方法是使用:

if (GetType() != other.GetType())
{
return false;
}

请参阅 Object.Equals 中的文档:“x.Equals(y) 返回与 y.Equals(x) 相同的值。”依靠重载来提供不同的结果可能会导致可怕的问题,这些问题很难调试。

关于C# Overriding Equals using "as"和用于正确性、灵活性和性能的专门方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/460846/

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