Definizione di tipo anonimo (Visual Basic)

In risposta alla dichiarazione di un'istanza di un tipo anonimo, il compilatore crea una nuova definizione di classe contenente le proprietà specificate per il tipo.

Codice generato dal compilatore

Per la definizione seguente di product, il compilatore crea una nuova definizione della classe contenente le proprietà Name, Price e OnHand.

' Variable product is an instance of an anonymous type.
Dim product = New With {Key .Name = "paperclips", Key .Price = 1.29, .OnHand = 24}

La definizione della classe contiene definizioni di proprietà simili a quanto segue. Si noti che non esiste alcun metodo Set per le proprietà chiave. I valori delle proprietà chiave sono di sola lettura.

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

Inoltre, le definizioni di tipo anonimo contengono un costruttore senza parametri. I costruttori che richiedono parametri non sono consentiti.

Se una dichiarazione di tipo anonimo contiene almeno una proprietà chiave, la definizione del tipo esegue l'override dei tre membri ereditati da Object: Equals, GetHashCode e ToString. Se non vengono dichiarate proprietà chiave, viene eseguito l'override solo di ToString. Gli override forniscono le funzionalità seguenti:

  • Equals restituisce True se due istanze di tipo anonimo sono la stessa istanza o se soddisfano le condizioni seguenti:

    • Hanno lo stesso numero di proprietà.

    • Le proprietà sono dichiarate nello stesso ordine, con gli stessi nomi e gli stessi tipi dedotti. I confronti dei nomi non fanno distinzione tra maiuscole e minuscole.

    • Almeno una delle proprietà è una proprietà chiave e la parola chiave Key viene applicata alle stesse proprietà.

    • Il confronto di ogni coppia corrispondente di proprietà chiave restituisce True.

      Negli esempi seguenti, ad esempio, Equals restituisce True solo per employee01 e employee08. Il commento prima di ogni riga specifica il motivo per cui la nuova istanza non corrisponde a 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 fornisce un algoritmo GetHashCode univoco in modo appropriato. L'algoritmo usa solo le proprietà della chiave per calcolare il codice hash.

  • ToString restituisce una stringa di valori di proprietà concatenati, come illustrato nell'esempio seguente. Sono incluse sia le proprietà chiave che le proprietà non chiave.

    Console.WriteLine(employee01.ToString())
    Console.WriteLine(employee01)
    ' The preceding statements both display the following:
    ' { Name = Bob, Category = 3, InOffice = False }
    

Le proprietà denominate in modo esplicito di un tipo anonimo non possono essere in conflitto con questi metodi generati. Ciò significa che non è possibile usare .Equals, .GetHashCode o .ToString per assegnare un nome a una proprietà.

Le definizioni di tipi anonimi che includono almeno una proprietà chiave implementano anche l'interfaccia System.IEquatable<T>, dove T è il tipo del tipo anonimo.

Nota

Le dichiarazioni di tipo anonimo creano lo stesso tipo anonimo solo se sono presenti nello stesso assembly, le relative proprietà hanno gli stessi nomi e gli stessi tipi dedotti, le proprietà vengono dichiarate nello stesso ordine e le stesse proprietà vengono contrassegnate come proprietà chiave.

Vedi anche