7 Stimmen

Worin besteht der Unterschied zwischen der Verwendung von String.Equals(str1,str2) und str1 == str2?

Mögliches Duplikat:
C# Unterschied zwischen == und .Equals()

In meiner täglichen Code-Routine verwende ich sie häufig, aber ich weiß nicht genau, wie sie sich voneinander unterscheiden.

if(String.Equals(str1, str2))

und

if(str1 == str2)

6voto

Aliostad Punkte 78595

(UPDATE)

Sie sind in der Tat genau dasselbe.

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

así que == ruft das Equals .


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

EqualsHelper ist eine unsichere Methode:

UPDATE Was es tut, es Schleifen durch die Zeichen mit Integer-Zeigern und vergleicht sie als Ganzzahlen (4 Byte zu einer Zeit). Es tut es 10 zu einer Zeit und dann ein zu einer Zeit.

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

2voto

Stilgar Punkte 21139

Sie sind absolut identisch. Hier ist, was ildasm zeigt für ==

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

Lesen Sie auch die Dokumentation: http://msdn.microsoft.com/en-us/library/system.string.op_equality.aspx Dort heißt es

Dieser Operator wird mit der Equals-Methode implementiert

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X