Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo lista os principais nomes de funções e recursos para cada versão do Visual Basic. Para obter descrições detalhadas dos recursos novos e aprimorados nas versões mais recentes do idioma, consulte as seções vinculadas.
Versão atual
Visual Basic 17.13 / Visual Studio 2026
Para obter novos recursos, consulte Visual Basic 17.13.
Você pode baixar o SDK do .NET mais recente na página de downloads do .NET.
Versões anteriores
Visual Basic 17.0 / Visual Studio 2022
Para obter novos recursos, consulte o 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 o Visual Basic 14.
Visual Basic/Visual Studio 2013
Visualizações de tecnologia da Plataforma do Compilador do .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 dinâmica, co/contra genérica, acesso ao namespace global
Visual Basic/Visual Studio 2008
LINQ (Consulta Integrada à Linguagem), 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 anulável
Visual Basic/Visual Studio 2005
Os My tipos de tipo e auxiliar (acesso ao aplicativo, computador, sistema de arquivos, rede)
Visual Basic/Visual Studio .NET 2003
Operadores de turno de bit, declaração de variável de loop
Visual Basic/Visual Studio .NET 2002
A primeira versão do .NET do Visual Basic
Visual Basic 17.13
O Visual Basic 17.13 reconhece a unmanaged restrição genérica. O Visual Basic 17.13 reconhece o System.Runtime.CompilerServices.OverloadResolutionPriorityAttribute para a resolução de método.
Visual Basic 17.0
O Visual Basic 17.0 habilita o System.Runtime.CompilerServices.CallerArgumentExpressionAttribute.
Visual Basic 16.9
O Visual Basic 16.9 permite o consumo de propriedades somente de inicialização.
Visual Basic 16.0
O Visual Basic 16.0 se concentra em fornecer mais recursos do Visual Basic Runtime (microsoft.visualbasic.dll) para o .NET Core. É a primeira versão do Visual Basic focada no .NET Core. O .NET Core 3.0 adiciona as partes do Runtime do Visual Basic que dependem do Windows Forms.
Comentários permitidos em mais locais dentro de instruções
No Visual Basic 15.5 e versões anteriores, você só pode adicionar comentários em linhas em branco, no final de uma instrução ou em locais específicos em uma instrução em que uma continuação de linha implícita é permitida. A partir do Visual Basic 16.0, você também pode adicionar comentários após continuações de linha explícitas e dentro de uma instrução em uma linha que começa com um espaço seguido por 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
Nas versões anteriores do Visual Basic, a conversão de valores Double e Single em inteiros oferecia um desempenho relativamente ruim. O Visual Basic 16.0 aprimora significativamente o desempenho de conversões de ponto flutuante em inteiros quando você passa o valor retornado por qualquer um dos métodos a seguir para uma das funções de conversão de inteiros intrínsecas do Visual Basic (CByte, CShort, CInt, CLng, CSByte, CUShort, CUInt e CULng) ou quando o valor retornado por qualquer um dos métodos a seguir é implicitamente convertido em um tipo integral e Option Strict é definido como 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)
Essa otimização permite que o código seja executado mais rápido, até duas vezes mais rápido para código que faz um grande número de conversões em tipos inteiros. O exemplo a seguir 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
Essa 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 por posição e por nome, você precisava colocar argumentos posicionais antes dos argumentos nomeados. A partir do Visual Basic 15.5, você pode misturar argumentos posicionais e nomeados em qualquer ordem, desde que todos os argumentos até o último argumento posicional estejam na posição correta. Essa flexibilidade é particularmente útil quando argumentos nomeados tornam 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
Essa nova combinação de palavras-chave define um membro que todos os membros em sua classe de contenção podem acessar, bem como tipos derivados da classe que contém, mas somente se eles também forem encontrados no assembly que contém. Como as estruturas não podem ser herdadas, você só pode aplicar Private Protected aos membros de uma classe.
Separador hex/binário/octal à esquerda
O Visual Basic 2017 adicionou suporte para o caractere de sublinhado (_) como um separador de dígito. A partir do Visual Basic 15.5, você pode usar o caractere de sublinhado como um separador à esquerda entre o prefixo e os dígitos hexadecimal, 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 arquivo do projeto do Visual Basic (*.vbproj):
<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>
Visual Basic 15.3
Quando você atribui os valores dos elementos da tupla a partir de variáveis, o Visual Basic deduz o nome dos elementos da tupla a partir dos nomes das variáveis correspondentes. Você não precisa nomear explicitamente um elemento de tupla. O exemplo a seguir usa inferência para criar uma 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
Comutadores de compilador adicionais
O compilador de linha de comando do Visual Basic agora dá suporte às opções do 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 assembly de referência. Use -refonly para especificar que a compilação gera apenas um assembly de referência.
Visual Basic 15
Tuplas são uma estrutura de dados leve, comumente usada para retornar vários valores de uma única chamada de método. Normalmente, para retornar vários valores de um método, você precisa executar uma das seguintes opções:
Definir um tipo personalizado (a
Classou aStructure). Essa opção é uma solução pesada.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
Em seguida, você pode chamar o método e manipular a tupla retornada com código como o exemplo a seguir.
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ígito
Você pode definir um literal binário usando o prefixo &B ou &b. Além disso, você pode usar o caractere de sublinhado, _como um separador de dígito para aprimorar 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 retornados de referência do C#
O C# dá suporte a valores retornados 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 retornados de referência, mas permite que você consuma e modifique 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 subcadeia de caracteres 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 na Sentence 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();
}
}
Em sua forma mais simples, você pode modificar a palavra encontrada na frase usando código como o exemplo a seguir. Observe que você não está atribuindo um valor ao método, mas sim à expressão retornada pelo método, que é o valor retornado 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 com esse código, no entanto, é que, se uma correspondência não for encontrada, o método retornará a primeira palavra. Como o exemplo não examina o valor do Boolean argumento para determinar se uma correspondência é encontrada, ele modifica a primeira palavra se não houver correspondência. O exemplo a seguir corrige esse problema substituindo a primeira palavra por si mesma 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 retornado de referência é passado por referência. O método auxiliar pode 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 de cadeia de caracteres não qualificada de um tipo ou membro para uso em uma mensagem de erro sem codificar uma cadeia de caracteres. Essa abordagem mantém seu código correto ao refatorar. Esse recurso também é útil para conectar links MVC de model-view-controller e disparar eventos alterados de propriedade.
Interpolação de cadeia de caracteres
Use expressões de interpolação de cadeia de caracteres para construir cadeias de caracteres. 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 à Formatação Composta.
Acesso e indexação de membro condicional nulo
Você pode testar nulo de forma sintactica 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 decrescente em estruturas de dados. Se a referência de objeto ou operando à esquerda for nula, as operações retornarão nulo.
Literais de cadeia de caracteres de várias linhas
Literais de cadeia de caracteres podem conter sequências de nova linha. Você não precisa mais da solução alternativa antiga 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 inicializadores e entre termos de expressão LINQ.
Resolução de nomes totalmente qualificada de forma mais inteligente
Dado o código, como Threading.Thread.Sleep(1000), o Visual Basic usava para pesquisar o namespace "Threading", descobria que ele era ambíguo entre System.Threading e System.Windows.Threading, e então relatava 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 listará membros de ambos os tipos na lista de conclusão.
Literais de data do primeiro ano
Você pode ter literais de data no formato yyyy-mm-dd. #2015-03-17 16:10 PM#
Propriedades da interface Readonly
Você pode implementar propriedades de interface readonly usando uma propriedade readwrite. A interface garante a funcionalidade mínima e não impede que uma classe de implementação permita que a propriedade seja definida.
Para obter mais legibilidade do código, agora você pode usar TypeOf com IsNot.
ID< de aviso >#Disable e ID de aviso <de #Enable>
Você pode desabilitar e habilitar avisos específicos para regiões dentro de um arquivo de origem.
Aprimoramentos de comentários do documento XML
Ao escrever comentários de documentos, você obtém suporte inteligente de editor e build para validar nomes de parâmetro, tratamento adequado de crefs (por exemplo, genéricos e operadores), coloração e refatoração.
Definições parciais de módulo e interface
Além de classes e structs, você pode declarar módulos e interfaces parciais.
#Region diretivas dentro de corpos de método
Você pode colocar #Region...#End delimitadores de região em qualquer lugar em um arquivo, dentro de funções e até mesmo abrangendo os corpos da função.
As definições de substituições são sobrecargas implícitas
Se você adicionar o Overrides modificador a uma definição, o compilador adicionará Overloads implicitamente para que você possa digitar menos código em casos comuns.
CObj permitido em argumentos de atributos
Agora você pode usar CObj(...) em argumentos de atributo. Anteriormente, o compilador retornava um erro dizendo que não era uma constante.
Declarando e consumindo métodos ambíguos de diferentes interfaces
Anteriormente, o código a seguir retornava erros que impediam você de declarar IMock ou de chamar GetDetails (se esses métodos foram 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 para chamar. Você pode declarar relações de interface no Visual Basic como as mostradas no exemplo.