为了比较两个变量,我们可以使用==或Equals方法。例如,
string a = new string(new char[] {'a', 'b', 'c', 'd'});
string b = new string(new char[] {'a', 'b', 'c', 'd'});
Console.WriteLine (a==b);
Console.WriteLine (a.Equals(b));
我的问题是我应该何时使用==以及何时应该使用等号?两者之间有什么区别吗?
答案 0 :(得分:5)
==是一个运算符,当没有重载时意味着"引用相等"对于类(和结构的字段相等),但可以重载。它是一个过载而不是一个覆盖的结果是它不是多态的。
Equals是一种虚拟方法;这使得它具有多态性,但意味着你需要注意不要在空实例上调用它。
根据经验:
EqualityComparer<T>.Default.Equals(a,b)
避免出现空问题,支持Nullable-of-T,并支持IEquatable-of-T 答案 1 :(得分:3)
John Skeet的这篇文章将回答你的问题:
那么,你何时应该使用哪个运算符?我的经验法则是 几乎所有引用类型,当您想要测试相等性时使用Equals 而不是参考身份。字符串例外 - 将字符串与==进行比较会使事情变得简单得多 更具可读性,但你需要记住运营商的双方 必须是string类型的表达式才能进行比较 工作正常。
对于值类型,我通常使用==来更容易阅读代码。事情 如果值类型为==提供了重载,那将会变得棘手 对Equals采取不同的行动,但我认为这种类型非常糟糕 旨在开始。
[作者:Jon Skeet]
答案 2 :(得分:1)
当对象类型使用==时,它将解析为 System.Object.ReferenceEquals。
Equals只是一个虚方法,并且表现如此,所以被覆盖了 将使用版本(对于字符串类型比较内容)。