Sdílet prostřednictvím


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

Někdy je nutné srovnat dvě hodnoty.V některých případech testujete rovnost hodnot, také známou jako ekvivalence, což znamená, že hodnoty, které jsou obsaženy ve dvou proměnných se rovnají.V ostatních případech je nutné určit, zda hodnoty dvou proměnných odkazují na stejný základní objekt v paměti.Tento typ rovnosti se nazývá referenční rovnost nebo identita.Toto téma popisuje tyto dva druhy rovnosti a obsahuje odkazy na další témata pro další informace.

Referenční rovnost

Referenční rovnost znamená, že reference na dva objekty odkazují na stejný základní objekt.Tato situace může nastat 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 jsou vytvořeny dva objekty, ale po příkazu přiřazení oba odkazy odkazují na stejný objekt.Proto mají referenční rovnost.Použijte metodu ReferenceEquals k určení, zda dva odkazy odkazují na stejný objekt.

Pojem referenční rovnosti platí pouze pro typy odkazů.Hodnota typu objektů nemůže mít referenční rovnosti, protože při instanci hodnotového typu je přiřazena proměnné, vytvoří se kopie hodnoty.Proto nikdy nemůžete mít dvě nezabalené struktury, které odkazují na stejné místo v paměti.Navíc pokud použijete ReferenceEquals k porovnání dvou typů hodnot, výsledek bude vždy false, i když jsou všechny hodnoty, které jsou obsaženy v objektech, stejné.Důvodem je, že každá proměnná je zabalená do samostatného objekt instance.Další informace naleznete v tématu Postupy: Testování rovnosti (identity) odkazů (Průvodce programováním v C#).

Hodnota rovnosti

Hodnota rovnost znamená, že dva objekty obsahují stejnou hodnotu nebo hodnoty.Pro primitivní hodnotové typy, jako int nebo bool, jsou testy pro hodnotu rovnosti jednoduché.Můžete použít operátor == dle příkladu dále.

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

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

Pro většinu ostatních typů testování rovnosti je hodnota složitější, protože vyžaduje pochopit, jak ji definuje typ.U tříd a struktur, které mají více polí nebo vlastností, je rovnost hodnoty často definována tak, že všechny vlastnosti nebo pole mají stejnou hodnotu.Například dva objekty Point mohou být definovány jako rovnocenné, pokud se pointA.X rovná pointB.X a pointA.Y se rovná pointB.Y.

Neexistuje však žádný požadavek, aby rovnocennost byla založena na všech polích v typu.Může být založeno na podmnožině.Při porovnávání typů, které nevlastníte, se ujistěte, že chápete konkrétně, jak ekvivalence jsou definovány pro tento typ.Další informace o tom, jak definovat rovnost hodnot ve vašich třídách a strukturách, najdete v části Postupy: Definování rovnosti hodnoty pro typ (Průvodce programováním v C#).

Hodnota rovnosti pro hodnoty plovoucího bodu

Porovnání rovnosti hodnot s plovoucí desetinnou čárkou (double a float) je problematické z důvodu nepřesnosti aritmetiky s plovoucími desetinnými čárkami v binárních počítačích.Další informace naleznete v poznámkách v tématu Double.

Příbuzná témata

Title

Description

Postupy: Testování rovnosti (identity) odkazů (Průvodce programováním v C#)

Popisuje, jak lze zjistit, zda mají dvě proměnné referenční rovnost.

Postupy: Definování rovnosti hodnoty pro typ (Průvodce programováním v C#)

Popisuje, jak poskytnout vlastní definici rovnosti hodnot daného typu.

Průvodce programováním v C#

Poskytuje odkazy na podrobné informace o důležitých funkcích jazyka C# a funkcích, které jsou k dispozici pro jazyk C# v rámci rozhraní .NET Framework.

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

Poskytuje informace o typu systému C# a odkazy na další informace.

Viz také

Koncepty

Průvodce programováním v C#