Condividi tramite


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 Compiler-Generated

Per la definizione seguente di , il compilatore crea una nuova definizione di productclasse contenente le proprietà Name, Pricee 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 alle seguenti. Si noti che non esiste alcun Set metodo per le proprietà della 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 di tre membri ereditati da Object: Equals, GetHashCodee ToString. Se non vengono dichiarate proprietà chiave, solo l'override di ToString viene eseguito. Le sostituzioni 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à vengono 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 Key parola chiave viene applicata alle stesse proprietà.

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

      Negli esempi seguenti, ad esempio, restituisce EqualsTrue 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, .GetHashCodeo .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.

Annotazioni

Le dichiarazioni di tipo anonimo creano lo stesso tipo anonimo solo se si verificano 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.

Vedere anche