Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Este artigo lista os nomes-chave das funcionalidades para cada versão do Visual Basic. Para descrições detalhadas das novas funcionalidades e melhoradas nas versões mais recentes da língua, consulte as secções ligadas.
Versão atual
Visual Basic 17.13 / Visual Studio 2026
Para novas funcionalidades, consulte Visual Basic 17.13.
Você pode baixar o SDK mais recente do .NET na página de downloads do .NET.
Versões anteriores
Visual Basic 17.0 / Visual Studio 2022
Para novas funcionalidades, consulte Visual Basic 17.0.
Visual Basic 16.9 / Visual Studio 2019 versão 16.9
Para obter novos recursos, consulte Visual Basic 16.9.
Visual Basic 16.0 / Visual Studio 2019 versão 16.0
Para obter novos recursos, consulte Visual Basic 16.0.
Visual Basic 15.5 / Visual Studio 2017 versão 15.5
Para obter novos recursos, consulte Visual Basic 15.5.
Visual Basic 15.3 / Visual Studio 2017 versão 15.3
Para obter novos recursos, consulte Visual Basic 15.3.
Visual Basic 15 / Visual Studio 2017
Para obter novos recursos, consulte Visual Basic 2017.
Visual Basic / Visual Studio 2015
Para obter novos recursos, consulte Visual Basic 14.
Visual Basic / Visual Studio 2013
Visualizações de tecnologia da plataforma de compilador .NET ("Roslyn")
Visual Basic / Visual Studio 2012
Async e await palavras-chave, iteradores, atributos de informações do chamador
Visual Basic, Visual Studio 2010
Propriedades implementadas automaticamente, inicializadores de coleção, continuação de linha implícita, variação co/contra dinâmica, genérica, acesso a namespace global
Visual Basic / Visual Studio 2008
Language Integrated Query (LINQ), literais XML, inferência de tipo local, inicializadores de objeto, tipos anônimos, métodos de extensão, inferência de tipo local var , expressões lambda, if operador, métodos parciais, tipos de valor nulo
Visual Basic / Visual Studio 2005
O My tipo e os tipos auxiliares (acesso ao aplicativo, computador, sistema de arquivos, rede)
Visual Basic / Visual Studio .NET 2003
Operadores de deslocamento de bits, declaração de variável de loop
Visual Basic / Visual Studio .NET 2002
A primeira versão do Visual Basic .NET
Visual Basic 17.13
O Visual Basic 17.13 reconhece a unmanaged restrição genérica. O Visual Basic 17.13 reconhece a System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute resolução do método.
Visual Basic 17.0
O Visual Basic 17.0 permite o System.Runtime.CompilerServices.CallerArgumentExpressionAttribute.
Visual Basic 16.9
Visual Basic 16.9 permite o consumo de propriedades somente init.
Visual Basic 16.0
O Visual Basic 16.0 foca-se em fornecer mais funcionalidades do Visual Basic Runtime (microsoft.visualbasic.dll) ao .NET Core. É a primeira versão do Visual Basic focada em .NET Core. O .NET Core 3.0 adiciona as partes do Runtime Visual Basic que dependem do Windows Forms.
Comentários permitidos em mais lugares dentro das instruções
No Visual Basic 15.5 e versões anteriores, só pode adicionar comentários em linhas em branco, no final de uma instrução ou em locais específicos dentro de uma instrução onde é permitida uma continuação implícita de linha. A partir do Visual Basic 16.0, também pode adicionar comentários após continuações explícitas de linhas e dentro de uma instrução numa linha que começa com um espaço seguido de um sublinhado.
Public Sub Main()
cmd.CommandText = ' Comment is allowed here without _
"SELECT * FROM Titles JOIN Publishers " _ ' This is a comment
& "ON Publishers.PubId = Titles.PubID " _
_ ' This is a comment on a line without code
& "WHERE Publishers.State = 'CA'"
End Sub
Conversão otimizada de ponto flutuante para inteiro
Em versões anteriores do Visual Basic, a conversão de valores Double e Single para inteiros oferecia um desempenho relativamente fraco. O Visual Basic 16.0 melhora significativamente o desempenho das conversões de ponto flutuante para inteiros quando se passa o valor devolvido por qualquer um dos seguintes métodos para uma das funções intrínsecas de conversão inteira do Visual Basic (CByte, CShort, CInt, CLng, CSByte, CUShort, CUInt e CULng), ou quando o valor devolvido por qualquer um dos métodos seguintes é implicitamente convertido num tipo integral e o Option Strict é definido para Off:
- Conversion.Fix(Double)
- Conversion.Fix(Object)
- Conversion.Fix(Single)
- Conversion.Int(Double)
- Conversion.Int(Object)
- Conversion.Int(Single)
- Math.Ceiling(Double)
- Math.Floor(Double)
- Math.Round(Double)
- Math.Truncate(Double)
Esta otimização permite que o código corra mais rapidamente — até duas vezes mais rápido para código que faz um grande número de conversões para tipos inteiros. O exemplo seguinte ilustra algumas chamadas de método simples que a otimização afeta:
Dim s As Single = 173.7619
Dim d As Double = s
Dim i1 As Integer = CInt(Fix(s)) ' Result: 173
Dim b1 As Byte = CByte(Int(d)) ' Result: 173
Dim s1 AS Short = CShort(Math.Truncate(s)) ' Result: 173
Dim i2 As Integer = CInt(Math.Ceiling(d)) ' Result: 174
Dim i3 As Integer = CInt(Math.Round(s)) ' Result: 174
Esta otimização trunca em vez de arredondar valores de ponto flutuante.
Visual Basic 15.5
Argumentos nomeados não à direita
No Visual Basic 15.3 e versões anteriores, quando uma chamada de método incluía argumentos tanto por posição como por nome, era necessário colocar argumentos posicionais antes dos argumentos nomeados. A partir do Visual Basic 15.5, podes misturar argumentos posicionais e nomeados em qualquer ordem, desde que todos os argumentos até ao último argumento posicional estejam na posição correta. Esta flexibilidade é particularmente útil quando argumentos nomeados tornam o seu código mais legível.
Por exemplo, a chamada de método a seguir tem dois argumentos posicionais entre um argumento nomeado. O argumento nomeado deixa claro que o valor 19 representa uma idade.
StudentInfo.Display("Mary", age:=19, #9/21/1998#)
Private Protected modificador de acesso de membro
Esta nova combinação de palavras-chave define um membro ao qual todos os membros da sua classe contida podem aceder, bem como tipos derivados da classe que contém, mas apenas se também forem encontrados no conjunto que contém. Como as estruturas não podem ser herdadas, só se pode aplicar Private Protected aos membros de uma classe.
Separador hex/binário/octal principal
Visual Basic 2017 adicionou suporte para o caractere de sublinhado (_) como um separador de dígitos. A partir do Visual Basic 15.5, você pode usar o caractere de sublinhado como um separador à esquerda entre o prefixo e dígitos hexadecimais, binários ou octais. O exemplo a seguir usa um separador de dígitos à esquerda para definir 3.271.948.384 como um número hexadecimal:
Dim number As Integer = &H_C305_F860
Para usar o caractere de sublinhado como um separador à esquerda, você deve adicionar o seguinte elemento ao seu arquivo de projeto do Visual Basic (*.vbproj):
<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>
Visual Basic 15.3
Quando atribui o valor dos elementos da tupla a partir de variáveis, o Visual Basic infere o nome dos elementos da tupla a partir dos respetivos nomes das variáveis. Não precisas de nomear explicitamente um elemento de tuplo. O exemplo seguinte usa inferência para criar um tupla com dois elementos nomeados: state e stateName.
Const state As String = "MI"
Const stateName As String = "Michigan"
Const capital As String = "Lansing"
Dim stateInfo = (state, stateName, capital)
Console.WriteLine($"{stateInfo.stateName}: 2-letter code: {stateInfo.State}, Capital {stateInfo.capital}")
' The example displays the following output:
' Michigan: 2-letter code: MI, Capital Lansing
Opções de compilador adicionais
O compilador de linha de comando do Visual Basic agora oferece suporte às opções de compilador -refout e -refonly para controlar a saída de assemblies de referência. Use -refout para definir o diretório de saída do conjunto de referência. Use -refonly para especificar que a compilação gera apenas uma montagem de referência.
Visual Basic 15
As tuplas são uma estrutura de dados leve que é mais comumente usada para devolver múltiplos valores de uma única chamada de método. Normalmente, para devolver múltiplos valores de um método, tem de fazer uma das seguintes opções:
Defina um tipo personalizado (a
Classou aStructure). Esta opção é uma solução robusta.Defina um ou mais
ByRefparâmetros, além de retornar um valor do método.
O suporte do Visual Basic para tuplas permite que você defina rapidamente uma tupla, opcionalmente atribua nomes semânticos aos seus valores e recupere rapidamente seus valores. O exemplo a seguir encapsula uma chamada para o TryParse método e retorna uma tupla.
Imports System.Globalization
Public Module NumericLibrary
Public Function ParseInteger(value As String) As (Success As Boolean, Number As Integer)
Dim number As Integer
Return (Integer.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, number), number)
End Function
End Module
Pode então chamar o método e gerir a tupla retornada com código, como no exemplo seguinte.
Dim numericString As String = "123,456"
Dim result = ParseInteger(numericString)
Console.WriteLine($"{If(result.Success, $"Success: {result.Number:N0}", "Failure")}")
Console.ReadLine()
' Output: Success: 123,456
Literais binários e separadores de dígitos
Você pode definir um literal binário usando o prefixo &B ou &b. Além disso, você pode usar o caractere sublinhado, _, como um separador de dígitos para melhorar a legibilidade. O exemplo a seguir usa ambos os recursos para atribuir um Byte valor e exibi-lo como um número decimal, hexadecimal e binário.
Dim value As Byte = &B0110_1110
Console.WriteLine($"{NameOf(value)} = {value} (hex: 0x{value:X2}) " +
$"(binary: {Convert.ToString(value, 2)})")
' The example displays the following output:
' value = 110 (hex: 0x6E) (binary: 1101110)
Para obter mais informações, consulte a seção "Atribuições literais" dos tipos de dados Byte, Integer, Long, Short, SByte, UInteger, ULong e UShort .
Suporte para valores de retorno de referência C#
C# suporta valores de retorno de referência. Ou seja, quando o método de chamada recebe um valor retornado por referência, ele pode alterar o valor da referência. O Visual Basic não permite criar métodos com valores de retorno de referência, mas permite consumir e modificar os valores de retorno de referência.
Por exemplo, a classe a seguir Sentence escrita em C# inclui um FindNext método que localiza a próxima palavra em uma frase que começa com uma substring especificada. A cadeia de caracteres é retornada como um valor de retorno de referência e uma Boolean variável passada por referência ao método indica se a pesquisa foi bem-sucedida. Isso significa que, além de ler o valor retornado, o chamador também pode modificá-lo, e essa modificação é refletida Sentence na classe.
using System;
public class Sentence
{
private string[] words;
private int currentSearchPointer;
public Sentence(string sentence)
{
words = sentence.Split(' ');
currentSearchPointer = -1;
}
public ref string FindNext(string startWithString, ref bool found)
{
for (int count = currentSearchPointer + 1; count < words.Length; count++)
{
if (words[count].StartsWith(startWithString))
{
currentSearchPointer = count;
found = true;
return ref words[currentSearchPointer];
}
}
currentSearchPointer = -1;
found = false;
return ref words[0];
}
public string GetSentence()
{
string stringToReturn = null;
foreach (var word in words)
stringToReturn += $"{word} ";
return stringToReturn.Trim();
}
}
Na sua forma mais simples, pode modificar a palavra encontrada na frase usando código como o exemplo seguinte. Note que não está a atribuir um valor ao método, mas sim à expressão que o método devolve, que é o valor de retorno de referência.
Dim sentence As New Sentence("A time to see the world is now.")
Dim found = False
sentence.FindNext("A", found) = "A good"
Console.WriteLine(sentence.GetSentence())
' The example displays the following output:
' A good time to see the world is now.
Um problema deste código, no entanto, é que, se não for encontrada uma correspondência, o método devolve a primeira palavra. Como o exemplo não examina o valor do Boolean argumento para determinar se uma correspondência foi encontrada, modifica a primeira palavra se não houver correspondência. O exemplo seguinte corrige este problema substituindo a primeira palavra por ele próprio se não houver correspondência.
Dim sentence As New Sentence("A time to see the world is now.")
Dim found = False
sentence.FindNext("A", found) = IIf(found, "A good", sentence.FindNext("B", found))
Console.WriteLine(sentence.GetSentence())
' The example displays the following output:
' A good time to see the world is now.
Uma solução melhor é usar um método auxiliar para o qual o valor de retorno de referência é passado por referência. O método auxiliar pode então modificar o argumento passado para ele por referência. O exemplo a seguir faz isso.
Module Example
Public Sub Main()
Dim sentence As New Sentence("A time to see the world is now.")
Dim found = False
Dim returns = RefHelper(sentence.FindNext("A", found), "A good", found)
Console.WriteLine(sentence.GetSentence())
End Sub
Private Function RefHelper(ByRef stringFound As String, replacement As String, success As Boolean) _
As (originalString As String, found As Boolean)
Dim originalString = stringFound
If found Then stringFound = replacement
Return (originalString, found)
End Function
End Module
' The example displays the following output:
' A good time to see the world is now.
Para obter mais informações, consulte Valores de retorno de referência.
Visual Basic 14
Você pode obter o nome da cadeia de caracteres não qualificada de um tipo ou membro para uso em uma mensagem de erro sem codificar uma cadeia de caracteres. Esta abordagem mantém o seu código correto ao refatorar. Esse recurso também é útil para conectar links MVC model-view-controller e disparar eventos alterados de propriedade.
Use expressões de interpolação de cadeias para construir cadeias. Uma expressão de cadeia de caracteres interpolada se parece com uma cadeia de caracteres de modelo que contém expressões. Uma cadeia de caracteres interpolada é mais fácil de entender em relação aos argumentos do que a Formatação Composta.
Acesso e indexação de membros condicionais nulos
Você pode testar para null de uma forma sintática muito leve antes de executar uma operação de acesso de membro (?.) ou índice (?[]). Esses operadores ajudam você a escrever menos código para lidar com verificações nulas, especialmente para descer em estruturas de dados. Se o operando esquerdo ou a referência de objeto for null, as operações retornarão null.
Literais de cadeia de caracteres de várias linhas
Os literais de cadeia de caracteres podem conter sequências de novas linhas. Já não precisas da velha solução alternativa de usar <xml><![CDATA[...text with newlines...]]></xml>.Value.
Comments
Você pode colocar comentários após continuações de linha implícitas, dentro de expressões do inicializador e entre termos de expressão LINQ.
Resolução de nomes mais inteligente e totalmente qualificada
Dado código como Threading.Thread.Sleep(1000), o Visual Basic antigamente procurava o namespace "Threading", descobria que era ambíguo entre System.Threading e System.Windows.Threading, e depois reportava um erro. O Visual Basic agora considera os dois namespaces possíveis juntos. Se você mostrar a lista de conclusão, o editor do Visual Studio lista membros de ambos os tipos na lista de conclusão.
Literais da primeira data do ano
Você pode ter literais de data no formato aaaa-mm-dd, #2015-03-17 16:10 PM#.
Propriedades da interface somente leitura
Pode implementar propriedades de interface de somente leitura usando uma propriedade de leitura e escrita. A interface garante funcionalidade mínima e não impede uma classe de implementação de permitir que a propriedade seja definida.
Para obter mais legibilidade do seu código, agora você pode usar TypeOf com IsNoto .
#Disable ID< de Aviso >e ID de Aviso <de #Enable>
Você pode desabilitar e habilitar avisos específicos para regiões dentro de um arquivo de origem.
Melhorias no comentário do documento XML
Ao escrever comentários de documentação, obtém-se um editor inteligente e suporte para validação de nomes de parâmetros, tratamento correto de crefs (por exemplo, genéricos e operadores), colorização e refatoração.
Definições parciais de módulo e interface
Além de classes e structs, você pode declarar módulos parciais e interfaces.
#Region diretivas no interior dos organismos de método
Você pode colocar delimitadores de região #Region...#End em qualquer lugar em um arquivo, dentro de funções e até mesmo abrangendo corpos de função.
As definições de substituições são implicitamente sobrecargas
Se você adicionar o Overrides modificador a uma definição, o compilador adicionará implicitamente Overloads para que você possa digitar menos código em casos comuns.
CObj permitido em argumentos de atributos
Agora podes usar argumentos de atributos CObj(...). Anteriormente, o compilador devolveu um erro indicando que não era uma constante.
Declarar e consumir métodos ambíguos de diferentes interfaces
Anteriormente, o seguinte código devolvia erros que o impediam de declarar IMock ou de chamar GetDetails (se estes métodos fossem declarados em C#):
Interface ICustomer
Sub GetDetails(x As Integer)
End Interface
Interface ITime
Sub GetDetails(x As String)
End Interface
Interface IMock : Inherits ICustomer, ITime
Overloads Sub GetDetails(x As Char)
End Interface
Interface IMock2 : Inherits ICustomer, ITime
End Interface
Agora, o compilador usa regras normais de resolução de sobrecarga para escolher o método mais apropriado GetDetails a chamar. Pode declarar relações de interface no Visual Basic como as mostradas no exemplo.