Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
La Key
parola chiave consente di specificare il comportamento per le proprietà di tipi anonimi. Solo le proprietà designate come proprietà chiave partecipano a test di uguaglianza tra istanze di tipo anonimo o calcolo dei valori del codice hash. Non è possibile modificare i valori delle proprietà chiave.
Si designa una proprietà di un tipo anonimo come proprietà chiave inserendo la parola chiave Key
davanti alla relativa dichiarazione nell'elenco di inizializzazione. Nell'esempio Airline
seguente e FlightNo
sono proprietà chiave, ma Gate
non.
Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",
Key .FlightNo = 3554, .Gate = "C33"}
Quando viene creato un nuovo tipo anonimo, eredita direttamente da Object. Il compilatore esegue l'override di tre membri ereditati: Equals, GetHashCodee ToString. Il codice di override prodotto per Equals e GetHashCode si basa sulle proprietà chiave. Se nel tipo GetHashCode non sono presenti proprietà chiave e Equals non ne viene eseguito l'override.
Uguaglianza
Due istanze di tipo anonimo sono uguali se sono istanze dello stesso tipo e se i valori delle relative proprietà della chiave sono uguali. Negli esempi flight2
seguenti è uguale a flight1
quello dell'esempio precedente perché sono istanze dello stesso tipo anonimo e hanno valori corrispondenti per le relative proprietà chiave. Tuttavia, flight3
non è uguale a flight1
perché ha un valore diverso per una proprietà chiave, FlightNo
. L'istanza flight4
non è lo stesso tipo di flight1
perché designano proprietà diverse come proprietà chiave.
Dim flight2 = New With {Key .Airline = "Blue Yonder Airlines",
Key .FlightNo = 3554, .Gate = "D14"}
' The following statement displays True. The values of the non-key
' property, Gate, do not have to be equal.
Console.WriteLine(flight1.Equals(flight2))
Dim flight3 = New With {Key .Airline = "Blue Yonder Airlines",
Key .FlightNo = 431, .Gate = "C33"}
' The following statement displays False, because flight3 has a
' different value for key property FlightNo.
Console.WriteLine(flight1.Equals(flight3))
Dim flight4 = New With {Key .Airline = "Blue Yonder Airlines",
.FlightNo = 3554, .Gate = "C33"}
' The following statement displays False. Instance flight4 is not the
' same type as flight1 because they have different key properties.
' FlightNo is a key property of flight1 but not of flight4.
Console.WriteLine(flight1.Equals(flight4))
Se due istanze vengono dichiarate solo con proprietà non chiave, identiche in nome, tipo, ordine e valore, le due istanze non sono uguali. Un'istanza senza proprietà chiave è uguale solo a se stessa.
Per altre informazioni sulle condizioni in cui due istanze di tipo anonimo sono istanze dello stesso tipo anonimo, vedere Tipi anonimi.
Calcolo del codice hash
Analogamente Equalsa , la funzione hash definita in GetHashCode per un tipo anonimo si basa sulle proprietà della chiave del tipo. Negli esempi seguenti viene mostrata l'interazione tra le proprietà chiave e i valori del codice hash.
Le istanze di un tipo anonimo con gli stessi valori per tutte le proprietà della chiave hanno lo stesso valore di codice hash, anche se le proprietà non chiave non hanno valori corrispondenti. L'istruzione seguente restituisce True
.
Console.WriteLine(flight1.GetHashCode = flight2.GetHashCode)
Le istanze di un tipo anonimo con valori diversi per una o più proprietà chiave hanno valori di codice hash diversi. L'istruzione seguente restituisce False
.
Console.WriteLine(flight1.GetHashCode = flight3.GetHashCode)
Le istanze di tipi anonimi che designano proprietà diverse come proprietà chiave non sono istanze dello stesso tipo. Hanno valori di codice hash diversi anche quando i nomi e i valori di tutte le proprietà sono uguali. L'istruzione seguente restituisce False
.
Console.WriteLine(flight1.GetHashCode = flight4.GetHashCode)
Read-Only Valori
Non è possibile modificare i valori delle proprietà chiave. Negli esempi precedenti, ad esempio, flight1
i campi e FlightNo
sono di sola lettura, ma Gate
Airline
possono essere modificati.
' The following statement will not compile, because FlightNo is a key
' property and cannot be changed.
' flight1.FlightNo = 1234
'
' Gate is not a key property. Its value can be changed.
flight1.Gate = "C5"