Share via


Likhetsjämförelser (C#-programmeringsguide)

Ibland är det nödvändigt att jämföra två värden för likhet. I vissa fall testar du för värdejämlikhet, även kallat ekvivalens, vilket innebär att värdena som finns i de två variablerna är lika. I andra fall måste du avgöra om två variabler refererar till samma underliggande objekt i minnet. Den här typen av likhet kallas referensjämlikhet eller identitet. Det här avsnittet beskriver dessa två typer av likhet och innehåller länkar till andra ämnen för mer information.

Referensjämlikhet

Referensjämlikhet innebär att två objektreferenser refererar till samma underliggande objekt. Detta kan inträffa genom enkel tilldelning, som du ser i följande exempel.

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

I den här koden skapas två objekt, men efter tilldelningssatsen refererar båda referenserna till samma objekt. Därför har de referensjämlikhet. ReferenceEquals Använd metoden för att avgöra om två referenser refererar till samma objekt.

Begreppet referensjämlikhet gäller endast för referenstyper. Värdetypsobjekt kan inte ha referensjämlikhet eftersom en kopia av värdet skapas när en instans av en värdetyp tilldelas till en variabel. Därför kan du aldrig ha två oboxade structs som refererar till samma plats i minnet. Om du använder ReferenceEquals för att jämföra två värdetyper blir falseresultatet alltid , även om alla värden som finns i objekten är identiska. Det beror på att varje variabel är inramad i en separat objektinstans. Mer information finns i Testa för referensjämlikhet (identitet).

Värdejämlikhet

Värdejämlikhet innebär att två objekt innehåller samma värde eller värden. För primitiva värdetyper som int eller bool är tester för värdejämlikhet enkla. Du kan använda operatorn == , som du ser i följande exempel.

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

För de flesta andra typer är testning för värdejämlikhet mer komplext eftersom det kräver att du förstår hur typen definierar den. För klasser och structs som har flera fält eller egenskaper definieras värdejämlikhet ofta som att alla fält eller egenskaper har samma värde. Två objekt kan till exempel Point definieras som likvärdiga om pointA.X är lika med pointB.X och pointA.Y är lika med pointB.Y. För poster innebär värdejämlikhet att två variabler av en posttyp är lika om typerna matchar och alla egenskaps- och fältvärden matchar.

Det finns dock inget krav på att likvärdigheten ska baseras på alla fält i en typ. Den kan baseras på en delmängd. När du jämför typer som du inte äger bör du se till att du specifikt förstår hur ekvivalens definieras för den typen. Mer information om hur du definierar värdejämlikhet i dina egna klasser och structs finns i Definiera värdejämlikhet för en typ.

Värdejämlikhet för flyttalsvärden

Likhetsjämförelser av flyttalsvärden (dubbel och flyttal) är problematiska på grund av imprecisionen av flyttalsaritmetik på binära datorer. Mer information finns i kommentarerna i avsnittet System.Double.

Title Description
Så här testar du referensjämlikhet (identitet) Beskriver hur du avgör om två variabler har referensjämlikhet.
Definiera värdejämlikhet för en typ Beskriver hur du anger en anpassad definition av värdejämlikhet för en typ.
Typer Innehåller information om C#-typsystemet och länkar till ytterligare information.
Poster Innehåller information om posttyper, som testar för värdejämlikhet som standard.