Heim >Backend-Entwicklung >C++ >Wie vermeide ich eine unendliche Rekursion, wenn der Operator „==' in C# mit Nullprüfungen überladen wird?

Wie vermeide ich eine unendliche Rekursion, wenn der Operator „==' in C# mit Nullprüfungen überladen wird?

Linda Hamilton
Linda HamiltonOriginal
2025-01-08 15:52:45409Durchsuche

How to Avoid Infinite Recursion When Overloading the '==' Operator in C# with Null Checks?

Wenn Sie den ==-Operator in C# überladen, vermeiden Sie eine unendliche Rekursion beim Umgang mit Nullwerten

Es gibt ein häufiges Problem beim Umgang mit Nullwerten, wenn der ==-Operator in C# überladen wird. Betrachten Sie den folgenden Codeausschnitt:

<code class="language-csharp">Foo foo1 = null;
Foo foo2 = new Foo();
Assert.IsFalse(foo1 == foo2);

public static bool operator ==(Foo foo1, Foo foo2) {
    if (foo1 == null) return foo2 == null; // 潜在的无限递归
    return foo1.Equals(foo2);
}</code>

In diesem Fall verwendet die ==-Überladung den ==-Operator selbst, um nach Nullwerten zu suchen. Dies kann zu einer unendlichen Rekursion führen, denn wenn foo1 leer ist, wird auch foo2 == null als leer ausgewertet, was dazu führt, dass die ==-Methode unendlich oft aufgerufen wird.

Um dieses Problem zu vermeiden, sollte die ==-Überladung ReferenceEquals anstelle von == verwenden, um nach Nullwerten zu suchen. ReferenceEquals führt keine rekursiven Aufrufe aus und kann daher sicher bestimmen, ob ein oder zwei Objekte null sind, ohne eine unendliche Rekursion zu verursachen. Der korrigierte Code lautet wie folgt:

<code class="language-csharp">Foo foo1 = null;
Foo foo2 = new Foo();
Assert.IsFalse(foo1 == foo2);

public static bool operator ==(Foo foo1, Foo foo2) {
    if (object.ReferenceEquals(foo1, null))
        return object.ReferenceEquals(foo2, null);
    return foo1.Equals(foo2);
}</code>

Durch die Änderung der Nullprüfung zur Verwendung von ReferenceEquals verarbeitet die ==-Überladung Nullwerte effizient, ohne eine unendliche Rekursion auszulösen. Es vergleicht die Nullwerte von Equals und foo1 korrekt, bevor mit dem foo2-Vergleich fortgefahren wird. Dieser Ansatz stellt sicher, dass das Verhalten des Operators auch bei Nullwerten immer konsistent und zuverlässig ist.

Diese überarbeitete Erklärung verdeutlicht das Problem und die Lösung prägnanter. Das Bild behält sein ursprüngliches Format und seine ursprüngliche Position.

Das obige ist der detaillierte Inhalt vonWie vermeide ich eine unendliche Rekursion, wenn der Operator „==' in C# mit Nullprüfungen überladen wird?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn