值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)
G.Y*_*G.Y 11
在最简写的答案中:
== opertator是检查身份.(即:a == b这两个是同一个对象吗?)
.Equals()是检查值.(即:a.Equals(b)都持有相同的值?)
有一个例外:
对于字符串和预定义的值类型(例如int,float等...),
operator ==将回答值而不是标识.(与使用.Equals()相同)
它们之间的一个显着区别是,它==是一个静态二元运算符,它在一个类型的两个实例上工作,而它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)
在简单的层面上,差异在于调用哪种方法.如果为相关类型定义,==方法将尝试绑定到operator ==.如果找不到值类型的==,它将进行值比较,对于引用类型,它将进行参考比较..Equals调用将对.Equals方法进行虚拟调度.
至于特定方法的作用,它都在代码中.用户可以定义/覆盖这些方法并做任何他们喜欢的事情.理想情况下,这种方法应该是等效的(对双关语而言)并且具有相同的输出但并非总是如此.
| 归档时间: |
|
| 查看次数: |
38006 次 |
| 最近记录: |