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, zda dvě proměnné odkazují na stejný základní objekt v paměti. Tento typ rovnosti se nazývá rovnost odkazů nebo identita. Toto téma popisuje tyto dva druhy rovnosti a obsahuje odkazy na další témata, kde najdete další informace.

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

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

V tomto kódu se vytvoří dva objekty, ale po příkazu přiřazení oba odkazy odkazují 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 nemůžete mít nikdy dvě unboxed struktury, které odkazují na stejné umístění v paměti. Navíc 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 v rámečku do samostatné instance objektu. Další informace naleznete v tématu Jak otestovat rovnost odkazů (Identita).</a0>

Rovnost hodnot

Rovnost hodnot znamená, že dva objekty obsahují stejnou hodnotu nebo hodnoty. U primitivních typů 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 můžou být definovány tak, aby odpovídaly, pokud se bodA.X rovná pointB.X a pointA.Y je roven boduB.Y. Pro záznamy rovnost hodnot znamená, že dvě proměnné typu záznamu jsou stejné, pokud se typy shodují a všechny hodnoty vlastností a polí se shodují.

Není však nutné, 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 vědět, jak je pro tento typ definována ekvivalence. Další informace o definování rovnosti hodnot ve vlastních třídách a strukturách naleznete v tématu Jak definovat rovnost hodnot pro typ.

Rovnost hodnot pro hodnoty s plovoucí desetinou čárkou

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

Titulek Popis
Testování rovnosti odkazů (identita) Popisuje, jak určit, jestli mají dvě proměnné rovnost odkazů.
Jak definovat rovnost hodnot pro typ Popisuje, jak poskytnout vlastní definici rovnosti hodnot pro typ.
Typy Poskytuje informace o systému typů C# a odkazy na další informace.
Záznamy Poskytuje informace o typech záznamů, které ve výchozím nastavení testují rovnost hodnot.