miércoles, 25 de enero de 2012

¿Qué hay de nuevo en Visual Basic 2010?

Desde su creación en 1991, el lenguaje Visual Basic ha sido siempre una herramienta de productividad fenomenal para la creación de aplicaciones. Casi 20 años después, sigue proporcionando un fácil acceso a la plataforma Microsoft. NET Framework, permitiendo a los desarrolladores escribir aplicaciones que abarcan escritorios, teléfonos, navegadores y hasta la nube.
Microsoft este mes se enviará Visual Studio 2010, que incorpora la versión 10 de Visual Basic (a veces referido como VB 2010 o VB10). Esta versión, sin embargo, el más potente, contiene numerosas características que ahorran tiempo que ayudan a los desarrolladores a hacer más con menos líneas de código. Aquí está todo lo que necesita saber para comenzar a ejecutar con Visual Basic en Visual Studio 2010.

COEVOLUCIÓN

En el pasado, Visual Basic y C # son desarrollados por equipos independientes, que a menudo resultaba en las características que aparecen en un idioma antes que el otro. Por ejemplo, C # se había auto-aplicado las propiedades y los inicializadores de colección, que no estaban en Visual Basic y Visual Basic tenía características tales como finales de los parámetros obligatorios y opcionales que no están en C #. Pero cada vez que una característica apareció en uno de los idiomas, muchos clientes que pedir que la capacidad adicional a la otra también.
Para hacer frente a esta información, Microsoft se fusionó el Visual Basic y C # equipos, adoptando una estrategia de co-evolución. La intención es hacer que las lenguas avanzar juntos. Cuando la funcionalidad principal es introducido en un idioma, debería aparecer en el otro también. Esto no quiere decir que todas las características estarán en ambos idiomas y funcionan exactamente de la misma manera, de hecho, cada idioma tiene su propia historia, el espíritu y sentir-los rasgos que son importantes para mantener. Coevolución significa que cualquier tarea que usted puede hacer en un idioma debe ser tan simple en la otra.
En el. NET Framework 4, Visual Basic y C # se han dado pasos de gigante hacia este objetivo, cada uno añadiendo una serie de capacidades de la otra ya tenía. Coevolución no es sólo sobre el pasado, sin embargo, es también la estrategia para futuras innovaciones en los idiomas. En ese espíritu,. NET Framework 4 introduce nuevas y potentes características, como el Dynamic Language Runtime, Tipos de incrustar la interoperabilidad y la variación genérica, en los dos idiomas al mismo tiempo, permitiendo que los desarrolladores de Visual Basic y C # para aprovechar al máximo. NET Framework.

NUEVAS CARACTERÍSTICAS DE VISUAL BASIC 2010

Las nuevas características de Visual Basic 2010 están diseñados para ayudarle a hacer más en menos líneas de código.Nosotros (el equipo de diseño de Visual Basic) se veía en los lugares donde los desarrolladores a menudo tienen que escribir mucho código repetitivo y tedioso investigado formas de conseguir el compilador para hacer el trabajo en su lugar. Ese es el panorama, ahora vamos a profundizar en algunas de las características de uno en uno.

CONTINUACIÓN DE LÍNEA IMPLÍCITA

Visual Basic es un lenguaje orientado a líneas que utiliza clara, Inglés-como sintaxis para mejorar la legibilidad. Pero que a menudo resulta en código que se ejecuta con el límite de 80 caracteres por línea, obligando a los desarrolladores para desplazarse mucho. Usted puede utilizar el carácter de subrayado para indicar al compilador que debe mantener el procesamiento de la siguiente línea como parte de la actual (es decir, el tratamiento de múltiples líneas físicas en una sola línea, lógico). Pero tener que escribir repetidamente subraya siempre ha sido molesto, y de hecho, durante años el número 1 petición de función ha sido para el compilador de "sólo con ello."
Pues bien, en Visual Basic 2010, el compilador puede. Ahora sabe que las fichas (como las comas, paréntesis y operadores) tienden a ocurrir justo antes de que el carácter de continuación de línea, y se inserta el carácter para que los desarrolladores ya no necesitan. Por ejemplo, poniendo fin a una instrucción de Visual Basic con una coma no es legal, el compilador sabe, así que cuando se ve una cadena de componentes léxicos que se ve como {coma, entrar} , se infiere la presencia de la marca de continuación de línea, como el ejemplo de la La figura 1 muestra.
Figura 1 Continuación Inferir línea
<Extension()>
Función FilterByCountry (
  Los clientes de ByVal como IEnumerable (Of Customer),
  País ByVal As String) As IEnumerable (Of Customer)
    Consulta Dim =
      C En los clientes de
      Donde c.Country = país
      Seleccione <Customer>
        <% =
          c.Name y
          "," &
          c.Country
        %>
      </ Cliente>
    Volver consulta
  End Function
