Udostępnij za pośrednictwem


Porównania równości (Przewodnik programowania w języku C#)

Czasami konieczne jest porównanie dwóch wartości równości. W niektórych przypadkach testujesz równość wartości, znaną również jako równoważność, co oznacza, że wartości zawarte w dwóch zmiennych są równe. W innych przypadkach należy określić, czy dwie zmienne odwołują się do tego samego obiektu bazowego w pamięci. Ten typ równości jest nazywany równością odwołania lub tożsamością. W tym temacie opisano te dwa rodzaje równości i podano linki do innych tematów, aby uzyskać więcej informacji.

Równość odwołań

Równość referencyjna oznacza, że dwa odwołania do obiektów odwołują się do tego samego obiektu bazowego. Może to nastąpić za pomocą prostego przypisania, jak pokazano w poniższym przykładzie.

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) = {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);
    }
}

W tym kodzie tworzone są dwa obiekty, ale po instrukcji przypisania oba odwołania odwołują się do tego samego obiektu. W związku z tym mają one równość referencyjną. ReferenceEquals Użyj metody , aby określić, czy dwa odwołania odwołują się do tego samego obiektu.

Pojęcie równości referencyjnej dotyczy tylko typów odwołań. Obiekty typu wartości nie mogą mieć równości odwołań, ponieważ gdy wystąpienie typu wartości jest przypisane do zmiennej, zostanie wykonana kopia wartości. W związku z tym nigdy nie można mieć dwóch nieboxowanych struktur odwołujących się do tej samej lokalizacji w pamięci. Ponadto w przypadku ReferenceEquals porównywania dwóch typów wartości wynik będzie zawsze mieć falsewartość , nawet jeśli wartości zawarte w obiektach są identyczne. Dzieje się tak, ponieważ każda zmienna jest umieszczana w osobnym wystąpieniu obiektu. Aby uzyskać więcej informacji, zobacz Jak przetestować równość odwołań (Tożsamość).

Równość wartości

Równość wartości oznacza, że dwa obiekty zawierają tę samą wartość lub wartości. W przypadku typów wartości pierwotnych, takich jak int lub bool, testy równości wartości są proste. Możesz użyć == operatora , jak pokazano w poniższym przykładzie.

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

W przypadku większości innych typów testowanie równości wartości jest bardziej złożone, ponieważ wymaga zrozumienia sposobu definiowania tego typu. W przypadku klas i struktur, które mają wiele pól lub właściwości, równość wartości jest często definiowana, aby oznaczać, że wszystkie pola lub właściwości mają tę samą wartość. Na przykład dwa Point obiekty mogą być równoważne, jeśli pointA.X jest równy pointB.X i pointA.Y jest równy pointB.Y. W przypadku rekordów równość wartości oznacza, że dwie zmienne typu rekordu są równe, jeśli typy są zgodne, a wszystkie wartości właściwości i pól są zgodne.

Nie jest jednak wymagane, aby równoważność była oparta na wszystkich polach w typie. Może on być oparty na podzestawie. Podczas porównywania typów, których nie jesteś właścicielem, należy dokładnie zrozumieć, w jaki sposób równoważność jest definiowana dla tego typu. Aby uzyskać więcej informacji na temat definiowania równości wartości we własnych klasach i strukturach, zobacz Jak zdefiniować równość wartości dla typu.

Równość wartości dla wartości zmiennoprzecinkowych

Porównania równości wartości zmiennoprzecinkowych (podwójne i zmiennoprzecinkowe) są problematyczne z powodu nierecyjności arytmetyki zmiennoprzecinkowej na komputerach binarnych. Aby uzyskać więcej informacji, zobacz uwagi w temacie System.Double.

Nazwa opis
Jak przetestować równość odwołań (tożsamość) Opisuje sposób określania, czy dwie zmienne mają równość odwołania.
Jak zdefiniować równość wartości dla typu Opisuje sposób podawania niestandardowej definicji równości wartości dla typu.
Typy Zawiera informacje o systemie typów języka C# i linki do dodatkowych informacji.
Rekordy Zawiera informacje o typach rekordów, które domyślnie testować pod kątem równości wartości.