Confronto di uguaglianze (Guida per programmatori C#)
È talvolta necessario confrontare l'uguaglianza di due valori. In alcuni casi, si testa l'uguaglianza di valori, detta anche equivalenza, ovvero si verifica che i valori contenuti dalle due variabili siano uguali. In altri casi, è necessario determinare se due variabili si riferiscono allo stesso oggetto sottostante in memoria. Questo tipo di uguaglianza è detto uguaglianza di riferimenti o identità. In questo argomento vengono descritti questi due tipi di uguaglianza e vengono forniti i collegamenti ad altri argomenti per ulteriori informazioni.
Uguaglianza di riferimenti
Per uguaglianza dei riferimenti si intende che due riferimenti all'oggetto fanno riferimento allo stesso oggetto sottostante. Questa situazione può verificarsi tramite una semplice assegnazione, come illustrato nell'esempio seguente.
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();
}
}
In questo codice, vengono creati due oggetti, ma dopo l'istruzione di assegnazione, entrambi riferimenti puntano allo stesso oggetto. Presentano pertanto l'uguaglianza dei riferimenti. Utilizzare il metodo ObjectReferenceEquals() per stabilire se due riferimenti puntano allo stesso oggetto.
Il concetto di uguaglianza dei riferimenti si applica solo ai tipi di riferimento. Gli oggetti tipo di valore non possono presentare uguaglianza dei riferimenti perché quando un'istanza di un tipo di valore è assegnata a una variabile, viene creata una copia del valore. Pertanto non è mai possibile disporre di due struct sottoposti a conversione unboxing che fanno riferimento allo stesso percorso in memoria. Inoltre, se si utilizza ReferenceEquals() per confrontare due tipi di valore, il risultato sarà sempre false, anche se i valori contenuti negli oggetti sono tutti identici. Ogni variabile è infatti sottoposta a conversione boxing in un'istanza dell'oggetto separata. Per ulteriori informazioni, vedere Procedura: testare l'uguaglianza di riferimenti (identità) (Guida per programmatori C#).
Uguaglianza di valori
Uguaglianza di valori significa che due oggetti contengono uno o più valori identici. Per i tipi di valore primitivi quale int o bool, i test dell'uguaglianza di valori sono semplici. È possibile utilizzare 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 di valori è più complesso perché è necessario comprendere come venga definita dal tipo. Per le classi e gli struct che dispongono di più campi o proprietà, l'uguaglianza di valori indica spesso che tutti i campi o le proprietà presentano lo stesso valore. Due oggetti Point, ad esempio, possono essere definiti come equivalenti se pointA.X è uguale a pointB.X e pointA.Y è uguale a pointB.Y.
Non è tuttavia indispensabile che l'equivalenza sia basata su tutti i campi in un tipo. Può essere basata su un sottoinsieme. Quando si confrontano tipi di cui non è proprietari, è consigliabile verificare di avere compreso in modo specifico come l'equivalenza sia definita per tale tipo. Per ulteriori informazioni sulla definizione dell'uguaglianza di valori nelle classi e negli struct, vedere Procedura: definire l'uguaglianza di valori per un tipo (Guida per programmatori C#).
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 ulteriori informazioni, vedere le note nell'argomento System.Double.
Argomenti correlati
Titolo |
Descrizione |
---|---|
Procedura: testare l'uguaglianza di riferimenti (identità) (Guida per programmatori C#) |
Viene descritto come determinare se due variabili presentano l'uguaglianza dei riferimenti. |
Procedura: definire l'uguaglianza di valori per un tipo (Guida per programmatori C#) |
Viene descritto come fornire una definizione personalizzata dell'uguaglianza di valori per un tipo. |
Vengono forniti collegamenti a informazioni su importanti funzionalità del linguaggio C# e sulle funzionalità disponibili per C# tramite .NET Framework. |
|
Vengono fornite informazioni sul sistema dei tipi di C# e collegamenti a ulteriori informazioni. |