- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我在 SO 上的许多问题都与 IEquatable 实现有关。我发现它很难正确实现,因为在天真的实现中有很多隐藏的错误,而且我找到的关于它的文章也很不完整。我想找到或写一个明确的引用,其中必须包括:
这样完整的引用文献已经存在了吗?
附言:偶MSDN reference对我来说似乎有缺陷
最佳答案
IEquatable<T>
对于值类型实现 IEquatable<T>
值类型与引用类型略有不同。假设我们有 Implement-Your-Own-Value-Type 原型(prototype),一个复数结构。
public struct Complex
{
public double RealPart { get; set; }
public double ImaginaryPart { get; set; }
}
我们的第一步是实现 IEquatable<T>
并覆盖 Object.Equals
和 Object.GetHashCode
:
public bool Equals(Complex other)
{
// Complex is a value type, thus we don't have to check for null
// if (other == null) return false;
return (this.RealPart == other.RealPart)
&& (this.ImaginaryPart == other.ImaginaryPart);
}
public override bool Equals(object other)
{
// other could be a reference type, the is operator will return false if null
if (other is Complex)
return this.Equals((Complex)other);
else
return false;
}
public override int GetHashCode()
{
return this.RealPart.GetHashCode() ^ this.ImaginaryPart.GetHashCode();
}
除了运算符之外,我们只需要很少的努力就可以实现正确的实现。添加运算符也是一个简单的过程:
public static bool operator ==(Complex term1, Complex term2)
{
return term1.Equals(term2);
}
public static bool operator !=(Complex term1, Complex term2)
{
return !term1.Equals(term2);
}
精明的读者会注意到我们应该实现 IEquatable<double>
自 Complex
数字可以与基础值类型互换。
public bool Equals(double otherReal)
{
return (this.RealPart == otherReal) && (this.ImaginaryPart == 0.0);
}
public override bool Equals(object other)
{
// other could be a reference type, thus we check for null
if (other == null) return base.Equals(other);
if (other is Complex)
{
return this.Equals((Complex)other);
}
else if (other is double)
{
return this.Equals((double)other);
}
else
{
return false;
}
}
如果我们添加IEquatable<double>
,我们需要四个运算符,因为你可以有 Complex == double
或 double == Complex
(对于 operator !=
也是如此):
public static bool operator ==(Complex term1, double term2)
{
return term1.Equals(term2);
}
public static bool operator ==(double term1, Complex term2)
{
return term2.Equals(term1);
}
public static bool operator !=(Complex term1, double term2)
{
return !term1.Equals(term2);
}
public static bool operator !=(double term1, Complex term2)
{
return !term2.Equals(term1);
}
至此,我们以最小的努力得到了正确且有用的实现 IEquatable<T>
对于值类型:
public struct Complex : IEquatable<Complex>, IEquatable<double>
{
}
关于c# - 有完整的IEquatable实现引用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1307493/
我有一个树型类 Foo及其界面 IFoo . 我想要 Foo能够实现IEquatable>什么时候T : IEquatable (或者更一般地说,如果 T : I 我可能想要 Foo : I> 除了其
域类 T可以是 ValueObject 类型: public class Coordinate: ValueObject { ... } ValueObject实现 IEquatable界面。我想要
我首先使用带有 EntityFramework 代码的 ASP.NET MVC。 我正在尝试为将保存到我的数据库中的所有对象创建一个基类(这里称为实体类)。 有没有在基类中实现IEquatable的好
我想比较两个相同类型的自定义类对象。被比较的自定义类有一个 List 属性,其中填充了另一种自定义类型的项目。这可以通过继承 IEquatable 实现吗? 我不知道如何通过修改 MSDN's cod
当我使用 IEquatable interface 实现要比较的对象时: 为什么我必须覆盖 Equals(object)方法,如果我已经实现 Equals(T) ? 我可以使用==吗?和 !=运营商一
我想要一个通用类来实现 IEquatable 接口(interface)。该类具有 T 类型的数据项。要使泛型类等同,数据项也必须是 T 类型。 这是我的通用类: public class V : I
我有一个代表外部物理测量设备的类。简化版本如下所示: public class Device { public string Tag { get; set; } public int
我有一个 IEquatable方法如下: public bool Equals(TravelOptions other) { if (other == null) return false;
我有一个来自 SQL Server 数据库的 POCO,它有一个身份 ID 字段。我想实现 IEquatable 这样我就可以检查它们是否是相同的记录,使用 .Contains()在 List等 假设
我尝试使用以下方法来阻止人们更改 querystring为了查看其他人的详细信息: public static bool IsCurrentUserAuthorisedVessel(HttpReque
假设我有以下类(class): public sealed class ScaleValue : IComparable, IComparable, IEquatable { publ
我有一个可以毫无问题地序列化为 XML 的对象。但是,当我实现 IEquatable 并覆盖函数时,我收到有关未正确生成 XML 的错误。以前有人遇到过这个吗? 最佳答案 您可能需要覆盖 Equals
这是一个关于我正在尝试做的事情的例子: public class Foo : IEquatable { public bool Equals(Foo other) {
我经常使用代表工厂生产的实体的类。为了方便地测试我的工厂,我通常实现 IEquatable , 同时也覆盖 GetHashCode和 Equals (如 MSDN 所建议)。 例如;采用以下为示例目的
我有一个包含两个字符串和一个枚举的类。我正在尝试使用此类的实例作为字典中的键。不幸的是,我似乎没有正确实现 IEquatable。这是我的做法: public enum CoinSide {
我想知道 F# 中的相等测试在哪些情况下会导致装箱,以及是否存在覆盖 Equals 的情况。和 GetHashCode并实现IEquatable<>比使用 StructuralEqualityAttr
我刚刚将 Visual Studio 更新到最新的 16.6.0 Preview 1.0 和最新的 .NET Core 3.1.2。我的项目有enable . IEquatable 似乎发生了变化。现
我已经实现了IEquatable比较两个列表中的对象但是我想有条件地这样做: public bool Equals(CustomerType other) { if (this.Zipcode
我正在研究接口(interface)的类型,但我不明白如何使用 IEquatable 接口(interface)。 我认为它比直接使用a.Equals(b)提供了更好的性能,因为我们避免了拳击...我
嗯,我遇到了 IEquatable (C#) 的问题。正如您在下面的代码中看到的,我得到了一个实现了 IEquatable 的类,但是它的“Equals”方法无法实现。我的目标是:我的数据库中有一个日
我是一名优秀的程序员,十分优秀!