Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
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:
EqualsrestituisceTruese 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
Keyparola chiave viene applicata alle stesse proprietà.Il confronto di ogni coppia corrispondente di proprietà chiave restituisce
True.Negli esempi seguenti, ad esempio, restituisce
EqualsTruesolo peremployee01eemployee08. Il commento prima di ogni riga specifica il motivo per cui la nuova istanza non corrisponde aemployee01.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))
GetHashcodefornisce un algoritmo GetHashCode univoco in modo appropriato. L'algoritmo usa solo le proprietà della chiave per calcolare il codice hash.ToStringrestituisce 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.