Partage via


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 retourne True 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 retourne True uniquement pour employee01 et employee08. Le commentaire avant chaque ligne spécifie la raison pour laquelle la nouvelle instance ne correspond pas employee01.

      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é.

Voir aussi