加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Object.Equals是虚拟的,但Object.operator ==不在C#中使用它?

发布时间:2020-12-15 05:40:17 所属栏目:百科 来源:网络整理
导读:我被C#中一个奇怪的“不对称”所打击,我真的不明白.请参阅以下代码: using System;using System.Diagnostics;namespace EqualsExperiment{ class Program { static void Main(string[] args) { object apple = "apple"; object orange = string.Format("{0}
我被C#中一个奇怪的“不对称”所打击,我真的不明白.请参阅以下代码:
using System;
using System.Diagnostics;
namespace EqualsExperiment
{
    class Program
    {
        static void Main(string[] args)
        {
            object apple = "apple";
            object orange = string.Format("{0}{1}","ap","ple");
            Console.WriteLine("1");
            Debug.Assert(apple.Equals(orange));
            Console.WriteLine("2");
            Debug.Assert(apple == orange);
            Console.WriteLine("3");
        }
    }
}

对于所有的.NET大师来说,这可能是显而易见的,但第二个断言失败了.

在Java中,我了解到==是这里名为Object.ReferenceEquals的同义词.在C#中,我认为Object.operator ==使用Object.Equals,它是虚拟的,因此它在System.String类中被覆盖.

有人可以解释,为什么第二个断言在C#中失败?我的哪些假设不好?

解决方法

==运算符不是同义词,它是为不同类型定义的运算符.

==运算符是为字符串定义的,然后它确实使用了Equals方法:

public static bool operator ==(string a,string b) {
  return Equals(a,b);
}

但是,在您的代码中,您没有在字符串上使用运算符,而是在对象上使用它,因此您获得的是为对象定义的==运算符,它使用ReferenceEquals进行比较.

在编译时决定使用哪个运算符的重载,因此它是决定重载的变量类型,而不是变量指向的实际对象类型.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读