-6

可能重复:和 .Equals()
之间的 C# 区别==

为了比较两个变量,我们可以使用 == 或 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));

我的问题是什么时候应该使用 == 什么时候应该使用 Equals?两者有什么区别吗?

4

3 回答 3

7

== 是一个运算符,当不重载时,它表示类的“引用相等”(以及结构的字段相等),但可以重载。它是重载而不是覆盖的结果是它不是多态的。

Equals 是一个虚方法;这使它具有多态性,但这意味着您需要小心不要在空实例上调用它。

根据经验:

  • 如果你知道某事物的类型,并且知道它有 == 重载(大多数核心类型,如字符串、int、float 等具有 == 含义),那么使用 ==
  • 如果您不知道类型,可能会推荐使用 Equals(a,b),因为这样可以避免 null 问题
  • 如果您真的想检查相同的实例(引用相等),请考虑使用 ReferenceEquals(a,b),因为即使 == 被重载并且 Equals 被覆盖,这也将起作用
  • 使用泛型时,考虑EqualityComparer<T>.Default.Equals(a,b)哪个可以避免 null 问题,支持 Nullable-of-T,并支持 IEquatable-of-T
于 2012-04-30T07:13:29.023 回答
4

John Skeet 的这篇文章将回答您的问题:

那么,什么时候应该使用哪个运算符呢?我的经验法则是,对于几乎所有引用类型,当您想要测试相等性而不是引用标识时,请使用 Equals。字符串是个例外——用 == 比较字符串确实让事情变得更简单、更易读,但你需要记住,运算符的两边都必须是字符串类型的表达式,才能使比较正常工作。

对于值类型,我通常使用 == 来获得更易于阅读的代码。如果值类型为 == 提供与 Equals 不同的重载,事情就会变得棘手,但我认为这种类型一开始设计的非常糟糕。

[作者:乔恩斯基特]

http://blogs.msdn.com/b/csharpfaq/archive/2004/03/29/when-should-i-use-and-when-should-i-use-equals.aspx

于 2012-04-30T07:09:43.970 回答
1

当 == 用于对象类型时,它将解析为 System.Object.ReferenceEquals。

Equals 只是一个虚拟方法并且行为如此,因此将使用覆盖的版本(对于字符串类型比较内容)。

https://stackoverflow.com/a/814880/655293

于 2012-04-30T07:09:57.327 回答