c# – 为什么要实现IEquatable接口

我一直在阅读文章并理解一定程度的接口,如果我想改正我自己的自定义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方法之前.

解决方法:

Now if i dont implement the interface and leave : IEquatable out of the code, it seems the application operates exactly the same.

那么,这取决于“应用程序”的作用.例如:

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

…如果既没有重写Equals(对象)也没有实现IEquatable< T>,那将无效(即索引将为-1).列表< T> .IndexOf不会调用您的Equals重载.

知道你的特定类的代码将获取Equals重载 – 但是任何与任意对象一起使用的代码(例如泛型集合,所有LINQ to Objects等)都不会接收它.

上一篇:c# – 确定对象的类型


下一篇:java – 使用多态?