【发布时间】:2012-01-09 11:03:50
【问题描述】:
我正在使用 .net 2.0 和 c#,并且我已经在我的类中实现了 IEquatible 接口,如下所示:-
public MyClass() : IEquatable<MyClass>
{
Guid m_id = Guid.NewGuid();
public Guid Id
{
get
{
return m_id;
}
}
#region IEquatable<MyClass> Members
public bool Equals(MyClass other)
{
if (this.Id == other.Id)
{
return true;
}
else
{
return false;
}
}
#endregion
}
这是不好的编程习惯吗?我读过我还需要实现 Object.Equals 和 Object.GetHashCode ,但我不知道为什么。
我希望能够检查 MyClass 的实例是否尚未包含在 MyClass 类型的通用列表中。为什么框架只建议你只实现 Equals?
任何帮助将不胜感激。
【问题讨论】:
-
实现可以简写为:
return this.Id == other.Id;. -
你想达到什么目的?使用上面发布的代码,MyClass 的每个实例都将使用新的 Guid 进行初始化,这意味着每个实例都是唯一的并且不能等同于另一个实例,这是期望的行为吗?
-
我同意。如果每个实例都有一个唯一的 ID,那么
Object.ReferenceEquals将以相同的方式工作(除非有可能克隆MyClass的实例)。 -
@AmarPalsapure - 与 OP 发布的代码将产生的
NullReferenceException相同。