发布于 2008-09-22 01:31:12
string x = "hello";
string y = String.Copy(x);
string z = "hello";
测试x
是否指向与y
相同的对象
(object)x == (object)y // false
x.ReferenceEquals(y) // false
x.ReferenceEquals(z) // true (because x and z are both constants they
// will point to the same location in memory)
测试x
是否具有与y
相同的字符串值
x == y // true
x == z // true
x.Equals(y) // true
y == "hello" // true
请注意,这与Java不同。在Java语言中,==
操作符不是重载的,所以在Java语言中一个常见的错误是:
y == "hello" // false (y is not the same object as "hello")
对于Java语言中的字符串比较,您需要始终使用.equals()
y.equals("hello") // true
发布于 2015-08-20 06:23:30
我打算把这篇文章作为对公认答案的评论,但我认为在决定采取哪条路线时,这一点值得考虑。
dotnetfiddle:https://dotnetfiddle.net/gESLzO
小提琴代码:
Object a = null;
Object b = new Object();
// Ex 1
Console.WriteLine(a == b);
// Ex 2
Console.WriteLine(b == a);
// Ex 3
Console.WriteLine(b.Equals(a));
// Ex 4
Console.WriteLine(a.Equals(b));
前3个WriteLine示例可以工作,但第四个会抛出一个异常。1和2使用==
,这是一个静态方法,不需要实例化任何一个对象。
示例3之所以有效,是因为b
是实例化的。
示例4失败,因为a
为null
,因此不能在空对象上调用方法。
因为我尽可能懒惰地编写代码,所以我使用==
,特别是在处理其中一个对象(或两个)都可以为空的情况下。如果我没有这样做,那么在调用.Equals()
之前,我必须首先做一个空检查。
发布于 2008-09-22 00:18:29
我对两者的用法的理解是这样的:使用==表示概念上的相等(在上下文中,这两个参数的含义是否相同?),使用.Equals表示具体的相等(这两个参数实际上是完全相同的对象吗?)。
编辑: Kevin Sheffield的链接文章更好地解释了价值与引用相等…
https://stackoverflow.com/questions/112625
复制相似问题