Whats the difference between using String.Equals(str1,str2) and str1 == str2
本问题已经有最佳答案,请猛点这里访问。
Possible Duplicate:
C# difference between== and .Equals()
在我的日常代码例行程序中,我经常使用它们,但真的不知道它们之间到底有什么不同。
1 | if(String.Equals(str1, str2)) |
和
1 | if(str1 == str2) |
(更新)
它们实际上是完全一样的。
1 2 3 4 | public static bool operator ==(string a, string b) { return Equals(a, b); } |
所以
1 2 3 4 | public static bool Equals(string a, string b) { return ((a == b) || (((a != null) && (b != null)) && EqualsHelper(a, b))); } |
更新它使用整数指针循环字符,并将它们作为整数进行比较(一次4字节)。它一次10次,然后一次1次。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | private static unsafe bool EqualsHelper(string strA, string strB) { int length = strA.Length; if (length != strB.Length) { return false; } fixed (char* chRef = &strA.m_firstChar) { fixed (char* chRef2 = &strB.m_firstChar) { char* chPtr = chRef; char* chPtr2 = chRef2; while (length >= 10) { if ((((*(((int*) chPtr)) != *(((int*) chPtr2))) || (*(((int*) (chPtr + 2))) != *(((int*) (chPtr2 + 2))))) || ((*(((int*) (chPtr + 4))) != *(((int*) (chPtr2 + 4)))) || (*(((int*) (chPtr + 6))) != *(((int*) (chPtr2 + 6)))))) || (*(((int*) (chPtr + 8))) != *(((int*) (chPtr2 + 8))))) { break; } chPtr += 10; chPtr2 += 10; length -= 10; } while (length > 0) { if (*(((int*) chPtr)) != *(((int*) chPtr2))) { break; } chPtr += 2; chPtr2 += 2; length -= 2; } return (length <= 0); } } } |
它们是完全一样的。以下是ildasm的目的==
1 2 | IL_0002: call bool System.String::Equals(string, string) |
另请阅读文档:http://msdn.microsoft.com/en-us/library/system.string.op_equality.aspx它说
This operator is implemented using the Equals method