Confronti di uguaglianza (Guida per programmatori C#)

A volte è necessario confrontare due valori per verificarne l'uguaglianza. In alcuni casi si verifica l'uguaglianza dei valori, nota anche come equivalenza, ovvero se i valori contenuti nelle due variabili sono uguali. In altri casi, è necessario determinare se due variabili fanno riferimento allo stesso oggetto sottostante in memoria. Questo tipo di uguaglianza è detto uguaglianza dei riferimenti o identità. In questo argomento vengono descritti questi due tipi di uguaglianza e indicati i collegamenti ad altri argomenti per le informazioni dettagliate.

Uguaglianza di riferimenti

Uguaglianza di riferimenti significa che due riferimenti ad oggetti puntano allo stesso oggetto sottostante. Ciò può verificarsi con un'assegnazione semplice, come illustrato nell'esempio seguente.

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

In questo codice vengono creati due oggetti, ma dopo l'istruzione di assegnazione, entrambi i riferimenti fanno riferimento allo stesso oggetto. Di conseguenza, esiste un'uguaglianza dei riferimenti. Usare il metodo ReferenceEquals per determinare se due riferimenti fanno riferimento allo stesso oggetto.

Il concetto di uguaglianza dei riferimenti si applica solo ai tipi di riferimento. Per gli oggetti di tipo di valore non può esistere l'uguaglianza dei riferimenti poiché quando un'istanza di un tipo di valore viene assegnata a una variabile, viene creata una copia del valore. Di conseguenza, non è possibile avere due struct unboxed che fanno riferimento alla stessa posizione in memoria. Se inoltre si usa ReferenceEquals per confrontare due tipi valore, il risultato sarà sempre false, anche se i valori contenuti negli oggetti sono tutti identici. Ciò avviene perché ogni variabile è di tipo boxed in un'istanza separata dell'oggetto. Per altre informazioni, vedere Come testare l'uguaglianza dei riferimenti (Identità).

Uguaglianza di valori

Uguaglianza di valori significa che due oggetti contengono lo stesso valore o gli stessi valori. Per i tipi di valore primitivi, ad esempio int o bool, i test per verificare l'uguaglianza di valori sono semplici. È possibile usare l'operatore ==, come indicato nell'esempio seguente.

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

Per la maggior parte degli altri tipi, il test dell'uguaglianza di valori è più complesso poiché è necessario sapere in che modo viene definito dal tipo. Per le classi e gli struct con più campi o proprietà, l'uguaglianza di valori viene spesso definita in modo che tutti i campi o tutte le proprietà abbiano lo stesso valore. Ad esempio, due oggetti Point possono essere definiti equivalenti se pointA.X è uguale a pointB.X e pointA.Y è uguale a pointB.Y. Per i record, l'uguaglianza dei valori indica che due variabili di un tipo di record sono uguali se i tipi corrispondono e tutti i valori di proprietà e campo corrispondono.

Tuttavia, nessun requisito prevede che l'equivalenza sia basata su tutti i campi in un tipo. Può essere basata su un subset. Quando si confrontano i tipi di cui non si è proprietari, è necessario assicurarsi di sapere esattamente in che modo viene definita l'equivalenza per quel tipo. Per altre informazioni su come definire l'uguaglianza dei valori nelle classi e negli struct personalizzati, vedere Come definire l'uguaglianza dei valori per un tipo.

Uguaglianza di valori per i valori a virgola mobile

I confronti di uguaglianza dei valori a virgola mobile (double e float) sono problematici a causa dell'imprecisione dell'aritmetica a virgola mobile nei computer binari. Per altre informazioni, vedere le note nell'argomento System.Double.

Posizione Descrizione
Come testare l'uguaglianza dei riferimenti (Identità) Descrive come determinare se per due variabili esiste l'uguaglianza dei riferimenti.
Come definire l'uguaglianza dei valori per un tipo Descrive come specificare una definizione personalizzata di uguaglianza dei valori per un tipo.
Tipi Informazioni sul sistema di tipi C# e collegamenti a informazioni aggiuntive.
Record Fornisce informazioni sui tipi di record, che consentono di verificare l'uguaglianza dei valori per impostazione predefinita.