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 tych 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; }

    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 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 referencyjnych. 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 rozpędzonych 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 zawsze będzie mieć falsewartość , nawet jeśli wartości zawarte w obiektach są identyczne. Jest to spowodowane tym, że każda zmienna jest umieszczana w osobnym wystąpieniu obiektu. Aby uzyskać więcej informacji, zobacz How to test for reference equality (Identity)( Jak przetestować równość referencyjną (Identity).

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 jego definiowania. 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ą taką samą wartość. Na przykład dwa Point obiekty mogą być zdefiniowane jako równoważne, jeśli punktA.X jest równy punktB.X, a punktA.Y jest równy punktB.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 ma jednak wymogu, 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óre nie są własnością, 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 nieprecyzyjnej arytmetyki zmiennoprzecinkowej na komputerach binarnych. Aby uzyskać więcej informacji, zobacz uwagi w temacie System.Double.

Tytuł Opis
Jak przetestować równość odwołań (tożsamość) Opisuje sposób określania, czy dwie zmienne mają równość odwołań.
Definiowanie równości wartości dla typu Opisuje sposób dostarczania niestandardowej definicji równości wartości dla typu.
Przewodnik programowania w języku C# Zawiera linki do szczegółowych informacji o ważnych funkcjach i funkcjach języka C#, które są dostępne dla języka C# za pośrednictwem platformy .NET.
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ły równość wartości.

Zobacz też