为什么要实现 IEquatable 接口

2024-04-16

我一直在阅读文章并在一定程度上理解接口,但是,如果我想纠正我自己的自定义 Equals 方法,似乎我可以在不实现 IEquatable 接口的情况下做到这一点。一个例子。

using System;
using System.Collections;
using System.ComponentModel;

namespace ProviderJSONConverter.Data.Components
{
    public class Address : IEquatable<Address>
    {
        public string address { get; set; }

        [DefaultValue("")]
        public string address_2 { get; set; }
        public string city { get; set; }
        public string state { get; set; }
        public string zip { get; set; }

        public bool Equals(Address other)
        {
            if (Object.ReferenceEquals(other, null)) return false;
            if (Object.ReferenceEquals(this, other)) return true;
            return (this.address.Equals(other.address)
                && this.address_2.Equals(other.address_2)
                && this.city.Equals(other.city)
                && this.state.Equals(other.state)
                && this.zip.Equals(other.zip));
        }
    }
 }

现在如果我不实现接口并离开: IEquatable<Address>从代码来看,应用程序的运行方式似乎完全相同。因此,我不清楚为什么要实现该接口?我可以在没有它的情况下编写自己的自定义 Equals 方法,并且断点将仍然命中该方法并返回相同的结果。 谁能帮我解释一下吗?我很困惑为什么要包括“IEquatable<Address>" 在调用 Equals 方法之前。


现在,如果我不实现该接口并将 : IEquatable 排除在代码之外,则应用程序的运行方式似乎完全相同。

嗯,这取决于“应用程序”的作用。例如:

List<Address> addresses = new List<Address>
{
    new Address { ... }
};
int index = addresses.IndexOf(new Address { ... });

...那是行不通的(即index将是 -1) 如果你没有重写Equals(object)也没有实施IEquatable<T>. List<T>.IndexOf不会打电话给你的Equals超载。

了解您的代码specific类将拿起Equals重载 - 但任何适用于的代码(例如泛型集合、所有 LINQ to Objects 等)随意的物体不会拾取它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么要实现 IEquatable 接口 的相关文章

