如何进入接口方法(Equals)
本文关键字:Equals 方法 何进入 接口 | 更新日期: 2023-09-27 18:25:15
我已经实现了iEquatable接口:
LineItem : IEquatable<LineItem>
但现在我想通过逐步执行代码来调试我的Equals(...)
方法。但即使在调试模式下,介入也不会进入(即F11),在方法中放置断点也不会让我进入。我如何调试它??
并不是说它应该是相关的,但这里是我的Equals
方法:
public bool Equals(LineItem other)
{
List<bool> individuals = new List<bool>();
individuals.Add(DateTime.Equals(Expiry, other.Expiry));
individuals.Add(Code == other.Code);
individuals.Add(Type == other.Type);
individuals.Add(Class == other.Class);
Func<object, object, bool> Compare = delegate(object A, object B)
{
if (A == DBNull.Value || B == DBNull.Value)
return A == B;
else
return (double)A == (double)B;
};
individuals.Add(Compare(Strike, other.Strike));
individuals.Add(Compare(Future, other.Future));
individuals.Add(Compare(Premium, other.Premium));
individuals.Add(Compare(Volatility, other.Volatility));
individuals.Add(Compare(Volume, other.Volume));
individuals.Add(Compare(OpenInterest, other.OpenInterest));
individuals.Add(Compare(Delta, other.Delta));
return !individuals.Contains(false);
}
编辑:我现在从代码中的其他地方调用这个方法,如下所示:
if(!fo.Future.Equals(li))...
但这仍然不能让我调试它。
您需要后退一大步,首先学习如何正确实现等式方法。C#被设计成一种"成功之坑"语言;也就是说,你应该自然而然地以正确的方式做事。不幸的是,在C#中,平等并不是一个"成功的坑";语言设计者没能让第一次做对它变得容易。
这是我在重写相等时使用的模式。
首先,从编写一个私有静态方法开始,该方法可以使一切正常。其他一切都将使用此方法。通过处理(1)早期的引用相等和(2)null检查来启动您的方法。
private static MyEquality(Foo x, Foo y)
{
if (ReferenceEquals(x, y)) return true;
// We now know that they are not BOTH null. If one is null
// and the other isn't then they are not equal.
if (ReferenceEquals(x, null)) return false;
if (ReferenceEquals(y, null)) return false;
// Now we know that they are both non-null and not reference equal.
... check for value equality here ...
}
好吧,现在我们有了它,我们可以用它来实现其他一切。
public override bool Equals(object y)
{
return MyEquality(this, y as Foo);
}
public override int GetHashcode()
{
// Implement GetHashcode to follow the Prime Directive Of GetHashcode:
// Thou shalt implement GetHashcode such that if x.Equals(y) is true then
// x.GetHashcode() == y.GetHashcode() is always also true.
}
public bool Equals(Foo y)
{
return MyEquality(this, y);
}
这就是正确实现IEquatable<T>.Equals
所必需的。您还应该考虑覆盖==
运算符以保持一致:
public static bool operator ==(Foo x, Foo y)
{
return MyEquality(x, y);
}
public static bool operator !=(Foo x, Foo y)
{
return !MyEquality(x, y);
}
现在,无论您调用object.Equals(foo, bar)
、foo.Equals(bar)
还是foo == bar
,都具有一致的行为。
LineItem.Equals(a, b)
是对Object.Equals(object, object)
的静态方法调用;这不是你的方法。
如果您已经覆盖了a.Equals(object)
,但没有覆盖它,则此实现将调用它。