Condividi tramite


Definizione del tipo anonimo

Aggiornamento: novembre 2007

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

Codice generato dal compilatore

Per la seguente definizione di product, il compilatore crea una nuova definizione di classe che contiene 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 di classe contiene definizioni di proprietà simili alle seguenti. Si noti che non è disponibile un 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 Property Name() As String
        Get
            Return _name
        End Get
    End Property

    Public 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 predefinito. Non è consentito l'uso di costruttori che richiedono parametri.

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 viene dichiarata alcuna proprietà chiave, viene eseguito l'override solo di ToString. L'override fornisce la seguente funzionalità:

  • 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. Nel confronto tra nomi non viene applicata la distinzione tra maiuscole e minuscole.

    • Almeno una delle proprietà è una proprietà chiave e la parola chiave Key si applica alle stesse proprietà.

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

    Ad esempio, Equals restituisce True solo per employee01 e employee08, come illustrato nell'esempio seguente. Il commento che precede ogni riga specifica la ragione per cui la nuova istanza nuova 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 di GetHashCode adeguatamente univoco. L'algoritmo utilizza solo le proprietà chiave per calcolare il codice hash.

  • ToString restituisce una stringa di valori concatenati della proprietà, come illustrato nell'esempio seguente. Sono incluse sia le proprietà chiave che quelle 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 devono essere in conflitto con questi metodi generati. Ovvero, non è possibile utilizzare .Equals, .GetHashCode o .ToString per denominare una proprietà.

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

Nota:

Dichiarazioni di tipo anonimo creano lo stesso tipo anonimo solo se si verificano nello stesso assembly, le 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

Attività

Procedura: dichiarare un'istanza di un tipo anonimo

Procedura: dedurre nomi di proprietà e tipi nelle dichiarazioni di tipo anonimo

Concetti

Tipi anonimi

Confronto tra tipi denominati e tipi anonimi