发表日期:2017-11-23 17:37:30文章编辑:浏览次数:191 标签:公司新闻
在对象化programming的这个world里,基于以上原因,可以看作语法sweet吧,本来不应该有==,equals是标准.但==确实很方便,更直观。那么我们因为便利性而使用==,,==最好理解为:以比较的类型为前提,决定比较的方式。即,值类型比较值,对象类型比较引用
看看msdn对于 ==和 equals的解释:
== 的解释:
对于预定义的值类型,如果操作数的值相等,则相等运算符 (==) 返回 true,否则返回 false。 对于 string 以外的引用类型,如果两个操作数引用同一个对象,则 == 返回 true。 对于 string 类型,== 比较字符串的值。
equals的解释:
如果当前实例是引用类型,Equals(Object)方法测试引用相等性,并调用Equals(Object)方法等效于调用ReferenceEquals方法。 引用相等性意味着进行比较的对象变量引用同一个对象
如果当前实例是值类型,Equals(Object)方法测试值是否相等
对于引用类型来说,
等号(==)比较的是两个变量的”引用” 是否一样,即是引用的”地址”是否相同。
而对于equals来说仍然比较的是变量的 ”内容” 是否一样。
那么object a1=15,以及 object 阿=15. 对于内容层面来说,两者完全相同,返回true,这样就说的通了!
Java 不允许重载操作符,所以 == 符号的行为是固定的。
C# 的 == 符号的行为你是可以通过重载操作符去修改的,这提供了更灵活的编程方式,但增加了代码的理解难度,也是 Java 不允许重载操作符的原因。
我相信c#语言的设计,本身遵循的是一种极简的的逻辑在里边,以此为基础去理解各种变化就可以了,如果累举各种细节情况来分析,反而把自己绕进去了。
这个极简的逻辑,我的观点,补充一下上面说过的:
1.在对象化编程的世界里,本来不应该有==,equals比较值,refrenceequal比较引用,本来从逻辑上来说,就足够了,没==什么事。
2.但==确实很方便,更直观。那么我们因为便利性而使用==,可以看作语法糖,c#重写了==,使程序员在equals和refrenceequals之外,有一个更便捷的方式。但使用==的理念必须清晰,就如3所说。
3.基于以上原因,==最好理解为:以比较的类型为前提,决定比较的方式。即,值类型比较值,对象类型比较引用
以这种极简的观念出发,赋予两个object对象,因为object是对象基类,值被包装过了进行的对比,所以是引用比较,地址也不同。