Visual Basic .NET

14 principais melhorias no Visual Basic 14

Lucian Wischik

O Visual Basic 14 é a mais nova versão do Visual Basic, e que será lançado como parte do Visual Studio 2015. Esta versão foi reescrita do zero em cerca de 1,3 milhões de linhas de versões de código VB - versões anteriores foram realmente escritas em C++. A equipe aproveitou a reescrita para repensar todas as partes do VB a partir do zero. Eu solicitei a equipe para escolher as suas 14 principais melhorias. Eles escolheram os seus favoritos a partir de toda a placa - na experiência em codificação, nos fundamentos do sistema de projetos e na própria linguagem.

Melhor experiência em codificação

1. Refatoração "Só o fato de que finalmente se obtém a criação de refatoração diretamente no produto é enorme."— Jim Wooley, .NET MVP

É usada para ser o que você tinha que comprar produtos de complemento apenas para obter refatorações essenciais para o Visual Basic, como extração de um método ou embutir uma variável temporária. Havia algumas refatorações para C# e a Microsoft tinha uma parceria com a Developer Express para tornar o seu suplemento Refactor! disponível para usuários do Visual Basic desde Visual Studio 2005. Agora as refatorações são construídas no Visual Studio 2015! Para usá-las, clique sobre um identificador, ou destaque uma sub-expressão. Em seguida, pressione Ctrl+Dot, ou clique com o botão direito do mouse e escolha Ações Rápidas. Isso traz um menu de contexto da lâmpada de ações relevantes, como mostrado na Figura 1.

Visual Basic 14 agora tem a refatoração embutida
Figura 1 Visual Basic 14 agora tem a refatoração embutida

Observe que as refatorações são sensíveis ao contexto. Por exemplo, se você extrair o lado direito de "Dim circleArea = Math.PI * radius * radius" em um método, o Visual Basic sugere o nome "GetCircleArea" para esse método. E isso coloca você em modo de renomear em linha se você quer mudar ainda mais o nome. O que é inteligente sobre esta renomeação em linha é que ele pode detectar e avisá-lo sobre conflitos de nomes se você escolher um nome que já está em uso, ele pode evitar confrontos, sempre que possível, e ele funciona em toda a sua solução, mesmo mudando nomes em projetos C #, também.

2. Analisadores "O recurso é espetacular. Tenho tantas idéias de como usar esse recurso ... todas as pequenas coisas que eu vejo no código das pessoas. "- Ouvido de um MVP do Windows PowerShell

Os analisadores são uma maneira de colocar essas lâmpadas, ações de código e rabiscos de erro em suas próprias mãos. Você pode usá-los para fazer cumprir diretrizes de codificação em toda a sua equipe. Se você está voando para depurar um problema, você pode conectar um analisador para encontrar rapidamente defeitos de código comuns em toda a solução. E muitas bibliotecas que você usa podem se tornar "código consciente" com seus próprios analisadores integrados. Por exemplo, suponha que você ainda não tenha usado a biblioteca do Microsoft Azure Storage ou não leu artigos sobre as práticas recomendadas. Como a biblioteca agora vem com um analisador que detecta armadilhas comuns no uso de seus APIs, você pode ficar imediatamente confiante de que você o está usando corretamente. É como ter um revisor do código de especialista sobre seus ombros enquanto digita.

Você pode adicionar analisadores ao seu projeto sob o novo nó de Referências | Analisadores, (ou via NuGet). Uma vez lá, eles se tornam parte da compilação do seu projeto - eles executam ao vivo enquanto você digita para mostrar rabiscos de erro ao vivo. Eles executam quando você cria seu projeto no Visual Studio ou na linha de comando, e executará até mesmo em servidores de compilação. Os analisadores obtém a chance de "abrir" as partes internas do compilador, olhar para as árvores de sintaxe de código-fonte do projeto e seus tipos e membros. Os desenvolvedores estão agradavelmente surpresos por descobrir como é fácil codificar o seu conhecimento de domínio especialista em analisadores, graças a essas árvores de sintaxe e tipos+membros. Meu analisador favorito é aquele que detecta onde meu grupo vem usando métodos Async Sub que deveriam ter sido Async Function ... As Task e emite um aviso. Este é um canto áspero de programação assíncrona que não basta as pessoas esarem cientes, e isso leva a erros de simultaneidade difícil de capturar, por isso é ótimo que minha equipe agora possa capturar o erro no tempo de compilação. Para começar a escrever seus próprios analisadores, vá para roslyn.codeplex.com.

