Visual Basic .NET

Las 14 mejoras principales en Visual Basic 14

Lucian Wischik

Visual Basic 14 es la versión más reciente de Visual Basic y se enviará como parte de Visual Studio 2015. Esta versión ha sido reescrita desde cero en aproximadamente 1,3 millones de líneas de código VB, las versiones anteriores en realidad se escribieron en C++. El equipo aprovechó la reescritura para volver a plantear cada parte de VB desde el comienzo. Le pedí al equipo que seleccionara las 14 mejoras principales. Eligieron sus favoritas de forma general, en la experiencia de codificación, en los fundamentos del sistema del proyecto y en el lenguaje en sí mismo.

Mejor experiencia de codificación

1. Refactorizaciones “El simple hecho de que finalmente logremos refactorizar directamente dentro del producto es importantísimo” — MVP Jim Wooley de .NET.

Antes tenía que comprar complementos, simplemente para obtener las refactorizaciones fundamentales de Visual Basic, como extraer un método o incluir una variable temporal en línea. Había pocas refactorizaciones para C# y Microsoft se ha asociado con Developer Express para hacer que su complemento Refactor! esté disponible para los usuarios de Visual Basic a partir de Visual Studio 2005. Ahora las refactorizaciones están integradas en Visual Studio 2015. Para usarlas, haga clic en el identificador, o resalte una subexpresión. Luego, presione Ctrl+Punto, o haga clic con el botón secundario del ratón para elegir Acciones rápidas. Aparecerá un menú contextual de acciones relevantes con una bombilla, como se muestra en la Figura 1.

Visual Basic 14 ahora cuenta con refactorizaciones integradas
Figura 1 Visual Basic 14 ahora cuenta con refactorizaciones integradas

Tenga en cuenta que las refactorizaciones tienen en cuenta el contexto. Por ejemplo, si extrae el lado derecho de “Dim circleArea = Math.PI * radius * radius” y lo inserta al método, Visual Basic sugiere el nombre “GetCircleArea” para ese método. Lo coloca en modo de cambio de nombre en línea si desea volver a cambiar el nombre. Lo que resulta inteligente acerca de este cambio de nombre en línea es que puede detectar y advertirle acerca de conflictos de nombre si selecciona un nombre que ya está en uso, puede evitar conflictos siempre que sea posible, y funciona en toda la solución, incluso al cambiar nombres en proyectos de C#.

2. Analizadores “La característica es espectacular. Tengo tantas ideas acerca de cómo usar esta características....todas aquellas cosas pequeñas que ve en el código de la gente”. Esto se oyó de un MPV (Profesional más valioso) de Windows PowerShell.

Los analizadores son una forma de poner en sus manos esas bombillas, acciones de código y subrayados ondulados de error. Puede usarlos para hacer cumplir las directrices de codificación en su equipo. Si tiene prisa por depurar un problema, puede conectar un analizador que encuentre rápidamente defectos de código comunes en toda la solución. Muchas de las bibliotecas que usa pueden comenzar a “tener en cuenta el código” con sus propios analizadores integrados. Por ejemplo, supongamos que aún no ha utilizado la biblioteca de almacenamiento de Microsoft Azure o no ha leído los artículos sobre las prácticas más recomendadas. Dado que la biblioteca ahora viene con un analizador que detecta escollos comunes en el uso de sus API, puede confiar de inmediato en que la utilizará correctamente. Es como tener un revisor de código experto por encima de su hombro mientras escribe.

