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进行比较. 在编译时决定使用哪个运算符的重载,因此它是决定重载的变量类型,而不是变量指向的实际对象类型. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- ruby-on-rails – Rails中属性的基于角色的安全机
- 谈谈Oracle 数据库的系统权限UNLIMITED TABLESPA
- 重构 — 改善既有的类图设计 条款3:用 FACADE 类
- Cocos2D-Android-1之源码详解:4.AtlasTest
- c# – System.Array’不包含’Count’的定义
- 我用Cocos2d-x模拟《Love Live!学院偶像祭》的Li
- postgresql – Postgres GIST和Btree索引
- 正则表达式30分钟入门教程
- reactjs – i18n进行反应,formatjs,react-intl
- [ReactNative入门到精通]React Native 第一个程
热点阅读