.Equals和==之间有什么区别

Cod*_*313 39 .net c# string

a.Equals(b)a == b类型,引用类型和字符串之间有什么区别?看起来似乎= = b对于字符串来说效果很好,但我一直在尝试使用良好的编码实践.

Dir*_*mar 37

什么时候开始我应该使用Equals,什么时候应该使用==:

Equals方法只是在System.Object中定义的虚拟方法,并且被选择执行的任何类重写.==运算符是一个可以由类重载但通常具有标识行为的运算符.

对于尚未重载==的引用类型,它会比较两个引用是否引用同一个对象 - 这正是Equals在System.Object中的实现.

默认情况下,值类型不会为==提供重载.但是,框架提供的大多数值类型都提供了自己的重载.值类型的Equals的默认实现由ValueType提供,并使用反射进行比较,这使得它通常比特定于类型的实现慢得多.此实现还在被比较的两个值中的引用对上调用Equals.

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));
    }
}
Run Code Online (Sandbox Code Playgroud)

这个简短的示例程序的结果是

True
True
False
True
Run Code Online (Sandbox Code Playgroud)


Chr*_*fer 12

这是一篇很棒的博客文章,关于为什么实现方式不同.

从本质上讲==会在编译时使用的变量类型来约束和.Equals是要在运行时动态绑定.


G.Y*_*G.Y 11

在最简写的答案中:

== opertator是检查身份.(即:a == b这两个是同一个对象吗?)

.Equals()是检查值.(即:a.Equals(b)都持有相同的值?)

有一个例外:
对于字符串预定义的值类型(例如int,float等...),
operator ==将回答值而不是标识.(与使用.Equals()相同)


And*_*are 8

它们之间的一个显着区别是,它==是一个静态二元运算符,它在一个类型的两个实例上工作,而它Equals是一个实例方法.重要的原因是你可以这样做:

Foo foo = new Foo()
Foo foo2 = null;
foo2 == foo;
Run Code Online (Sandbox Code Playgroud)

但是如果不扔掉一个你就不能这样做NullReferenceException:

Foo foo = new Foo()
Foo foo2 = null;
foo2.Equals(foo);
Run Code Online (Sandbox Code Playgroud)


Jar*_*Par 7

在简单的层面上,差异在于调用哪种方法.如果为相关类型定义,==方法将尝试绑定到operator ==.如果找不到值类型的==,它将进行值比较,对于引用类型,它将进行参考比较..Equals调用将对.Equals方法进行虚拟调度.

至于特定方法的作用,它都在代码中.用户可以定义/覆盖这些方法并做任何他们喜欢的事情.理想情况下,这种方法应该是等效的(对双关语而言)并且具有相同的输出但并非总是如此.