Key (Visual Basic)

Le mot clé Key vous permet de spécifier le comportement des propriétés de types anonymes. Seules les propriétés que vous désignez comme propriétés de clé participent aux tests d’égalité entre les instances de type anonyme ou au calcul des valeurs de code de hachage. Les valeurs des propriétés de clé ne peuvent pas être modifiées.

Vous désignez une propriété d’un type anonyme en tant que propriété de clé en plaçant le mot clé Key devant sa déclaration dans la liste d’initialisation. Dans l’exemple suivant, Airline et FlightNo sont des propriétés de clés, mais Gate ne l’est pas.

Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",
                        Key .FlightNo = 3554, .Gate = "C33"}

Lorsqu’un nouveau type anonyme est créé, il hérite directement de Object. Le compilateur remplace trois membres hérités : Equals, GetHashCode et ToString. Le code de remplacement produit pour Equals et GetHashCode se base sur les propriétés de clé. S’il n’y a pas de propriétés de clé dans le type, GetHashCode et Equals ne sont pas remplacés.

Égalité

Deux instances de type anonyme sont égales si elles sont des instances du même type et si les valeurs de leurs propriétés de clé sont égales. Dans les exemples suivants, flight2 est égal à flight1 de l’exemple précédent, car il s’agit d’instances du même type anonyme qui ont des valeurs correspondantes pour leurs propriétés de clé. Toutefois, flight3 n’est pas égal à flight1 , car il a une valeur différente pour une propriété de clé, FlightNo. L’instance flight4 n’est pas du même type que flight1, car elles désignent des propriétés différentes comme propriétés de clé.

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

Si deux instances sont déclarées avec uniquement des propriétés non clés, identiques en nom, type, ordre et valeur, les deux instances ne sont pas égales. Une instance sans propriétés de clé n’est égale qu’à elle-même.

Pour plus d’informations sur les conditions dans lesquelles deux instances de type anonyme sont des instances du même type anonyme, consultez Types anonymes.

Calcul du code de hachage

Comme Equals, la fonction de hachage définie dans GetHashCode pour un type anonyme se base sur les propriétés de clé du type. Les exemples suivants montrent l’interaction entre les propriétés de clé et les valeurs de code de hachage.

Les instances d’un type anonyme qui ont les mêmes valeurs pour toutes les propriétés de clé ont la même valeur de code de hachage, même si les propriétés non clés n’ont pas de valeurs correspondantes. L'instruction suivante retourne True.

Console.WriteLine(flight1.GetHashCode = flight2.GetHashCode)

Les instances d’un type anonyme qui ont des valeurs différentes pour une ou plusieurs propriétés de clé ont des valeurs de code de hachage différentes. L'instruction suivante retourne False.

Console.WriteLine(flight1.GetHashCode = flight3.GetHashCode)

Les instances de types anonymes qui désignent des propriétés différentes comme propriétés de clé ne sont pas des instances du même type. Elles ont des valeurs de code de hachage différentes, même lorsque les noms et les valeurs de toutes les propriétés sont identiques. L'instruction suivante retourne False.

Console.WriteLine(flight1.GetHashCode = flight4.GetHashCode)

Valeurs en lecture seule

Les valeurs des propriétés de clé ne peuvent pas être modifiées. Par exemple, dans flight1 dans les exemples précédents, les champs Airline et FlightNo sont en lecture seule, mais il est possible de modifier Gate.

' 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"

Voir aussi