En Visual Basic 2008, el código en la figura 1 se han necesitado nueve subraya. En cada uno de estos casos, sin embargo, el compilador infiere que el guión era necesario y permitido que se omite:
  • Después de la <Extension()> atributo
  • Después de la ((abrir paréntesis) en la declaración del método
  • Después de la, (coma) para el primer parámetro
  • Antes de la) (cierre paréntesis) en la declaración del método
  • Después de la = (signo igual)
  • Después de que el <% = (etiqueta de apertura de una expresión incrustada)
  • Después de cada & (y comercial) en el literal XML
  • Antes de que el%> (etiqueta de cierre para una expresión incrustada)
Esta capacidad nuevo compilador es especialmente útil para la firma del método, que van más allá de 80 caracteres en el ejemplo, si cada parte se encontraban en la misma línea. En la figura 2 verá todas las combinaciones de símbolos y prácticas en las que el carácter de continuación de línea implícita.
Figura 2 , donde los personajes están implícitos Continuación
MuestraAntesDespués de
, (Coma),. (Punto),> (atributos), ({(entre paréntesis abierto), <% = (comienza expresión incrustada (literales XML)) X
),},] (Corchetes cerca),%> (cerca de expresión incorporado)X 
Todas las palabras clave de LINQ:
Conjunto, distinto, de, Grupo A, Grupo Ensamble, Ensamble, Vamos, Ordenar por, seleccionar, Saltar, saltar mientras, toma, toma tiempo, donde, en, en, encendido, ascendente, descendente
XX
Los operadores:
+, -, *, /, \, ^,>>, <<, Mod, y, + =, -=, *=, / =, \ =, ^ =,>> =, <<=, y = , <, <=,>,> =, <>, es, IsNot, como, y, OR, XOR, AndAlso, OrElse
 X
Con (en un inicializador de objeto) X
Como puedes ver, hay más de 60 lugares en los que el idioma no requiere subraya. (De hecho, ninguno de los ejemplos de código en este artículo requiere el carácter de continuación de línea.) Por supuesto, usted todavía puede utilizar el guión bajo, por lo que el código de versiones anteriores de Visual Basic todavía se compilará como se esperaba.

LAMBDAS DE INSTRUCCIÓN

El lambda término puede sonar intimidante al principio, pero una lambda es sólo una función definida dentro de otra función. Visual Basic 2008 introduce las expresiones lambda con la palabra clave de función:
Clientes As Cliente () = ...

 Array.FindAll (clientes, la función (c) c.Country = "Canadá")
Las expresiones lambda le dará una buena forma compacta de expresar la lógica a nivel local sin tener que dividir a través de varios métodos. Por ejemplo, así es como el código anterior se habría visto en Visual Basic 2005 (que no apoyó las expresiones lambda):
Consulta Dim = Array.FindAll (clientes, AddressOf filtro)

    ...

Función de filtro (ByVal c como cliente) As Boolean
  Volver c.Country = "Canadá"
