==与C#中的等于之间的差异

时间:2012-04-30 07:08:38

标签: c# .net equals

  

可能重复:
  C# difference between == and .Equals()

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

我的问题是我应该何时使用==以及何时应该使用等号?两者之间有什么区别吗?

3 个答案:

答案 0 :(得分:5)

==是一个运算符,当没有重载时意味着"引用相等"对于类(和结构的字段相等),但可以重载。它是一个过载而不是一个覆盖的结果是它不是多态的。

Equals是一种虚拟方法;这使得它具有多态性,但意味着你需要注意不要在空实例上调用它。

根据经验:

  • 如果你知道某种东西的类型,并且知道它有一个==重载(大多数核心类型,如string,int,float等都有==含义),那么使用==
  • 如果你不知道类型,可以推荐Equals(a,b),因为这可以避免空问题
  • 如果你真的想要检查相同的实例(引用相等),请考虑使用ReferenceEquals(a,b),因为即使==重载并且等于被覆盖
  • ,这也会起作用
  • 使用泛型时,请考虑EqualityComparer<T>.Default.Equals(a,b)避免出现空问题,支持Nullable-of-T,并支持IEquatable-of-T

答案 1 :(得分:3)

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

  

那么,你何时应该使用哪个运算符?我的经验法则是   几乎所有引用类型,当您想要测试相等性时使用Equals   而不是参考身份。字符串例外 -   将字符串与==进行比较会使事情变得简单得多   更具可读性,但你需要记住运营商的双方   必须是string类型的表达式才能进行比较   工作正常。

     

对于值类型,我通常使用==来更容易阅读代码。事情   如果值类型为==提供了重载,那将会变得棘手   对Equals采取不同的行动,但我认为这种类型非常糟糕   旨在开始。

     

[作者:Jon Skeet]

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

答案 2 :(得分:1)

  

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

     

Equals只是一个虚方法,并且表现如此,所以被覆盖了   将使用版本(对于字符串类型比较内容)。

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