Condividi tramite


Confronti di uguaglianza (Guida per programmatori C#)

A volte è necessario confrontare due valori per verificarne l'uguaglianza. In alcuni casi, si testa l'uguaglianza dei valori, nota anche come equivalenza, il che significa che i valori contenuti dalle due variabili sono uguali. In altri casi, è necessario determinare se due variabili fanno riferimento allo stesso oggetto sottostante in memoria. Questo tipo di uguaglianza è denominato uguaglianza dei riferimenti o identità. In questo argomento vengono descritti questi due tipi di uguaglianza e vengono forniti collegamenti ad altri argomenti per ulteriori informazioni.

Uguaglianza dei riferimenti

L'uguaglianza dei riferimenti significa che due riferimenti a oggetti fanno riferimento allo stesso oggetto sottostante. Ciò può verificarsi tramite 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) = {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) = {areEqual}");
    }
}

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

Il concetto di uguaglianza dei riferimenti si applica solo ai tipi di riferimento. Gli oggetti tipo valore non possono avere uguaglianza di riferimento perché quando un'istanza di un tipo valore viene assegnata a una variabile, viene eseguita una copia del valore. Pertanto, non è mai possibile avere due struct non racchiusi che fanno riferimento alla stessa posizione in memoria. Inoltre, se si usano ReferenceEquals per confrontare due tipi valore, il risultato sarà falsesempre , anche se i valori contenuti negli oggetti sono tutti identici. Ciò è dovuto al fatto che ogni variabile viene inserita in un'istanza di oggetto separata. Per altre informazioni, vedere Come testare l'uguaglianza dei riferimenti (Identità).

Uguaglianza di valori

L'uguaglianza dei 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 di uguaglianza dei valori sono semplici. È possibile usare l'operatore == , come illustrato 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 dei valori è più complesso perché richiede di comprendere come il tipo lo definisce. Per le classi e gli struct con più campi o proprietà, l'uguaglianza dei valori viene spesso definita per indicare che tutti i campi o le proprietà hanno lo stesso valore. Ad esempio, due Point oggetti possono essere definiti come 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.

Non esiste tuttavia alcun requisito che l'equivalenza sia basata su tutti i campi di un tipo. Può essere basato su un subset. Quando si confrontano i tipi di cui non si è proprietari, è necessario assicurarsi di comprendere in modo specifico come viene definita l'equivalenza per tale 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 dei 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 osservazioni nell'argomento System.Double.

Titolo Descrizione
Come testare l'uguaglianza dei riferimenti (Identità) Viene descritto come determinare se due variabili hanno l'uguaglianza dei riferimenti.
Come definire l'uguaglianza dei valori per un tipo Viene descritto come fornire una definizione personalizzata di uguaglianza dei valori per un tipo.
Tipi Fornisce informazioni sul sistema dei 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.