最近我决定改用Equals
方法。我主要使用MSDN指南(我相信更新的指南)。所以我的实现最终会像这样:
public class EqualityCheck
{
public int Age { get; set; }
public string Name { get; set; }
public DateTime DateOfBirth { get; set; }
public override bool Equals(object obj)
{
if (null == obj)
{
return false;
}
//If obj is on of the expected type return false
EqualityCheck ec = obj as EqualityCheck;
if (null == ec)
{
return false;
}
//return true if the fields match. This is the place where we can decide what combination should be unique
return (Age == ec.Age) && (Name == ec.Name) && (DateOfBirth == ec.DateOfBirth);
}
public bool Equals(EqualityCheck ec)
{
// If parameter is null return false:
if (ec == null)
{
return false;
}
// Return true if the fields match:
return (Age == ec.Age) && (Name == ec.Name);
}
//How to implement GetHashCode for complex object?
}
还有一个孩子班:
public class EqualityCheckChild : EqualityCheck
{
public int Height { get; set; }
public override bool Equals(System.Object obj)
{
// If parameter cannot be cast to ThreeDPoint return false:
EqualityCheckChild ec1 = obj as EqualityCheckChild;
if (ec1 == null)
{
return false;
}
// Return true if the fields match:
return base.Equals(obj) && Height == ec1.Height;
}
public bool Equals(EqualityCheckChild ec1)
{
// Return true if the fields match:
return base.Equals((EqualityCheck)ec1) && Height == ec1.Height;
}
public static bool operator ==(EqualityCheckChild a, EqualityCheckChild b)
{
if (Equals(a, b))
{
return true;
}
if (a == null || b == null)
{
return false;
}
return a.DateOfBirth == b.DateOfBirth && a.Name == b.Name;
}
public static bool operator !=(EqualityCheckChild a, EqualityCheckChild b)
{
return !(a == b);
}
}
我认为这就是MSDN所显示的实现,只是删除了强制转换。
我正在使用VS2015
和.NET 4.5.2
。 VS标志着演员是多余的,那就是当我查看这个问题时。我已经读过可能的无限循环,只是出于好奇,我决定用上面的代码重新创建它。但是我不能重现它。
因为这不是复制粘贴代码。至少不是字面上的。我手工编写它试图理解我在做什么,所以我猜可能与原始代码有一些不匹配导致这种情况。但我的问题仍然存在 - 如何重现MSDN文章中提到的问题?
答案 0 :(得分:1)
尝试将EqualityCheckChild
的实例与null进行比较。
EqualityCheckChild foo = new EqualityCheckChild();
Console.WriteLine(foo == null);
此代码段将导致StackOverflowException,因为在operator==
方法中,if (a == null || b == null)
会调用自身。