Übereinstimmungsvergleiche (C#-Programmierhandbuch)Equality Comparisons (C# Programming Guide)

Unter bestimmten Umständen ist es erforderlich, die Gleichheit zweier Werte zu prüfen.It is sometimes necessary to compare two values for equality. In einigen Fällen prüfen Sie die Wertgleichheit, die auch als Äquivalenz bezeichnet wird. Das bedeutet, Sie prüfen, ob die in zwei Variablen enthaltenen Werte gleich sind.In some cases, you are testing for value equality, also known as equivalence, which means that the values that are contained by the two variables are equal. In anderen Fällen müssen Sie ermitteln, ob zwei Variablen auf das gleiche zugrunde liegende Objekt im Arbeitsspeicher verweisen.In other cases, you have to determine whether two variables refer to the same underlying object in memory. Diese Art von Gleichheit wird als Verweisgleichheit oder Identität bezeichnet.This type of equality is called reference equality, or identity. In diesem Thema werden diese zwei Arten der Gleichheit beschrieben. Außerdem finden Sie hier Links zu verwandten Themen mit weiteren Informationen.This topic describes these two kinds of equality and provides links to other topics for more information.

VerweisgleichheitReference Equality

Verweisgleichheit ist gegeben, wenn zwei Objektverweise auf dasselbe zugrunde liegende Objekt verweisen.Reference equality means that two object references refer to the same underlying object. Die Ursache hierfür kann eine einfache Zuweisung sein, wie im folgenden Beispiel gezeigt.This can occur through simple assignment, as shown in the following example.

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

    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) = {0}", 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) = {0}", areEqual);

        // Keep the console open in debug mode.
        Console.WriteLine("Press any key to exit.");
        Console.ReadKey();
    }
}

In diesem Code werden zwei Objekte erstellt, nach der Zuweisungsanweisung verweisen jedoch beide Verweise auf das gleiche Objekt.In this code, two objects are created, but after the assignment statement, both references refer to the same object. Es liegt eine Verweisgleichheit vor.Therefore they have reference equality. Verwenden Sie die ReferenceEquals-Methode, um zu ermitteln, ob zwei Verweise auf das gleiche Objekt verweisen.Use the ReferenceEquals method to determine whether two references refer to the same object.

Das Konzept der Verweisgleichheit gilt nur für Verweistypen.The concept of reference equality applies only to reference types. Bei Werttypobjekten kann keine Verweisgleichheit vorliegen, da bei Zuweisung einer Werttypinstanz zu einer Variablen eine Kopie des Werts erstellt wird.Value type objects cannot have reference equality because when an instance of a value type is assigned to a variable, a copy of the value is made. Aus diesem Grund ist es unmöglich, dass zwei nicht geschachtelte Strukturen vorhanden sind, die auf die gleiche Position im Arbeitsspeicher verweisen.Therefore you can never have two unboxed structs that refer to the same location in memory. Wenn Sie zwei Werttypen mit der ReferenceEquals-Methode vergleichen, ist das Ergebnis immer false, selbst wenn die in den Objekten enthaltenen Werte alle identisch sind.Furthermore, if you use ReferenceEquals to compare two value types, the result will always be false, even if the values that are contained in the objects are all identical. Der Grund hierfür ist, dass jede Variable in einer eigenen Objektinstanz geschachtelt ist.This is because each variable is boxed into a separate object instance. Weitere Informationen finden Sie unter Vorgehensweise: Überprüfen auf Verweisgleichheit (Identität).For more information, see How to: Test for Reference Equality (Identity).

WertgleichheitValue Equality

Eine Wertgleichheit liegt dann vor, wenn zwei Objekte den gleichen Wert bzw. die gleichen Werte enthalten.Value equality means that two objects contain the same value or values. Die Prüfung auf Wertgleichheit für primitive Werttypen wie int oder bool ist einfach.For primitive value types such as int or bool, tests for value equality are straightforward. Sie können den ==-Operator verwenden, wie im folgenden Beispiel gezeigt.You can use the == operator, as shown in the following example.

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 die Prüfung auf Wertgleichheit komplexer, da es darauf ankommt, wie die Wertgleichheit für den jeweiligen Typ definiert wird.For most other types, testing for value equality is more complex because it requires that you understand how the type defines it. Für Klassen und Strukturen mit mehreren Feldern oder Eigenschaften wird Wertgleichheit oft so definiert, dass alle Felder oder Eigenschaften den gleichen Wert aufweisen.For classes and structs that have multiple fields or properties, value equality is often defined to mean that all fields or properties have the same value. Zwei Point-Objekte werden z. B. als äquivalent definiert, wenn pointA.X gleich pointB.X und pointA.Y gleich pointB.Y ist.For example, two Point objects might be defined to be equivalent if pointA.X is equal to pointB.X and pointA.Y is equal to pointB.Y.

Die Äquivalenz muss jedoch nicht unbedingt auf allen Feldern in einem Typ basieren.However, there is no requirement that equivalence be based on all the fields in a type. Die Basis kann auch eine Teilmenge sein.It can be based on a subset. Wenn Sie Typen von einem anderen Besitzer vergleichen, vergewissern Sie sich, wie die Gleichheit für den jeweiligen Typ definiert ist.When you compare types that you do not own, you should make sure to understand specifically how equivalence is defined for that type. Informationen zum Definieren von Wertgleichheit für Ihre eigenen Klassen und Strukturen finden Sie unter Vorgehensweise: Definieren von Wertgleichheit für einen Typ.For more information about how to define value equality in your own classes and structs, see How to: Define Value Equality for a Type.

Wertgleichheit für GleitkommawerteValue Equality for Floating Point Values

Die Übereinstimmungsprüfung für Gleitkommawerte (double und float) ist aufgrund der Ungenauigkeit der Gleitkommaarithmetik auf Computern mit Binärlogik problematisch.Equality comparisons of floating point values (double and float) are problematic because of the imprecision of floating point arithmetic on binary computers. Weitere Informationen finden Sie in den Hinweisen im Thema System.Double.For more information, see the remarks in the topic System.Double.

TitelTitle descriptionDescription
Gewusst wie: Überprüfen auf Verweisgleichheit (Identität)How to: Test for Reference Equality (Identity) Beschreibt, wie zwei Variablen auf Verweisgleichheit geprüft werden.Describes how to determine whether two variables have reference equality.
Gewusst wie: Definieren von Wertgleichheit für einen TypHow to: Define Value Equality for a Type Beschreibt, wie eine benutzerdefinierte Definition der Wertgleichheit für einen Typ erstellt wird.Describes how to provide a custom definition of value equality for a type.
C#-ProgrammierhandbuchC# Programming Guide Links zu ausführlichen Informationen zu wichtigen Funktionen der C#-Sprache sowie zu Funktionen, die über .NET Framework für C# verfügbar sind.Provides links to detailed information about important C# language features and features that are available to C# through the .NET Framework.
TypenTypes Informationen zum C#-Typsystem und Links zu weiteren Informationen.Provides information about the C# type system and links to additional information.

Siehe auchSee Also

C#-ProgrammierhandbuchC# Programming Guide