“ ==”“ Equals”之间的差别。
来源:互联网 发布:河北人怎么样知乎 编辑:程序博客网 时间:2024/05/01 07:04
Equals 方法只是在 System.Object 中定义的一个虚拟方法,它由任何选择执行该任务的类所重写。== 运算符是一个可由类重载的运算符,该类通常具有恒等行为。
对于未重载 == 的引用类型,该运算符会比较两个引用类型是否引用同一对象,而这恰好是 System.Object 中的 Equals 实现所做的工作。
对于未重载 == 的值类型,该运算符会比较这两个值是否"按位"相等,即是否这两个值中的每个字段都相等。当您对值类型调用 Equals 时,仍然会发生这一情况,但这一次,该实现是由 ValueType 提供的,并且使用反射进行比较,从而使比较速度比特定于类型的实现慢很多。
到此为止,二者是如此类似。二者之间的主要区别是多态。运算符被重载而不是被重写,这意味着除非编译器知道调用更为具体的版本,否则它只是调用恒等版本。为阐明这一点,请看下面这个示例:
using System;public class Test{
static void Main()
{
// Create two equal but distinct strings
string a = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
string b = new string(new char[] {'h', 'e', 'l', 'l', 'o'});
Console.WriteLine (a==b);
Console.WriteLine (a.Equals(b));
// Now let's see what happens with the same tests but
// with variables of type object
object c = a;
object d = b;
Console.WriteLine (c==d);
Console.WriteLine (c.Equals(d));
}
}
结果是:
TrueTrue
False
True
第三行是 False,原因在于编译器不知道 c 和 d 的内容都是字符串引用,因而只能调用 == 的非重载版本。因为它们是对不同字符串的引用,所以恒等运算符返回 False。
那么,应该如何区别使用这些运算符呢?我的准则是:对于几乎所有引用类型,当您希望测试相等性而不是引用一致性时,请使用 Equals。例外的情况是字符串 - 使用 == 比较字符串确实会使事情简单得多,而且代码可读性更好,但是 您需要记住,该运算符的两端都必须是类型字符串表达式,才能使比较正常进行。
对于值类型,我通常使用 ==,因为除非值类型本身包含引用类型(这种情况极为罕见),否则是恒等还是相等的问题无关紧要。
- “ ==”“ Equals”之间的差别。
- object 类 “equals” 方法与 “ == " 之间的差别
- equals和==的差别
- C#中==和equals的差别
- java中equals和“==”的差别
- Java中==和equals的差别
- String中的equals方法与==的差别
- ==、Equals()、ReferenceEquals()之间的异同
- ==、Equals()、ReferenceEquals()之间的异同
- Java Integer的==和.equals()之间的区别
- Java对象之间的比较之equals和==
- 关于equals和==之间的区别(举例说明)
- Java“==”和equals()之间的比较
- hashcode、equals和==之间的区别
- 比较运算符compareTo()、equals()、==之间的区别
- 在java中==和equals之间的区别
- ReferenceEquals(), static Equals(), instance Equals(), 和运算行符==之间的关系
- name==null , "".equals(name) ,name.equals("") 之间的区别
- 爱情老了,就是亲情
- 受用一生的做人做事36字诀
- 关于创业的想法
- 阿忆:一个北大副教授的全部工资收入清单
- Ubuntu 英文界面下处理中文
- “ ==”“ Equals”之间的差别。
- DBGRIDEH 组件在Borland开发工具中应用全攻略
- tidy试用
- blog开张
- 返回数据库表中第m到n条记录集的sql语句的两种写法
- 近几天情况
- 最近的规划
- 一个用php实现ajax原来如此简单-xajax
- SELECT 赋值与ORDER BY冲突的问题