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 nouvelle 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 des propriétés Name, Priceet 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é semblables à celles qui suivent. 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

De plus, les définitions de type anonymes contiennent un constructeur par défaut. 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 du type substitue trois membres hérités de Object : Equals, GetHashCode et ToString. Si aucune propriété de clé n'est déclarée, seul ToString est substitué. Les substitutions fournissent les fonctionnalités suivantes :

  • Equals retourne la valeur True si deux instances de type anonyme sont identiques ou si elles remplissent les 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 nom 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 propriétés identiques.

    • La comparaison de chaque paire de propriétés de clé correspondante retourne la valeur True.

    Par exemple, Equals retourne uniquement la valeur True pour employee01 et employee08 dans les exemples suivants. Le commentaire précédant 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 unique 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 l'illustre l'exemple suivant. Les propriétés de clé et celles ne correspondant pas à une 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 d'un type anonyme nommées explicitement ne peuvent pas être 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 si elles se produisent dans le même assembly, si leurs propriétés ont les mêmes noms et les mêmes types déduits, si les propriétés sont déclarées dans le même ordre et si les mêmes propriétés sont marquées comme propriétés de clé.

Voir aussi

Tâches

Comment : déclarer une instance d'un type anonyme (Visual Basic)

Comment : déduire les types et les noms de propriétés dans des déclarations de types anonymes (Visual Basic)

Concepts

Types anonymes (Visual Basic)

Comparaison entre types nommés et types anonymes (Visual Basic)