Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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.
Zugehörige Themen
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. |