c# - .NET 中 "equals"的内部结构

标签 c# oop interface

我有一个愚蠢的怀疑。通常“System.Object”实现“Equals”。当我实现 IEquatable 接口(interface)我可以为我的“等于”提供自定义定义(我相信如此)。

所以教授类的实现等于

class Professor:System.Object,IEquatable

既然 System.Equals 和 IEquatable 的 Equals 有不同的定义,为什么 C# 没有报告错误?因为我没有覆盖“Equals”,甚至没有使用 new 关键字隐藏“Equals”。

class Professor : IEquatable<Professor>
{

   public string Name { get; set; }

   public bool Equals(Professor cust)
   {
       if (cust == null) return false;
       return cust.Name == this.Name;
   }

}

最佳答案

你既没有覆盖也没有隐藏Object.Equals() 因为您的版本将 Professor 作为参数类型 - 而不是对象。你是 overloading Equals() 方法。

C# 允许两个具有相同名称的方法在它们接受的参数类型上有所不同。这称为重载 - 它可以被视为编译时多态性。

Overriding (您可以,也可能应该这样做)从基类中的版本更改方法的实现。它是运行时类型多态性的基础。

Hiding 是一种不太常见的技术,它允许派生类屏蔽基类中方法的一个版本。根据调用的引用类型,您可以获取基类版本(如果通过基类引用调用)或派生类版本(如果通过派生类型调用)引用)。

关于你的第二个问题,你应该使用 IEquatable<T>当存在用于比较与引用相等性不同的两个实例的“相等性”的语义时。

你应该实现 IComparableIComparable<T>当有订购元素的语义时。这意味着它们可以小于、大于或相等。

关于c# - .NET 中 "equals"的内部结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1596502/

相关文章:

c# - 为所有 View 定义一个部分

c# - 在 Xamarin.Forms 的 WPF 预览中使用本地镜像

c# - TableLayoutPanel 在列内放置标签控件

oop - 为什么使用对象继承而不是 mixins

java - 如何在 Java 中从游戏 Canvas 添加单独的图像

java - 为什么有人会在 java 1.8 的接口(interface)中定义静态方法?

java - 实现采用枚举的接口(interface)的类

c# - Visual Studio调试器在混合 Debug模式下停止击中断点

ios - connect Action 在 iOS 开发中有什么作用?

java - 为什么要使用 getter 和 setter/访问器?