End Function
Por desgracia, las expresiones lambda Visual Basic 2008 se requiere que las expresiones devuelven un valor, por lo que:
Array.ForEach (clientes, la función (c) Console.WriteLine (c.Country))
habría causado esto:
"Error de compilación:" La expresión no produce un valor. "
Console.WriteLine es un procedimiento Sub (void en C #), por lo que no devuelve un valor, por lo que el compilador da un error. Para hacer frente a esto, Visual Basic 2010 introduce soporte para lambdas de instrucción, que son lambdas que puede contener una o más declaraciones:
Array.ForEach (clientes, Sub (c) Console.WriteLine (c.Country))
Debido a Console.WriteLine no devuelve un valor, que sólo puede crear una lambda Sub en lugar de una función lambda. Aquí hay otro ejemplo que utiliza múltiples sentencias:
Array.ForEach (clientes, Sub (c)
                           Console.WriteLine ("Nombre del país:")
                           Console.WriteLine (c.Country)
                         End Sub)
Cuando se ejecuta este código, que va a imprimir dos líneas para cada cliente. Observe también que si se pasa sobre ccuando estás de codificación, verás que el compilador ha inferido el tipo de cliente (que también es legal el tipo c como cliente para indicar el tipo de forma explícita). Dinámica de cableado controladores de eventos es otro gran uso de lambdas de instrucción:
AddHandler b.Click, Sub (sender As Object, e As EventArgs)
                      MsgBox ("botón pulsado")
                      'Insertar una lógica más compleja aquí
                    End Sub
Y, de hecho, puede combinar lambdas de instrucción con una función nueva en Visual Basic 2008: los delegados relajados. (. Puede utilizar delegados seguridad de tipos, los punteros a funciones, la ejecución de múltiples funciones a la vez) Esta combinación produce una firma aún más simple:
AddHandler b.Click, Sub ()
                      MsgBox ("botón pulsado")
                     'Insertar una lógica más compleja aquí
                    End Sub
Delegado de relajación le permite omitir completamente los parámetros de un controlador de eventos, un buen beneficio, dado que con frecuencia no se utilizan en todo, por lo que sólo tiene que añadir el ruido visual.
Además de las lambdas Sub de una sola línea y de varias líneas lambdas Sub hemos visto hasta ahora, Visual Basic 2010 también es compatible con varias líneas lambdas Función:
Consulta Dim = customers.Where (function (c)
                              "Volver sólo los clientes que no se han guardado
                              'Insertar una lógica más compleja aquí
                              Volver c.ID = -1
                            End Function)
Otro aspecto interesante de lambdas de instrucción es la forma en que se cruzan con los delegados anónimos Visual Basic 2008 introdujo. Las personas suelen confundir estos con los métodos de C # 's anónimos, aunque técnicamente no son lo mismo. Delegados anónimos se producen cuando el compilador de Visual Basic deduce un tipo de delegado sobre la base de la firma del método de una lambda:
Método de dim = función (producto As String)
               Si el producto = "Papel" Entonces
                 Volver 4,5 "unidades en stock
               Más
                 Rendimiento del 10 '10 de todo lo demás
               End If
             End Function

MsgBox (método ("Papel"))
Si se ejecuta este código, verá el valor 4,5 se muestra en el cuadro de mensaje. Además, si se pasa sobre el método , usted verá el texto el método As <Function(String) Como Double> . Debido a que no proporcionó tipo delegado actual, el compilador generará una automáticamente, de esta manera:
Delegar la función $ $ compilerGeneratedName (producto As String) As Double
Esto se llama un delegado anónimo, ya que sólo aparece en el compilador de código de producción, no en el código escrito. Observe que el compilador infiere el tipo de retorno, como doble, cuando en realidad no había ninguna cláusula As para especificar el tipo dada la lambda de retorno. El compilador busca en todas las declaraciones que volver dentro de la lambda y ve los tipos doble (4,5) y entero (10):
"Observe el" As Single "
Método de dim = función (producto As String) As Single
               Si el producto = "Papel" Entonces
                 Volver 4,5 "unidades en stock
               Más
                 Rendimiento del 10 '10 de todo lo demás
               End If
             End Function
A continuación, ejecuta el algoritmo de tipo dominante y determina que con seguridad se puede convertir del 10 al doble, pero no se puede convertir de forma segura a los 4,5 enteros, por lo que es el doble elegir mejor.
También puede tomar el control del tipo de cambio de forma explícita, en cuyo caso el compilador no intentará deducir el tipo. En lugar de confiar en el compilador para inferir el tipo de delegado, es muy común para asignar una lambda a una variable que tiene un tipo de delegado explícitos:
Método de As Func (Of String, Single) =
  La función (de productos)
    Si el producto = "Papel" Entonces
      Volver 4,5 "unidades en stock
    Más
      Rendimiento del 10 '10 de todo lo demás
    End If
  End Function
Debido a un tipo de objetivo explícito fue proporcionada, no hay necesidad de decir como secuencia o As Single, el compilador puede inferir su presencia según el tipo de delegado de la parte izquierda de la declaración. Por lo tanto, si pasa el cursor sobre los productos que usted encontrará que el tipo inferido es String. Especificando como único ya no es necesario, porque el tipo de delegado ya proporciona esa información. En el ejemplo anterior, la firma del delegado Func (. NET Framework que se incluye) se parece a esto:
Delegar la función Func (Of T, R) (param ByVal como T) Como R
con una pequeña excepción, como veremos más adelante en la sección de variación genérica.

PROPIEDADES AUTOIMPLEMENTADAS

En Visual Basic, las propiedades son miembros de la clase que se utiliza para exponer el estado de un objeto con el mundo exterior. Una declaración de propiedad típica se ve algo como esto:
_Country Privado As String

Casa de campo As String
  Obtener
    Volver _Country
  End Get
  Set (ByVal Value As String)
    _Country = Valor
  Ajuste final
End Property
Eso es 10 líneas de código por lo que en realidad es un concepto muy simple. Teniendo en cuenta que los objetos típicos suelen tener decenas de propiedades, se termina como una gran cantidad de código repetitivo en las definiciones de clase. Para realizar estas tareas más fáciles, Visual Basic 2010 introduce auto propiedades implementadas, que permiten definir un edificio sencillo con una sola línea de código:
Casa de campo As String
En este caso, el compilador seguirá adelante y generar el Getter, Setter y los campos de respaldo de forma automática. El nombre del campo de respaldo siempre será un subrayado seguido por el nombre de la propiedad:_Country en este caso. Esta convención garantiza la compatibilidad de serialización binaria que un auto-aplicado la propiedad puede cambiar a una normal. Siempre y cuando el nombre del campo de respaldo es la serialización mismo binario seguirá trabajando.
Una de las cosas interesantes que puedes hacer con el auto propiedades implementadas se especifica que los inicializadores de establecer el valor predeterminado de la propiedad cuando el constructor se ejecuta. Un escenario común con las clases de entidad, por ejemplo, establece la clave principal a algo parecido a -1 para indicar que está en un estado no guardado. Esto es lo que ese código se vería así:
Propiedad ID As Integer = -1
Cuando el constructor se ejecuta, el campo de respaldo (_ID) se establecerá en el valor -1 de forma automática. La sintaxis de inicializador también funciona para los tipos de referencia:
OrderList propiedad como una lista (de orden) = Nueva lista (de orden)
La línea de código anterior no puede sentirse muy "Visual Basic-ish", dado que introducir el nombre del tipo de dos veces es redundante. La buena noticia es que hay una sintaxis, incluso más corto que sea coherente con lo que Visual Basic permite a los regulares en las declaraciones de variables:
Propiedad OrderList Como nueva lista (de orden)
Usted puede incluso combinar esto con objetos iniciadores para permitir establecer propiedades adicionales:
Propiedad OrderList Como nueva lista (de orden) con {. Capacidad = 100}
Obviamente, para las propiedades más complejas, la sintaxis ampliada sigue siendo necesaria. Usted todavía puede escribir de propiedad {Tab} para activar el fragmento de la propiedad de edad. Por otra parte, después de escribir la primera línea de la propiedad, solo tiene que introducir Obtenga {Enter} , y el IDE generará la antigua propiedad de estilo:
Nombre de la propiedad como secuencia
  Obtener

  End Get
  Set (ByVal Value As String)

  Ajuste final
End Property
La gente a menudo la observación de que la sintaxis de la propiedad nueva es casi idéntica a la sintaxis de un campo público, ¿por qué no utilizar un campo público en su lugar? Bueno, por varias razones:
  • Gran parte de la. NET de enlace de datos de obras de infraestructura contra las propiedades, pero no los campos.
  • Una interfaz no puede hacer valer la existencia de un campo, sino que puede cumplir de una propiedad.
  • Las propiedades proporcionan una mayor flexibilidad a largo plazo para el cambio de reglas de negocio. Por ejemplo, supongamos que alguien introduce la regla de que un número de teléfono debe ser de 10 dígitos. No hay manera de realizar esta validación al asignar a un campo público. Cambio de un campo público de una propiedad es un cambio importante en escenarios como la serialización binaria y la reflexión.

INICIALIZADORES DE COLECCIÓN

. Una práctica común NET es crear una instancia de una colección y después llenarla llamando al método Add de una vez por cada elemento:
Dígitos As New List (Of Integer)
digits.Add (0)
digits.Add (1)
digits.Add (2)
digits.Add (3)
digits.Add (4)
digits.Add (5)
digits.Add (6)
digits.Add (7)
digits.Add (8)
digits.Add (9)
Pero el resultado es un montón de gastos sintáctica por lo que es fundamentalmente un concepto muy simple. Visual Basic 2010 introduce inicializadores de colección para hacerle más fácil crear una instancia colecciones. Con este código:
Dígitos dim = Nueva lista (Of Integer) de {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
el compilador generará todas las llamadas al método Add de forma automática. También puede utilizar la función de la sintaxis como nuevo Visual Basic:
Dígitos As New List (Of Integer) de {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
Tenga en cuenta que en el equipo de Visual Basic, se recomienda siempre usar la segunda sintaxis (como nuevo) sobre la primera, porque hace resistente contra el código de cambios en la configuración de Option Infer.
Usted puede utilizar inicializadores de colección en contra de cualquier tipo que cumpla con los siguientes requisitos:
  • Se puede iterar sobre ella con un For Each-declaración, es decir, que implementa IEnumerable. (Para una definición más precisa / detallada de un tipo de colección, véase la sección 10.9.3 de la especificación del lenguaje Visual Basic en msdn.microsoft.com/library/aa711986 (VS.71). Aspx).
  • Cuenta con una accesible (no necesariamente pública) sin parámetros de constructor.
  • lt tiene un accesible (no necesariamente pública) de la instancia o método de extensión denominado add.
Eso significa que usted también puede usar inicializadores de colección con los tipos más complejos, tales como los diccionarios:
LookupTable As Nuevo Diccionario (Of Integer, String) Desde
  {{1, "One"},
   {2, "dos"},
   {3, "Tres"},
   {4, "cuatro"}}
(. Tenga en cuenta que a pesar de que esta declaración se extiende por cinco líneas, no se subraya) En este caso, el compilador generará un código que es equivalente a la antigua manera de inicializar el diccionario:
LookupTable As Nuevo Diccionario (Of Integer, String)
lookupTable.Add (1, "One")
lookupTable.Add (2, "Dos")
lookupTable.Add (3, "Tres")
lookupTable.Add (4, "Cuatro")
El compilador está llamando a un método Add que tiene dos parámetros en vez de uno. Se sabe que hacer esto porque los valores entran en el inicializador de colección se encontraban en llaves anidadas, así: {{1, "One"}, {2, "dos"}, ...}. Para cada conjunto de llaves anidadas, el compilador intenta pasar los parámetros a un método Add compatible.
También puede proporcionar su propia implementación Agregar personalizado mediante un método de extensión:
<Extension()>
  Sub Add (ByVal como fuente IList (Of Customer),
          ByVal id As Integer,
          Nombre ByVal As String,
          ByVal ciudad As String)

      source.Add (nuevo cliente con
                 {
                    . ID = id,
                    . Nombre = nombre,
                    . City = ciudad
                 })
  End Sub
(¡Mira a todos los desaparecidos subrayado) Este método se extiende cualquier tipo que implemente IList (Of Customer) y luego le permite utilizar la sintaxis de colección inicializador de nuevo como esto:
Lista Dim = Nueva lista (del cliente) de
            {
              {1, "Jon", "Redmond"},
              {2, "Bob", "Seattle"},
              {3, "Sally", "Toronto"}
            }
(La adición de tres clientes de la lista ). También puede utilizar inicializadores de colección en conjunto con auto-propiedades implementadas:
Estados como Nueva lista de la propiedad (Of String) Desde {"AL", "AK", "AR", "AZ", ...}

LOS LITERALES DE MATRIZ

Además de las más poderosas formas de trabajar con tipos de colección, 2010 de Visual Basic también proporciona algunas grandes mejoras para trabajar con matrices. Considere el siguiente código (que funciona bien en versiones anteriores):
Números de As Integer () = new Integer () {1, 2, 3, 4, 5}
Es obvio al observar los elementos de la matriz que cada uno es un número entero, por lo que tener que escribir realmente a cabo entero dos veces en esta línea no añade ningún valor. literales de matriz permiten la creación de una matriz poniendo todos sus elementos dentro de llaves , y luego tener el compilador infiere el tipo de forma automática:
Números de dim = {1, 2, 3, 4, 5}
El tipo de números no es objeto, sino más bien Integer () (siempre y cuando Option Infer está encendido), ya que el literal de matriz puede ahora mantenerse por sí misma y tiene su propio tipo. Consideremos un ejemplo más complicado:
Números de dim = {1, 2, 3, 4, 5.555}
En este caso, el tipo de números se infiere como doble (). El compilador determina el tipo de examen de cada elemento de la matriz y calcular el tipo dominante (utilizando el mismo algoritmo discutido anteriormente para inferir el tipo de retorno de una declaración lambda). ¿Qué sucede si no hay un tipo dominante, como en el siguiente código:
Números de dim = {1, 2, 3, 4, "5"}
En este caso, la conversión de un entero en una cadena sería una conversión de restricción (es decir, no habría posibilidad de pérdida de datos en tiempo de ejecución), y del mismo modo, la conversión de una cadena a un entero también sería una conversión de restricción. El único tipo de seguro es para recoger objetos () (y el compilador dará un error cuando Option Strict está encendido).
Los literales de matriz se pueden anidar en cualquier forma multi-dimensional arrays o matrices escalonadas:
'2 Matriz unidimensional
Dim matriz = {{1, 0}, {0, 1}} 

"Matriz escalonada - la evaluación de la fuerza entre paréntesis de la matriz interna primero
Dim irregular = {({1, 0}), ({0, 1})}

DYNAMIC LANGUAGE RUNTIME

Aunque técnicamente es un lenguaje estático en el fondo, Visual Basic siempre ha tenido las capacidades dinámicas muy potentes, como el enlace en tiempo. Visual Studio 2010 viene con una nueva plataforma llamada Dynamic Language Runtime (DLR), que hace que sea más fácil de construir y la comunicación entre los dinámicos idiomas. Visual Basic 2010 se ha actualizado para apoyar plenamente la DLR en su latebinder, permitiendo a los desarrolladores utilizar las bibliotecas y los marcos desarrollados en otros lenguajes como IronPython / IronRuby.
Lo bueno de esta función es que nada ha cambiado sintácticamente (de hecho, no una sola línea de código fue modificado en el compilador para admitir esta función). Los desarrolladores todavía puede hacer las operaciones en tiempo de ejecución de la misma manera que en las versiones anteriores de Visual Basic. Lo que ha cambiado es el código en el Visual Basic Runtime (Microsoft.VisualBasic.dll), que ahora reconoce la interfaz IDynamicMetaObjectProvider que el DLR ofrece. Si un objeto implementa esta interfaz, el tiempo de ejecución de Visual Basic se construirá un CallSite DLR y permitir que el objeto y el lenguaje proporciona para inyectar su propia semántica en la operación.
Por ejemplo, las bibliotecas estándar de Python contiene un archivo llamado random.py con un método llamado aleatoria que se puede utilizar para reorganizar al azar los elementos de una matriz. Llamar es simple:
Dim Python como ScriptRuntime Python.CreateRuntime = ()
Dim azar como objeto = python.UseFile ("random.py")

Artículos Dim = {1, 2, 3, 4, 5, 6, 7}
random.shuffle (artículos)
En tiempo de ejecución, Visual Basic considera que el objeto implementa IDynamicMetaObjectProvider y por lo tanto pasa el control a la DLR, que a su vez se comunica con Python y se ejecuta el método (que pasa a lo largo de la serie que se definió en Visual Basic como un argumento para el método).
Ese es un ejemplo de invocar una API DLR-enabled, pero también es posible que los desarrolladores crear sus propias API que utilizan esta característica. La clave es implementar la interfaz IDynamicMetaObjectProvider, en cuyo caso los compiladores de Visual Basic y C # se reconoce que el objeto tiene especial semántica dinámica. En lugar de implementar la interfaz de forma manual, es más fácil heredar de la clase System.Dynamic.DynamicObject (que ya se implementa esta interfaz) y acaba de superar un par de métodos. Figura 3 muestra un ejemplo completo de crear un objeto personalizado dinámico (una propiedad " bolsa "que aparece para crear propiedades sobre la marcha) y decir que es el uso normal de Visual enlace en tiempo de base. (Para más información sobre cómo trabajar con DynamicObject, ver el excelente artículo de Doug Rothaus 'en blogs.msdn.com/vbteam/archive/2010/01/20/fun-with-dynamic-objects-doug-rothaus.aspx .)
Figura 3 Creación de un objeto dinámico personalizado y llamándola con enlace en tiempo de Visual Básico
Las importaciones System.Dynamic
  Module Module1
    Sub Main ()
      Dim p como objeto PropertyBag = Nuevo
        p.One = 1
        p.Two = 2
        p.Three = 3
      Console.WriteLine (p.One)
      Console.WriteLine (p.Two)
      Console.WriteLine (p.Three)
    End Sub
      PropertyBag clase: Inherits DynamicObject
        Los valores privados como Nuevo Diccionario (Of String, Integer)
        Público está por sobre la función TrySetMember (
          ByVal cuaderno como SetMemberBinder,
          ByVal Value As Object) As Boolean
            valores (binder.Name) = valor
          Devolver True
        End Function
        Público está por sobre la función TryGetMember (
          ByVal cuaderno como GetMemberBinder,
          ByRef resultado As Object) As Boolean
          Volver values.TryGetValue (binder.Name, resultado)
        End Function
      Fin de la clase
  End Module

VARIANZA GENÉRICA

Esta es una característica que puede sonar muy complicado (con términos como covarianza y contravarianza) al principio, pero en realidad es bastante simple. Si usted tiene un objeto de tipo IEnumerable (de Apple) y desea asignar a un IEnumerable (de fruta), que debe ser legal, ya que cada manzana es una fruta (forzado por una relación de herencia). Desafortunadamente, antes de Visual Basic 2010, la variación genérica no fue apoyada en el compilador, a pesar de que en realidad fue apoyado en el Common Language Runtime (CLR).
Consideremos el ejemplo de la Figura 4 . En Visual Basic 2008, el código en la Figura 4 se generará un error de compilación (o si Option Strict está apagado, una excepción en tiempo de ejecución) en la línea Dim enabledonly. La solución fue llamar al método de extensión fundido, como se muestra aquí.:
"Manera antigua, el llamado a la Conversión de tipos (de control) ya no es necesario en VB 2010
    Dim enabledonly = FilterEnabledOnly (buttons.Cast (de control))
Esto ya no es necesario, porque en Visual Basic 2010, la interfaz IEnumerable se ha marcado como covariante usando el modificador de salida:
Interfaz IEnumerable (de los T)
  ...
Fin de interfaz
Figura 4 Ejemplo de variación genérica
Option Strict On
Clase pública Form1
  Sub Form1_Load () Handles MyBase.Load
    Botones As New List (Of Button) Desde
      {
        Nuevo botón con
        {
          . Nombre = "btnOk",
          . Enabled = true
        },
        Nuevo botón con
        {
          . Nombre = "btnCancel",
          . Enabled = False
        }
      }

    Dim enabledonly = FilterEnabledOnly (botones)
  End Sub
  Función FilterEnabledOnly (
    Controles de ByVal como IEnumerable (Of Control)
    ) Como IEnumerable (Of Control)
    Regreso de la c En los controles
    Donde c.Enabled = true
  End Function
Fin de la clase
Esto significa que el parámetro T genérico es ahora la variante (es decir, que trabaja para las relaciones de herencia) y el compilador se asegurará de que sólo se usa en las posiciones donde el tipo está saliendo de la interfaz. Los parámetros genéricos también pueden ser contravariante, lo que significa que es utilizado en la entrada de posiciones.Un tipo realmente puede tener ambas cosas. Por ejemplo, el delegado Func ha discutido anteriormente, tanto los parámetros contravariantes (las cosas que se pasan en) y un parámetro covariante (para el tipo de cambio):
Delegar la función Func (Of A T, Out R) (param ByVal como T) Como R
Puede utilizar la entrada y salida modificadores de sus interfaces personalizadas y de los delegados. . Muchas interfaces de uso común y delegados en el NET Framework 4 ya han sido marcados como variante, ejemplos comunes incluyen toda la acción / delegados Func, IEnumerable (Of T), IComparer (Of T) y IQueryable (Of T), entre otros.
Lo bueno de variación genérica es que es una característica que realmente no tiene que preocuparse, si es que está haciendo su trabajo, nunca lo notará. Situaciones que se utiliza para provocar los errores de compilación o que requieren una llamada. Cast (Of T) debería funcionar bien en Visual Basic 2010.

MEJORA DE LOS PARÁMETROS OPCIONALES

Los parámetros opcionales proporcionan una característica de la productividad de la mano que permite a los desarrolladores que los métodos más flexibles y evitar la contaminación de una clase con numerosas sobrecargas de un método. Una de las limitaciones en el pasado fue que los parámetros opcionales no puede ser anulable (o de hecho cualquiera que no sea intrínseca tipo de estructura). Visual Basic 2010 ahora le permite definir los parámetros opcionales de cualquier tipo de valor:
Sub displayorder (ByVal como cliente del cliente,
                 OrderID ByVal As Integer,
                 Unidades opcionales de ByVal como número entero? = 0,
                 Opcional backgroundColor ByVal As Color = Nothing)
End Sub
En este caso, las unidades es de tipo Nullable (Of Integer) y backgroundColor es un tipo de estructura no intrínseco, pero todavía se puede utilizar como parámetros opcionales. Visual Basic 2010 también ofrece mejor soporte para los parámetros opcionales que son de carácter genérico.

INSERTAR LA INTEROPERABILIDAD DE LOS TIPOS

Para las aplicaciones que realizan la interoperabilidad COM, un punto débil común es tener que trabajar con ensamblados de interoperabilidad primarios (PIA). Un PIA es un montaje. NET que sirve como un contenedor en tiempo de ejecución (RCW) sobre un componente COM y tiene un GUID único para identificarlo. . NET asambleas comunicarse con un PIA, que luego se lleva a cabo cualquier clasificación necesaria para mover datos entre COM y NET..
Desafortunadamente, la PIA puede complicar la implementación, ya que son archivos DLL adicionales que deben ser desplegados a las máquinas de los usuarios finales. También pueden causar problemas de control de versiones, por ejemplo, si quieres una aplicación para poder trabajar en contra de Excel 2003 y Excel 2007, que había necesidad de implementar tanto PIA con la aplicación.
La interoperabilidad de incrustar tipos de entidades incrusta directamente en la aplicación, pero sólo los tipos y miembros de la PIA que son absolutamente necesarias, eliminando así la necesidad de PIA que se desplegarán a las máquinas de los usuarios finales.
Para activar esta función de un proyecto existente (que ya está activado por defecto para las nuevas referencias), seleccione la referencia en el Explorador de soluciones y cambiar la interoperabilidad de incrustar tipos de opción en la ventana de propiedades (ver Figura 5 ). O, si la compilación con el compilador de línea de comandos, utilice el l / (o / link) en lugar de cambiar la r / y la referencia /.
imagen: Habilitación de la interoperabilidad de incrustar tipos de características en el Explorador de soluciones
Figura 5 Habilitación de la interoperabilidad de incrustar tipos de características en el Explorador de soluciones
Una vez que haya convertido a esta función, la aplicación ya no tiene una dependencia en el PIA. De hecho, si se abre el conjunto de reflector o ildasm, te darás cuenta de que en realidad no hay ninguna referencia al PIA en lo absoluto.

MULTI-TARGETING

La cosa más fresca sobre todas las características de Visual Basic es que 2010 incluso se puede utilizar en proyectos destinados a. NET Framework 2.0 a través de. NET Framework 3.5. Esto significa que la continuación de línea implícita, literales de matriz, inicializadores de colección, lambdas de instrucción, auto-propiedades implementadas y así sucesivamente todos los que trabajan en los proyectos existentes sin tener que redirigir a. NET Framework 4.
La única excepción es Incrustar tipos de interoperabilidad, que tiene una dependencia en los tipos que están sólo en el NET Framework 4,. Como resultado que no se puede utilizar cuando la orientación versiones NET Framework 2.0 a 3.5..Además, los tipos que están marcados como variante sólo se marcan de esa manera en el. NET Framework 4, por lo que en el ejemplo anterior, usted todavía tiene que llamar. Cast (Of T) al orientar las versiones 2.0 a 3.5. Puede, sin embargo, hacer su propia variante tipos (con la entrada / salida modificadores) al orientar las versiones anteriores.
Para cambiar el marco actual objetivo de una aplicación, haga doble clic en Mi proyecto, haga clic en la ficha Compilar, haga clic en Opciones de compilación avanzadas y seleccione de la lista desplegable en la parte inferior.
Cuando se compila desde la línea de comandos, en realidad hay ningún interruptor de línea de comandos para habilitar esta característica. En cambio, el compilador busca en el cual la Asamblea siempre que la definición de System.Object (por lo general mscorlib) y que marco la asamblea tiene como objetivo, a continuación, los sellos que el valor en el ensamblado de salida. (Este es el mismo mecanismo que el compilador utiliza en la construcción de conjuntos de Silverlight.) Cuando se utiliza el IDE, todo esto sucede de manera transparente, por lo que en general no es algo que hay que preocuparse.

¡PRUÉBELO

Como puede ver, Visual Basic 2010 tiene muchas características de gran alcance que le permiten ser más productivos al escribir menos líneas de código, la descarga más trabajo para el compilador. En este artículo, sólo he mirado las características del lenguaje, pero el IDE Visual Basic 2010 también tiene un montón de grandes mejoras. He aquí una lista parcial:
  • Para navegar
  • Las referencias de relieve
  • Generar a partir de Uso
  • Mejor IntelliSense (subcadena coincidente, el camello de los casos de consulta, sugerencia modo, útil para "primera prueba" estilos de desarrollo)
  • Soporte multi-monitor
  • Zoom
El equipo de Visual Basic le encantaría escuchar sus comentarios sobre lo que podemos hacer para que Visual Basic, incluso mejor, así que nos envíe sus comentarios y preguntas en Microsoft Connect. Para aprender más sobre el lenguaje y las características IDE, puedes ver los contenidos de msdn.com / vbasic , incluyendo los artículos, muestras y procedimientos ¿Tengo videos. Por supuesto, la mejor manera de aprender es por medio del buceo y el uso del producto, así que es hora de instalarlo y probarlo.
¿Quieres más de Visual Basic? Ya lo tienes. MSDN Magazine es la reanudación de la publicación mensual de la columna Instintos básicos, que se centra en el desarrollador de Visual Basic y otros temas relacionados, y está escrito por el equipo de Visual Basic de Microsoft.        


Fuente: Microsoft

No hay comentarios:

Publicar un comentario