我希望我的Food类能够在与另一个Food实例相等时进行测试.稍后我将对一个列表使用它,我想使用它的List.Contains()方法.我应该执行IEquatable<Food>还是只覆盖Object.Equals()?来自MSDN:

此方法通过以下方式确定等式:

所以我的下一个问题是:函数的哪些函数/类.NET框架使用Object.Equals()?我应该首先使用它吗?

推荐答案

主要原因是性能.当仿制药被引入美国时.NET2.0他们能够添加一系列整洁的类,比如List<T>Dictionary<K,V>HashSet<T>等.这些 struct 大量使用GetHashCodeEquals.但对于值类型,这需要装箱.IEquatable<T>允许 struct 实现强类型Equals方法,因此不需要装箱.因此,在将值类型与泛型集合一起使用时,性能会更好.

引用类型受益不大,但IEquatable<T>实现确实让您避免了System.Object的强制转换,如果它被频繁调用,这可能会有所不同.

但是,正如Jared Parson's blog所指出的,您must仍然实现标准Object.EqualsObject.GetHashcode覆盖.

.net相关问答推荐

Long.MaxValue从Single到Long的转换导致溢出异常

Azure SignalR 和微服务

Msbuild try 构建 msbuild.exe 而不是我的 .csproj 文件

关于在 .NET 中干净地终止线程的问题

将 Moq 模拟对象传递给构造函数

指定的版本字符串不符合要求的格式 - major[.minor[.build[.revision]]]

托管和非托管代码、内存和大小有什么区别?

从 Web.Config 中的邮箱友好显示名称存储 Smtp

如何使用 log4net 记录跟踪消息?

在 ToString() 之前判断 null

如何比较 C# 中的(目录)路径?

在未安装 Visual Studio 的机器上使用 FUSLOGVW.EXE

什么是 C# 中的自动属性,它们的用途是什么?

等效于 C# 在 powershell 中的使用关键字?

获取系统中已安装的应用程序

通过反射查找可空属性的类型

如何在安装后立即启动 .NET Windows 服务?

如何将 Excel 序列日期编号转换为 .NET DateTime?

C# 应用程序中的全局键盘捕获

如何为 Dapper 查询动态创建参数