我最近接触了一个大型代码库,并注意到所有字符串比较都使用string . equals()而不是==
你认为这是什么原因?
我最近接触了一个大型代码库,并注意到所有字符串比较都使用string . equals()而不是==
你认为这是什么原因?
当前回答
这两种方法在功能上是相同的——它们比较值。 正如MSDN上写的那样:
关于字符串。Equals方法-确定该实例和 另一个指定的String对象具有相同的值。(http://msdn.microsoft.com/en-us/library/858x0yyx.aspx) About ==—虽然string是引用类型,但相等操作符(==和 !=)的定义是为了比较字符串对象的值,而不是 参考文献这使得字符串相等性的测试更加直观。(http://msdn.microsoft.com/en-en/library/362314fe.aspx)
但如果你的一个字符串实例是空的,这些方法的工作方式是不同的:
string x = null;
string y = "qq";
if (x == y) // returns false
MessageBox.Show("true");
else
MessageBox.Show("false");
if (x.Equals(y)) // returns System.NullReferenceException: Object reference not set to an instance of an object. - because x is null !!!
MessageBox.Show("true");
else
MessageBox.Show("false");
其他回答
弦之间有实际的区别。等于和==
bool result = false;
object obj = "String";
string str2 = "String";
string str3 = typeof(string).Name;
string str4 = "String";
object obj2 = str3;
// Comparision between object obj and string str2 -- Com 1
result = string.Equals(obj, str2);// true
result = String.ReferenceEquals(obj, str2); // true
result = (obj == str2);// true
// Comparision between object obj and string str3 -- Com 2
result = string.Equals(obj, str3);// true
result = String.ReferenceEquals(obj, str3); // false
result = (obj == str3);// false
// Comparision between object obj and string str4 -- Com 3
result = string.Equals(obj, str4);// true
result = String.ReferenceEquals(obj, str4); // true
result = (obj == str4);// true
// Comparision between string str2 and string str3 -- Com 4
result = string.Equals(str2, str3);// true
result = String.ReferenceEquals(str2, str3); // false
result = (str2 == str3);// true
// Comparision between string str2 and string str4 -- Com 5
result = string.Equals(str2, str4);// true
result = String.ReferenceEquals(str2, str4); // true
result = (str2 == str4);// true
// Comparision between string str3 and string str4 -- Com 6
result = string.Equals(str3, str4);// true
result = String.ReferenceEquals(str3, str4); // false
result = (str3 == str4);// true
// Comparision between object obj and object obj2 -- Com 7
result = String.Equals(obj, obj2);// true
result = String.ReferenceEquals(obj, obj2); // false
result = (obj == obj2);// false
添加表
obj "String" {1#} object {string}
str2 "String" {1#} string
str3 "String" {5#} string
str4 "String" {1#} string
obj2 "String" {5#} object {string}
现在看{1#}和{5#}
Obj, str2, str4和obj2引用相同。
Obj和obj2是对象类型,其他是字符串类型
结论:
com1: result = (obj == str2);// true compares object and string so performs a reference equality check obj and str2 point to the same reference so the result is true com2: result = (obj == str3);// false compares object and string so performs a reference equality check obj and str3 point to the different references so the result is false com3: result = (obj == str4);// true compares object and string so performs a reference equality check obj and str4 point to the same reference so the result is true com4: result = (str2 == str3);// true compares string and string so performs a string value check str2 and str3 are both "String" so the result is true com5: result = (str2 == str4);// true compares string and string so performs a string value check str2 and str4 are both "String" so the result is true com6: result = (str3 == str4);// true compares string and string so performs a string value check str3 and str4 are both "String" so the result is true com7: result = (obj == obj2);// false - compares object and object so performs a reference equality check - obj and obj2 point to the different references so the result is false
很大一部分开发人员很可能来自Java背景,使用==比较字符串是错误的,而且不起作用。
在c#中,(对于字符串)没有(实际的)区别,只要它们的类型是字符串。
如果它们的类型是object或T,那么在这里可以看到其他关于泛型方法或操作符重载的回答,因为你肯定想使用Equals方法。
这篇文章有一篇文章,你可能会觉得很有趣,引用了乔恩·斯基特的话。看起来用途是差不多的。
Jon Skeet指出,实例Equals的性能“在字符串较短时略好——随着字符串长度的增加,这种差异变得完全不重要。”
这两种方法在功能上是相同的——它们比较值。 正如MSDN上写的那样:
关于字符串。Equals方法-确定该实例和 另一个指定的String对象具有相同的值。(http://msdn.microsoft.com/en-us/library/858x0yyx.aspx) About ==—虽然string是引用类型,但相等操作符(==和 !=)的定义是为了比较字符串对象的值,而不是 参考文献这使得字符串相等性的测试更加直观。(http://msdn.microsoft.com/en-en/library/362314fe.aspx)
但如果你的一个字符串实例是空的,这些方法的工作方式是不同的:
string x = null;
string y = "qq";
if (x == y) // returns false
MessageBox.Show("true");
else
MessageBox.Show("false");
if (x.Equals(y)) // returns System.NullReferenceException: Object reference not set to an instance of an object. - because x is null !!!
MessageBox.Show("true");
else
MessageBox.Show("false");
我一直在碰壁,试图解决一个错误,因为我读了这篇文章,得出的结论是,在实践中没有什么有意义的区别,所以我把这个链接贴在这里,以防其他人发现他们从==和=中得到不同的结果。
Object == equal失败,但. equals成功。这有道理吗?
string a = "x";
string b = new String(new []{'x'});
Console.WriteLine("x == x " + (a == b));//True
Console.WriteLine("object x == x " + ((object)a == (object)b));//False
Console.WriteLine("x equals x " + (a.Equals(b)));//True
Console.WriteLine("object x equals x " + (((object)a).Equals((object)b)));//True