Puede agregar analizadores a su proyecto en los nuevos Referencias | nodo de Analizadores (o a través de NuGut). Una vez allí se vuelven parte de la compilación de su proyecto, se activan a medida que escribe para mostrar subrayados ondulados de errores. Se ejecutan cuando crea el proyecto en Visual Studio o en la línea de comando e incluso se ejecutará en servidores de compilación. Los analizadores tienen la oportunidad de “abrir” los aspectos internos del compilador para examinar los árboles de sintaxis del código fuente del proyecto y sus tipos y miembros. Los programadores se sorprenden gratamente al descubrir lo fácil que es codificar sus conocimientos expertos en el dominio en analizadores, gracias a estos árboles de sintaxis y tipos+miembros. Mi analizador favorito es uno que detecta dónde mi equipo ha estado usando métodos Async Sub que deberían haber sido Async Function...As Task y emite una advertencia. Esta es una parte difícil de la programación asíncrona que no demasiadas personas tienen en cuenta y lleva a errores de simultaneidad difíciles de detectar, por lo tanto es genial que el equipo ahora pueda detectar un error en el momento de la compilación. Para comenzar a escribir sus propios analizadores, vaya a roslyn.codeplex.com.

3. No es necesario que el cursor se mueva fuera de la línea “Ahora hacemos lo correcto.”—Dustin Campbell, Miembro del equipo de Visual Basic

Como usuario de VB, hace mucho tiempo que está acostumbrado a escribir cierto código, y luego bajar y subir rápidamente el cursor para ver si aparecen errores de subrayado ondulado. O a escribir código para solucionar un subrayado ondulado de error, pero luego debe bajar y subir el cursor para que el subrayado desaparezca.

Ahora no es necesario que haga todo eso. Simplemente deje el cursor donde está y los subrayados ondulados de error aparecerán y desaparecerán solos.

4. Referencias en comentarios de documento XML “Para los apasionados de los documentos, esto es un paso gigantesco en la dirección correcta.”— Sam Harvell, MVP de .NET

¿Es un apasionado de los comentarios de documentos XML? Este es un pequeño ejemplo:

