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

Czasami jest konieczne porównanie dwóch wartości dla równości.W niektórych przypadkach testuje się równość wartość, innymi słowy równoważność, co oznacza, że wartości, które są zawarte w dwóch zmiennych są równe.W innych przypadkach należy ustalić, czy dwie zmienne odnoszą się do tego samego podstawowego obiektu w pamięci.Ten typ równości jest nazywany równość odwołań lub tożsamość.Ten temat opisuje te dwa rodzaje równości i zapewnia łącza do innych tematów z większą ilością informacji.

Równość odniesienia

Równość odniesienia oznacza, że dwa odwołania do obiektu odnoszą się do tego samego obiektu podstawowego.Może to wystąpić poprzez proste zadanie, jak pokazano w poniższym przykładzie.

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();
    }
}

W tym kodzie tworzone są dwa obiekty, ale po instrukcji przypisania, oba odwołania odnoszą się do tego samego obiektu.Posiadają, tym samym, takie same odwołania.Użyj metody ReferenceEquals, aby określić czy dwa odwołania odwołują się do tego samego obiektu.

Koncepcja odwołania dotyczy tylko typów odwołań.obiekty typu wartości nie mogą posiadać równości odwołań, ponieważ wystąpienie typu wartości jest przypisane do zmiennej, utworzona jest kopia wartości.Tym samym, nie można nigdy posiadać dwóch struct bez opakowania, które odnoszą się do tej samej lokalizacji w pamięci.Ponadto, jeśli korzystasz z ReferenceEquals do porównywania dwóch typów wartości, wynikiem zawsze będzie false, nawet jeśli zawarte w obiektach wartości są identyczne.Jest tak, ponieważ każda zmienna jest umieszczona w osobnym wystąpieniu obiektu.Aby uzyskać więcej informacji, zobacz Porady: testowanie równości odwołań (tożsamości) (Przewodnik programowania w języku C#).

Równość wartości

Równość wartości oznacza, że dwa obiekty zawierają tę samą wartość lub wartości.Dla podstawowych typów wartości, takich jak int lub bool, testy na równoważność wartości są proste.Można użyć == operatora, jak to przedstawiono w poniższym przykładzie.

int a = GetOriginalValue();
int b = GetCurrentValue();

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

Dla większości innych typów testowanie równoważności wartości jest bardziej złożone, ponieważ wymaga zrozumienia, w jaki sposób są one definiowane przez typ.W przypadku klas i struktur mających wiele pól lub właściwości, jest często definiowana równość wartości, co oznacza, że wszystkie pola lub właściwości mają tę samą wartość.Na przykład dwa obiekty Point mogą być zdefiniowane jako równoważne, jeżeli pointA.X jest równy pointB.X i pointA.Y jest równy pointB.Y.

Jednakże nie istnieje wymóg, że równoważność musi opierać się na wszystkich polach w typie.Może być on oparty na podzbiorze.Przy porównaniu typów, których nie znasz, należy upewnić się, że zrozumiałe jest definiowanie równoważności dla tego typu.Aby uzyskać więcej informacji dotyczących definiowania równości wartości własnych klas i struktur, zobacz Porady: definiowanie równości wartości dla typu (Przewodnik programowania w języku C#).

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

Porównania równości pływających punktu wartości (podwójna i pływające) są problematyczne ze względu na niedokładności pływających punktów arytmetycznych na komputerach binarnych.Aby uzyskać więcej informacji, zobacz uwagi w temacie Double.

Tematy pokrewne

Tytuł

Opis

Porady: testowanie równości odwołań (tożsamości) (Przewodnik programowania w języku C#)

Opisuje sposób określenia, czy dwie zmienne mają odniesienie równości.

Porady: definiowanie równości wartości dla typu (Przewodnik programowania w języku C#)

Opisuje sposob dostarczania niestandardowych definicji równości wartość dla określonego typu.

Przewodnik programowania w języku C#

Oferuje łącza do szczegółowych informacji o ważnych funkcjach języka C# i funkcjach, które są dostępne dla języka C# za pomocą .NET Framework.

Typy (Przewodnik programowania w języku C#)

Oferuje informacje o systemie typu C# oraz łączach do dodatkowych informacji.

Zobacz też

Koncepcje

Przewodnik programowania w języku C#