开发者

Whats the difference between using String.Equals(str1,str2) and str1 == str2 [duplicate]

This question already has answers here: Closed 12 years ago.

Possible Duplicate:

C# difference between == and .Equals()

In my daily code routine I use them a lot, but really don't know how exactly they are different from each other.

if(开发者_StackOverflowString.Equals(str1, str2))

and

if(str1 == str2)


(UPDATE)

They are in fact exactly the same.

public static bool operator ==(string a, string b)
{
    return Equals(a, b);
}

so == calls the Equals.


public static bool Equals(string a, string b)
{
    return ((a == b) || (((a != null) && (b != null)) && EqualsHelper(a, b)));
}

EqualsHelper is an unsafe method:

UPDATE What it does, it loops through the characters using integer pointers and compares them as integers (4byte at a time). It does it 10 at a time and then one at a time.

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);
        }
    }
}


They are absolutely the same. Here is what ildasm shows for ==

  IL_0002:  call       bool System.String::Equals(string,
                                              string)

Also read the documentation: http://msdn.microsoft.com/en-us/library/system.string.op_equality.aspx It says

This operator is implemented using the Equals method

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