Freigeben über


Gleichheitsvergleiche (C#-Programmierhandbuch)

Es ist manchmal notwendig, zwei Werte für die Gleichheit zu vergleichen. In einigen Fällen testen Sie die Gleichheit von Werten, auch als Äquivalenz bezeichnet, was bedeutet, dass die Werte, die in den beiden Variablen enthalten sind, gleich sind. In anderen Fällen müssen Sie bestimmen, ob zwei Variablen auf dasselbe zugrunde liegende Objekt im Arbeitsspeicher verweisen. Diese Art von Gleichheit wird als Referenzgleichheit oder Identität bezeichnet. In diesem Thema werden diese beiden Arten von Gleichheit beschrieben und Links zu anderen Themen bereitgestellt, um weitere Informationen zu erhalten.

Referenzgleichheit

Referenzgleichheit bedeutet, dass zwei Objektverweise auf dasselbe zugrunde liegende Objekt verweisen. Dies kann durch einfache Zuweisung erfolgen, wie im folgenden Beispiel gezeigt.

using System;
class Test
{
    public int Num { get; set; }
    public string Str { get; set; }

    public static void Main()
    {
        Test a = new Test() { Num = 1, Str = "Hi" };
        Test b = new Test() { Num = 1, Str = "Hi" };

        bool areEqual = System.Object.ReferenceEquals(a, b);
        // False:
        System.Console.WriteLine($"ReferenceEquals(a, b) = {areEqual}");

        // Assign b to a.
        b = a;

        // Repeat calls with different results.
        areEqual = System.Object.ReferenceEquals(a, b);
        // True:
        System.Console.WriteLine($"ReferenceEquals(a, b) = {areEqual}");
    }
}

In diesem Code werden zwei Objekte erstellt, aber nach der Zuordnungsanweisung verweisen beide Verweise auf dasselbe Objekt. Daher haben sie Bezugsgleichheit. Verwenden Sie die ReferenceEquals Methode, um zu bestimmen, ob zwei Verweise auf dasselbe Objekt verweisen.

Das Konzept der Referenzgleichstellung gilt nur für Referenztypen. Werttypobjekte können keine Referenzgleichheit aufweisen, da bei der Zuweisung einer Instanz eines Werttyps an eine Variable eine Kopie des Werts erstellt wird. Daher können Sie nie zwei unboxierte Strukturen haben, die sich auf denselben Speicherort im Arbeitsspeicher beziehen. Darüber hinaus wird das Ergebnis immer ReferenceEquals, wenn Sie false verwenden, um zwei Werttypen zu vergleichen, selbst wenn die in den Objekten enthaltenen Werte alle identisch sind. Dies liegt daran, dass jede Variable als separate Objektinstanz verpackt wird. Weitere Informationen finden Sie unter So testen Sie auf Referenzgleichheit (Identität).

Wertgleichheit

Die Wertgleichstellung bedeutet, dass zwei Objekte denselben Wert oder dieselben Werte enthalten. Bei primitiven Werttypen wie "int " oder "bool" sind Tests für die Wertgleichstellung einfach. Sie können den == Operator verwenden, wie im folgenden Beispiel gezeigt.

int a = GetOriginalValue();  
int b = GetCurrentValue();  
  
// Test for value equality.
if (b == a)
{  
    // The two integers are equal.  
}  

Für die meisten anderen Typen ist das Testen der Wertgleichstellung komplexer, da sie erfordert, dass Sie verstehen, wie der Typ ihn definiert. Bei Klassen und Strukturen mit mehreren Feldern oder Eigenschaften wird die Wertgleichstellung häufig definiert, um zu bedeuten, dass alle Felder oder Eigenschaften denselben Wert aufweisen. Beispielsweise können zwei Point Objekte als gleichwertig definiert werden, wenn "pointA.X" gleich "pointB.X" ist und "pointA.Y" gleich "pointB.Y" ist. Bei Datensätzen bedeutet die Wertgleichstellung, dass zwei Variablen eines Datensatztyps gleich sind, wenn die Typen übereinstimmen und alle Eigenschafts- und Feldwerte übereinstimmen.

Es besteht jedoch keine Anforderung, dass die Äquivalenz auf allen Feldern in einem Typ basiert. Sie kann auf einer Teilmenge basieren. Wenn Sie Typen vergleichen, die Sie nicht besitzen, sollten Sie sicherstellen, dass Sie genau verstehen, wie die Äquivalenz für diesen Typ definiert ist. Weitere Informationen zum Definieren der Wertgleichstellung in Ihren eigenen Klassen und Strukturen finden Sie unter How to define value equality for a type.

Wertgleichheit für Gleitkommawerte

Gleichheitsvergleiche von Gleitkommawerten (Double und Float) sind aufgrund der ungenauen Gleitkommaarithmetik auf Binärcomputern problematisch. Weitere Informationen finden Sie in den Anmerkungen im Thema System.Double.

Titel BESCHREIBUNG
So testen Sie die Referenzgleichheit (Identität) Beschreibt, wie ermittelt wird, ob zwei Variablen eine Referenzgleichheit aufweisen.
Definieren der Wertgleichstellung für einen Typ Beschreibt, wie eine benutzerdefinierte Definition der Wertgleichstellung für einen Typ bereitgestellt wird.
Typen Enthält Informationen zum C#-Typsystem und Links zu zusätzlichen Informationen.
Einträge Stellt Informationen zu Datensatztypen bereit, die standardmäßig auf Die Gleichheit von Werten testen.