Compartir a través de


Definición de tipo anónimo

Actualización: noviembre 2007

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 del tipo.

Código generado por compilador

En la siguiente definición 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 la siguiente. Observe que no hay ningún método Set para las propiedades de clave. Los valores de las propiedades de clave son de sólo lectura.

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

Además, las definiciones de tipos anónimos contienen un constructor predeterminado. No se permiten los constructores que requieran parámetros.

Si una declaración de tipo anónimo contiene al menos una propiedad de clave, la definición de tipo invalida tres miembros heredados de Object: Equals, GetHashCode y ToString. Si no se declara ninguna propiedad de clave, sólo se invalida ToString. Las invalidaciones proporcionan la funcionalidad siguiente:

  • Equals devuelve True 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 deducidos. Las comparaciones de nombres no distinguen mayúsculas de minúsculas.

    • Al menos una de las propiedades es una propiedad de clave y la palabra clave Key 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 devuelve True sólo para employee01 y employee08. El comentario situado delante de que cada línea especifica la razón por la que la nueva instancia no coincide con 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 proporciona un algoritmo GetHashCode único correctamente. El algoritmo utiliza sólo las propiedades de 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 tanto las propiedades de clave como las que no lo son.

    Console.WriteLine(employee01.ToString())
    Console.WriteLine(employee01)
    ' The preceding statements both display the following:
    ' { Name = Bob, Category = 3, InOffice = False }
    

Explícitamente las propiedades con nombre de un tipo anónimo no pueden estar en conflicto con estos métodos generados. Es decir, no puede utilizar .Equals, .GetHashCodeo .ToString para asignar un nombre a una propiedad.

Las definiciones de tipo anónimas que incluyen por lo menos una propiedad de clave también implementan la interfaz System.IEquatable<T>, donde T es el tipo del tipo anónimo.

Nota:

Las declaraciones de tipos anónimas crean el mismo tipo anónimo sólo si producen en el mismo ensamblado, sus propiedades tienen los mismos nombres y los mismos tipos deducidos, las propiedades se declaran en el mismo orden y se marcan las mismas propiedades como propiedades de clave.

Vea también

Tareas

Cómo: Declarar una instancia de un tipo anónimo

Cómo: Deducir tipos y nombres de propiedades en declaraciones de tipos anónimos

Conceptos

Tipos anónimos

Tipos con nombre y anónimos comparados