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