Definición de tipos anónimos (Visual Basic)
En respuesta a la declaración de una instancia de un tipo anónimo, el compilador crea una nueva definición de clase que contiene las propiedades especificadas.
Código generado por el compilador
Para la definición siguiente de product
, el compilador crea una nueva definición de clase que contiene las propiedades Name
, Price
y OnHand
.
' Variable product is an instance of an anonymous type.
Dim product = New With {Key .Name = "paperclips", Key .Price = 1.29, .OnHand = 24}
La definición de clase contiene definiciones de propiedad similares a las siguientes. Observa que no hay ningún Set
método para las propiedades de clave. Los valores de las propiedades de clave son de solo lectura.
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
Además, las definiciones de tipo anónimo contienen un constructor sin parámetros. Los constructores que requieren parámetros no están permitidos.
Si una declaración de tipo anónima contiene al menos una propiedad clave, la definición de tipo invalida tres miembros heredados de Object: Equals, GetHashCode y ToString. Si no se declara ninguna propiedad de clave, solo ToString se invalida. Las invalidaciones de elementos proporcionan la funcionalidad siguiente:
Equals
devuelveTrue
si dos instancias de tipo anónimo son la misma instancia o si cumplen las condiciones siguientes:Tienen el mismo número de propiedades.
Las propiedades se declaran en el mismo orden, con los mismos nombres y los mismos tipos inferidos. Las comparaciones de nombres no distinguen mayúsculas de minúsculas.
Al menos una de las propiedades es una propiedad clave y la
Key
palabra clave se aplica a las mismas propiedades.La comparación de cada par correspondiente de propiedades de clave devuelve
True
.Por ejemplo, en los ejemplos siguientes,
Equals
devuelveTrue
solo paraemployee01
yemployee08
. El comentario antes de cada línea especifica el motivo por el que la nueva instancia no coincide conemployee01
.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
proporciona un algoritmo GetHashCode adecuado. El algoritmo usa solo las propiedades clave para calcular el código hash.ToString
devuelve una cadena de valores de propiedad concatenados, como se muestra en el ejemplo siguiente. Se incluyen las propiedades key y non-key.Console.WriteLine(employee01.ToString()) Console.WriteLine(employee01) ' The preceding statements both display the following: ' { Name = Bob, Category = 3, InOffice = False }
Las propiedades con nombre explícito de un tipo anónimo no pueden entrar en conflicto con estos métodos generados. Es decir, no se puedes usar .Equals
, .GetHashCode
o .ToString
para asignar un nombre a una propiedad.
Las definiciones de tipo anónimo que incluyen al menos una propiedad clave también implementan la interfaz System.IEquatable<T>, donde T
es el tipo del tipo anónimo.
Nota
Las declaraciones de tipo anónimo crean el mismo tipo anónimo solo si se producen en el mismo ensamblado, sus propiedades tienen los mismos nombres y los mismos tipos inferidos, las propiedades se declaran en el mismo orden y las mismas propiedades se marcan como propiedades clave.