Définition du type anonyme (Visual Basic)
En réponse à la déclaration d’une instance d’un type anonyme, le compilateur crée une définition de classe qui contient les propriétés spécifiées pour le type.
Code généré par le compilateur
Pour la définition suivante de product
, le compilateur crée une définition de classe qui contient des propriétés Name
, Price
et OnHand
.
' Variable product is an instance of an anonymous type.
Dim product = New With {Key .Name = "paperclips", Key .Price = 1.29, .OnHand = 24}
La définition de classe contient des définitions de propriétés similaires à ce qui suit. Notez qu’il n’existe aucune méthode Set
pour les propriétés de clé. Les valeurs des propriétés de clé sont en lecture seule.
Public Class $Anonymous1
Private _name As String
Private _price As Double
Private _onHand As Integer
Public ReadOnly Property Name() As String
Get
Return _name
End Get
End Property
Public ReadOnly Property Price() As Double
Get
Return _price
End Get
End Property
Public Property OnHand() As Integer
Get
Return _onHand
End Get
Set(ByVal Value As Integer)
_onHand = Value
End Set
End Property
End Class
En outre, les définitions de type anonyme contiennent un constructeur sans paramètre. Les constructeurs qui nécessitent des paramètres ne sont pas autorisés.
Si une déclaration de type anonyme contient au moins une propriété de clé, la définition de type remplace trois membres hérités de Object : Equals, GetHashCode et ToString. Si aucune propriété de clé n’est déclarée, seule ToString est remplacée. Les remplacements fournissent les fonctionnalités suivantes :
Equals
retourneTrue
si deux instances de type anonyme sont la même instance ou si elles répondent aux conditions suivantes :Elles ont le même nombre de propriétés.
Les propriétés sont déclarées dans le même ordre, avec les mêmes noms et les mêmes types déduits. Les comparaisons de noms ne respectent pas la casse.
Au moins une des propriétés est une propriété de clé, et le mot clé
Key
est appliqué aux mêmes propriétés.La comparaison de chaque paire correspondante de propriétés de clé retourne
True
.Par exemple, dans les exemples suivants,
Equals
retourneTrue
uniquement pouremployee01
etemployee08
. Le commentaire avant chaque ligne spécifie la raison pour laquelle la nouvelle instance ne correspond pasemployee01
.Dim employee01 = New With {Key .Name = "Bob", Key .Category = 3, .InOffice = False} ' employee02 has no InOffice property. Dim employee02 = New With {Key .Name = "Bob", Key .Category = 3} ' The first property has a different name. Dim employee03 = New With {Key .FirstName = "Bob", Key .Category = 3, .InOffice = False} ' Property Category has a different value. Dim employee04 = New With {Key .Name = "Bob", Key .Category = 2, .InOffice = False} ' Property Category has a different type. Dim employee05 = New With {Key .Name = "Bob", Key .Category = 3.2, .InOffice = False} ' The properties are declared in a different order. Dim employee06 = New With {Key .Category = 3, Key .Name = "Bob", .InOffice = False} ' Property Category is not a key property. Dim employee07 = New With {Key .Name = "Bob", .Category = 3, .InOffice = False} ' employee01 and employee 08 meet all conditions for equality. Note ' that the values of the non-key field need not be the same. Dim employee08 = New With {Key .Name = "Bob", Key .Category = 2 + 1, .InOffice = True} ' Equals returns True only for employee01 and employee08. Console.WriteLine(employee01.Equals(employee08))
GetHashcode
fournit un algorithme GetHashCode approprié. L’algorithme utilise uniquement les propriétés de clé pour calculer le code de hachage.ToString
retourne une chaîne de valeurs de propriété concaténées, comme illustré dans l’exemple suivant. Les propriétés de clé et non clé sont incluses.Console.WriteLine(employee01.ToString()) Console.WriteLine(employee01) ' The preceding statements both display the following: ' { Name = Bob, Category = 3, InOffice = False }
Les propriétés nommées explicitement d’un type anonyme ne peuvent pas entrer en conflit avec ces méthodes générées. Autrement dit, vous ne pouvez pas utiliser .Equals
, .GetHashCode
ou .ToString
pour nommer une propriété.
Les définitions de type anonyme qui incluent au moins une propriété de clé implémentent également l’interface System.IEquatable<T>, où T
est le type du type anonyme.
Notes
Les déclarations de type anonyme créent le même type anonyme uniquement s’ils se produisent dans le même assembly, leurs propriétés ont les mêmes noms et les mêmes types déduits, les propriétés sont déclarées dans le même ordre et les mêmes propriétés sont marquées comme propriétés de clé.