随机推荐

  • 在编译时通过 constexpr 或模板函数获取多维 std::array 的大小

    我用的是三维std array 因为大小在编译时已知 但是 我注意到 size 函数不是静态的 因此 constexpr 模板函数无法访问 我已经找到了下面的演示示例 它估计一维的大小std array 然而 这不适用于二维或更多维度 有没
  • C# 中的并发集合

    我正在寻找一种方法来获得并发收集 in C 或者至少是一个支持的集合并发枚举器 现在我得到了InvalidOperationException当我正在迭代的集合发生变化时 我可以深度复制该集合并使用私人副本 但我想知道是否有更好的方法 代码
  • DisplayMemberPath 在 WPF 中不起作用

    我要显示CustomerList CustomerName财产项目ListBox using ItemsSource DisplayMemberPath仅限财产 但它不起作用 我不想使用DataContext或我的问题中的任何其他绑定 请帮
  • 实体框架 6 和集合

    我正在开发我的第一个实体框架应用程序 我正在使用 EF 版本 6 来自 Nuget 和 net 4 0 然而 我在一些对我来说似乎应该非常简单的事情上遇到了一些困难 我在互联网上发现了很多相互矛盾的建议和解决方案 但是在花了几天时间尝试解决
  • Firebase - Firestore - 使用 collection.add() 获取密钥

    我在使用 Firebase 的新 Firestore 时遇到问题 情况 我有一个collection room 我创建房间collection room add room 我正在尝试做的事情 我需要更新一个房间 为此 我使用 collect
  • 示例 urllib3 和 python 中的线程

    我正在尝试在简单线程中使用 urllib3 来获取多个 wiki 页面 该脚本将 为每个线程创建 1 个连接 我不明白为什么 并永远挂起 urllib3 和线程的任何提示 建议或简单示例 import threadpool from url
  • 将多行转换为一行,并以逗号作为分隔符[重复]

    这个问题在这里已经有答案了 如果我发出SELECT username FROM Users我得到这个结果 username Paul John Mary 但我真正需要的是one所有值均以逗号分隔的行 如下所示 Paul John Mary
  • 计算网格上两点之间恰好有“n”个节点的最短路径

    我在网格上定义了以下 3D 表面 pylab inline def muller potential x y use numpy False Muller potential Parameters x float np ndarray or
  • 实体框架 Fluent API 映射简单的一对多关系

    我有两张桌子 文档 Id DocumentTypeId 标题 详细信息 文档类型 ID 名称 描述 DocumentTypeId 是引用 DocumentTypes 表的外键 IE 所有文件都可以应该 有一个分配给它们的类型 我有两节课 p
  • 多人台球游戏物理模拟[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 将邻接矩阵转换为 Cytoscape 的 Edgelist(csv 文件)

    我的 csv 文件中有一个大的 200 列 行 邻接矩阵 这详细说明了个体之间的互动 我想将此文件转换为边缘列表 可以手动完成 但需要大量时间 下面显示了一小部分数据 第一个单元格是空格 A B C A 0 0 1 B 0 0 1 C 1
  • (0, _reactI18next.translate) 不是函数

    实际上 我是本地反应新手 在这里我尝试使用 react i18next 将语言更改为阿拉伯语 但在执行时出现以下错误 ReactNativeJS 0 reactI18next translate 不是一个函数 在 0 reactI18nex
  • AppDelegate 或 AppController

    在阅读可可教程时 我注意到一些教程使用AppDelegate还有一些AppController用于定义IBActions打开使用子类的各种窗口NSWindowController 这有某种经验法则吗 我创建一个仅是我的应用程序委托的类 并实
  • 如何使用 Visual Studio 2008 对 C# Web 服务进行单元测试

    您应该如何使用 Visual Studio 2008 对 C 中的 Web 服务进行单元测试 当我生成单元测试时 它会添加对 Web 服务类的实际引用 而不是 Web 引用 它设置以下中指定的属性 http msdn microsoft c
  • 检查 netcdf linux 库版本

    如何确定我的系统中安装了哪个版本的 netcdf 库 有命令行吗 我尝试搜索 netcdf 发现了一堆文件 但无法确定版本号 有没有命令可以检查已安装的任何版本 我在ubuntu上 netCDF 提供nc config用于此目的的命令行工具
  • 在 Rust 中应该如何进行指针算术?

    我知道答案是 你不应该 但为了争论 如何should你做吧 例如 如果您想编写一个替代方案Vec
  • Apache 服务器上的 React、js

    我正在一个react js项目中工作 我有一个安装了apache服务器的云服务器 我的问题是我可以在 apache 服务器上设置我的反应项目吗 正如达文 泰伦所说 react是一种浏览器技术 除了客户端浏览器从服务器下载应用程序之外 一切都
  • 用户模型中带有 uuid 列的 Laravel Sanctum 不保存 tokenable_id

    我尝试使用Laravel 8 x and Laravel sanctum 2 14 2验证我的 API 和 UUID 作为我的主密钥User model 我的定制PersonalAccessToken model use Illuminat
  • 在 Google Places Apis 中搜索特定城市内的位置

    我正在使用 Google Places Apis 来过滤特定城市内的结果 我能够过滤结果 但它也会显示该城市之外的结果 例如 如果我设置德里市的 LatLngBounds 并搜索纽约市的位置 它还给了我纽约市的结果 但纽约的 LatLng
  • 为什么要实现 IEquatable 接口

    我一直在阅读文章并在一定程度上理解接口 但是 如果我想纠正我自己的自定义 Equals 方法 似乎我可以在不实现 IEquatable 接口的情况下做到这一点 一个例子 using System using System Collectio