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