Porovnání rovnosti (Průvodce programováním v C#)

Někdy je nutné porovnat dvě hodnoty rovnosti. V některých případech testujete rovnost hodnot, označovanou také jako ekvivalence, což znamená, že hodnoty obsažené v těchto dvou proměnných jsou stejné. V jiných případech musíte určit, jestli dvě proměnné odkazují na stejný základní objekt v paměti. Tento typ rovnosti se nazývá rovnost odkazu nebo identita. Toto téma popisuje tyto dva druhy rovnosti a obsahuje odkazy na další témata s dalšími informacemi.

Rovnost odkazů

Rovnost odkazů znamená, že dva odkazy na objekt odkazují na stejný podkladový objekt. K tomu může dojít prostřednictvím jednoduchého přiřazení, jak je znázorněno v následujícím příkladu.

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

V tomto kódu se vytvoří dva objekty, ale po příkazu přiřazení odkazují oba odkazy na stejný objekt. Proto mají rovnost odkazů. ReferenceEquals Pomocí metody určete, zda dva odkazy odkazují na stejný objekt.

Koncept rovnosti odkazů se vztahuje pouze na odkazové typy. Objekty typu hodnota nemohou mít rovnost odkazu, protože pokud je instance typu hodnoty přiřazena proměnné, vytvoří se kopie hodnoty. Proto nikdy nemůžete mít dvě unboxed struktury, které odkazují na stejné umístění v paměti. Kromě toho, pokud použijete ReferenceEquals k porovnání dvou typů hodnot, výsledek bude vždy false, i když hodnoty obsažené v objektech jsou všechny identické. Důvodem je to, že každá proměnná je rozdělena do samostatné instance objektu. Další informace najdete v tématu Testování rovnosti odkazů (Identita).

Rovnost hodnot

Rovnost hodnot znamená, že dva objekty obsahují stejnou hodnotu nebo hodnoty. Pro primitivní typy hodnot, jako jsou int nebo bool, jsou testy rovnosti hodnot jednoduché. Operátor můžete použít == , jak je znázorněno v následujícím příkladu.

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

U většiny ostatních typů je testování rovnosti hodnot složitější, protože vyžaduje, abyste pochopili, jak ho typ definuje. U tříd a struktur, které mají více polí nebo vlastností, je rovnost hodnot často definována tak, aby všechna pole nebo vlastnosti měly stejnou hodnotu. Například dva Point objekty mohou být definovány tak, aby byly ekvivalentní, pokud je pointA.X rovno pointB.X a pointA.Y je rovno boduB.Y. U záznamů rovnost hodnot znamená, že dvě proměnné typu záznamu jsou stejné, pokud se typy shodují a všechny hodnoty vlastností a polí odpovídají.

Neexistuje však žádný požadavek, aby ekvivalence byla založena na všech polích typu. Může být založená na podmnožině. Při porovnávání typů, které nevlastníte, byste měli zajistit, abyste pochopili, jak je pro daný typ definována ekvivalence. Další informace o definování rovnosti hodnot ve vlastních třídách a strukturách naleznete v tématu Definování rovnosti hodnot pro typ.

Rovnost hodnot pro hodnoty s plovoucí desetinnou čárkou

Porovnání rovnosti hodnot s plovoucí desetinou čárkou (double a float) jsou problematické z důvodu nepřesné aritmetické aritmetické hodnoty s plovoucí desetinou čárkou na binárních počítačích. Další informace naleznete v poznámkách v tématu System.Double.

Nadpis Popis
Testování rovnosti odkazů (Identita) Popisuje, jak určit, jestli dvě proměnné mají rovnost odkazů.
Jak definovat rovnost hodnoty pro typ Popisuje, jak poskytnout vlastní definici rovnosti hodnot pro typ.
Průvodce programováním v C# Obsahuje odkazy na podrobné informace o důležitých jazykových funkcích a funkcích jazyka C#, které jsou dostupné pro jazyk C# prostřednictvím .NET.
Typy Poskytuje informace o systému typů jazyka C# a odkazy na další informace.
Záznamy Poskytuje informace o typech záznamů, které ve výchozím nastavení testují rovnost hodnot.

Viz také