Note
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier les répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de changer de répertoire.
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 nouvelle définition de classe qui contient les 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 Set méthode pour les propriétés de clé. Les valeurs des propriétés clés 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, GetHashCodeet ToString. Si aucune propriété clé n’est déclarée, ToString est uniquement remplacé. Les remplacements fournissent les fonctionnalités suivantes :
EqualsretourneTruesi deux instances de type anonyme sont la même instance ou si elles remplissent les conditions suivantes :Ils 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é clé, et le
Keymot clé est appliqué aux mêmes propriétés.Comparaison de chaque paire correspondante de propriétés de clé retourne
True.Par exemple, dans les exemples suivants,
EqualsretourneTrueuniquement pouremployee01etemployee08. Le commentaire avant chaque ligne spécifie la raison pour laquelle la nouvelle instance ne correspondemployee01pas.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))
GetHashcodefournit un algorithme GetHashCode unique et approprié. L’algorithme utilise uniquement les propriétés de clé pour calculer le code de hachage.ToStringretourne une chaîne de valeurs de propriété concaténées, comme illustré dans l’exemple suivant. Les propriétés principales et non principales sont prises en compte.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, .GetHashCodeou .ToString 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.
Remarque
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é.