3. Não há necessidade de cursor para fora da linha "Nós fazemos a coisa certa agora." - Dustin Campbell, Membro da equipe do Visual Basic

Como usuário VB, por muito tempo você esteve acostumado a digitar um código e, em seguida, fazer um rápido "cursor para cima e para baixo" para ver se algum rabisco de erro aparece. Ou você escreveria o código para corrigir um rabisco de erro, mas depois tem que fazer o "para cima e para baixo" para o rabisco desaparecer.

Agora você não tem que passar por tudo isso. Basta deixar o cursor onde ele está, e os rabiscos de erro aparecerão ou desaparecerão sozinhos.

4. Referências nos comentários do doc. XML "Para as pessoas apaixonadas por docs, este é um enorme passo na direção certa." - Sam Harwell, do .NET MVP.

Você é um apaixonado por comentários do doc. XML? Aqui está um pequeno exemplo:

''' <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

Nas versões anteriores do VB, quando você digitou cref e param-name em seus comentários, você obteve ajuda na lista completa, mas além disso você estava por conta própria. O compilador fez alguma validação mínima para verificar se os nomes existiram, mas eles foram formatados em cinza e não é fácil de encontrar, pesquisar ou refatorar.

Agora no Visual Basic 14 os argumentos cref e param-name são coloridos corretamente. Você pode passar o mouse sobre eles para ver as dicas. Quando você faz uma refatoração do símbolo de renomeação (Ctrl+R, Ctrl+R), o Visual Basic renomeia todas as referências a um símbolo, incluindo aquelas do cref e param-name. Você pode clicar com o botão direito do mouse em um deles e Ir para definição, ou Localizar todas as referências. Se você quiser se referir a um método que tem várias sobrecargas, agora você pode inequivocamente se referir à única sobrecarga que você quer. Essas mudanças tornam tudo mais fácil para digitar as referências nos seus comentários do doc. XML - e obtê-los corretamente.

Fundamentos do sistema do projeto

5. Nó de referência no Gerenciador de Soluções "O fato é que todos temos que ajustar as referências diariamente." - Lucian Wischik, membro da equipe do Visual Basic

A Figura 2 mostra como um típico projeto do Visual Basic 14 parece no Gerenciador de Soluções.

O Nó de Referência agora é mostrado no Gerenciador de Soluções
Figura 2 O Nó de Referência agora é mostrado no Gerenciador de Soluções

O que é novo é o nó de Referências. Isto costumava ser ocultado e você tinha que clicar em Mostrar todos os arquivos para vê-lo, mas que também mostrava muitos arquivos irrelevantes.

Este comportamento anterior pode ter feito sentido há 10 anos, quando você começava com um projeto Windows Forms e, em geral, tem o conjunto certo de referências. Mas é uma realidade do desenvolvimento moderno hoje em dia que o Nó de Referências é usado com frequência, especialmente para gerenciar as referências do NuGet. É uma conveniência pequena, mas útil para ser capaz de encontrá-lo facilmente no Gerenciador de Solução.

6. Projetos compartilhados "Isso é realmente apenas um bom ferramental na parte superior dos arquivos vinculados que os torna mais fáceis de se trabalhar." - Windows Developer MVP, Morten Nielsen

Suponha que você queira compartilhar o código entre dois ou mais projetos. É uma situação comum o suficiente, por exemplo, ao manter tanto as versões do Windows Presentation Foundation (WPF) como as versões do Windows Phone de um app. Minha meta é sempre a mesma: maximizar a reutilização de código, então por exemplo, uma correção de bug que você faz para um projeto beneficiará automaticamente o outro projeto.

No passado, você podia escolher entre duas técnicas: usar arquivos vinculados para compartilhar o código fonte comum, ou remodelar o seu código compartilhado em uma Biblioteca de Classes Portátil para compartilhar um binário comum. Agora o Visual Basic 14 permite uma terceira técnica poderosa: Projetos compartilhados.

Por que você usaria Projetos compartilhados? A tarefa de compartilhamento de código é profunda e desafiadora sem nenhuma solução "de tamanho único" boa. As Bibliotecas de Classe Portáteis são uma solução boa, limpa, mas o força a arquitetar seu código para que o código comum nunca chame os projetos WPF ou Phone; só chama nos APIs do sistema que estão presentes tanto no WPF como no Phone. Os projetos compartilhados são mais fáceis de usar, porque eles não exigem este arquitetamento novamente.

Para configurar um projeto compartilhado, clique com o botão direito do mouse sobre a sua solução e selecione Adicionar | Novo Projeto | VB | Projeto compartilhado. Em seguida, clique com o botão direito do mouse no nó de Referência de cada projeto, por sua vez e escolha Adicionar | Projetos compartilhados. Um projeto compartilhado é apenas uma coleção de arquivos de origem, arquivos XAML, imagens e outros ativos que serão incluídos em cada projeto que faz referência a ele.

Para cada um de seus projetos, você também pode configurar Meu Projeto | Compilar | Opções de Compilar Avançadas | Constantes personalizadas com constantes personalizados - WPF e TELEFONE, por exemplo. Em seguida, em seu código compartilhado, você pode chamar em APIs específicos do projeto como este:

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

7. 50% mais rápido de tempos de compilação "50% não é brincadeira."—.NET MVP, Sam Harwell

O compilador Visual Basic usado para ser escrito em C++. Para Visual Basic 14, a equipe reescreveu-o completamente em VB, o que o tornou consideravelmente mais rápido! Existem duas comparações:

  • Uma grande compilação de solução (1,3 milhões de linhas de código) passou de 68 segundos a 41 segundos.
  • Uma carga de solução fria (um app da Windows Store) passou de 6,7 segundos para 4,6 segundos

Isso é uma economia de tempo considerável. É ótimo quando sua mente pode permanecer na faixa ao invés de meandros no atraso entre "terminar de codificar" e "pressionar F5 para bater em um ponto de interrupção."

O aumento de desempenho de 50% pode vir como uma surpresa para as pessoas que pensam que o C++ é mais rápido do que o VB. A verdade é que algoritmos, estruturas de dados e simultaneidade são onde você obter os benefícios de velocidade real. O aumento de desempenho ao reescrever em VB vem de muitos lugares: repensar as estruturas de dados; ser capaz de expressar algoritmos de forma mais limpa e refatorar com mais segurança; usar o assíncrono e o threadpool; usar as ferramentas de perfil do Visual Studio para descobrir a CPU e os hotspots de alocação de memória; e usar os analisadores para detectar simples dicas de desempenho .NET como conversão boxing desnecessária.

8. Expressões Lambdas e LINQ em uma Janela Inspeção "Incrível!"— Marco Senn-Haag, Usuário do Uservoice do Visual Studio

O LINQ e o lambdas são uma ótima maneira de resumir dados. Um dos lugares que isto é mais necessário é no tempo de depuração, nas Janelas Ispeção e Imediata. No passado, o uso de qualquer LINQ ou lambdas aqui gerava um erro:

Evaluation of lambda expressions is not valid in the debugger.

Agora, conforme você vê na Figura 3, ele apenas funciona! Por exemplo, se você estiver em um ponto de interrupção, onde você tem uma coleção chamada "clientes", você pode obter uma leitura rápida sobre a coleção escrevendo isso na janela inspeção:

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

Expressões lambdas e LINQ na Janela Inspeção
Figura 3 Expressões lambdas e LINQ na Janela Inspeção

Sabia que você pode usar a Janela Imediata, mesmo sem o lançamento de seu programa? Por exemplo, se você acabou de escrever um módulo com uma função GetName, você pode abrir a Janela Imediata (Depuração | Windows | Imediato) e digite "? GetName()” e ele o avaliará.

O Visual Studio 2015 também terá um melhor suporte para editar e continuar como em métodos Assíncrono e Iterador, bem como em situações mais comuns, como no interior e ao redor de consultas LINQ e lambdas, mesmo permitindo que você adicione uma nova consulta ou expressão lambda a um método existente. Embora isso não faça no Visual Studio 2015 Preview, você será capaz de fazer tudo isso na versão final.

9. Melhor listas de erros "O antes e depois realmente contam uma grande história." — Membro da equipe do Visual Basic, Anthony D. Green

A lista de erros no Visual Basic 14 tem inúmeras melhorias práticas, aquelas que respondem solicitações do usuário de longa data (ver Figura 4). Antes, a lista de erros usada mostra nomes de tipo totalmente qualificados; agora, ele só mostra nomes de tipo minimamente qualificados para que você possa ler mais facilmente a mensagem de erro. E isso mostra o código de erro, assim como o que é útil para a classificação por código de erro. Ainda melhor, o código de erro é um hiperlink para uma pesquisa na Internet, muitas vezes mais útil do que um link para a página de documentação do MSDN. Além disso, você pode filtrar cada coluna na lista de erro, como você faz no Excel.

A lista de erros no Visual Studio 2015 (inferior) é mais legível e versátil do que no Visual Studio 2013 (superior)
Figura 4 A lista de erros no Visual Studio 2015 (inferior) é mais legível e versátil do que no Visual Studio 2013 (superior)

Às vezes, ao fazer grandes mudanças é fácil obter a sua solução em um estado onde um monte de código a jusante está quebrado. No passado, o VB mostraria apenas os primeiros 101 erros. Isso tornou difícil ter uma idéia de quão difundida a ruptura foi, ou obter uma visão geral de que tipos de mudanças você tem que fazer. Agora, o Visual Basic 14 mostra todos os erros, sem limite. (Isso pode ser configurado em Ferramentas | Opções | Editor de Texto | Básico | Avançado | Mostrar diagnósticos para arquivos fechados.)

Melhorias da linguagem

10. Operadores de propagação nula "A necessidade constante do nulo verifica os bites de todos tanto em produtividade como em bugs." — .NET MVP, Deborah Kurata

Suponha que você tenha uma classe Customer com um campo de endereço que pode legitimamente ser nulo, talvez porque o seu aplicativo não exige que os endereços sejam digitados. Anteriormente, qualquer código que precisava fazer alguma coisa com o endereço - como exibi-lo ao usuário - teria de ser salvaguardado com verificação nula para levar isso em conta. Essas verificações nulas rapidamente se tornam tediosas. Com o Visual Basic 14 você pode elegantemente lidar com a possibilidade de um nulo como este, usando o novo operador ?.:

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

O operador ?. é simplesmente uma abreviação para o padrão comum, mas complicado de atribuir a uma variável temporária e, em seguida, a verificação para nulo:

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

Você pode usar ?. em uma sequência e misturá-lo com o operador do ponto regular, a?.b.c?.d, por exemplo. Lê-se da esquerda para a direita. Qualquer valor nulo usado por ?. só vai parar a sequência curta e dar a resposta Nada, e qualquer valor nulo usado por . lançará um NullReferenceException como de costume.

O operador ?. é uma versão condicional nula do operador .. Há versões condicionais nulas da maioria dos outros operadores, bem como: indexação, matriz?(i); invocação delegada, delegada?(args); pesquisa em dicionário, dict?!key; e propriedades do eixo XML, xml?.@attr, xml?.<key>, xml?...<key>.

Você pode usar ?. de outras maneiras práticas, também:

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. Várias linhas de cadeias de caracteres literais "É triste que eu esteja tão animado para várias linhas de cadeias de caracteres literais?" — Forum User Scaramouche

É assim que você costumava escrever cadeias de caracteres de várias linhas, recheadas com vbCrLfs:

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

É compreensível que um pedido comum seja o de permitir que cadeias de caracteres literais abrangem várias linhas. Agora, no Visua Basic 14 você pode:

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

Um recurso notadamente relatado - e comumente solicitado - é que você pode, agora, colocar comentários dentro de declarações de várias linhas. Anteriormente, eles não eram autorizados a dentro de expressões LINQ como as seguinte:

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. Interpolação da Cadeia de caracteres "A interpolação da cadeia de caracteres torna o código muito mais simples, e faz com que a intenção saia." — User Judah, Canal 9

A interpolação da cadeia de caracteres é uma maneira mais fácil de escrever cadeias de caracteres com expressões nelas, assim:

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

Isto é simplesmente uma abreviação para o seguinte:

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

A interpolação da cadeia de caracteres é muitas vezes mais fácil de escrever do que uma chamada explícita para String.Format, pois economiza ter que fazer malabarismos nos espaços reservados posicionais {0} e {1}. E, claro, há colorização completa e IntelliSense para as expressões dentro dos furos. A interpolação da cadeia de caracteres funciona particularmente bem com cadeias de caracteres programáticas, como nestes exemplos:

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

Como é normal para String.Format, este formatação da cadeia de caracteres usa a cultura atual. Se você está criando uma sequência de programação que inclui um número de ponto flutuante, como quando você está passando latitude e longitude para um serviço Web, você provavelmente vai querer InvariantCulture no lugar. Este será suportado no Visual Studio 2015, mas até o momento o projeto ainda não foi resolvido.

Observe que a interpolação da cadeia de caracteres ainda não está no Visual Studio 2015 Preview, mas estará presente no Visual Studio 2015, antes do seu final.

13. NameOf "Esta será uma ajuda para tantos cenários quantos eu posso pensar." — Roslyn Forum Member ewwloyd

O operador NameOf é a melhor maneira de incorporar uma cadeia de caracteres literal no seu código, quando essa cadeia de caracteres literal se refere a um nome em seu código-fonte. Aqui está um exemplo:

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

O operador NameOf não é avaliado no tempo de execução: É um tempo de compilação constante, neste caso, a cadeia de caracteres contante "s". A razão para usar NameOf(s) é que ele protege você contra erros de digitação. Por exemplo, se você renomear o parâmetro do método, então o argumento NameOf será renomeado automaticamente. Isso não teria acontecido com apenas uma cadeia de caracteres literal. Aqui está um outro lugar onde NameOf funciona bem:

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

Observe que NameOf ainda não está no Visual Studio 2015 Preview, mas estará presente no Visual Studio 2015, antes do final.

14. Código aberto "Nós estamos tentando envolver a comunidade. Existe um monte de gente inteligente lá fora. Nós vamos olhar para as solicitações por pull da comunidade tal como fazemos com nossas próprias idéias." - Arquiteto do C#/Visual Basic, Anders Hejlsberg

A melhoria final não está no Visual Basic em si, mas no processo de trabalhar com VB.

O código-fonte do compilador VB agora é código aberto. Então, é o processo de criação da própria linguagem. Cada nova proposta de recurso é feita aberta, com a análise pública total. Os membros da equipe de projeto da linguagem do Microsoft Visual Basic são essencialmente agora administradores da linguagem. A equipe analisa propostas, considera-as profundamente, vê se há armadilhas inesperadas ou casos angulares, e determina se eles se encontram na barra para inclusão na linguagem. Os minutos de Reunião do Projeto de Linguagem são publicados abertamente. É realmente um momento emocionante para estar na Equipe de Design do Visual Basic Language, e um momento emocionante para ser um usuário do VB.

Conclusão

Existe uma série de melhorias no Visual Basic 14. Este artigo cobriu quase metade delas. O tema geral foi o de tornar o VB existente funcionando melhor em formas fáceis de usar, sem a introdução de novos conceitos difíceis. Para obter mais informações, verifique roslyn.codeplex.com e blogs.msdn.com/vbteam.

Este artigo refere-se ao pré-lançamento de versões do Visual Basic 14 e Visual Studio 2015. Todas as informações estão sujeitas a alterações.


Lucian Wischik está na equipe de projeto de linguagem do Visual Basic/C# na Microsoft, com especial responsabilidade pelo VB. Antes de entrar na Microsoft, ele trabalhou na academia sobre a teoria da concorrência e assíncronia. Ele é um grande marinheiro e nadador de longa distância. Entre em contato com ele pelo email lwischik@microsoft.com.

Agradecemos aos seguintes especialistas técnicos da Microsoft pela revisão deste artigo: Dustin Campbell e Anthony D. Green
Dustin Campbell é gerente de programa principal na equipe Visual Studio, onde trabalha nas experiências do Visual Basic e C# IDE. Nos últimos cinco anos, ele tem se focado em reconstruir os compiladores VB e C# e os IDEs como parte do Projeto Roslyn.

Anthony D. Green é um gerente de programa da equipe VB/C#/F# da Microsoft que estava reescrevendo os compiladores VB & C# (em VB e C#). Anthony vem programando em linguagens de programação BASIC desde os 14 anos, a maioria em QBasic e VB, e tem sido um membro apaixonado da comunidade VB.NET desde 2004.