''' <summary>
''' Similar to <see cref="List(Of Integer).Count"/>
''' </summary>
''' <param name="e">Thing to count</param>
''' <remarks></remarks>
Sub Count(e As IEnumerable)
End Sub

En las versiones anteriores de VB, cuando escribía cref and param-name en sus comentarios, accedía a la ayuda de lista de finalización, pero esa era toda la ayuda que tenía. El compilador hacía una validación mínima para comprobar que los nombres existieran, pero estaban escritos en gris y eran difíciles de encontrar, de buscar o de refactorizar.

Ahora, en Visual Basic 14, los argumentos cref and param-name están correctamente coloreados. Puede pararse con el cursor sobre ellos para ver información sobre las herramientas. Cuando hace una refactorización de cambio de nombre de símbolo (Ctrl+R, Ctrl+R), Visual Basic cambia los nombres de todas las referencias a un símbolo, incluidas las de cref and param-name. Puede hacer clic con el botón secundario del ratón en cualquier de ellos e Ira a la definición o Buscar todas las referencias. Si desea remitirse a un método que tenga varias cargas de trabajo, ahora puede hacer referencia sin ambigüedades a la carga de trabajo que desea. Todos estos cambios permiten escribir referencias en sus comentarios de documentos XML con mayor facilidad y hacerlo correctamente.

Fundamentos del sistema del proyecto

5. Nodo Referencias del Explorador de soluciones “Lo cierto es que todos debemos ajustar las referencias todos los días.”—Lucian Wischik, miembro del equipo de Visual Basic

La Figura 2 muestra cómo se ve un proyecto típico de Visual Basic 14 en el Explorador de soluciones.

El nodo de referencias ahora aparece en el Explorador de soluciones
Figura 2 El nodo de referencias ahora aparece en el Explorador de soluciones

Novedades en el nodo de referencias. Esto solía estar oculto y era necesario hacer clic en Mostrar todos los campos para verlo, pero eso también mostraba muchos archivos irrelevantes.

Este comportamiento previo podría haber tenido sentido 10 años atrás cuando se comenzaba un proyecto con Windows Forms y por lo general tenía el conjunto de referencias adecuado. Pero es una realidad del desarrollo moderno actual el hecho de que el nodo de referencias se usa con frecuencia, especialmente para administrar referencias de NuGet. Resulta práctico poder encontrarlo fácilmente en el Explorador de soluciones.

6. Proyectos compartidos “Esta es realmente una buena herramienta, mucho mejor que los archivos vinculados que hace que sea mucho más fácil trabajar con ellos”. — Morten Nielsen, MVP, programador de Windows

Supongamos que desea compartir un código entre dos o más proyectos. Esta es una situación bastante común, por ejemplo, al conservar ambas versiones de Windows Presentation Foundation (WPF) y de Windows Phone de una aplicación. El objetivo es siempre el mismo: maximizar la reutilización del código, entonces, por ejemplo, la corrección de un error que realice en un proyecto beneficiará automáticamente al otro proyecto.

En el pasado, se podía elegir entre dos técnicas: usar archivos vinculados para compartir código fuente en común, o rediseñar el código compartido en una Biblioteca de clases portable para compartir un binario en común. Ahora Visual Basic 14 permite una tercera técnica poderosa: Proyectos compartidos.

¿Por qué utilizaría Proyectos compartidos? La tarea de compartir código es profunda y desafiante y no ofrece una buena solución que se adapte a todo. Las Bibliotecas de clases portables son una solución limpia y buena, pero obligan a diseñar un código para que el código en común nunca invoque proyectos de WPF o de Phone; solo invoca API del sistema que están presentes tanto en WPF como en Phone. Los proyectos compartidos son más fáciles de usar porque no requieren este cambio de estructura.

Para configurar un proyecto compartido, haga clic con el botón secundario del ratón y seleccione Agregar | Nuevo proyecto | VB | Proyecto compartido. A continuación, haga clic con el botón secundario en el nodo de referencia de cada proyecto de a un por vez y seleccione Agregar | Proyectos compartidos. Un proyecto compartido es simplemente una colección de archivos fuente, archivos XML, imágenes y otros elementos que se incluirán en cada proyecto que haga referencia a él.

Para cada uno de sus proyectos, también puede configurar  Mi proyecto | Compilar | Opciones de compilación avanzadas | Constantes personalizadas con constantes personalizadas (por ejemplo, WPF y PHONE). Luego, en el código compartido, puede invocar las API específicas del proyecto, por ejemplo:

#If WPF Then
  ' nothing needed
#ElseIf PHONE Then
  ShowBatteryStatus()
#End If

7. Tiempos de compilación 50 por ciento más rápidos “50 por ciento no es ninguna broma.”—Sam Harwell, MVP de .NET

El compilador de Visual Basic solía escribirse en C++. En Visual Basic 14, el equipo lo ha escrito por completo en VB, que es muchísimo más rápido. Aquí presentamos dos comparaciones:

  • La compilación de una solución de gran tamaño (1,3 millones de líneas de código) pasó de tardar 68 segundos a 41.
  • La carga de una solución en frío (una aplicación de Windows Store) pasó de tardar 6,7 segundos a 4,6.

Eso es un ahorro de tiempo considerable. Es genial cuando puedes mantenerte concentrado en lugar de caminar sin rumbo en la demora entre "terminar la codificación" y "presionar F5 para encontrar un punto de interrupción".

El aumento del 50 por ciento en el rendimiento podría resultar sorprendente para las personas que creen que C++ es más rápido que VB. La verdad es que se obtienen beneficios en tiempo real en los algoritmos, las estructuras de datos y la simultaneidad. El aumento en el rendimiento a partir de la escritura en VB proviene de varias partes: la nueva forma de las estructuras de datos; el hecho de poder ser capaz de expresar algoritmos con mayor claridad y refactorizar de forma más segura; el uso de asincronía y de subprocesos; el uso de las herramientas de generación de perfiles de Visual Studio para descubrir puntos de asignación de memoria y CPU y el uso de analizadores para detectar simples trampas en el rendimiento de .NET al igual que boxing innecesario.

8. Expresiones Lambdas y LINQ en una ventana de visualización “¡Impresionante!”— Marco Senn-Haag, usuario de Visual Studio Uservoice

LINQ y lambdas son una excelente forma de resumir datos. Uno de los lugares donde esto se necesita es en el tiempo de depuración, en las ventanas inmediatas y de visualización. En el paso, cualquier uso de LINQ o lambdas aquí generaba un error:

Evaluation of lambda expressions is not valid in the debugger.

Ahora, como se puede ver en la Figura 3, ¡funciona! Por ejemplo, si se encuentra en un punto de interrupción donde tiene una colección llamada "clientes", puede leerla rápidamente si escribe esto en la ventana de visualización:

From c In customers Where c.OrderStatus = "Unfulfilled" Select c.LastName

Expresiones Lambdas y LINQ en la ventana de visualización
Figura 3 Expresiones Lambdas y LINQ en la ventana de visualización

¿Sabía que puede usar la ventana inmediata sin siquiera iniciar el programa? Por ejemplo, si acaba de escribir un módulo con una función GetName, puede abrir la ventana inmediata (Depurar | Windows | Inmediata) y escribir “? GetName()” y se lo evaluará.

Visual Studio 2015 también ofrecerá mayor compatibilidad para editar y continuar, como en los métodos asincrónico y de iterador, y también en situaciones más comunes como dentro de las consultas LINQ y las lambdas o en su proximidad, que incluso le permite agregar una expresión lambda o de consulta nueva a un método existente. Aunque esto no corresponde al anticipo de Visual Studio 2015, podrá hacer todo esto en la versión final.

9. Mejor lista de errores “El antes y el después son los verdaderos protagonistas.”— Anthony D. Green, miembro del equipo de Visual Basic

La lista de errores de Visual Basic 14 cuenta con muchas mejoras prácticas, algunas que responden a las viejas solicitudes de los usuarios (vea la Figura 4). Antes la lista de errores solía mostrar nombres de tipos completamente calificados; ahora solo muestra nombres de tipos mínimamente calificados para que le resulte más fácil leer el mensaje de error. Además, también muestra el código de error, lo que resulta práctico para ordenar por código de error. Lo que es aún mejor, el código de error es un hipervínculo a una búsqueda de Internet, que con frecuencia es más útil que un vínculo a una página de documentación MSDN. Además, puede filtrar cada columna en la lista de errores, de la misma manera que lo hace en Excel.

La lista de error en Visual Studio 2015 (abajo) es más legible y más versátil que en Visual Studio 2013 (arriba)
Figura 4 La lista de error en Visual Studio 2015 (abajo) es más legible y más versátil que en Visual Studio 2013 (arriba)

En ocasiones, al hacer grandes cambios, es fácil obtener una solución en un estado en el que hay mucho código descendente roto. En el pasado, VB mostraba solamente los primeros 101 errores. Esto dificultaba tener una idea de cuán extendida estaba la interrupción, o tener un panorama general de qué tipos de cambios debía hacer. Ahora, Visual Basic 14 muestra todos los errores sin límite. (Esto se puede configurar en Herramientas | Opciones | Editor de texto | Básico | Avanzado | Mostrar diagnóstico para archivos cerrados.)

Mejoras en el lenguaje

10. Operadores de propagación de valores Null “La necesidad constante de comprobar valores Null nos compete a todos, tanto en cuanto a productividad como en errores.”— Deborah Kurata, MVP de .NET

Supongamos que tiene una clase Customer y un campo Address que podría ser legítimamente nulo, quizás porque la aplicación no requiere que se escriban direcciones. Antes, cualquier código que debía hacer algo con la dirección (como mostrárselo al usuario) debía estar protegido con una comprobación de valor null para que esto se pudiera tener en cuenta. Estas comprobaciones de valores null se vuelven rápidamente tediosas. Con Visual Basic 14, puede manejar elegantemente la posibilidad de que un valor null como este use el nuevo operador ?.:

Console.WriteLine("{0} ({1})",
  customer.Name,
  customer.Address?.Country)

El operador ?. es simplemente la versión abreviada del común pero engorroso patrón de asignación de una variable temporal y de la posterior comprobación del valor null:

Dim _temp = customer.Address
Console.WriteLine("{0} ({1})",
  customer.Name,
  If(_temp Is Nothing, Nothing, _temp.Country))

Puede usar ?. en una secuencia y combinarlo con el operador de punto regular, por ejemplo un, a?.b.c?. Se lee de izquierda a derecha. Cualquier valor null que utilice ?. detendrá la secuencia y ofrecerá la respuesta Nothing y cualquier valor null que utilice . arrojará una NullReferenceException, como de costumbre.

El operador ?. es una versión condicional de null del operador . Existen versiones condicionales de null de casi todos los demás operadores también: indexing, array?(i); delegate invocation, delegate?(args); dictionary lookup, dict?!key; y XML axis properties, xml?.@attr, xml?.<key>, xml?...<key>.

Puede usar ?. de otras maneras prácticas, también:

If customer?.Age > 50 Then ...
' If branch taken only if customer is non-null AND is older than 50
Dim name = If(customer?.Name, "blank")
' Pick a default name if customer is null
Dim first = customers?.FirstOrDefault()
' Only invoke this method if customers is non-null

11. Literales de cadena de múltiples líneas “¿No es patético que me emocionen tanto los literales de cadena?”—Scaramouche, usuario del foro

Es así como lo utilizó para escribir cadenas de líneas múltiples, condimentadas con vbCrLfs:

Dim json = "{" & vbCrLf &
"  'Name': 'Bad Boys'," & vbCrLf &
"  'ReleaseDate': '1995-4-7T00:00:00'," & vbCrLf &
"  'Genres': ['Action','Comedy']" & vbCrLf &
"}"

Como es comprensible, se solicitaba con frecuencia permitir literales de cadena que comprendan varias líneas. Ahora, en Visual Basic 14, puede:

Dim json = "{
  'Name': 'Bad Boys',
  'ReleaseDate': '1995-4-7T00:00:00',
  'Genres': ['Action','Comedy']
}"

Una notable característica relacionada (y comúnmente solicitada) es que ahora se pueden incluir comentarios dentro de declaraciones de múltiples líneas. Antes, no estaban permitidos dentro de las expresiones LINQ como en el siguiente ejemplo:

Dim q = From x In y ' This is a from clause
        Where x < z ' And this is the where
        Select x    ' This select is redundant

12. Interpolación de cadena “La interpolación de cadena hace posible un código más simple y que se destaque el intento.”—Usuario de Channel9 Judah

La interpolación de cadena es una forma más simple de escribir cadenas con expresiones en ellas, como:

Dim s = $"hello {p.Name} you are {p.Height:0.00}m tall"

Esta es simplemente la versión abreviada de lo siguiente:

Dim s = String.Format("hello {0} you are {1:0.00}m tall", p.Name, p.Height)

La interpolación de cadena a menudo es más fácil de escribir que una llamada explícita a String.Format ya que le ahorra tener que jugar con los marcadores de posición posicionales {0} y {1}. Por supuesto, existen muchos colores y IntelliSense para las expresiones que se encuentran dentro de los huecos. La interpolación de cadena funciona particularmente bien con cadenas programáticas, como en estos ejemplos:

Dim fn = $"C:\Documents\{folder}\{file}.{ext}"
Dim url = $"http://{site}/{path}/{file}?search={query}"

Como es normal para String.Format, esto formatea la cadena con la referencia cultural. Si está construyendo una cadena programática que incluye un número de punto flotante, como cuando está pasando latitud y longitud a un servicio web, muy probablemente desee InvariantCulture en su lugar. Esto será compatible en Visual Studio 2015, pero por el momento el diseño no está terminado.

Tenga en cuenta que la interpolación de cadena aún no se encuentra en Visual Studio 2015 Preview, pero formará parte de Visual Studio 2015 antes de que finalice.

13. NameOf “Se me ocurre que esto será de gran ayuda en muchos escenarios.”—miembro del foro Roslyn ewwloyd

El operador NameOf es una mejor forma de incrustar literales de cadena en el código, cuando ese literal de cadena hace referencia a un nombre en el código fuente. Aquí se muestra un ejemplo:

Sub f(s As String)
  If s Is Nothing Then Throw New ArgumentNullException(NameOf(s))
End Sub

El operador NameOf no se evalúa en el momento de la ejecución: es una constante de tiempo de ejecución, en este caso la cadena constante “s”. El motivo para usar NameOf(s) es que lo protege contra errores tipográficos. Por ejemplo, si cambia el nombre de parámetro del método, entonces el nombre del argumento NameOf cambiará automáticamente. Eso no hubiese sucedido con un solo literal de cadena. Este es otro lugar donde NameOf funciona bien:

Private _age As Integer
Property Age As Integer
  Get
    Return _age
  End Get
  Set
    _age = Value
    RaiseEvent PropertyChanged(
      Me, New PropertyChangedEventArgs(NameOf(Age)))
  End Set
End Property

Tenga en cuenta que NameOf aún no se encuentra en Visual Studio 2015 Preview, pero formará parte de Visual Studio 2015 antes de que finalice.

14. Código abierto “Estamos tratando de comprometer a la comunidad. Hay muchas personas inteligentes aquí. Examinaremos las solicitudes de extracción de la comunidad de la misma manera que lo hacemos con nuestras propias ideas.”— Anders Hejlsberg arquitecto de C#/Visual Basic.

La mejora final no está en Visual Basic en sí mismo, pero está camino a funcionar con VB.

El código fuente del compilador de VB es ahora código abierto. Por lo tanto, se trata del proceso de diseño del lenguaje en sí mismo. Cada nueva propuesta de característica se deja a consideración del escrutinio público. Los miembros del equipo de diseño de lenguaje de Microsoft Visual Basic son esencialmente ahora auxiliares del lenguaje. El equipo examina las propuestas, las somete a una profunda consideración, se asegura de que no haya trampas o casos límite inesperados y determina si cumplen con las expectativa para incluirlas en el lenguaje. Las minutas de la reunión de diseño de lenguaje se publican abiertamente. Es verdaderamente emocionante formar parte del equipo de diseño de lenguaje de Visual Basic y una oportunidad increíble para ser usuario de VB.

Resumen

Visual Basic 14 cuenta con muchas mejoras. Este artículo ha cubierto casi la mitad de ellas. El tema principal ha sido hacer que la versión actual de VB funcione mejor y fácilmente, sin introducir conceptos nuevos y difíciles. Para obtener más información, consulte roslyn.codeplex.com y blogs.msdn.com/vbteam.

Este artículo hace referencia a las versiones de Visual Basic 14 y Visual Studio 2015 previas al lanzamiento. Toda la información está sujeta a cambios.


Lucian Wischik forma parte del equipo de diseño de lenguaje Visual Basic/C# de Microsoft, especialmente responsable de VB. Antes de unirse a Microsoft trabajó en los círculos académicos en la teoría de simultaneidad y asincronía. También es aficionado a la navegación y a la natación en distancias largas. Puede encontrarlo en lwischik@microsoft.com.

Gracias a los siguientes expertos técnicos de Microsoft por revisar este artículo: Dustin Campbell y Anthony D. Green
Dustin Campbell es un destacado administrador de programas del equipo de Visual Studio, donde trabaja en las experiencias de Visual Basic y C# IDE. Durante los últimos cinco años, se ha centrado en la reconstrucción de los compiladores de VB y C# y IDE como parte del Proyecto Roslyn.

Anthony D. Green es administrador de programas en el equipo VB/C#/F# de Microsoft, y ha estado rescribiendo los compiladores de VB y C# (en VB y C#). Anthony ha estado programando en lenguajes de programación BASIC desde los 14 años de edad, principalmente en QBasic y VB y ha sido un apasionado miembro de la comunidad de VB.NET desde 2004.