Megosztás a következőn keresztül:


Egyenlőségi összehasonlítások (C# programozási útmutató)

Néha szükség van két egyenlőségi érték összehasonlítására. Bizonyos esetekben az értékegyenlőséget( más néven egyenértékűséget) teszteli, ami azt jelenti, hogy a két változó által tartalmazott értékek egyenlők. Más esetekben meg kell határoznia, hogy két változó ugyanarra a mögöttes objektumra hivatkozik-e a memóriában. Az ilyen típusú egyenlőséget referenciaegyenlőségnek vagy identitásnak nevezzük. Ez a témakör az egyenlőség két típusát ismerteti, és további információkért más témakörökre mutató hivatkozásokat tartalmaz.

Hivatkozás egyenlőségre

A hivatkozási egyenlőség azt jelenti, hogy két objektumhivatkozás ugyanarra a mögöttes objektumra hivatkozik. Ez egyszerű hozzárendeléssel történhet, ahogyan az alábbi példában is látható.

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

Ebben a kódban két objektum jön létre, de a hozzárendelési utasítás után mindkét hivatkozás ugyanarra az objektumra hivatkozik. Ezért hivatkozási egyenlőségre hivatkoznak. Ezzel a ReferenceEquals módszerrel megállapíthatja, hogy két hivatkozás ugyanarra az objektumra hivatkozik-e.

A referencia-egyenlőség fogalma csak a referenciatípusokra vonatkozik. Az értéktípus-objektumok nem rendelkeznek hivatkozási egyenlőségjelekkel, mert ha egy értéktípus egy példányát egy változóhoz rendelik, az érték másolatát készíti el. Ezért soha nem lehet két, a memóriában ugyanarra a helyre hivatkozó, nem dobozolt szerkezet. Továbbá, ha két értéktípus összehasonlítására használja ReferenceEquals , az eredmény mindig az lesz false, még akkor is, ha az objektumokban található értékek mind azonosak. Ennek az az oka, hogy minden változó külön objektumpéldányba van bekeretítve. További információ: A referenciaegyenlőség (Identitás) tesztelése.

Értékegyenlőség

Az értékegyenlőség azt jelenti, hogy két objektum ugyanazt az értéket vagy értéket tartalmazza. Az olyan primitív értéktípusok esetében, mint az int vagy a bool, az értékegyenlőség vizsgálata egyszerű. Az operátort az == alábbi példában látható módon használhatja.

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

A legtöbb más típus esetében az értékegyenlőség tesztelése összetettebb, mert ehhez tisztában kell lennie azzal, hogy a típus hogyan határozza meg. Több mezővel vagy tulajdonsággal rendelkező osztályok és szerkezetek esetében az értékegyenlőség gyakran azt jelenti, hogy minden mező vagy tulajdonság azonos értékkel rendelkezik. Két objektum például akkor lehet egyenértékű, Point ha a pointA.X egyenlő a pointB.X-tal, a pointA.Y pedig a pointB.Y-vel. Rekordok esetében az értékegyenlőség azt jelenti, hogy egy rekordtípus két változója egyenlő, ha a típusok megegyeznek, és az összes tulajdonság és mező értéke megegyezik.

Nem követelmény azonban, hogy az egyenértékűség egy típus összes mezőjén alapuljon. Ez egy részhalmazon alapulhat. Ha összehasonlítja a nem a tulajdonában lévő típusokat, mindenképpen tisztában kell lennie azzal, hogy pontosan hogyan van meghatározva az egyenértékűség az adott típushoz. Az értékegyenlőség saját osztályokban és szerkezetekben való definiálásáról további információt az Értékegyenlőség definiálása típushoz című témakörben talál.

Lebegőpontos értékek értékegyenlőség

A lebegőpontos értékek egyenlőségi összehasonlítása (kettős és lebegőpontos) a bináris számítógépek lebegőpontos számtani metrikáinak pontatlansága miatt problémás. További információkért tekintse meg a témakör System.Doublemegjegyzéseit.

Cím Leírás
Referenciaegyenlőség (identitás) tesztelése Azt ismerteti, hogyan állapítható meg, hogy két változó rendelkezik-e referenciaegyenlőséggel.
Értékegyenlőség definiálása egy típushoz Azt ismerteti, hogyan lehet egyéni értékegyenlőséget biztosítani egy típushoz.
Típusok A C#-típusrendszerre vonatkozó információkat és a további információkra mutató hivatkozásokat tartalmazza.
Rekordok Információt nyújt a rekordtípusokról, amelyek alapértelmezés szerint tesztelik az értékegyenlőséget.