Tipos con nombre y anónimos comparados
Actualización: noviembre 2007
El formato que usa para declarar una instancia de un tipo anónimo se parece el formato que utiliza al declarar una instancia de un tipo con nombre mediante un inicializador de objeto. Sin embargo, hay diferencias importantes en el resultado.
Declaraciones
En los ejemplos siguientes, product1 es una instancia de un tipo anónimo y product2 es una instancia de la clase Product. Ambas declaraciones utilizan una lista de inicializaciones en sus declaraciones. La única diferencia sintáctica entre las dos declaraciones es que no se especifica ningún tipo de datos después de New para product1. Esto lo convierte en un tipo anónimo.
' Variable product1 is an instance of an anonymous type.
Dim product1 = New With {.Name = "paperclips", .Price = 1.29}
La variable product1 tiene establecimiento inflexible de tipos como instancia de un tipo anónimo. El compilador define el tipo según las propiedades que se especifican en la declaración. El compilador utiliza Inferencia de tipo de variable local para determinar los tipos de datos de las propiedades a partir de los valores iniciales que proporciona. En este ejemplo, el tipo anónimo contiene las propiedades Name y Price y sus tipos se deducen como String y Double, respectivamente.
Nota: |
---|
En el ejemplo anterior, no se especifica ninguna de las propiedades como propiedades de clave. Por consiguiente, las propiedades no representan ningún papel al determinar si dos instancias del mismo tipo son iguales o cuál es el valor de código hash de la instancia. Sin embargo, se pueden cambiar los valores de las propiedades, mientras que los valores de las propiedades de clave son de sólo lectura. Para obtener más información sobre propiedades de clave, vea Tipos anónimos. |
En el ejemplo siguiente, product2 tiene establecimiento inflexible de tipos como instancia de la clase Product. Tanto Name como Price deben ser miembros de la clase Product y sus tipos deben ser compatibles con los valores proporcionados en la declaración.
' Variable product2 is an instance of Product.
Dim product2 = New Product With {.Name = "paperclips", .Price = 1.29}
Para obtener más información, consulte Inicializadores de objeto: Tipos con nombre y anónimos.
Distinciones
La lista siguiente compara otros aspectos de las dos declaraciones:
La inferencia de tipo de variable local determina que product1 es una instancia de un tipo anónimo y que product2 es una instancia de la clase Product. No hay ninguna cláusula As en ninguna declaración, aunque para product2 la cláusula As es opcional.
Dado que los tipos anónimos no tienen nombres especificados, no puede utilizar una cláusula As para declarar product1. Se debe deducir su tipo. De esta forma, se limita el uso de tipos anónimos a variables locales.
Dado que product2 es una instancia de un tipo con nombre, Product, que puede declararla sin usar la inferencia de tipos mediante una cláusula As.
Dim product2a As New Product With {.Name = "paperclips", .Price = 1.29}
Si se define un constructor adecuado en Product, product2 se puede declarar e inicializar sin utilizar un inicializador de objeto.
Dim product2b As New Product("paperclips", 1.29)
O bien, la serie siguiente de instrucciones tiene la misma aplicación.
Dim product2c As New Product product2c.Name = "paperclips" product2c.Price = 1.29
No es posible ninguna declaración similar para product1 porque a sus propiedades se les asigna nombre y se definen en la propia lista de inicializadores.
Puesto que product1, product2 y sus propiedades tienen todos establecimiento inflexible de tipos, puede utilizar IntelliSense para navegar por el código que usa cualquier objeto.
Precaución: El compilador genera el nombre del tipo anónimo y quizá cambie de una compilación a otra. El código no debe usar ni depender del nombre de un tipo anónimo porque el nombre podría cambiar cuando se vuelva a compilar el proyecto.
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
Inferencia de tipo de variable local