Key (Visual Basic)
La parola chiave Key
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 seguente, Airline
e FlightNo
sono proprietà chiave, al contrario di Gate
.
Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",
Key .FlightNo = 3554, .Gate = "C33"}
Quando viene creato un nuovo tipo anonimo, quest'ultimo eredita direttamente da Object. Il compilatore esegue l'override di tre membri ereditati: Equals, GetHashCode e ToString. Il codice di override prodotto per Equals e GetHashCode si basa sulle proprietà chiave. Se nel tipo non sono presenti proprietà chiave, non viene eseguito l'override di GetHashCode e Equals.
Equality
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 seguenti flight2
è uguale a flight1
dall'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 e sono 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 a Equals, 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)
Valori di sola lettura
Non è possibile modificare i valori delle proprietà chiave. Negli esempi precedenti, ad esempio, in flight1
i campi Airline
e FlightNo
sono di sola lettura, ma Gate
può essere modificato.
' 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"