Você está na página 1de 1706

Dê a sua opinião sobre a experiência de download do PDF.

Documentação do Visual Basic


O Visual Basic é uma linguagem de programação orientada a objeto desenvolvida pela
Microsoft. O uso do Visual Basic torna mais rápido e fácil criar aplicativos .NET com
segurança de tipo.

Introdução

a BAIXAR

Baixar o SDK do .NET

b COMEÇAR AGORA

Crie um aplicativo de console do .NET Core usando o Visual Studio

Criar uma biblioteca .NET Standard no Visual Studio

Passo a passo

Recursos adicionais

Conceitos básicos

e VISÃO GERAL

Conceitos de programação

h NOVIDADES

Novidades no Visual Basic

p CONCEITO

Estrutura de um aplicativo do Visual Basic

Funcionalidades da linguagem

Desenvolver aplicativos com o Visual Basic

Aplicativos do Windows Forms

b COMEÇAR AGORA

Vis al Basic no Q&A


Visual Basic no Q&A

Referência da linguagem

i REFERÊNCIA

Índice

Palavras-chave

Operadores

Tipos de dados

Funções de cadeia de caracteres

Especificação do idioma
Novidades do Visual Basic
Artigo • 15/02/2023 • 13 minutos para o fim da leitura

Este tópico lista os nomes dos principais recursos para cada versão do Visual Basic, com
descrições detalhadas das funcionalidades novas e aprimoradas nas versões mais
recentes da linguagem.

Versão atual
Visual Basic 16.9 / Visual Studio 2019 Versão 16.9

Para as novas funcionalidades, consulte Visual Basic 16.9.

Você pode baixar o SDK mais recente do .NET na página de downloads do .NET .

Versões anteriores
Visual Basic 16.0 / Visual Studio 2019 Versão 16.0

Para as novas funcionalidades, consulte Visual Basic 16.0.

Visual Basic 15.5 / Visual Studio 2017 Versão 15.5

Para as novas funcionalidades, consulte Visual Basic 15.5.

Visual Basic 15.3 / Visual Studio 2017 Versão 15.3

Para as novas funcionalidades, consulte Visual Basic 15.3.

Visual Basic 15/Visual Studio 2017

Para as novas funcionalidades, consulte Visual Basic 2017.

Visual Basic/Visual Studio 2015

Para as novas funcionalidades, consulte Visual Basic 14.

Visual Basic/Visual Studio 2013

Visualizações de tecnologia da Plataforma do Compilador .NET (“Roslyn”)

Visual Basic/Visual Studio 2012

palavras-chave Async e await , iteradores, atributos de informações do chamador

Visual Basic, Visual Studio 2010

Propriedades autoimplementadas, inicializadores de coleção, continuação de linha


implícita, covariância/contravariância genérica, acesso ao namespace global
Visual Basic/Visual Studio 2008

LINQ (consulta integrada à linguagem), literais XML, inferência de tipos de variável local,
inicializadores de objeto, tipos anônimos, métodos de extensão, inferência de tipos var
local, expressões lambda, operador if , métodos parciais, tipos de valor anulável

Visual Basic/Visual Studio 2005

O tipo My e tipos auxiliares (acesso ao aplicativo, computador, sistema de arquivos,


rede)

Visual Basic / Visual Studio .NET 2003

Operadores bit shift, declaração de variável de loop

Visual Basic / Visual Studio .NET 2002

A primeira versão do Visual Basic .NET

Visual Basic 16.9


O Visual Basic 16.9 permite o consumo de propriedades somente init.

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 e é a primeira versão do Visual Basic focada
no .NET Core. Muitas partes do Runtime do Visual Basic dependem do WinForms e elas
serão adicionadas em uma versão posterior do Visual Basic.

Comentários permitidos em mais lugares dentro de instruções

No Visual Basic 15.8 e versões anteriores, os comentários só são permitidos em linhas


em branco, no final de uma instrução ou em locais específicos dentro de uma instrução
em que uma continuação de linha implícita é permitida. A partir do Visual Basic 16.0, os
comentários também são permitidos após continuações de linha explícitas e dentro de
uma instrução em uma linha começando com um espaço seguido de um sublinhado.

VB

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

Ponto flutuante otimizado para a conversão de inteiro

Nas versões anteriores do Visual Basic, a conversão de valores Duplos e Únicos como
inteiros apresentava um desempenho relativamente baixo. O Visual Basic 15.8 melhora
significativamente o desempenho das conversões de ponto flutuante para inteiros
quando você passa o valor retornado por qualquer um dos seguintes métodos para
uma das funções de conversão de inteiros intrínsecas do Visual Basic (CByte, CShort,
CInt, CLng, CSByte, CUShort, CUInt, CULng) ou quando o valor retornado por qualquer
um dos métodos a seguir é implicitamente convertido em um tipo integral quando
Opção Strict está definida 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 rapidamente – até duas
vezes mais rápido para o código que faz um grande número de conversões para tipos
de inteiro. O exemplo a seguir ilustra algumas chamadas de método simples que são
afetadas por essa otimização:

VB

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

Observe que isso trunca em vez de arredondar os valores de ponto flutuante.

Visual Basic 15.5


Argumentos nomeados que não estejam à direita
No Visual Basic 15.3 e nas versões anteriores, quando uma chamada de método incluía
argumentos por posição e por nome, os argumentos posicionais tinham que preceder
os argumentos nomeados. A partir do Visual Basic 15.5 os argumentos posicionais e
nomeados podem aparecer em qualquer ordem, desde que todos os argumentos, até o
último argumento posicional, estejam na posição correta. Isso é especialmente útil
quando os argumentos nomeados são usados para tornar o código mais legível.

Por exemplo, a seguinte chamada de método tem dois argumentos posicionais entre
um argumento nomeado. O argumento nomeado deixa claro que o valor 19 representa
uma idade.

VB

StudentInfo.Display("Mary", age:=19, #9/21/1998#)

Private ProtectedModificador de acesso de membro

Essa nova combinação de palavra-chave definirá um membro que é acessível por todos
os membros em sua classe recipiente, bem como por tipos derivados da classe
recipiente, mas somente se eles também forem encontrados no assembly de contenção.
Como estruturas não podem ser herdadas, Private Protected só pode ser aplicado aos
membros de uma classe.

Separador hex/binário/octal à esquerda

O Visual Basic 2017 agora tem 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 separador à esquerda entre o prefixo e os dígitos binários,
hexadecimais ou octais. O exemplo a seguir usa um separador de dígito à esquerda para
definir 3.271.948.384 como um número hexadecimal:

VB

Dim number As Integer = &H_C305_F860

Para usar o caractere de sublinhado como separador à esquerda, você deve adicionar o
seguinte elemento ao arquivo de projeto do Visual Basic (*.vbproj):

XML

<PropertyGroup>

<LangVersion>15.5</LangVersion>

</PropertyGroup>

Visual Basic 15.3


Inferência de tupla nomeada

Quando você atribui o valor de elementos de tupla com base em variáveis, o Visual
Basic infere o nome dos elementos de tupla dos nomes de variável correspondentes;
não é necessário nomear explicitamente um elemento de tupla. O exemplo a seguir usa
a inferência para criar uma tupla com três elementos nomeados, state , stateName e
capital .

VB

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 adicionais do compilador

O compilador de linha de comando do Visual Basic agora é compatível com as opções


do compilador -refout e -refonly para controlar a saída de assemblies de referência. A -
refout define o diretório de saída do assembly de referência e a -refonly especifica que
somente um assembly de referência deve ser produzido pela compilação.

Visual Basic 15
Tuplas

As tuplas são uma estrutura de dados leve que é mais 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 realizar uma das seguintes ações:

Defina um tipo personalizado (uma Class ou Structure ). Esta é uma solução


pesada.

Definir um ou mais parâmetros ByRef , além de retornar um valor do método.

O suporte do Visual Basic para tuplas permite definir rapidamente uma tupla,
opcionalmente atribuir nomes semânticos para seus valores e recuperar rapidamente
seus valores. O exemplo a seguir encapsula uma chamada para o método TryParse e
retorna uma tupla.

VB

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

O chamador pode então chamar o método e manipular a tupla retornada com o código
semelhante ao seguinte.

VB

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 os 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ígitos para melhorar a
legibilidade. O exemplo a seguir usa as duas funcionalidades para atribuir um valor
Byte e exibi-lo como um número decimal, hexadecimal e binário.

VB

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 de literal" dos tipos de
dados Byte, Integer, Long, Short, SByte, UInteger, ULong e UShort.

Suporte para valores retornados por referência em C#


Começando com o C# 7.0, o C# é compatível com valores retornados de referência. Isto
é, 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 a criação de métodos com
valores retornados de referência, mas isso não permite o consumo e a modificação de
valores de retorno de referência.

Por exemplo, a classe Sentence a seguir escrita em C# inclui um método FindNext que
localiza a próxima palavra em uma sentença que começa com uma subcadeia de
caracteres especificada. A cadeia de caracteres é retornada como um valor retornado de
referência e uma variável Boolean passada pela referência para o 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.

C#

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
um código semelhante ao seguinte. Observe que você não está atribuindo um valor ao
método, mas para a expressão que o método retorna, que é o valor retornado de
referência.

VB

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 argumento Boolean para determinar se uma correspondência foi encontrada,
ele modificará a primeira palavra se não houver nenhuma correspondência. O exemplo
a seguir corrige isso substituindo a primeira palavra por ela mesma se não há nenhuma
correspondência.

VB

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.

VB

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 Reference return values (Valores retornados de
referência).

Visual Basic 14
NameOf

Você pode obter o nome da cadeia de caracteres não qualificada de um tipo ou de um


membro para uso em uma mensagem de erro sem realizar hard-coding de uma cadeia
de caracteres. Isso permite que seu código permaneça correto ao refatorar. Esse recurso
também é útil para conectar links MVC do tipo modelo-exibição-controlador e acionar
eventos de alteração de propriedade.

Interpolação de cadeia de caracteres

Você pode usar expressões de interpolação de cadeia de caracteres para construir


cadeias de caracteres. Uma expressão de cadeia de caracteres interpolada 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 a argumentos, do que a formatação
composta.

Acesso de membro nulo condicional e indexação

Você pode testar a nulidade de uma maneira sintática muito simples antes de executar
uma operação de acesso de membro ( ?. ) ou índice ( ?[] ). Esses operadores ajudam a
escrever menos código para lidar com verificações de nulidade, especialmente para
entrar em estruturas de dados. Se a referência de objeto ou o operando esquerdo for
nulo, as operações serão nulas.

Literais de cadeia multilinha


Literais de cadeia de caracteres podem conter sequências de nova linha. Você não
precisa da solução alternativa antiga de usar <xml><![CDATA[...text with
newlines...]]></xml>.Value

Comentários

É possível colocar comentários após continuações de linha implícitas em expressões


inicializadora e entre termos de expressão LINQ.

Resolução de nome totalmente qualificado mais inteligente

Dado um código como Threading.Thread.Sleep(1000) , o Visual Basic pesquisava o


namespace "Threading", descobria que ele era ambíguo entre System.Threading e
System.Windows.Threading e, então, relatava um erro. Agora, o Visual Basic considera
os dois namespaces possíveis juntos. Se você mostrar a lista de conclusão, o editor do
Visual Studio listará membros dos dois tipos na lista de conclusão.

Literais de data com o ano primeiro

Você pode ter literais de data no formato aaaa-mm-dd, #2015-03-17 16:10 PM# .

Propriedades de 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.

TypeOf <expr> IsNot <type>

Para facilitar a leitura do seu código, agora você pode usar TypeOf com IsNot .

#Disable Warning <ID> e #Enable Warning <ID>

É possível desabilitar e habilitar avisos específicos para regiões dentro de um arquivo de


origem.

Melhorias no comentário da documentação XML

Ao escrever comentários de documento, você obtém o editor inteligente e suporte de


build para validar nomes de parâmetro, tratamento adequado de crefs (genéricos,
operadores etc.), coloração e refatoração.

Definições de interfaces e módulos parciais

Além das classes e structs, você pode declarar interfaces e módulos parciais.
As diretivas #Region dentro de corpos de método

Você pode colocar delimitadores #Region...#End Region em qualquer lugar em um


arquivo, dentro de funções e até mesmo estendê-los por corpos de função.

Definições de substituição são implicitamente sobrecargas

Se você adicionar o modificador Overrides 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

O compilador apresentava um erro de que CObj(...) não era uma constante quando
usado em construções de atributo.

Declarando e consumindo métodos ambíguos de diferentes interfaces

Anteriormente, o código a seguir gerava erros que impediam você de declarar IMock ou
chamar GetDetails (se eles tivessem sido declarados em C#):

VB

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 usará regras de resolução de sobrecarga normais para escolher o


GetDetails mais apropriado a ser chamado e você pode declarar relações de interface
no Visual Basic, como aquelas mostradas no exemplo.

Confira também
Novidades no Visual Studio 2017
Novidades no Visual Studio 2019
Saiba mais sobre alterações
interruptivas no compilador de Visual
Basic
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

A equipe da Roslyn mantém uma lista de alterações interruptivas nos compiladores


do C# e do Visual Basic. Você pode encontrar informações sobre essas alterações nesses
links no repositório GitHub:

Alterações interruptivas no VS2019 Atualização 1 e posteriores em comparação


com o VS2019
Alterações interruptivas desde o VS2017 (VB 15)
Alterações interruptivas no Roslyn 3.0 (VS2019) do Roslyn 2.* (VS2017)
Alterações interruptivas no Roslyn 1.0 (VS2015) do compilador nativo C# (VS2013 e
anterior).
Membros de enumeração conflitantes
Introdução ao Visual Basic
Artigo • 15/02/2023 • 2 minutos para o fim da leitura

Esta seção da documentação ajuda você a começar o desenvolvimento de aplicativos do


Visual Basic.

Introdução ao Visual Basic e o .NET Core


Compilar um aplicativo “Olá, Mundo” em C# com o .NET Core no Visual Studio

Compilar uma biblioteca de classes .NET Standard no Visual Studio

Informações adicionais
O que há de novo no Visual Basic Lista os novos recursos em cada uma das
versões do Visual Basic .NET.

Recursos Adicionais para Programadores que Usam o Visual Basic Fornece uma
lista de sites e grupos de notícias que podem ajudá-lo a encontrar respostas para
problemas comuns.

Confira também
Obter o Visual Basic Fornece links de download para versões do Visual Studio que
incluem suporte ao Visual Basic e versões gratuitas.

Programação orientada a objetos Fornece links para páginas que apresentam a


programação orientada a objeto e descrevem como criar seus próprios objetos e
usar objetos para simplificar a codificação.

Exemplos Fornece links para código de exemplo no Visual Basic.

Instruções Fornece uma lista de páginas de Ajuda que demonstram aspectos da


linguagem do Visual Basic.

Opções de comentários para o Visual Studio Aborda como receber suporte e


fornecer comentários.

Visual Studio Fornece links para a documentação do Visual Studio.


C# Fornece links para a documentação sobre desenvolvimento de aplicativos com
o Visual C#.

Visual C++ Fornece links para a documentação do Visual C++.

Desenvolvimento do Office e do SharePoint Fornece informações sobre como usar


o Microsoft Office e o Visual Studio como parte de um aplicativo de negócios.
Recursos adicionais
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Os sites a seguir fornecem orientações e podem ajudar a encontrar respostas para


problemas comuns.

Recursos da Microsoft

Na Web

URL Descrição

Design de linguagem Visual Basic Repositório oficial no GitHub para design de linguagem
.NET Visual Basic .NET.

Blog da equipe do Microsoft Visual Fornece acesso ao blog da equipe do Visual Basic.
Basic

Exemplos de código

URL Descrição

Exemplos de documentação do Contém os exemplos usados na documentação do Visual


Visual Basic Basic e do .NET.

Navegador de exemplos Contém exemplos de código escritos no Visual Basic

Fóruns

URL Descrição

P e R da Microsoft Perguntas técnicas sobre a linguagem de programação do Visual Basic.

Vídeos e webcasts

URL Descrição

GitHub: .NET do Visual O repositório oficial para design de linguagem .NET do Visual
Basic Basic.
Suporte

URL Descrição

Suporte da Fornece acesso a artigos da Base de Dados de Conhecimento (KB), downloads e


Microsoft atualizações, webcasts de suporte e outros serviços.

Perguntas Permite arquivar bugs ou fornecer sugestões à Microsoft sobre o .NET e o Visual
sobre o Studio. Você também pode relatar um bug ao selecionar Ajuda>Enviar
Visual Comentários>Relatar um Problema no Visual Studio.
Studio

Recursos de terceiros
URL Descrição

VBForums Fornece um fórum para discussão de Visual Basic, .NET e muito mais.

vbCity Um site da comunidade para que pessoas aprendam e façam perguntas sobre
Visual Basic e .NET.

Stack O Stack Overflow é um site de perguntas e respostas para desenvolvedores.


Overflow

Tutlane O Tutlane fornece tutoriais para aprender o Visual Basic, C# etc.

Confira também
Introdução ao Visual Basic
Opções de comentários do Visual Studio
Desenvolvendo aplicativos com o Visual
Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Esta seção aborda documentação conceitual para a linguagem do Visual Basic.

Nesta seção
Programando no Visual Basic

Abrange uma variedade de assuntos de programação.

Desenvolvimento com My

Discute um novo recurso chamado My , que fornece acesso a informações e a instâncias


de objetos padrão que são relacionadas a um aplicativo e seu ambiente de tempo de
execução.

Acessando dados em aplicativos do Visual Basic

Contém ajuda para acessar os dados do Visual Basic.

Criando e usando componentes no Visual Basic

Define o termo componente e discute como e quando criar componentes.

Noções básicas de Aplicativo do Windows Forms

Fornece informações sobre como criar aplicativos do Windows Forms usando o Visual
Studio.

Personalizando projetos e estendendo My

Descreve como você pode personalizar modelos de projeto para fornecer mais objetos
My .

Seções relacionadas
Guia de programação do Visual Basic

Percorre os elementos essenciais de programação com o Visual Basic.

Referência da linguagem Visual Basic

Contém documentação de referência para a linguagem do Visual Basic.


Programando no Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Esta seção aborda tarefas de programação que você talvez queira saber mais sobre
como criar seu aplicativo Visual Basic.

Nesta seção
Acessando recursos de computador

Contém documentação sobre como usar o objeto My.Computer para acessar


informações sobre o computador no qual um aplicativo será executado e como
controlar o computador.

Registrando informações em log a partir do aplicativo

Contém documentação sobre como registrar informações de seu aplicativo usando os


objetos My.Application.Log e My.Log e como estender recursos de registro em log do
aplicativo.

Como acessar dados do usuário

Contém documentação sobre tarefas que você pode realizar usando o objeto My.User .

Como acessar formulários de aplicativo

Contém documentação sobre acesso a formulários do aplicativo usando os objetos


My.Forms e My.Application .

Como acessar serviços Web de aplicativo

Contém documentação sobre como acessar os serviços Web referenciados pelo


aplicativo usando o objeto My.WebServices .

Acessando configurações de aplicativo

Contém documentação sobre acesso a configurações do aplicativo usando o objeto


My.Settings .

Processando unidades, diretórios e arquivos

Contém documentação sobre como acessar o sistema de arquivos usando o objeto


My.Computer.FileSystem .

Confira também
Recursos da linguagem do Visual Basic
Conceitos de Programação
Coleções
Desenvolvendo aplicativos com o Visual Basic
Acessar recursos de computador (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O objeto My.Computer é um dos três objetos centrais em My , fornecendo acesso a


informações e a funcionalidades usadas com frequência. My.Computer fornece métodos,
propriedades e eventos para acessar o computador no qual o aplicativo é executado.
Seus objetos incluem:

Audio
Área de Transferência (ClipboardProxy)
Clock
FileSystem
Info
Keyboard
Mouse
Network
Ports
Registro (RegistryProxy)

Nesta seção
Executando sons

Lista tarefas associadas a My.Computer.Audio , como reproduzir um som em segundo


plano.

Armazenar dados e ler da área de transferência

Lista tarefas associadas a My.Computer.Clipboard , como leitura ou gravação de dados na


Área de Transferência.

Obter informações sobre o computador

Lista tarefas associadas a My.Computer.Info , como determinar o nome completo ou


endereços IP do computador.

Acessar o teclado

Lista tarefas associadas a My.Computer.Keyboard , como determinar se CAPS LOCK está


ativado.

Acessar o mouse

Lista tarefas associadas a My.Computer.Mouse , como determinar se um mouse está


presente.

Realizar operações de rede

Lista tarefas associadas a My.Computer.Network , como carregar ou baixar arquivos.

Acessar as portas do computador

Lista tarefas associadas a My.Computer.Ports , como mostrar as portas seriais disponíveis


ou enviar cadeias de caracteres a portas seriais.

Ler e gravar no Registro

Lista tarefas associadas a My.Computer.Registry , como leitura ou gravação de dados em


chaves do Registro.
Registrando informações em log a partir
do aplicativo (Visual Basic)
Artigo • 21/02/2023 • 2 minutos para o fim da leitura

Esta seção contém tópicos que abordam como registrar informações em log do
aplicativo usando os objetos My.Application.Log ou My.Log e como estender os
recursos de registro em log do aplicativo.

O objeto Log fornece métodos para gravar informações nos ouvintes de log do
aplicativo e a propriedade avançada TraceSource do objeto Log fornece informações
detalhadas de configuração. O objeto Log será configurado pelo arquivo de
configuração de aplicativo.

O objeto My.Log está disponível somente para aplicativos do ASP.NET. Para aplicativos
cliente, use My.Application.Log . Para obter mais informações, consulte Log.

Tarefas
Para Consulte

Gravar informações de evento em logs do aplicativo. Como: gravar mensagens de log

Gravar informações de exceção em logs do aplicativo. Como: registrar exceções em log

Gravar informações de rastreamento em logs do Como: registrar mensagens em log


aplicativo quando o aplicativo for inicializado e quando o aplicativo é iniciado ou
desligado. encerrado

Configure My.Application.Log para gravar Como: gravar informações de evento em


informações em um arquivo de texto. um arquivo de texto

Configure My.Application.Log para gravar Como: gravar em um Log de Eventos do


informações em um log de eventos. Aplicativo

Altere o local em que My.Application.Log grava as Passo a passo: alterar o local no qual
informações. My.Application.Log grava informações

Determine o local em que My.Application.Log grava Passo a passo: determinar o local no


as informações. qual My.Application.Log grava
informações

Crie um ouvinte de log personalizado para Passo a passo: criar ouvintes de log
My.Application.Log . personalizados
Para Consulte

Filtre a saída dos logs My.Application.Log . Passo a passo: filtrar a saída de


My.Application.Log

Confira também
Microsoft.VisualBasic.Logging.Log
Trabalhar com logs do aplicativo
Solução de problemas: ouvintes de log
Acessando dados do usuário (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Esta seção contém tópicos que lidam com o objeto My.User e com as tarefas que você
pode realizar com ele.

O objeto My.User fornece acesso a informações sobre o usuário conectado, retornando


um objeto que implementa a interface IPrincipal.

Tarefas
Para Consulte

Obter nome de logon do usuário Name

Obter nome de domínio do usuário, se o aplicativo usa a autenticação do CurrentPrincipal


Windows

Determinar a função do usuário IsInRole

Confira também
User
Acessando formulários de aplicativo
(Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O objeto My.Forms fornece uma maneira fácil de acessar uma instância de cada
Windows Form declarado no projeto do aplicativo. Você também pode usar as
propriedades do objeto My.Application para acessar a tela inicial e o formulário
principal do aplicativo e obter uma lista dos formulários abertos do aplicativo.

Tarefas
A tabela a seguir lista exemplos que mostram como acessar os formulários de um
aplicativo.

Para Consulte

Acessar um formulário de outro formulário em um aplicativo. Objeto


My.Forms

Exibir os títulos de todos os formulários abertos do aplicativo. OpenForms

Atualizar a tela inicial com informações de status conforme o aplicativo é SplashScreen


iniciado.

Confira também
OpenForms
SplashScreen
Objeto My.Forms
Acessando serviços Web do aplicativo
(Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O objeto My.WebServices fornece uma instância de cada serviço Web referenciado pelo
projeto atual. Cada instância é instanciada sob demanda. É possível acessar esses
serviços Web por meio das propriedades do objeto My.WebServices . O nome da
propriedade é igual ao nome do serviço Web acessado pela propriedade. Qualquer
classe que herda de SoapHttpClientProtocol é um serviço Web.

Tarefas
A tabela a seguir lista as possíveis maneiras de acessar serviços Web referenciados por
um aplicativo.

Para Consulte

Chamar um serviço Web Objeto My.WebServices

Chamar um serviço Web de forma assíncrona e manipular um Como: Chamar um serviço Web
evento quando ele for concluído de forma assíncrona

Confira também
Objeto My.WebServices
Como chamar um serviço Web de forma
assíncrona (Visual Basic)
Artigo • 21/02/2023 • 2 minutos para o fim da leitura

Este exemplo conecta um manipulador a um evento de manipulador assíncrono do


serviço Web, para que ele possa recuperar o resultado de uma chamada de método
assíncrono. Este exemplo usou o serviço Web DemoTemperatureService em
http://www.xmethods.net .

Quando você faz referência a um serviço Web em seu projeto no IDE (Ambiente de
Desenvolvimento Integrado) do Visual Studio, ele é adicionado ao objeto
My.WebServices , e o IDE gera uma classe proxy do cliente para acesso a um serviço Web

especificado

A classe proxy permite chamar os métodos de serviço Web de forma síncrona, em que
seu aplicativo aguarda até que a função seja concluída. Além disso, o proxy cria
membros adicionais para ajudar a chamar o método de forma assíncrona. Para cada
função de serviço Web, NameOfWebServiceFunction, o proxy cria uma sub-rotina
NameOfWebServiceFunction Async , um evento NameOfWebServiceFunction Completed e
uma classe NameOfWebServiceFunction CompletedEventArgs . Este exemplo demonstra
como usar os membros assíncronos para acessar a função getTemp do serviço Web
DemoTemperatureService.

7 Observação

Esse código não funciona em aplicativos Web, pois o ASP.NET não oferece suporte
ao objeto My.WebServices .

Chamar um serviço Web de forma assíncrona


1. Consulte o serviço Web DemoTemperatureService em http://www.xmethods.net . O
endereço é

HTTP

http://www.xmethods.net/sd/2001/DemoTemperatureService.wsdl

2. Adicione um manipulador de eventos ao evento getTempCompleted :


VB

Private Sub getTempCompletedHandler(ByVal sender As Object,

ByVal e As net.xmethods.www.getTempCompletedEventArgs)

MsgBox("Temperature: " & e.Result)

End Sub

7 Observação

Você não pode usar a instrução Handles para associar um manipulador de


eventos aos eventos do objeto My.WebServices .

3. Adicione um campo para acompanhar se o manipulador de eventos tiver sido


adicionado ao evento getTempCompleted :

VB

Private handlerAttached As Boolean = False

4. Adicione um método para adicionar ao manipulador de eventos ao evento


getTempCompleted , se necessário, e para chamar o método getTempAsync :

VB

Sub CallGetTempAsync(ByVal zipCode As Integer)

If Not handlerAttached Then

AddHandler My.WebServices.

TemperatureService.getTempCompleted,

AddressOf Me.TS_getTempCompleted

handlerAttached = True

End If

My.WebServices.TemperatureService.getTempAsync(zipCode)

End Sub

Para chamar o método Web getTemp de forma assíncrona, chame o método


CallGetTempAsync . Quando o método Web for concluído, seu valor retornado será

transmitido ao manipulador de eventos getTempCompletedHandler .

Confira também
Como acessar serviços Web de aplicativo
Objeto My.WebServices
Acessando configurações de aplicativo
(Visual Basic)
Artigo • 21/02/2023 • 2 minutos para o fim da leitura

Esta seção contém tópicos que descrevem o objeto My.Settings e as tarefas que ele
permite que você realize.

My.Settings
As propriedades do objeto My.Settings fornecem acesso às configurações do seu
aplicativo. Para adicionar ou remover configurações, use o painel Configurações do
Designer de Projeto.

Os métodos do objeto My.Settings permitem que você salve as configurações do


usuário atual ou reverta as configurações do usuário para os últimos valores salvos.

Tarefas
A tabela a seguir lista exemplos que mostram como acessar os formulários de um
aplicativo.

Para Consulte

Atualizar o valor de uma configuração de Como alterar configurações do usuário no Visual


usuário Basic

Exibir configurações de aplicativo e de usuário Como criar grades de propriedades para


em uma grade de propriedades configurações de usuário no Visual Basic

Salvar valores atualizados de configuração de Como persistir configurações de usuário no


usuário Visual Basic

Determinar os valores das configurações de Como ler configurações do aplicativo no Visual


usuário Basic

Confira também
Gerenciando configurações de aplicativo (.NET)
Objeto My.Settings
Processando unidades, diretórios e
arquivos (Visual Basic)
Artigo • 21/02/2023 • 2 minutos para o fim da leitura

Você pode usar o Visual Basic para processar unidades, pastas e arquivos com o objeto
My.Computer.FileSystem , que fornece um melhor desempenho e é mais fácil de usar que

os métodos tradicionais, como as funções FileOpen e Write (embora elas ainda estejam
disponíveis). As seções a seguir discutem esses métodos em detalhes.

Nesta seção
Access de arquivo com o Visual Basic

Discute como usar o objeto My.Computer.FileSystem para trabalhar com arquivos,


unidades e pastas.

Noções básicas de E/S de arquivo do .NET Framework e o sistema de arquivos (Visual


Basic)

Fornece uma visão geral dos conceitos de E/S de arquivo no .NET Framework, incluindo
fluxos, armazenamento isolado, eventos de arquivo, atributos de arquivo e acesso a
arquivos.

Passo a passo: manipular arquivos usando métodos do .NET Framework

Demonstra como usar o .NET Framework para manipular arquivos e pastas.

Instruções passo a passo: manipulando arquivos e diretórios no Visual Basic

Demonstra como usar o objeto My.Computer.FileSystem para manipular arquivos e


pastas.

Seções relacionadas
Estrutura do Programa e Convenções de Código

Fornece diretrizes para a estrutura física e a aparência dos programas.

FileSystem

Documentação de referência do objeto My.Computer.FileSystem e seus membros.


Desenvolvimento com My (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O Visual Basic apresenta novos recursos para o método RAD que aumentam a
produtividade, facilitam o uso e dão mais robustez. Um desses recursos, chamado My ,
oferece acesso a informações e a instâncias de objeto padrão relacionadas ao aplicativo
e ao seu ambiente de tempo de execução. Essas informações são organizadas em um
formato que pode ser descoberto por meio do IntelliSense e que é logicamente
delineado de acordo com o uso.

Os membros de alto nível do My são expostos como objetos. Cada objeto se comporta
de forma semelhante a um namespace ou uma classe com membros Shared e um
conjunto de membros relacionados são expostos.

Esta tabela mostra objetos My de nível superior e suas relações uns com os outros.

Nesta seção
Como executar tarefas com My.Application, My.Computer e My.User

Descreve os três objetos My centrais My.Application , My.Computer e My.User , que


fornecem acesso a informações e funcionalidade

Instâncias de objeto padrão fornecidas por My.Forms e My.WebServices

Descreve os objetos My.Forms e My.WebServices , que fornecem acesso a formulários,


fontes de dados e serviços Web XML usados por seu aplicativo.

Método RAD com My.Resources e My.Settings

Descreve os objetos My.Resources e My.Settings , que fornecem acesso a recursos e


configurações de um aplicativo.
Visão geral do modelo de aplicativo do Visual Basic

Descreve o modelo de inicialização/desligamento do aplicativo do Visual Basic.

Como My depende do tipo de projeto

Fornece detalhes sobre quais os recursos My que estão disponíveis em diferentes tipos
de projeto.

Confira também
ApplicationBase
Computer
User
Objeto My.Forms
Objeto My.WebServices
Como My depende do tipo de projeto
Executando tarefas com My.Application,
My.Computer e My.User (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os três objetos centrais My que fornecem acesso a informações e funcionalidades


usadas regularmente são My.Application (ApplicationBase), My.Computer (Computer) e
My.User (User). Você pode usar esses objetos para acessar informações relacionadas ao

aplicativo atual, ao computador no qual ele está instalado ou ao usuário atual do


aplicativo, respectivamente.

My.Application, My.Computer e My.User


Os exemplos a seguir demonstram como as informações podem ser recuperadas
usando My .

VB

' Displays a message box that shows the full command line for the

' application.

Dim args As String = ""

For Each arg As String In My.Application.CommandLineArgs

args &= arg & " "

Next

MsgBox(args)

VB

' Gets a list of subfolders in a folder

My.Computer.FileSystem.GetDirectories(

My.Computer.FileSystem.SpecialDirectories.MyDocuments, True, "*Logs*")

Além de recuperar informações, os membros expostos por meio desses três objetos
também permitem executar métodos relacionados àquele objeto. Por exemplo, você
pode acessar uma série de métodos para manipular arquivos ou atualizar o registro por
meio de My.Computer .

A E/S do arquivo é bem mais fácil e rápida com My , que inclui uma série de métodos e
propriedades para manipular arquivos, diretórios e unidades. O objeto TextFieldParser
permite que você leia arquivos estruturados grandes que tenham campos delimitados
ou de largura fixa. Este exemplo abre o TextFieldParser reader e o usa para ler
C:\TestFolder1\test1.txt .
VB

Dim reader =

My.Computer.FileSystem.OpenTextFieldParser("C:\TestFolder1\test1.txt")

reader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited

reader.Delimiters = New String() {","}

Dim currentRow As String()

While Not reader.EndOfData

Try

currentRow = reader.ReadFields()

Dim currentField As String

For Each currentField In currentRow

MsgBox(currentField)

Next

Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException

MsgBox("Line " & ex.Message &

"is not valid and will be skipped.")

End Try

End While

My.Application permite que você altere a cultura do aplicativo. O exemplo a seguir


demonstra como esse método pode ser chamado.

VB

' Changes the current culture for the application to Jamaican English.

My.Application.ChangeCulture("en-JM")

Confira também
ApplicationBase
Computer
User
Como My depende do tipo de projeto
Instâncias de objeto padrão fornecidas
por My.Forms e My.WebServices (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os objetos My.Forms e My.WebServices fornecem acesso a formulários, fontes de dados


e serviços Web XML usados por seu aplicativo. Eles fornecem acesso por meio de
coleções de instâncias padrão de cada um desses objetos.

Instâncias Padrão
Uma instância padrão é uma instância da classe fornecida pelo runtime e não precisa ser
declarada e instanciada com o uso das instruções Dim e New . O exemplo a seguir
demonstra como você pode ter declarado e instanciado uma instância de uma classe
Form chamada Form1 e como agora pode obter uma instância padrão dessa classe
Form por meio de My.Forms .

VB

' The old method of declaration and instantiation

Dim myForm As New Form1

myForm.show()

VB

' With My.Forms, you can directly call methods on the default

' instance()

My.Forms.Form1.Show()

O My.Forms objeto retorna uma coleção de instâncias padrão para cada classe Form
existente em seu projeto. Da mesma forma, My.WebServices fornece uma instância
padrão da classe proxy para cada serviço Web ao qual você criou uma referência em seu
aplicativo.

Confira também
Objeto My.Forms
Objeto My.WebServices
Como My depende do tipo de projeto
Desenvolvimento de aplicativo rápido
com My.Resources e My.Settings (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O objeto My.Resources fornece acesso aos recursos do aplicativo e permite que você
recupere dinamicamente recursos para o aplicativo.

Recuperando recursos
Vários recursos, como arquivos de áudio, ícones, imagens e cadeias de caracteres,
podem ser recuperados por meio do objeto My.Resources . Por exemplo, você pode
acessar os arquivos de recursos específicos da cultura do aplicativo. O exemplo a seguir
define o ícone do formulário como aquele nomeado Form1Icon armazenado no arquivo
de recurso do aplicativo.

VB

Sub SetFormIcon()

Me.Icon = My.Resources.Form1Icon

End Sub

O objeto My.Resources expõe apenas recursos globais. Ele não fornece acesso a
arquivos de recursos associados a formulários. Acesse no formulário os respectivos
recursos.

Da mesma forma, o objeto My.Settings fornece acesso às configurações do aplicativo e


permite armazenar e recuperar dinamicamente configurações de propriedade e outras
informações sobre o aplicativo. Para obter mais informações, confira My.Resources
Object e My.Settings Object.

Confira também
Objeto My.Resources
Objeto My.Settings
Acessando configurações de aplicativo
Visão geral do modelo de aplicativo do
Visual Basic
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Visual Basic fornece um modelo bem definido para controlar o comportamento de


aplicativos do Windows Forms: o modelo de aplicativo do Visual Basic. Esse modelo
inclui eventos para manipular a inicialização e o desligamento do aplicativo, bem como
eventos para capturar exceções sem tratamento. Ele também fornece suporte para o
desenvolvimento de aplicativos de instância única. O modelo de aplicativo é extensível,
portanto, os desenvolvedores que precisam de mais controle podem personalizar os
métodos substituíveis.

Usos para o modelo de aplicativo


Um aplicativo típico precisa executar tarefas ao iniciar e desligar. Por exemplo, quando é
inicializado, o aplicativo pode exibir uma tela inicial, fazer conexões de banco de dados,
carregar um estado salvo e assim por diante. Quando o aplicativo é desligado, ele pode
fechar conexões de banco de dados, salvar o estado atual e assim por diante. Além
disso, o aplicativo pode executar um código específico quando ele é encerrado de
maneira inesperada, como durante uma exceção sem tratamento.

O modelo de aplicativo do Visual Basic facilita a criação de um aplicativo de instância


única. Um aplicativo de instância única difere de um normal, pois apenas uma instância
do aplicativo pode ser executada por vez. Uma tentativa de iniciar outra instância de um
aplicativo de instância única resulta na notificação da instância original — por meio do
evento StartupNextInstance — de que outra tentativa de inicialização foi feita. A
notificação inclui os argumentos de linha de comando da instância subsequente. A
instância subsequente do aplicativo é fechada antes que qualquer inicialização possa
ocorrer.

Um aplicativo de instância única é iniciado e verifica se é a primeira instância ou uma


instância subsequente do aplicativo:

Se for a primeira instância, ela inicia normalmente.

Cada tentativa subsequente de iniciar o aplicativo, enquanto a primeira instância é


executada, resulta em um comportamento muito diferente. A tentativa
subsequente notifica a primeira instância sobre os argumentos de linha de
comando e sai imediatamente. A primeira instância manipula o evento
StartupNextInstance para determinar quais foram os argumentos de linha de

comando da instância subsequente e continua a ser executada.

Este diagrama mostra como uma instância subsequente sinaliza a primeira


instância:

Ao manipular o evento StartupNextInstance , você pode controlar como o aplicativo de


instância única se comporta. Por exemplo, o Microsoft Outlook normalmente é
executado como um aplicativo de instância única; quando o Outlook está em execução
e você tenta iniciar o Outlook novamente, o foco muda para a instância original, mas
outra instância não é aberta.

Eventos no Modelo de Aplicativo


Os seguintes eventos são encontrados no modelo de aplicativo:

Inicialização de aplicativos. O aplicativo aciona o evento Startup quando ele é


iniciado. Ao manipular esse evento, você pode adicionar código que inicializa o
aplicativo antes que o formulário principal seja carregado. O evento Startup
também prevê o cancelamento da execução do aplicativo durante essa fase do
processo de inicialização, se desejado.

Você pode configurar o aplicativo para mostrar uma tela inicial enquanto o código
de inicialização do aplicativo é executado. Por padrão, o modelo de aplicativo
suprime a tela inicial quando o argumento de linha de comando /nosplash ou -
nosplash é usado.

Aplicativos de instância única. O evento StartupNextInstance é gerado quando


uma instância subsequente de um aplicativo de instância única é iniciada. O
evento passa os argumentos de linha de comando da instância subsequente.

Exceções sem tratamento. Se o aplicativo encontrar uma exceção sem tratamento,


ele acionará o evento UnhandledException. O manipulador para esse evento pode
examinar a exceção e determinar se deve continuá-la.

O evento UnhandledException não é gerado em algumas circunstâncias. Para obter


mais informações, consulte UnhandledException.
Alterações de conectividade de rede. Se a disponibilidade de rede do computador
for alterada, o aplicativo aciona o evento NetworkAvailabilityChanged.

O evento NetworkAvailabilityChanged não é gerado em algumas circunstâncias.


Para obter mais informações, consulte NetworkAvailabilityChanged.

Aplicativo desligado. O aplicativo fornece o evento Shutdown para sinalizar


quando está prestes a ser desligado. Nesse manipulador de eventos, você pode
garantir que as operações que o aplicativo precisa executar — fechar e salvar, por
exemplo — sejam concluídas. Você pode configurar o aplicativo para desligar
quando o formulário principal for fechado ou para desligar apenas quando todos
os formulários fecharem.

Disponibilidade
Por padrão, o modelo de aplicativo do Visual Basic está disponível para projetos do
Windows Forms. Se você configurar o aplicativo para usar um objeto de inicialização
diferente ou iniciar o código do aplicativo com um Sub Main personalizado, talvez esse
objeto ou classe precise fornecer uma implementação da classe
WindowsFormsApplicationBase para usar o modelo de aplicativo. Para obter
informações sobre como alterar o objeto de inicialização, confira Página do aplicativo,
Designer de projeto (Visual Basic).

Confira também
WindowsFormsApplicationBase
Startup
StartupNextInstance
UnhandledException
Shutdown
NetworkAvailabilityChanged
WindowsFormsApplicationBase
Estendendo o modelo de aplicativo do Visual Basic
Como My depende do tipo de projeto
(Visual Basic)
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

My expõe somente os objetos exigidos por um tipo de projeto específico. Por exemplo, o
objeto My.Forms está disponível em um aplicativo do Windows Forms, mas não está
disponível em um aplicativo de console. Esse tópico descreve quais objetos My estão
disponíveis em diferentes tipos de projeto.

My em aplicativos e sites do Windows


My expõe somente objetos que são úteis no tipo de projeto atual; suprime objetos que não
são aplicáveis. Por exemplo, a imagem a seguir mostra o modelo de objeto My em um
projeto do Windows Forms.

Em um projeto de site, o My expõe objetos relevantes para um desenvolvedor da Web


(como os objetos My.Request e My.Response ) ao suprimir objetos que não são relevantes
(como o objeto My.Forms ). A imagem a seguir mostra o modelo de objeto My em um
projeto de site da Web:
Detalhes do projeto
A tabela a seguir mostra quais objetos My são habilitados por padrão para oito tipos de
projeto: aplicativo do Windows, biblioteca de classes, aplicativo de console, biblioteca de
controle do Windows, biblioteca de controle da Web, serviço do Windows, vazio e site.

Há três versões do objeto My.Application , duas versões do objeto My.Computer e duas


versões do objeto My.User ; detalhes sobre essas versões são fornecidos nas notas de rodapé
após a tabela.

Meu objeto Aplicativo Biblioteca Aplicativo Biblioteca Biblioteca Serviço Vazio Site
do de do de de Windows
Windows Classes Console Controle Controles
do da Web
Windows

My.Application Sim1 Sim2 Sim3 Sim2 No Sim3 Não No

My.Computer Sim4 Sim4 Sim4 Sim4 Sim5 Sim4 No Sim5

My.Forms Sim Não Não Sim Não No No No

My.Log No No No No No Não Não Sim

My.Request Não No Não Não Não Não Não Sim

My.Resources Sim Sim Sim Sim Sim Sim Não Não

My.Response Não Não Não Não Não Não Não Sim

My.Settings Sim Sim Sim Sim Sim Sim Não Não

My.User Sim6 Sim6 Sim6 Sim6 Sim7 Sim6 No Sim7


Meu objeto Aplicativo Biblioteca Aplicativo Biblioteca Biblioteca Serviço Vazio Site
do de do de de Windows
Windows Classes Console Controle Controles
do da Web
Windows

My.WebServices Sim Sim Sim Sim Sim Sim Não No

1 Versão do Windows Forms de My.Application . Deriva da versão do console (confira a


Observação 3); adiciona suporte para interagir com as janelas do aplicativo e fornece o
modelo de aplicativo do Visual Basic.

2 Versão da biblioteca de My.Application . Fornece a funcionalidade básica de que aplicativo


precisa: fornece membros para gravar no log do aplicativo e acessar informações do
aplicativo.

3 Versão do console de My.Application . Deriva da versão da biblioteca (confira a Observação


2) e inclui membros adicionais para acessar os argumentos de linha de comando do
aplicativo e as informações de implantação do ClickOnce.

4 Versão do Windows de My.Computer . Deriva da versão do Servidor (confira a Observação 5)


e fornece acesso a objetos úteis em um computador cliente, como teclado, tela e mouse.

5 Versão do servidor de My.Computer . Fornece informações básicas sobre o computador,


como o nome, o acesso ao relógio e assim por diante.

6 Versão do Windows de My.User . Esse objeto está associado à identidade atual do thread.

7
Versão da Web de My.User . Esse objeto está associado à identidade do usuário da
solicitação HTTP atual do aplicativo.

Confira também
ApplicationBase
Computer
Log
User
Como personalizar quais objetos estão disponíveis em My
Compilação Condicional
-define (Visual Basic)
Objeto My.Forms
Objeto My.Request
Objeto My.Response
Objeto My.WebServices
Acessando dados em aplicativos do
Visual Basic
Artigo • 21/02/2023 • 2 minutos para o fim da leitura

O Visual Basic inclui vários novos recursos para ajudar no desenvolvimento de


aplicativos que acessam dados. Formulários de associação de dados para aplicativos do
Windows são criados arrastando itens da janela Fontes de Dados para um formulário.
Associe controles a dados arrastando itens da janela Fontes de Dados para os controles
existentes.

Seções relacionadas
Acesso a dados no Visual Studio

Fornece links para páginas que discutem a incorporação da funcionalidade de acesso a


dados aos seus aplicativos.

Ferramentas de dados do Visual Studio para .NET

Fornece links para páginas sobre como usar o Visual Studio para criar aplicativos que
funcionam com dados.

LINQ

Fornece links para tópicos que descrevem como usar LINQ com Visual Basic.

LINQ to SQL

Fornece informações sobre o LINQ to SQL. Inclui exemplos de programação.

Ferramentas LINQ to SQL no Visual Studio

Fornece links para tópicos sobre como criar um modelo de objeto LINQ to SQL em
aplicativos.

Trabalhar com conjuntos de dados em aplicativos de n camadas

Fornece links para tópicos sobre como criar aplicativos de dados multicamadas.

Adicionar novas conexões

Fornece links para páginas sobre como usar o Visual Studio para conectar o aplicativo a
dados com ferramentas de tempo de design e objetos de conexão ADO.NET.

Ferramentas de conjunto de dados no Visual Studio

Fornece links para páginas que descrevem como carregar dados em conjuntos de dados
e como executar instruções SQL e procedimentos armazenados.
Associar controles a dados no Visual Studio

Fornece links para páginas que explicam como exibir dados no Windows Forms através
de controles associados a dados.

Editar dados em conjuntos de dados

Fornece links para páginas que descrevem como manipular os dados nas tabelas de
dados de um conjunto de dados.

Validar dados em conjuntos de dados

Fornece links para páginas que descrevem como adicionar validação a um conjunto de
dados durante alterações de coluna e linha.

Salvar dados novamente no banco de dados

Fornece links para páginas que explicam como enviar dados atualizados de um
aplicativo para o banco de dados.

ADO.NET

Descreve as classes ADO.NET, que expõem serviços de acesso a dados ao programador


do .NET Framework.

Dados em soluções do Office

Contém links para páginas que explicam como os dados funcionam em soluções do
Office, incluindo informações sobre programação orientada a esquemas, cache de
dados e acesso a dados no lado do servidor.
Criando e usando componentes no
Visual Basic
Artigo • 21/02/2023 • 2 minutos para o fim da leitura

Um componente é uma classe que implementa a interface


System.ComponentModel.IComponent ou que deriva direta ou indiretamente de uma
classe que implementa IComponent. Um componente .NET é um objeto reutilizável,
pode interagir com outros objetos e fornece controle sobre recursos externos e suporte
ao tempo de design.

Um recurso importante dos componentes é que eles são projetáveis, o que significa que
uma classe que é um componente pode ser usada no ambiente de desenvolvimento
integrado do Visual Studio. Um componente pode ser adicionado à Caixa de
Ferramentas, arrastado e solto em um formulário e manipulado em uma superfície de
design. O suporte ao tempo de design de base para componentes é integrado ao .NET.
Um desenvolvedor de componentes não precisa fazer nenhum trabalho adicional para
aproveitar a funcionalidade de base do tempo de design.

Um controle é semelhante a um componente, pois ambos são projetáveis. No entanto,


um controle fornece uma interface do usuário, enquanto que um componente não. Um
controle deve derivar de uma das classes de controle base: Control ou Control.

Quando criar um componente


Se sua classe for ser usada em uma superfície de design (como o Designer do Windows
Forms ou do Web Forms), mas não tiver uma interface do usuário, ela deverá ser um
componente e implementar IComponent ou derivar de uma classe que implementa,
direta ou indiretamente, IComponent.

As classes Component e MarshalByValueComponent são implementações base da


interface IComponent. A principal diferença entre essas classes é que o marshaling da
classe Component é realizado por referência, enquanto o marshaling de IComponent é
realizado por valor. A lista a seguir fornece diretrizes amplas para os implementadores.

Se o componente precisar ter o marshaling realizado por referência, derive de


Component.

Se o componente precisar ter o marshaling realizado por valor, derive de


MarshalByValueComponent.
Se o seu componente não puder derivar de uma das implementações de base
devido a herança única, implemente IComponent.

Classes de componentes
O namespace System.ComponentModel fornece classes que são usadas para
implementar o comportamento de tempo de design e tempo de execução de
componentes e controles. Este namespace inclui as classes e interfaces base para
implementar atributos e conversores de tipo, associar a fontes de dados e licenciar
componentes.

As classes de componente principais são:

Component. Uma implementação base para a interface IComponent. Essa classe


habilita o compartilhamento de objeto entre aplicativos.

MarshalByValueComponent. Uma implementação base para a interface


IComponent.

Container. A implementação base para a interface IContainer. Essa classe


encapsula zero ou mais componentes.

Algumas das classes usadas para licenciamento de componentes são:

License. A classe base abstrata para todas as licenças. Uma licença é concedida a
uma instância específica de um componente.

LicenseManager. Fornece propriedades e métodos para adicionar uma licença a


um componente e gerenciar um LicenseProvider.

LicenseProvider. A classe base abstrata para implementar um provedor de licença.

LicenseProviderAttribute. Especifica a classe LicenseProvider a ser usada com uma


classe.

Classes normalmente usadas para descrever e persistir componentes.

TypeDescriptor. Fornece informações sobre as características de um componente,


como atributos, propriedades e eventos.

EventDescriptor. Fornece informações sobre um evento.

PropertyDescriptor. Fornece informações sobre uma propriedade.


Seções relacionadas
Solução de problemas de criação de controle e de componente

Explica como corrigir problemas comuns.

Confira também
Como acessar o suporte a tempo de design no Windows Forms
Noções básicas de Aplicativo do
Windows Forms (Visual Basic)
Artigo • 09/02/2023 • 7 minutos para o fim da leitura

Uma parte importante do Visual Basic é a capacidade de criar aplicativos do Windows


Forms executados localmente nos computadores dos usuários. Você pode usar o Visual
Studio para criar o aplicativo e a interface do usuário com o Windows Forms. Um
aplicativo do Windows Forms é criado nas classes do namespace
System.Windows.Forms.

Design dos Aplicativos do Windows Forms


Você pode criar aplicativos de serviço do Windows Forms e do Windows com o Visual
Studio. Para obter mais informações, consulte estes tópicos:

Guia de Introdução ao Windows Forms. Fornece informações sobre como criar e


programar o Windows Forms.

Controles do Windows Forms. Coleção de tópicos que detalham o uso de


controles do Windows Forms.

Aplicativos de Serviço do Windows. Lista os tópicos que explicam como criar


serviços do Windows.

Compilando interfaces do usuário sofisticadas e


interativas
O Windows Forms é o componente de cliente inteligente do .NET Framework e do .NET
Core (desde o .NET Core 3.0). É um conjunto de bibliotecas gerenciadas que viabilizam
as tarefas comuns de aplicativos, como leitura e gravação para o sistema de arquivos.
Ao usar um ambiente de desenvolvimento como o Visual Studio, você pode criar
aplicativos do Windows Forms que exibem informações, solicitam entrada de usuários e
se comunicam com computadores remotos em uma rede.

nos Windows Forms, um formulário é uma superfície visual na qual são exibidas
informações para o usuário. Normalmente, você compila os aplicativos do Windows
Forms colocando controles nos formulários e elaborando respostas para as ações do
usuário, como cliques com o mouse ou pressionamentos de teclas. Um controle é um
elemento discreto de interface do usuário que exibe dados ou aceita a entrada de
dados.

Eventos
Quando um usuário executa alguma ação no formulário ou em um dos controles, isso
gera um evento. O seu aplicativo reage a esses eventos usando código e os processa
quando eles acontecem. Para obter mais informações, consulte Criando manipuladores
de eventos nos Windows Forms.

Controles
O Windows Forms contém uma variedade de controles que podem ser colocados nos
formulários: controles que exibem caixas de texto, botões, caixas suspensas, botões de
opção e até mesmo páginas da Web. Para obter uma lista de todos os controles que
podem ser usados em um formulário, consulte Controles que podem ser usados nos
Windows Forms. Se os controles existentes não atenderem às suas necessidades, o
Windows Forms também dará suporte aos seus próprios controles personalizados
usando a classe UserControl.

O Windows Forms tem controles avançados de interface do usuário que emulam


recursos em aplicativos de alta tecnologia, como o Microsoft Office. Ao usar os
controles ToolStrip e MenuStrip, você pode criar barras de ferramentas e menus que
contêm texto e imagens, exibir submenus e hospedar outros controles, como caixas de
texto e caixas de combinação.

Com o designer de formulários do tipo "arrastar e soltar" do Visual Studio, você pode
criar facilmente os aplicativos do Windows Forms: basta selecionar os controles com o
cursor e colocá-los onde desejar no formulário. O designer oferece ferramentas, como
linhas de grade e linhas de alinhamento, para facilitar o alinhamento dos controles. E se
você usar o Visual Studio ou compilar na linha de comando, poderá usar os controles
FlowLayoutPanel, TableLayoutPanel ou SplitContainer para criar layouts de formulário
avançados com tempo e esforço mínimos.

Elementos Personalizados da Interface do Usuário


Por fim, se for necessário criar seus próprios elementos personalizados da interface do
usuário, o namespace System.Drawing contém todas as classes necessárias para
renderizar linhas, círculos e outras formas diretamente em um formulário.
Para obter informações passo a passo sobre como usar esses recursos, confira os
seguintes tópicos de Ajuda.

Para Consulte

Criar um novo aplicativo do Windows Forms com o Tutorial 1: Criar um visualizador de


Visual Studio imagens

Usar controles em formulários Como Adicionar Controles ao Windows


Forms

Criar gráficos com o System.Drawing Introdução à programação de elementos


gráficos

Criar controles personalizados Como: Herdar da classe UserControl

Exibindo e manipulando dados


Muitos aplicativos precisam exibir dados obtidos de um banco de dados, de um arquivo
XML, de um serviço Web XML ou de outra fonte de dados. O Windows Forms oferece
um controle flexível chamado DataGridView, para a renderização desses dados tabulares
em um formato tradicional de linha e coluna, para que todos os dados ocupem suas
próprias células. Ao usar DataGridView, você pode personalizar a aparência de células
individuais, bloquear linhas e colunas arbitrárias e exibir controles complexos em
células, entre outros recursos.

A conexão a fontes de dados pela rede é uma tarefa simples com clientes inteligentes
dos Windows Forms. O componente BindingSource, novo no Windows Forms do Visual
Studio 2005 e do .NET Framework 2.0, representa uma conexão com uma fonte de
dados e expõe os métodos para associar dados aos controles, navegar pelos registros
anteriores e posteriores, editar registros e salvar alterações na fonte original. O controle
BindingNavigator fornece uma interface simples pelo componente BindingSource para
que os usuários naveguem entre os registros.

Controles de Associação de Dados


Você pode criar controles de associação de dados facilmente usando a janela Fontes de
Dados, que exibe fontes de dados como bancos de dados, serviços Web e objetos no
projeto. Você pode criar controles de associação de dados ao arrastar itens dessa janela
para os formulários do seu projeto. Você também pode associar controles existentes a
dados ao arrastar objetos da janela Fontes de Dados para eles.

Configurações
Outro tipo de vinculação de dados que você pode gerenciar nos Windows Forms é
chamado de configurações. A maioria dos aplicativos de cliente inteligente deve manter
algumas informações sobre o estado de tempo de execução, como o último tamanho
de formulário conhecido, e reter os dados de preferência do usuário, como os locais
padrão dos arquivos salvos. O recurso de configuração de aplicativo lida com esses
requisitos ao oferecer uma forma fácil de armazenar ambos os tipos de configuração no
computador cliente. Uma vez definidas usando o Visual Studio ou um editor de código,
essas configurações são mantidas como XML e lidas automaticamente na memória em
tempo de execução.

Para obter informações passo a passo sobre como usar esses recursos, confira os
seguintes tópicos de Ajuda.

Para Consulte

Usar o componente Como: Associar controles do Windows Forms ao componente


BindingSource BindingSource usando o designer

Trabalhar com fontes de Como: Classificar e filtrar dados ADO.NET com o componente
dados do ADO.NET BindingSource do Windows Forms

Usar a janela Fontes de Passo a passo: exibindo dados em um Windows Form


Dados

Implantando aplicativos em computadores


cliente
Depois de gravar o aplicativo, você precisa enviá-lo aos usuários para que possam
instalá-lo e executá-lo em seus próprios computadores cliente. Ao usar a tecnologia
ClickOnce, você pode implantar os aplicativos no Visual Studio com apenas alguns
cliques e oferecer aos usuários uma URL que aponta para o aplicativo na Web. O
ClickOnce gerencia todos os elementos e dependências do aplicativo e garante que ele
seja instalado adequadamente no computador cliente.

Os aplicativos do ClickOnce podem ser configurados para serem executados somente


quando o usuário estiver conectado à rede ou para execução online e offline. Quando
você especifica que um aplicativo deve permitir a operação offline, o ClickOnce adiciona
um link ao aplicativo, no menu Iniciar do usuário, para que o usuário possa abri-lo sem
usar a URL.

Quando você atualiza o seu aplicativo, publica um novo manifesto de implantação e


uma nova cópia do seu aplicativo em seu servidor Web. O ClickOnce detecta que há
uma atualização disponível e atualiza a instalação do usuário. Nenhuma programação
personalizada é necessária para atualizar assemblies antigos.

Para obter uma introdução completa ao ClickOnce, confira Segurança e Implantação do


ClickOnce. Para obter informações passo a passo sobre como usar esses recursos,
confira os seguintes tópicos de Ajuda:

Para Consulte

Implantar um aplicativo com o Como publicar um Aplicativo ClickOnce usando o Assistente


ClickOnce de Publicação

Passo a passo: implantando um aplicativo ClickOnce


manualmente

Atualizar uma implantação do Como gerenciar atualizações para um aplicativo ClickOnce


ClickOnce

Gerenciar a segurança com o Como habilitar configurações de segurança do ClickOnce


ClickOnce

Outros controles e recursos


Existem muitos outros recursos no Windows Forms que facilitam e agilizam a
implementação de tarefas, como suporte à criação de caixas de diálogo, impressão,
adição de documentação e localização do aplicativo para vários idiomas. Além disso, o
Windows Forms conta com o sistema de segurança robusto do .NET, permitindo que
você libere aplicativos mais seguros para os clientes.

Para obter informações passo a passo sobre como usar esses recursos, confira os
seguintes tópicos de Ajuda:

Para Consulte

Imprimir o conteúdo de um Como: imprimir elementos gráficos no Windows Forms

formulário
Como: imprimir um arquivo de texto de várias páginas
nos Windows Forms

Saiba mais sobre a segurança dos Visão geral da Segurança do Windows Forms
Windows Forms

Confira também
WindowsFormsApplicationBase
Visão geral dos Windows Forms
Objeto My.Forms
Personalizando projetos e estendendo
My com o Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você pode personalizar modelos de projeto para fornecer mais objetos My . Isso facilita a
localização e o uso dos seus objetos por outros desenvolvedores.

Nesta seção
Estendendo o Meu Namespace no Visual Basic

Descreve como adicionar membros e valores personalizados ao namespace My no


Visual Basic.
Como empacotar e implantar extensões personalizadas de My

Descreve como publicar extensões de namespace personalizadas My usando


modelos do Visual Studio.
Estendendo o modelo de aplicativo do Visual Basic

Descreve como especificar suas próprias extensões para o modelo de aplicativo


substituindo membros da classe WindowsFormsApplicationBase.
Como personalizar quais objetos estão disponíveis em My

Descreve como controlar quais objetos My estão habilitados definindo a constante


de compilação condicional _MYTYPE do projeto.

Seções relacionadas
Desenvolvimento com My

Descreve quais objetos My estão disponíveis em diferentes tipos de projeto por


padrão.
Visão geral do modelo de aplicativo do Visual Basic

Descreve o modelo do Visual Basic para controlar o comportamento de aplicativos


Windows Forms.
Como My depende do tipo de projeto

Descreve quais objetos My estão disponíveis em diferentes tipos de projeto por


padrão.
Compilação Condicional

Discute como o compilador usa a compilação condicional para selecionar seções


específicas de código para compilar e excluir outras seções.
ApplicationBase

Descreve o objeto My que fornece propriedades, métodos e eventos relacionados


ao aplicativo atual.

Confira também
Desenvolvendo aplicativos com o Visual Basic
Estendendo o namespace My no Visual
Basic
Artigo • 21/02/2023 • 9 minutos para o fim da leitura

O namespace My no Visual Basic expõe propriedades e métodos que permitem a você


aproveitar facilmente o poder do .NET Framework. O namespace My simplifica
problemas comuns de programação, geralmente reduzindo uma tarefa difícil para uma
única linha de código. Além disso, o namespace My é totalmente extensível para que
você possa personalizar o comportamento de My e adicionar novos serviços à sua
hierarquia para se adaptar às necessidades específicas do aplicativo. Este tópico discute
como personalizar os membros existentes do namespace My e como adicionar suas
próprias classes personalizadas ao namespace My .

Personalizando membros de namespace


existentes My
O namespace My do Visual Basic expõe informações usadas com frequência sobre seu
aplicativo, seu computador e muito mais. Para obter uma lista completa dos objetos no
namespace My , confira Minha Referência. Talvez seja necessário personalizar os
membros existentes do namespace My para que eles correspondam melhor às
necessidades do aplicativo. Qualquer propriedade de um objeto no namespace My que
não seja somente leitura pode ser definida como um valor personalizado.

Por exemplo, suponha que você use frequentemente o objeto My.User para acessar o
contexto de segurança atual para o usuário que executa seu aplicativo. No entanto, sua
empresa usa um objeto de usuário personalizado para expor informações e recursos
adicionais para usuários dentro da empresa. Nesse cenário, você pode substituir o valor
padrão da propriedade My.User.CurrentPrincipal por uma instância do seu próprio
objeto principal personalizado, conforme mostrado no exemplo a seguir:

VB

My.User.CurrentPrincipal = CustomPrincipal

Definir a propriedade CurrentPrincipal no objeto My.User altera a identidade sob a


qual o aplicativo é executado. O objeto My.User , por sua vez, retorna informações sobre
o usuário recém-especificado.
Adicionando membros a objetos My
Os tipos retornados de My.Application e My.Computer são definidos como classes
Partial . Portanto, você pode estender os objetos My.Application e My.Computer ,

criando uma classe Partial chamada MyApplication ou MyComputer . A classe não pode
ser uma classe Private . Se você especificar a classe como parte do namespace My ,
poderá adicionar propriedades e métodos que serão incluídos com os objetos
My.Application ou My.Computer .

O exemplo a seguir adiciona uma propriedade chamada DnsServerIPAddresses ao


objeto My.Computer :

VB

Imports System.Net.NetworkInformation

Namespace My

Partial Class MyComputer

Friend ReadOnly Property DnsServerIPAddresses() As IPAddressCollection

Get

Dim dnsAddressList As IPAddressCollection = Nothing

For Each adapter In System.Net.NetworkInformation.

NetworkInterface.GetAllNetworkInterfaces()

Dim adapterProperties = adapter.GetIPProperties()

Dim dnsServers As IPAddressCollection =


adapterProperties.DnsAddresses

If dnsAddressList Is Nothing Then

dnsAddressList = dnsServers

Else

dnsAddressList.Union(dnsServers)

End If

Next adapter

Return dnsAddressList

End Get

End Property

End Class

End Namespace

Adicionando objetos personalizados ao


namespace My
Embora o namespace My forneça soluções para muitas tarefas comuns de programação,
você pode encontrar tarefas que o namespace My não aborda. Por exemplo, seu
aplicativo pode acessar serviços de diretório personalizados para dados do usuário ou
seu aplicativo pode usar assemblies que não são instalados por padrão com o Visual
Basic. Você pode estender o namespace My para incluir soluções personalizadas para
tarefas comuns específicas ao seu ambiente. O namespace My pode ser facilmente
estendido para adicionar novos membros a fim de atender às necessidades crescentes
do aplicativo. Além disso, você pode implantar suas extensões de namespace My para
outros desenvolvedores como um modelo do Visual Basic.

Adicionando membros ao namespace My


Como My é um namespace como qualquer outro namespace, você pode adicionar
propriedades de nível superior a ele apenas adicionando um módulo e especificando
um Namespace de My . Anotar o módulo com o atributo HideModuleName , conforme
mostrado no exemplo a seguir. O atributo HideModuleName garante que o IntelliSense
não exibirá o nome do módulo quando exibir os membros do namespace My .

VB

Namespace My

<HideModuleName()>

Module MyCustomModule

End Module

End Namespace

Para adicionar membros ao namespace My , adicione propriedades conforme necessário


ao módulo. Para cada propriedade adicionada ao namespace My , adicione um campo
de tipo ThreadSafeObjectProvider(Of T) privado, onde o tipo é o tipo retornado por sua
propriedade personalizada. Esse campo é usado para criar instâncias de objeto thread-
safe a serem retornadas pela propriedade chamando o método GetInstance . Como
resultado, cada thread que está acessando a propriedade estendida recebe sua própria
instância do tipo retornado. O exemplo a seguir adiciona uma propriedade chamada
SampleExtension que é do tipo SampleExtension ao namespace My :

VB

Namespace My

<HideModuleName()>

Module MyCustomExtensions

Private _extension As New ThreadSafeObjectProvider(Of SampleExtension)

Friend ReadOnly Property SampleExtension() As SampleExtension

Get

Return _extension.GetInstance()

End Get

End Property

End Module

End Namespace

Adicionando eventos a objetos personalizados


My
Você pode usar o objeto My.Application para expor eventos para seus objetos
personalizados My , estendendo a classe parcial MyApplication no namespace My . Para
projetos baseados no Windows, você pode clicar duas vezes no nó Meu Projeto para
seu projeto no Gerenciador de Soluções. No Designer de Projeto do Visual Basic, clique
na guia Aplicativo e clique no botão Exibir Eventos do Aplicativo. Um novo arquivo
chamado ApplicationEvents.vb será criado. Ele contém o seguinte código para estender
a classe MyApplication :

VB

Namespace My

Partial Friend Class MyApplication

End Class

End Namespace

Você pode adicionar manipuladores de eventos para seus objetos personalizados My ,


adicionando manipuladores de eventos personalizados à classe MyApplication . Eventos
personalizados permitem adicionar código que será executado quando um manipulador
de eventos for adicionado, removido ou o evento for gerado. Observe que o código
AddHandler de um evento personalizado é executado somente se o código for
adicionado por um usuário para manipular o evento. Por exemplo, considere que o
objeto SampleExtension da seção anterior tem um evento Load para o qual você deseja
adicionar um manipulador de eventos personalizado. O exemplo de código a seguir
mostra um manipulador de eventos personalizado chamado SampleExtensionLoad que
será invocado quando o evento My.SampleExtension.Load ocorrer. Quando o código é
adicionado para lidar com o novo evento My.SampleExtensionLoad , a parte AddHandler
desse código de evento personalizado é executada. O método
MyApplication_SampleExtensionLoad é incluído no exemplo de código para mostrar um

exemplo de um manipulador de eventos que manipula o evento


My.SampleExtensionLoad . Observe que o evento SampleExtensionLoad estará disponível
quando você selecionar a opção Meus Eventos de Aplicativo na lista suspensa à
esquerda acima do Editor de Código quando você estiver editando o arquivo
ApplicationEvents.vb.

VB

Namespace My

Partial Friend Class MyApplication

' Custom event handler for Load event.

Private _sampleExtensionHandlers As EventHandler

Public Custom Event SampleExtensionLoad As EventHandler

AddHandler(ByVal value As EventHandler)

' Warning: This code is not thread-safe. Do not call

' this code from multiple concurrent threads.

If _sampleExtensionHandlers Is Nothing Then

AddHandler My.SampleExtension.Load, AddressOf


OnSampleExtensionLoad

End If

_sampleExtensionHandlers =

System.Delegate.Combine(_sampleExtensionHandlers, value)

End AddHandler

RemoveHandler(ByVal value As EventHandler)

_sampleExtensionHandlers =

System.Delegate.Remove(_sampleExtensionHandlers, value)

End RemoveHandler
RaiseEvent(ByVal sender As Object, ByVal e As EventArgs)

If _sampleExtensionHandlers IsNot Nothing Then

_sampleExtensionHandlers.Invoke(sender, e)

End If

End RaiseEvent

End Event

' Method called by custom event handler to raise user-defined

' event handlers.

<Global.System.ComponentModel.EditorBrowsable(

Global.System.ComponentModel.EditorBrowsableState.Advanced)>

Protected Overridable Sub OnSampleExtensionLoad(

ByVal sender As Object, ByVal e As EventArgs)

RaiseEvent SampleExtensionLoad(sender, e)

End Sub

' Event handler to call My.SampleExtensionLoad event.

Private Sub MyApplication_SampleExtensionLoad(

ByVal sender As Object, ByVal e As System.EventArgs

) Handles Me.SampleExtensionLoad

End Sub

End Class

End Namespace

Diretrizes de design
Ao desenvolver extensões para o namespace My , use as seguintes diretrizes para ajudar
a minimizar os custos de manutenção dos componentes de extensão:

Inclua apenas a lógica de extensão. A lógica incluída na extensão do namespace


My deve incluir apenas o código necessário para expor a funcionalidade necessária

no namespace My . Como sua extensão residirá em projetos de usuário como


código-fonte, a atualização do componente de extensão incorre em um alto custo
de manutenção e deve ser evitada, se possível.
Minimize as suposições do projeto. Ao criar suas extensões do namespace My ,
não suponha um conjunto de referências, importações no nível do projeto ou
configurações específicas do compilador (por exemplo, Option Strict desativado).
Em vez disso, minimize as dependências e qualifique totalmente todas as
referências de tipo usando a palavra-chave Global . Além disso, verifique se a
extensão é compilada com Option Strict para minimizar erros na extensão.
Isole o código de extensão. Colocar o código em um único arquivo torna sua
extensão facilmente implantável como um modelo de item do Visual Studio. Para
obter mais informações, confira "Empacotamento e implantação de extensões"
posteriormente neste tópico. Colocar todo o código de extensão do namespace
My em um único arquivo ou uma pasta separada em um projeto também ajudará
os usuários a localizar a extensão do namespace My .

Criando bibliotecas de classes para My


Como é o caso da maioria dos modelos de objeto, alguns padrões de design funcionam
bem no namespace My e outros não. Ao criar uma extensão para o namespace My ,
considere os seguintes princípios:

Métodos sem estado. Os métodos no namespace My devem fornecer uma solução


completa para uma tarefa específica. Verifique se os valores de parâmetro que são
passados para o método fornecem todas as entradas necessárias para concluir a
tarefa específica. Evite criar métodos que dependem do estado anterior, como
conexões abertas com recursos.
Instâncias globais. O único estado que é mantido no namespace My é global para
o projeto. Por exemplo, My.Application.Info encapsula o estado compartilhado
em todo o aplicativo.
Tipos de parâmetro simples. Mantenha as coisas simples evitando tipos de
parâmetros complexos. Em vez disso, crie métodos que não levem nenhuma
entrada de parâmetro ou que usem tipos de entrada simples, como cadeias de
caracteres, tipos primitivos e assim por diante.
Métodos de fábrica. Alguns tipos são necessariamente difíceis de instanciar.
Fornecer métodos de fábrica como extensões para o namespace My permite que
você descubra e consuma mais facilmente tipos que se enquadram nessa
categoria. Um exemplo de um método de fábrica que funciona bem é
My.Computer.FileSystem.OpenTextFileReader . Há vários tipos de fluxo disponíveis
no .NET Framework. Ao especificar arquivos de texto especificamente, o
OpenTextFileReader ajuda o usuário a entender qual fluxo usar.

Essas diretrizes não impedem princípios gerais de design para bibliotecas de classes. Em
vez disso, são recomendações otimizadas para desenvolvedores que estão usando o
Visual Basic e o namespace My . Para obter princípios gerais de design para criar
bibliotecas de classes, confira Diretrizes de Design da Estrutura.

Empacotar e implantar extensões


Você pode incluir extensões de namespace My em um modelo de projeto do Visual
Studio ou empacotar suas extensões e implantá-las como um modelo de item do Visual
Studio. Ao empacotar suas extensões de namespace My como um modelo de item do
Visual Studio, você pode aproveitar os recursos adicionais fornecidos pelo Visual Basic.
Esses recursos permitem que você inclua uma extensão quando um projeto fizer
referência a um assembly específico ou permitem que os usuários adicionem
explicitamente sua extensão de namespace My usando a página Minhas Extensões do
Designer de Projeto do Visual Basic.

Para obter detalhes sobre como implantar extensões de namespace My , confira


Empacotando e implantando minhas extensões personalizadas.

Confira também
Como empacotar e implantar extensões personalizadas de My
Estendendo o modelo de aplicativo do Visual Basic
Como personalizar quais objetos estão disponíveis em My
Página Minhas extensões, Designer de projeto
Página de Aplicativo, Designer de Projeto (Visual Basic)
Parcial
Empacotar e implantar Minhas
extensões personalizadas (Visual Basic)
Artigo • 07/04/2023 • 4 minutos para o fim da leitura

O Visual Basic oferece um jeito fácil de implantar as extensões de namespace


personalizadas My usando modelos do Visual Studio. Se você estiver criando um
modelo de projeto para o qual as extensões My são parte integrante do novo tipo de
projeto, basta incluir o código de extensão My personalizado com o projeto ao exportar
o modelo. Para obter mais informações sobre como exportar modelos de projeto,
confira Como criar modelos de projeto.

Se a extensão My personalizada estiver em um arquivo de código único, você poderá


exportá-lo como um modelo de item que os usuários podem adicionar a qualquer tipo
de projeto do Visual Basic. Você pode personalizar o modelo de item para habilitar
recursos e comportamento adicionais para a extensão My personalizada em um projeto
do Visual Basic. Essas funcionalidades incluem o seguinte:

Permitir que os usuários gerenciem a extensão My personalizada na página Minhas


extensões do Designer de Projeto do Visual Basic.

Adicionar automaticamente a extensão My personalizada quando uma referência a


um assembly especificado é adicionada a um projeto.

Ocultar o modelo de item de extensão My na caixa de diálogo Adicionar item para


que não seja incluído na lista de itens do projeto.

Este tópico discute como empacotar uma extensão My personalizada como um modelo
de item oculto que pode ser gerenciado na página Minhas extensões do Designer de
Projeto do Visual Basic. A extensão My personalizada também pode ser adicionada
automaticamente quando uma referência a um assembly especificado é adicionada a
um projeto.

Criar uma extensão Meu namespace


A primeira etapa na criação de um pacote de implantação para uma extensão
personalizada My é criar a extensão como um arquivo de código único. Para obter
detalhes e orientações sobre como criar uma extensão My personalizada, confira
Estender o Meu Namespace no Visual Basic.
Exportar uma extensão do Meu namespace
como um modelo de item
Depois de ter um arquivo de código que inclui a extensão de namespace My , você pode
exportar o arquivo de código como um modelo de item do Visual Studio. Para obter
instruções sobre como exportar um arquivo como um modelo de item do Visual Studio,
confira Como criar modelos de item.

7 Observação

Se a extensão de namespace My tiver uma dependência de um assembly específico,


você poderá personalizar o modelo de item para instalar automaticamente a
extensão de namespace My quando uma referência a esse assembly for adicionada.
Como resultado, você desejará excluir essa referência de assembly ao exportar o
arquivo de código como um modelo de item do Visual Studio.

Personalizar o modelo de item


Você pode permitir que o modelo de item seja gerenciado na página Minhas extensões
do Designer de Projeto do Visual Basic. Você também pode permitir que o modelo de
item seja adicionado automaticamente quando uma referência a um assembly
especificado for adicionada a um projeto. Para habilitar essas personalizações, você
adicionará um novo arquivo, chamado arquivo CustomData, ao modelo e, em seguida,
adicionará um novo elemento ao XML ao arquivo .vstemplate.

Adicionar o arquivo CustomData


O arquivo CustomData é um arquivo de texto que tem uma extensão de nome de
arquivo de .CustomData (o nome do arquivo pode ser definido para qualquer valor
significativo para o modelo) e que contém XML. O XML no arquivo CustomData instrui o
Visual Basic a incluir a extensão My quando os usuários usarem a página Minhas
extensões do Designer de Projeto do Visual Basic. Opcionalmente, você pode adicionar
o atributo < AssemblyFullName> ao XML do arquivo CustomData. Isso instrui o Visual
Basic a instalar automaticamente a extensão My personalizada quando uma referência a
um determinado assembly é adicionada ao projeto. Você pode usar qualquer editor de
texto ou editor de XML para criar o arquivo CustomData e adicioná-lo à pasta
compactada do modelo de item (arquivo .zip).
Por exemplo, o XML a seguir mostra o conteúdo de um arquivo CustomData que
adicionará o item de modelo à pasta Minhas Extensões de um projeto do Visual Basic
quando uma referência ao assembly Microsoft.VisualBasic.PowerPacks.Vs.dll é
adicionada ao projeto.

XML

<VBMyExtensionTemplate

ID="Microsoft.VisualBasic.Samples.MyExtensions.MyPrinterInfo"

Version="1.0.0.0"

AssemblyFullName="Microsoft.VisualBasic.PowerPacks.vs"

/>

O arquivo CustomData contém um elemento < VBMyExtensionTemplate> que possui


atributos conforme listado na tabela a seguir.

Atributo Descrição

ID Obrigatórios. Um identificador exclusivo para a extensão. Se a extensão com


essa ID já tiver sido adicionada ao projeto, o usuário não será solicitado a
adicioná-la novamente.

Version Obrigatórios. Um número de versão para o modelo de item.

AssemblyFullName Opcional. Um nome de assembly. Quando uma referência a este assembly é


adicionada ao projeto, o usuário será solicitado a adicionar a extensão My
deste modelo de item.

Adicionar o elemento <CustomDataSignature> ao


arquivo .vstemplate
Para identificar o modelo de item do Visual Studio como uma extensão de namespace
My , você também deve modificar o arquivo .vstemplate para o modelo de item. Você
deve adicionar um elemento <CustomDataSignature> ao <TemplateData> . O elemento
<CustomDataSignature> deve conter o texto Microsoft.VisualBasic.MyExtension ,

conforme mostrado no exemplo a seguir.

XML

<CustomDataSignature>Microsoft.VisualBasic.MyExtension</CustomDataSignature>

Você não pode modificar arquivos em uma pasta compactada (arquivo .zip)
diretamente. Você deve copiar o arquivo .vstemplate da pasta compactada, modificá-lo
e substituir o arquivo .vstemplate na pasta compactada pela cópia atualizada.
O exemplo a seguir mostra o conteúdo de um arquivo .vstemplate que tem o elemento
<CustomDataSignature> adicionado.

XML

<VSTemplate Version="2.0.0"
xmlns="http://schemas.microsoft.com/developer/vstemplate/2005" Type="Item">

<TemplateData>

<DefaultName>MyCustomExtensionModule.vb</DefaultName>

<Name>MyPrinterInfo</Name>

<Description>Custom My Extensions Item Template</Description>

<ProjectType>VisualBasic</ProjectType>

<SortOrder>10</SortOrder>

<Icon>__TemplateIcon.ico</Icon>

<CustomDataSignature
>Microsoft.VisualBasic.MyExtension</CustomDataSignature>
</TemplateData>

<TemplateContent>

<References />

<ProjectItem SubType="Code"

TargetFileName="$fileinputname$.vb"

ReplaceParameters="true"

>MyCustomExtensionModule.vb</ProjectItem>

</TemplateContent>

</VSTemplate>

Instalar o modelo
Para instalar o modelo, você pode copiar a pasta compactada (arquivo .zip) para a pasta
de modelos de item do Visual Basic. Por padrão, os modelos de item do usuário estão
localizados em %USERPROFILE%\Documents\Visual Studio
<Version>\Templates\ItemTemplates\Visual Basic. Como alternativa, você pode publicar
o modelo como um arquivo do Instalador do Visual Studio (.vsi).

Confira também
Estendendo o Meu Namespace no Visual Basic
Estendendo o modelo de aplicativo do Visual Basic
Como personalizar quais objetos estão disponíveis em My
Página Minhas extensões, Designer de projeto
Estendendo o modelo de aplicativo do
Visual Basic
Artigo • 21/02/2023 • 5 minutos para o fim da leitura

Você pode adicionar funcionalidade ao modelo de aplicativo substituindo os membros


Overridable da classe WindowsFormsApplicationBase. Essa técnica permite personalizar

o comportamento do modelo de aplicativo e adicionar chamadas aos próprios métodos


à medida que o aplicativo é inicializado e desligado.

Visão geral visual do Modelo de Aplicativo


Esta seção apresenta visualmente a sequência de chamadas de função no Modelo de
Aplicativo do Visual Basic. A próxima seção descreve a finalidade de cada função em
detalhes.

O gráfico a seguir mostra a sequência de chamada do modelo de aplicativo em um


aplicativo normal do Windows Forms no Visual Basic. A sequência começa quando o
procedimento Sub Main chama o método Run.
O modelo de aplicativo do Visual Basic também fornece os eventos StartupNextInstance
e UnhandledException. Os gráficos a seguir mostram o mecanismo para gerar esses
eventos.

Como substituir os Métodos Base


O método Run define a ordem em que Application são executados. Por padrão, o
procedimento Sub Main para um aplicativo do Windows Forms chama o método Run.

Se o aplicativo for normal (aplicativo de várias instâncias) ou a primeira instância de um


aplicativo de instância única, o método Run executa Overridable na seguinte ordem:

1. OnInitialize. Por padrão, esse método define os estilos visuais, os estilos de


exibição de texto e o principal atual para o encadeamento do aplicativo principal
(se ele usar autenticação do Windows) e chama ShowSplashScreen se nem
/nosplash nem -nosplash forem usados como um argumento de linha de
comando.

A sequência de inicialização do aplicativo é cancelada se esta função retornar


False . Isso pode ser útil se houver circunstâncias em que o aplicativo não deve ser

executado.

O método OnInitialize chama os seguintes métodos:

a. ShowSplashScreen. Determina se o aplicativo tem uma tela inicial definida e, se


tiver, exibe-a em um thread separado.

O método ShowSplashScreen contém o código que exibe a tela inicial por, pelo
menos, o número de milissegundos especificado pela propriedade
MinimumSplashScreenDisplayTime. Para usar essa funcionalidade, você deve
adicionar a tela inicial ao aplicativo usando o Designer de Projeto (que define a
propriedade My.Application.MinimumSplashScreenDisplayTime como dois
segundos) ou definir a propriedade
My.Application.MinimumSplashScreenDisplayTime em um método que substitui

OnInitialize ou OnCreateSplashScreen. Para obter mais informações, consulte


MinimumSplashScreenDisplayTime.

b. OnCreateSplashScreen. Permite que um designer emita o código que inicializa a


tela inicial.

Por padrão, esse método não faz nada. Se você selecionar uma tela inicial para
o aplicativo no Designer de Projeto do Visual Basic, o designer substituirá o
método OnCreateSplashScreen por um que defina a propriedade SplashScreen
como uma nova instância do formulário de tela inicial.

2. OnStartup. Fornece um ponto de extensibilidade para gerar o evento Startup . A


sequência de inicialização do aplicativo é interrompida se esta função retornar
False .

Por padrão, esse método gera o evento Startup. Se o manipulador de eventos


definir a propriedade Cancel do argumento de evento como True , o método
retornará False para cancelar a inicialização do aplicativo.

3. OnRun. Fornece o ponto de partida para quando o aplicativo principal está pronto
para começar a ser executado, após a inicialização ser feita.

Por padrão, antes de entrar no loop de mensagens do Windows Forms, esse


método chama OnCreateMainForm (para criar o formulário principal do aplicativo) e
HideSplashScreen (para fechar a tela inicial):

a. OnCreateMainForm. Fornece uma forma para um designer emitir código que


inicializa o formulário principal.

Por padrão, esse método não faz nada. No entanto, quando você seleciona um
formulário principal para o aplicativo no Designer de Projeto do Visual Basic, o
designer substitui o método OnCreateMainForm por um que defina a
propriedade MainForm como uma nova instância do formulário principal.

b. HideSplashScreen. Se o aplicativo tiver uma tela inicial definida e estiver aberta,


ela será fechada por esse método.

Por padrão, esse método fecha a tela inicial.

4. OnStartupNextInstance. Fornece uma maneira de personalizar como um aplicativo


de instância única se comporta quando outra instância do aplicativo é iniciada.

Por padrão, esse método gera o evento StartupNextInstance.


5. OnShutdown. Fornece um ponto de extensibilidade para gerar o evento Shutdown .
Este método não será executado se ocorrer uma exceção sem tratamento no
aplicativo principal.

Por padrão, esse método gera o evento Shutdown.

6. OnUnhandledException. Executado se ocorrer uma exceção sem tratamento em


qualquer um dos métodos listados acima.

Por padrão, esse método gera o evento UnhandledException, desde que um


depurador não esteja anexado e o aplicativo esteja manipulando o evento
UnhandledException .

Se o aplicativo for de instância única e já estiver em execução, a instância subsequente


do aplicativo chamará o método OnStartupNextInstance na instância original do
aplicativo e será encerrada.

O construtor OnStartupNextInstance(StartupNextInstanceEventArgs) chama a


propriedade UseCompatibleTextRendering para determinar qual mecanismo de
renderização de texto usar para os formulários do aplicativo. Por padrão, a propriedade
UseCompatibleTextRendering retorna False , indicando que o mecanismo de
renderização de texto GDI deve ser usado, que é o padrão no Visual Basic 2005 e em
versões posteriores. Você pode substituir a propriedade UseCompatibleTextRendering
para retornar True , que indica que o mecanismo de renderização de texto GDI+ deve
ser usado, que é o padrão no Visual Basic .NET 2002 e no Visual Basic .NET 2003.

Como configurar o aplicativo


Como parte do modelo de aplicativo do Visual Basic, a classe
WindowsFormsApplicationBase fornece propriedades protegidas que configuram o
aplicativo. Essas propriedades devem ser definidas no construtor da classe de
implementação.

Em um projeto padrão do Windows Forms, o Designer de Projeto cria código para


definir as propriedades com as configurações do designer. As propriedades são usadas
apenas quando o aplicativo está iniciando; defini-los após o início dele não tem efeito.

Propriedade Determina Configuração no


painel do Aplicativo
do Designer de
Projeto
Propriedade Determina Configuração no
painel do Aplicativo
do Designer de
Projeto

IsSingleInstance Se o aplicativo é executado como um aplicativo Caixa de seleção


de instância única ou de várias instâncias. Criar aplicativo de
instância única

EnableVisualStyles Se o aplicativo usar estilos visuais que Caixa de seleção


correspondam ao Windows XP. Habilitar estilos
visuais do XP

SaveMySettingsOnExit Se o aplicativo salvar automaticamente as Caixa de seleção


alterações nas configurações do usuário do Salvar My.Settings
aplicativo quando ele for encerrado. no Desligamento

ShutdownStyle O que faz com que o aplicativo seja encerrado, Lista de Modo de
como quando o formulário de inicialização é desligamento
fechado ou quando o último formulário é
fechado.

Confira também
ApplicationBase
Startup
StartupNextInstance
UnhandledException
Shutdown
NetworkAvailabilityChanged
Visão geral do modelo de aplicativo do Visual Basic
Página de Aplicativo, Designer de Projeto (Visual Basic)
Personalizando quais objetos estão disponíveis em My
(Visual Basic)
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Esse tópico descreve como controlar quais objetos My são habilitados definindo-se a constante de compilação condicional
_MYTYPE do projeto. O IDE (Ambiente de Desenvolvimento Integrado) do Visual Studio mantém a constante de compilação

condicional _MYTYPE para um projeto em sincronia com o tipo do projeto.

Valores de _MYTYPE predefinidos


Você deve usar a opção do compilador /define para definir a constante de compilação condicional _MYTYPE . Ao especificar
seu próprio valor para a constante _MYTYPE , você deve colocar o valor da cadeia de caracteres em sequências de barra
invertida/aspas (\"). Por exemplo, você pode usar:

Console

/define:_MYTYPE=\"WindowsForms\"

Esta tabela mostra como a constante de compilação condicional _MYTYPE está definida para vários tipos de projeto.

Tipo de projeto Valor _MYTYPE

Biblioteca de Classes “Windows”

Aplicativo do Console "Console"

Web "Web"

Biblioteca de Controles da Web "WebControl"

Aplicativo do Windows "WindowsForms"

Aplicativo do Windows, ao começar com o Sub Main personalizado "WindowsFormsWithCustomSubMain"

Biblioteca de Controle do Windows “Windows”

Serviço Windows "Console"

Vazio "Empty"

7 Observação

Todas as comparações de cadeia de caracteres de compilação condicional diferenciam maiúsculas de minúsculas,


independentemente de como a instrução Option Compare é definida.

Constantes de compilação de _MY dependentes


A constante de compilação condicional _MYTYPE , por sua vez, controla os valores de várias outras constantes de
compilação _MY :

_MYTYPE _MYAPPLICATIONTYPE _MYCOMPUTERTYPE _MYFORMS _MYUSERTYPE _MYWEBSERVICES

"Console" "Console" “Windows” Indefinido “Windows” TRUE

“Personalizado” Indefinido Indefinido Indefinido Indefinido Indefinido

"Empty" Indefinido Indefinido Indefinido Indefinido Indefinido


_MYTYPE _MYAPPLICATIONTYPE _MYCOMPUTERTYPE _MYFORMS _MYUSERTYPE _MYWEBSERVICES

"Web" Indefinido "Web" FALSE "Web" FALSE

"WebControl" Indefinido "Web" FALSE "Web" TRUE

"Windows" ou "" “Windows” “Windows” Indefinido “Windows” TRUE

"WindowsForms" "WindowsForms" “Windows” TRUE “Windows” TRUE

"WindowsFormsWithCustomSubMain" "Console" “Windows” TRUE “Windows” TRUE

Por padrão, as constantes de compilação condicional indefinidas são resolvidas para FALSE . Você pode especificar valores
para as constantes indefinidas ao compilar seu projeto para substituir o comportamento padrão.

7 Observação

Quando _MYTYPE é definido como "Personalizado", o projeto contém o namespace My , mas não contém objetos. No
entanto, a configuração _MYTYPE como "Vazio" impede que o compilador adicione o namespace My e seus objetos.

Esta tabela descreve os efeitos dos valores predefinidos das constantes de compilação _MY .

Constante Significado

_MYAPPLICATIONTYPE Habilita My.Application , se a constante for "Console", "Windows" ou "WindowsForms":

– A versão de "Console" deriva de ConsoleApplicationBase. e tem menos membros do que a versão "Windows".

– A versão "Windows" deriva de ApplicationBase e tem menos membros do que a versão "WindowsForms".

– A versão "WindowsForms" de My.Application deriva de WindowsFormsApplicationBase. Se a constante TARGET


for definida como "winexe", a classe incluirá um método Sub Main .

_MYCOMPUTERTYPE Habilita My.Computer , se a constante for "Web" ou "Windows":

– A versão "Web" deriva de ServerComputer e tem menos membros do que a versão "Windows".

– A versão "Windows" de My.Computer deriva de Computer.

_MYFORMS Habilita My.Forms , se a constante for TRUE .

_MYUSERTYPE Habilita My.User , se a constante for "Web" ou "Windows":

– A versão "Web" My.User está associada à identidade do usuário da solicitação HTTP atual.

– A versão "Windows" de My.User está associada à entidade de segurança atual do thread.

_MYWEBSERVICES Habilita My.WebServices , se a constante for TRUE .

_MYTYPE Habilita My.Log , My.Request e My.Response , se a constante for "Web".

Confira também
ApplicationBase
Computer
Log
User
Como My depende do tipo de projeto
Compilação Condicional
-define (Visual Basic)
Objeto My.Forms
Objeto My.Request
Objeto My.Response
Objeto My.WebServices
Conceitos de Programação (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Esta seção explica conceitos de programação na linguagem do Visual Basic.

Nesta seção
Título Descrição

Programação Descreve como criar soluções assíncronas usando palavras-chave Async e


assíncrona com Await. Inclui um passo a passo.
Async e Await
(Visual Basic)

Visão geral de Discute como fornecer informações adicionais sobre como programar
atributos (Visual elementos como tipos, campos, métodos e propriedades por meio de
Basic) atributos.

Informações do Descreve como obter informações sobre o chamador de um método. Essas


chamador (Visual informações incluem o caminho do arquivo e o número de linha do código-
Basic) fonte e o nome do membro do chamador.

Coleções (Visual Descreve alguns dos tipos de coleções fornecidos pelo .NET Framework.
Basic) Demonstra como usar coleções simples e coleções de pares chave/valor.

Covariância e Mostra como habilitar a conversão implícita de parâmetros de tipo genérico


contravariância em interfaces e delegados.
(Visual Basic)

Árvores de Explica como você pode usar árvores de expressão para habilitar a
expressão (Visual modificação dinâmica de código executável.
Basic)

Iteradores (Visual Descreve os iteradores, que são usados para percorrer coleções e retornar
Basic) elementos um por vez.

LINQ (consulta Discute as capacidades avançadas de consulta na sintaxe de linguagem do


integrada à Visual Basic e o modelo para consultar bancos de dados relacionais,
linguagem) documentos XML, conjuntos de dados e coleções na memória.
(Visual Basic)

Programação Descreve os conceitos comuns orientados a objetos, incluindo


orientada a objeto encapsulamento, herança e polimorfismo.
(Visual Basic)
Título Descrição

Reflexão (Visual Explica como usar a reflexão para criar dinamicamente uma instância de um
Basic) tipo, associar o tipo a um objeto existente ou obter o tipo de um objeto
existente e invocar seus métodos ou acessar suas propriedades e campos.

Serialização Descreve os principais conceitos em binário, XML e serialização SOAP.


(Visual Basic)

Seções relacionadas
Artigo Descrição

Assemblies no Descreve como criar e usar um assemblies.


.NET

Dicas de Discute várias regras básicas que podem ajudá-lo a aumentar o desempenho
desempenho do seu aplicativo.
Programação assíncrona com Async e
Await (Visual Basic)
Artigo • 15/02/2023 • 17 minutos para o fim da leitura

É possível evitar gargalos de desempenho e aprimorar a resposta geral do seu aplicativo


usando a programação assíncrona. No entanto, as técnicas tradicionais para escrever
aplicativos assíncronos podem ser complicadas, dificultando sua escrita, depuração e
manutenção.

O Visual Studio 2012 apresenta uma abordagem simplificada, programação assíncrona,


que aproveita o suporte assíncrono no .NET Framework 4.5 e superior, bem como no
Windows Runtime. O compilador faz o trabalho difícil que o desenvolvedor costumava
fazer, e seu aplicativo mantém a estrutura lógica que se assemelha ao código síncrono.
Como resultado, você obtém todas as vantagens da programação assíncrona com uma
fração do esforço.

Este tópico oferece uma visão geral de quando e como usar a programação assíncrona
e inclui links para tópicos de suporte que contêm detalhes e exemplos.

A assincronia melhora a capacidade de


resposta
A assincronia é essencial para atividades potencialmente causadoras de bloqueios,
como quando seu aplicativo acessa a Web. O acesso a um recurso da Web às vezes é
lento ou atrasado. Se tal atividade for bloqueada dentro de um processo síncrono, todo
o aplicativo deverá esperar. Em um processo assíncrono, o aplicativo poderá prosseguir
com outro trabalho que não dependa do recurso da Web até a tarefa potencialmente
causadora do bloqueio terminar.

A tabela a seguir mostra a áreas típicas onde a programação assíncrona melhora a


resposta. As APIs listadas do .NET Framework 4.5 e do Windows Runtime contêm
métodos que dão suporte à programação assíncrona.

Área do aplicativo APIs de suporte que contêm métodos assíncronos

Acesso à Web HttpClient, SyndicationClient

Trabalhando com arquivos StorageFile, StreamWriter, StreamReader, XmlReader

Trabalhando com imagens MediaCapture, BitmapEncoder, BitmapDecoder


Área do aplicativo APIs de suporte que contêm métodos assíncronos

Programação WCF Operações síncronas e assíncronas

A assincronia é especialmente importante para aplicativos que acessam o thread de


interface de usuário porque todas as atividades relacionadas à interface do usuário
normalmente compartilham um único thread. Se um processo for bloqueado em um
aplicativo síncrono, todos serão bloqueados. Seu aplicativo para de responder, o que
poderia levar você a concluir que ele falhou quando, na verdade, está apenas
aguardando.

Quando você usa métodos assíncronos, o aplicativo continua a responder à interface do


usuário. Você poderá redimensionar ou minimizar uma janela, por exemplo, ou fechar o
aplicativo se você não desejar aguardar sua conclusão.

A abordagem baseada em assincronia adiciona o equivalente de uma transmissão


automática à lista de opções disponíveis para escolha ao criar operações assíncronas.
Ou seja, você obtém todos os benefícios da programação assíncrona tradicional, mas
com muito menos esforço do desenvolvedor.

Os métodos assíncronos são mais fáceis de


escrever
As palavras-chave Async e Await no Visual Basic são a parte central da programação
assíncrona. Ao usar essas duas palavras-chave, você pode usar recursos do .NET
Framework ou do Windows Runtime para criar um método assíncrono quase que tão
facilmente como cria um método síncrono. Os métodos assíncronos que você define
usando Async e Await são chamados de métodos assíncronos.

O exemplo a seguir mostra um método assíncrono. Quase tudo no código deve ser
completamente familiar para você. Os comentários chamam os recursos que você deve
adicionar para criar a assincronia.

O arquivo de exemplo completo do WPF (Windows Presentation Foundation) pode ser


encontrado no final deste tópico. Você também pode baixar o exemplo de Exemplo de
assincronia: exemplo de "Programação assíncrona com Async e Await".

VB

' Three things to note about writing an Async Function:

' - The function has an Async modifier.

' - Its return type is Task or Task(Of T). (See "Return Types" section.)

' - As a matter of convention, its name ends in "Async".

Async Function AccessTheWebAsync() As Task(Of Integer)

Using client As New HttpClient()

' Call and await separately.

' - AccessTheWebAsync can do other things while GetStringAsync is


also running.

' - getStringTask stores the task we get from the call to


GetStringAsync.

' - Task(Of String) means it is a task which returns a String when


it is done.

Dim getStringTask As Task(Of String) =


client.GetStringAsync("https://docs.microsoft.com/dotnet")

' You can do other work here that doesn't rely on the string from
GetStringAsync.

DoIndependentWork()

' The Await operator suspends AccessTheWebAsync.

' - AccessTheWebAsync does not continue until getStringTask is


complete.

' - Meanwhile, control returns to the caller of AccessTheWebAsync.

' - Control resumes here when getStringTask is complete.

' - The Await operator then retrieves the String result from
getStringTask.

Dim urlContents As String = Await getStringTask

' The Return statement specifies an Integer result.

' A method which awaits AccessTheWebAsync receives the Length value.

Return urlContents.Length

End Using

End Function

Se AccessTheWebAsync não tiver nenhum trabalho que possa fazer entre chamar
GetStringAsync e aguardar a conclusão, você poderá simplificar o código ao chamar e

esperar na instrução única a seguir.

VB

Dim urlContents As String = Await client.GetStringAsync()

As seguintes características resumem o que transforma o exemplo anterior em um


método assíncrono:

A assinatura do método inclui um modificador Async .

O nome de um método assíncrono, por convenção, termina com um sufixo


"Async".

O tipo de retorno é um dos seguintes tipos:


Task(Of TResult) se o método tem uma instrução return em que o operando tem
o tipo TResult.
Task se o método não possui instrução de retorno alguma ou se ele possui uma
instrução de retorno sem operando.
Sub se você estiver escrevendo um manipulador de eventos assíncronos.

Para obter mais informações, consulte “Tipos e parâmetros de retorno” mais


adiante neste tópico.

O método geralmente inclui pelo menos uma expressão await, a qual marca um
ponto onde o método não pode continuar até que a operação assíncrona
aguardada seja concluída. Enquanto isso, o método é suspenso e o controle
retorna para o chamador do método. A próxima seção deste tópico ilustra o que
acontece no ponto de suspensão.

Em métodos assíncronos, você usa as palavras-chave e os tipos fornecidos para indicar


o que deseja fazer, e o compilador faz o resto, inclusive acompanhar o que deve
acontecer quando o controle retorna a um ponto de espera em um método suspenso.
Alguns processos de rotina, como loops e a manipulação de exceções, podem ser
difíceis de manipular em um código assíncrono tradicional. Em um método assíncrono,
você escreve esses elementos da mesma forma que faria em uma solução síncrona, e o
problema é resolvido.

Para obter mais informações sobre assincronia nas versões anteriores do .NET
Framework, consulte Programação assíncrona do .NET Framework tradicional e TPL.

O que acontece em um método assíncrono


O mais importante que você deve compreender na programação assíncrona é a forma
como o fluxo de controle avança de um método para outro. O diagrama a seguir pode
ser usado para conduzi-lo pelo processo:
Os números no diagrama correspondem às seguintes etapas:

1. Um manipulador de eventos chama e aguarda o método assíncrono


AccessTheWebAsync .

2. AccessTheWebAsync cria uma instância de HttpClient e chama o método assíncrono


GetStringAsync para baixar o conteúdo de um site como uma cadeia de caracteres.

3. Algo acontece em GetStringAsync que suspende o andamento. Talvez ele deva


aguardar o download de um site ou alguma outra atividade causadora de
bloqueio. Para evitar o bloqueio de recursos, GetStringAsync transfere o controle
para seu chamador, AccessTheWebAsync .

GetStringAsync retorna um Task(Of TResult) em que TResult é uma cadeia de

caracteres e AccessTheWebAsync atribui a tarefa à variável getStringTask . A tarefa


representa o processo contínuo para a chamada a GetStringAsync , com um
compromisso de produzir um valor de cadeia de caracteres real quando o trabalho
estiver concluído.

4. Como o getStringTask ainda não foi esperado, AccessTheWebAsync pode continuar


com outro trabalho que não depende do resultado final de GetStringAsync . O
trabalho é representado por uma chamada ao método síncrono
DoIndependentWork .

5. DoIndependentWork é um método síncrono que faz seu trabalho e retorna ao seu


chamador.

6. AccessTheWebAsync está sem trabalho que ele possa executar sem um resultado de
getStringTask . Em seguida, AccessTheWebAsync deseja calcular e retornar o

comprimento da cadeia de caracteres baixada, mas o método não poderá calcular


o valor enquanto o método tiver a cadeia de caracteres.

Portanto, AccessTheWebAsync usa um operador await para suspender seu


andamento e para transferir o controle para o método que chamou
AccessTheWebAsync . AccessTheWebAsync retorna um Task(Of Integer) ao

chamador. A tarefa representa uma promessa de produzir um resultado inteiro


que é o comprimento da cadeia de caracteres baixada.

7 Observação

Se GetStringAsync (e portanto getStringTask ) for concluído antes que


AccessTheWebAsync o espere, o controle permanecerá em AccessTheWebAsync .

A despesa de suspender e então retornar para AccessTheWebAsync seria


desperdiçada caso o processo assíncrono chamado ( getStringTask ) já tivesse
sido concluído e AccessTheWebSync não tivesse que aguardar o resultado
final.

Dentro do chamador (manipulador de eventos neste exemplo), o processamento


do padrão continua. O chamador pode fazer outro trabalho que não dependa do
resultado de AccessTheWebAsync antes de aguardar o resultado, ou o chamador
pode aguardar imediatamente. O manipulador de eventos está aguardando
AccessTheWebAsync e AccessTheWebAsync está aguardando GetStringAsync .

7. GetStringAsync completa e produz um resultado de cadeia de caracteres. O


resultado da cadeia de caracteres não é retornado pela chamada para
GetStringAsync da maneira que você poderia esperar. (Lembre-se que o método já

retornou uma tarefa na etapa 3.) Em vez disso, o resultado da cadeia de caracteres
é armazenado na tarefa que representa a conclusão do método, getStringTask . O
operador await recupera o resultado de getStringTask . A instrução de atribuição
atribui o resultado retornado a urlContents .
8. Quando AccessTheWebAsync tem o resultado da cadeia de caracteres, o método
pode calcular o comprimento da cadeia de caracteres. Em seguida, o trabalho de
AccessTheWebAsync também é concluído e o manipulador de eventos de espera

poderá retomar. No exemplo completo no final do tópico, é possível confirmar que


o manipulador de eventos recuperou e imprimiu o valor do comprimento do
resultado.

Se você não tiver experiência em programação assíncrona, considere por um minuto a


diferença entre o comportamento síncrono e o assíncrono. Um método síncrono retorna
quando seu trabalho é concluído (etapa 5), mas um método assíncrono retorna um
valor de tarefa quando seu trabalho está suspenso (etapas 3 e 6). Quando o método
assíncrono eventualmente concluir seu trabalho, a tarefa será marcada como concluída
e o resultado, se houver, será armazenado na tarefa.

Para obter mais informações sobre o fluxo de controle, consulte Fluxo de controle em
programas assíncronos (Visual Basic).

Métodos de assíncronos da API


Você pode estar curioso para saber onde encontrar métodos como GetStringAsync que
oferecem suporte à programação assíncrona. O .NET Framework 4.5 ou superior contém
muitos membros que funcionam com Async e Await . É possível identificar esses
membros pelo sufixo “Async” que é acrescentado ao nome do membro e um tipo de
retorno de Task ou Task(Of TResult). Por exemplo, a classe System.IO.Stream contém
métodos como CopyToAsync, ReadAsync e WriteAsync, juntamente com os métodos
síncronos CopyTo, Read e Write.

O Windows Runtime também contém vários métodos que você pode usar com Async e
Await em aplicativos do Windows. Para obter mais informações e métodos de exemplo,
confira Chamar APIs assíncronas em C# ou no Visual Basic, Programação assíncrona
(aplicativos do Windows Runtime) e WhenAny: ponte entre o .NET Framework e o
Windows Runtime.

Threads
Os métodos assíncronos destinam-se a ser operações não causadoras de bloqueios.
Uma expressão Await em um método assíncrono não bloqueia o thread atual enquanto
a tarefa aguardada está em execução. Em vez disso, a expressão anterior assina o
restante do método como uma continuação e retorna o controle para o chamador do
método assíncrono.
As palavras-chave Async e Await não fazem com que threads adicionais sejam criados.
Os métodos assíncronos não exigem multithreading, pois um método assíncrono não
executa no próprio thread. O método é executado no contexto de sincronização atual e
usa tempo no thread somente quando o método está ativo. É possível usar Task.Run
para mover o trabalho de CPU associado a um thread em segundo plano, mas um
thread em segundo plano não ajuda com um processo que está apenas aguardando
que os resultados tornem-se disponíveis.

A abordagem baseada em async para a programação assíncrona é preferível às


abordagens existentes em quase todos os casos. Em particular, essa abordagem é
melhor do que BackgroundWorker para operações associadas a E/S porque o código é
mais simples e você não precisa se proteger contra condições de corrida. Em
combinação com Task.Run, a programação async é melhor do que BackgroundWorker
para operações associadas à CPU porque a programação async separa os detalhes de
coordenação da execução do seu código do trabalho que Task.Run transfere ao
threadpool.

Async e Await
Se especificar que um método é um método assíncrono usando um modificador Async,
você habilitará os dois recursos a seguir.

O método assíncrono marcado pode usar Await para designar pontos de


suspensão. O operador await informa ao compilador que o método assíncrono
não poderá continuar além daquele ponto até que o processo assíncrono
aguardado seja concluído. Enquanto isso, o controle retorna para o chamador do
método assíncrono.

A suspensão de um método assíncrono em uma expressão Await não constitui


uma saída de método e os blocos Finally não são executados.

O método assíncrono marcado pode ele próprio ser aguardado por métodos que
o chamam.

Um método assíncrono normalmente contém uma ou mais ocorrências do operador


Await , mas a ausência de expressões Await não causa erro de compilação. Se um
método assíncrono não usa o operador Await para marcar um ponto de suspensão, o
método é executado da mesma forma que um método síncrono, independentemente
do modificador Async . O compilador emite um aviso para esses métodos.

Async e Await são palavras-chave contextuais. Para obter mais informações e exemplos,
consulte os seguintes tópicos:
Async
Operador Await

Tipos e parâmetros de retorno


Na programação .NET Framework, um método assíncrono costuma retornar um Task ou
um Task(Of TResult). Dentro de um método assíncrono, um operador Await é aplicado a
uma tarefa que é retornada de uma chamada para outro método assíncrono.

Especifique Task(Of TResult) como o tipo de retorno se o método contiver uma


instrução Return que especifica um operando do tipo TResult .

Você usará Task como o tipo de retorno caso o método não possua nenhuma instrução
return ou tenha uma instrução return que não retorna um operando.

O exemplo a seguir mostra como você declara e chama um método que retorna um
Task(Of TResult) ou um Task:

VB

' Signature specifies Task(Of Integer)

Async Function TaskOfTResult_MethodAsync() As Task(Of Integer)

Dim hours As Integer

' . . .

' Return statement specifies an integer result.

Return hours

End Function

' Calls to TaskOfTResult_MethodAsync

Dim returnedTaskTResult As Task(Of Integer) = TaskOfTResult_MethodAsync()

Dim intResult As Integer = Await returnedTaskTResult

' or, in a single statement

Dim intResult As Integer = Await TaskOfTResult_MethodAsync()

' Signature specifies Task

Async Function Task_MethodAsync() As Task

' . . .

' The method has no return statement.

End Function

' Calls to Task_MethodAsync

Task returnedTask = Task_MethodAsync()

Await returnedTask

' or, in a single statement

Await Task_MethodAsync()

Cada tarefa retornada representa um trabalho em andamento. Uma tarefa encapsula


informações sobre o estado do processo assíncrono e, consequentemente, o resultado
final do processo ou a exceção que o processo apresenta quando não é bem-sucedido.

Um método assíncrono também pode ser um método Sub . Esse tipo de retorno é usado
principalmente para definir manipuladores de eventos, nos quais o tipo de retorno é
necessário. Os manipuladores de eventos assíncronos geralmente servem como o ponto
de partida para programas assíncronos.

Um método assíncrono que é um procedimento Sub não pode ser esperado, e o


chamador não pode capturar nenhuma exceção acionada pelo método.

O método assíncrono não pode declarar parâmetros ByRef, mas pode chamar métodos
com tais parâmetros.

Para obter mais informações e exemplos, consulte Tipos de retorno assíncronos (Visual
Basic). Para obter mais informações sobre como capturar exceções nos métodos
assíncronos, consulte a Instrução Try... Catch... Finally.

As APIs assíncronas na programação do Windows Runtime têm um dos seguintes tipos


de retorno, que são semelhantes às tarefas:

IAsyncOperation(Of TResult), que corresponde a Task(Of TResult)


IAsyncAction, que corresponde a Task
IAsyncActionWithProgress(Of TProgress)
IAsyncOperationWithProgress(Of TResult, TProgress)

Para obter mais informações e um exemplo, confira Chamar APIs assíncronas em C# ou


no Visual Basic.

Convenção de nomenclatura
Por convenção, deve-se acrescentar "Async" aos nomes dos métodos que têm um
modificador Async .

É possível ignorar a convenção quando um evento, uma classe base ou um contrato de


interface sugere um nome diferente. Por exemplo, você não deve renomear
manipuladores de eventos comuns, como Button1_Click .

Tópicos relacionados e exemplos (Visual


Studio)
Título Descrição Amostra

Instruções passo a Mostra como converter uma solução síncrona do Exemplo de


passo: acessando a WPF em uma solução assíncrona do WPF. O assincronia:
Web usando Async e aplicativo baixa uma série de sites. Programação
Await (Visual Basic) assíncrona com Async
e Await (Visual Basic)

Como estender as Adiciona Task.WhenAll à explicação passo a


instruções passo a passo anterior. O uso de WhenAll inicia todos os
passo assíncronas downloads ao mesmo tempo.
usando Task.WhenAll
(Visual Basic)

Como fazer várias Demonstra como iniciar várias tarefas ao mesmo Exemplo de
solicitações da Web tempo. assincronia: fazer
em paralelo usando várias solicitações da
Async e Await (Visual Web paralelamente
Basic)

Tipos de retorno Ilustra os tipos que os métodos assíncronos


assíncronos (Visual podem retornar e explica quando cada tipo é
Basic) apropriado.

Fluxo de controle em Rastreia em detalhes o fluxo de controle por Exemplo de


programas meio de uma sucessão de expressões de espera assincronia: fluxo de
assíncronos (Visual em um programa assíncrono. controle em
Basic) programas
assíncronos

Ajustando seu Mostra como adicionar a seguinte funcionalidade Exemplo assíncrono:


aplicativo assíncrono à sua solução assíncrona:
ajuste fino de seu
(Visual Basic) aplicativo
- Cancelar uma tarefa assíncrona ou uma lista de
tarefas (Visual Basic)

- Cancelar tarefas assíncronas após um período


(Visual Basic)

- Cancelar as demais tarefas assíncronas depois


que uma delas estiver concluída (Visual Basic)

- Iniciar várias tarefas assíncronas e processá-las


na conclusão (Visual Basic)

Tratando a reentrada Mostra como manipular casos em que uma


em aplicativos operação assíncrona ativa é reiniciada enquanto
assíncronos (Visual está em execução.
Basic)
Título Descrição Amostra

WhenAny: ponte Mostra como criar uma ponte entre tipos Task no Exemplo de
entre o .NET .NET Framework e IAsyncOperations no Windows assincronia: ponte
Framework e o Runtime para que você possa usar WhenAny entre o .NET e o
Windows Runtime com um método do Windows Runtime. Windows Runtime
(AsTask e WhenAny)

Cancelamento Mostra como criar uma ponte entre tipos Task no Exemplo de
assíncrono: ponte .NET Framework e IAsyncOperations no Windows assincronia: ponte
entre o .NET Runtime para que você possa usar entre o .NET e o
Framework e o CancellationTokenSource com um método do Windows Runtime
Windows Runtime Windows Runtime. (AsTask &
Cancellation)

Usando o Async para Lista e demonstra as vantagens de usar async e


acessar arquivos await para acessar arquivos.
(Visual Basic)

Padrão assíncrono Descreve um novo padrão de assincronia no .NET


baseado em tarefa Framework. O padrão baseia-se nos tipos Task e
(TAP) Task(Of TResult).

Vídeos sobre Fornece links para uma variedade de vídeos


assincronia no sobre programação assíncrona.
Channel 9

Exemplo completo
O código a seguir é o arquivo MainWindow.xaml.vb do aplicativo WPF (Windows
Presentation Foundation) discutido neste tópico. É possível baixar o exemplo de
Exemplo de assincronia: exemplo de "Programação assíncrona com Async e Await”.

VB

Imports System.Net.Http

' Example that demonstrates Asynchronous Progamming with Async and Await.

' It uses HttpClient.GetStringAsync to download the contents of a website.

' Sample Output:

' Working . . . . . . .

'

' Length of the downloaded string: 39678.

Class MainWindow

' Mark the event handler with Async so you can use Await in it.

Private Async Sub StartButton_Click(sender As Object, e As


RoutedEventArgs)

' Call and await immediately.

' StartButton_Click suspends until AccessTheWebAsync is done.

Dim contentLength As Integer = Await AccessTheWebAsync()

ResultsTextBox.Text &= $"{vbCrLf}Length of the downloaded string:


{contentLength}.{vbCrLf}"

End Sub

' Three things to note about writing an Async Function:

' - The function has an Async modifier.

' - Its return type is Task or Task(Of T). (See "Return Types"
section.)

' - As a matter of convention, its name ends in "Async".

Async Function AccessTheWebAsync() As Task(Of Integer)

Using client As New HttpClient()

' Call and await separately.

' - AccessTheWebAsync can do other things while GetStringAsync


is also running.

' - getStringTask stores the task we get from the call to


GetStringAsync.

' - Task(Of String) means it is a task which returns a String


when it is done.

Dim getStringTask As Task(Of String) =

client.GetStringAsync("https://docs.microsoft.com/dotnet")

' You can do other work here that doesn't rely on the string
from GetStringAsync.

DoIndependentWork()

' The Await operator suspends AccessTheWebAsync.

' - AccessTheWebAsync does not continue until getStringTask is


complete.

' - Meanwhile, control returns to the caller of


AccessTheWebAsync.

' - Control resumes here when getStringTask is complete.

' - The Await operator then retrieves the String result from
getStringTask.

Dim urlContents As String = Await getStringTask

' The Return statement specifies an Integer result.

' A method which awaits AccessTheWebAsync receives the Length


value.

Return urlContents.Length

End Using

End Function

Sub DoIndependentWork()

ResultsTextBox.Text &= $"Working . . . . . . .{vbCrLf}"

End Sub

End Class

Confira também
Operador Await
Async
Visão geral de atributos (Visual Basic)
Artigo • 22/02/2023 • 4 minutos para o fim da leitura

Os atributos fornecem um método eficiente de associação de metadados, ou


informações declarativas, ao código (assemblies, tipos, métodos, propriedades e etc.).
Após um atributo ser associado a uma entidade de programa, o atributo poderá ser
consultado no tempo de execução usando uma técnica chamada reflexão. Para obter
mais informações, consulte Reflexão (Visual Basic).

Os atributos têm as seguintes propriedades:

Os atributos adicionam metadados ao seu programa. Os metadados são


informações sobre os tipos definidos em um programa. Todos os assemblies .NET
contêm um conjunto de metadados especificado que descreve os tipos e os
membros de tipo definidos no assembly. Você pode adicionar atributos
personalizados para especificar qualquer informação adicional necessária. Para
obter mais informações, consulte Criando atributos personalizados (Visual Basic).

Você pode aplicar um ou mais atributos a assemblies completos, módulos ou


elementos de programas menores, como classes e propriedades.

Os atributos podem aceitar argumentos da mesma forma que métodos e


propriedades.

Seu programa pode examinar seus próprios metadados ou os metadados em


outros programas usando reflexão. Para obter mais informações, consulte
Acessando atributos usando reflexão (Visual Basic).

Usando atributos
Os atributos podem ser colocados em quase qualquer declaração, embora um atributo
específico possa restringir os tipos de declarações nas quais ele é válido. No Visual
Basic, um atributo fica entre colchetes angulares (<>). Ele deverá aparecer
imediatamente antes do elemento ao qual ele é aplicado, na mesma linha.

Neste exemplo, o atributo SerializableAttribute é usado para aplicar uma característica


específica a uma classe:

VB

<System.Serializable()> Public Class SampleClass

' Objects of this type can be serialized.

End Class

Um método com o atributo DllImportAttribute é declarado como este:

VB

Imports System.Runtime.InteropServices

VB

<System.Runtime.InteropServices.DllImport("user32.dll")>

Sub SampleMethod()

End Sub

Mais de um atributo pode ser colocado em uma declaração:

VB

Imports System.Runtime.InteropServices

VB

Sub MethodA(<[In](), Out()> ByVal x As Double)

End Sub

Sub MethodB(<Out(), [In]()> ByVal x As Double)


End Sub

Alguns atributos podem ser especificados mais de uma vez para uma determinada
entidade. Um exemplo de um atributo multiuso é ConditionalAttribute:

VB

<Conditional("DEBUG"), Conditional("TEST1")>

Sub TraceMethod()

End Sub

7 Observação

Por convenção, todos os nomes de atributo terminam com a palavra "Atributo"


para distingui-los de outros itens no .NET Framework. No entanto, você não precisa
especificar o sufixo de atributo ao usar atributos no código. Por exemplo,
[DllImport] é equivalente a [DllImportAttribute] , mas DllImportAttribute é o
nome do atributo real no .NET Framework.
Parâmetros de atributo
Muitos atributos têm parâmetros, que podem ser nomeados, sem nome ou posicionais.
Quaisquer parâmetros posicionais devem ser especificados em uma determinada ordem
e não podem ser omitidos. Os parâmetros nomeados são opcionais e podem ser
especificados em qualquer ordem. Os parâmetros posicionais são especificados
primeiro. Por exemplo, esses três atributos são equivalentes:

VB

<DllImport("user32.dll")>

<DllImport("user32.dll", SetLastError:=False, ExactSpelling:=False)>

<DllImport("user32.dll", ExactSpelling:=False, SetLastError:=False)>

O primeiro parâmetro, o nome da DLL, é posicional e sempre vir em primeiro lugar; os


outros são nomeados. Nesse caso, ambos os parâmetros nomeados são padronizados
como false e, portanto, podem ser omitidos. Consulte a documentação do atributo
individual para obter informações sobre valores de parâmetro padrão.

Destinos de Atributos
O destino de um atributo é a entidade à qual o atributo se aplica. Por exemplo, um
atributo pode ser aplicado a uma classe, um método específico ou um assembly inteiro.
Por padrão, um atributo aplica-se ao elemento que ele precede. Mas você pode
identificar explicitamente, por exemplo, se um atributo é aplicado a um método, ou a
seu parâmetro ou a seu valor retornado.

Para identificar explicitamente um atributo de destino, use a seguinte sintaxe:

VB

<target : attribute-list>

A lista de possíveis valores target é mostrada na tabela a seguir.

Valor de destino Aplica-se a

assembly Assembly inteiro

module Módulo de assembly atual (que é diferente de um módulo do Visual Basic)

O exemplo a seguir mostra como aplicar atributos a módulos e assemblies. Para obter
mais informações, consulte Atributos comuns (Visual Basic).
VB

Imports System.Reflection

<Assembly: AssemblyTitleAttribute("Production assembly 4"),

Module: CLSCompliant(True)>

Usos comuns para os atributos


A lista a seguir inclui alguns dos usos comuns de atributos no código:

Marcar métodos usando o atributo WebMethod nos serviços Web para indicar que o
método deve ser chamado por meio do protocolo SOAP. Para obter mais
informações, consulte WebMethodAttribute.

Descrever como realizar marshaling de parâmetros de método ao interoperar com


código nativo. Para obter mais informações, consulte MarshalAsAttribute.

Descrever as propriedades COM para classes, métodos e interfaces.

Chamar o código não gerenciado usando a classe DllImportAttribute.

Descrever o assembly em termos de versão, título, descrição ou marca.

Descrever quais membros de uma classe serializar para persistência.

Descrever como fazer mapeamento entre nós XML e membros de classe para
serialização de XML.

Descrever os requisitos de segurança para métodos.

Especificar as características usadas para impor a segurança.

Controlar otimizações pelo compilador JIT (Just-In-Time) para que o código


permaneça fácil de depurar.

Obter informações sobre o chamador de um método.

Seções relacionadas
Para obter mais informações, consulte:

Criando atributos personalizados (Visual Basic)

Acessando atributos usando reflexão (Visual Basic)


Como criar uma união do C/C++ usando atributos (Visual Basic)

Atributos comuns (Visual Basic)

Informações do chamador (Visual Basic)

Confira também
Guia de programação do Visual Basic
Reflexão (Visual Basic)
Atributos
Informações do chamador (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Ao usar atributos de informações do chamador, você pode obter informações sobre o


chamador de um método. Você pode obter o caminho do arquivo do código-fonte, o
número da linha no código-fonte e o nome do membro do chamador. Essas
informações são úteis para fins de rastreamento, depuração e criação de ferramentas de
diagnóstico.

Para obter essas informações, você deve usar os atributos que são aplicadas aos
parâmetros opcionais, cada qual com um valor padrão. A tabela a seguir lista os
atributos de informações do chamador que são definidos no namespace de
System.Runtime.CompilerServices:

Atributo Descrição Type

CallerFilePathAttribute O caminho completo do arquivo de origem que String


contém o chamador. Esse é o caminho do
arquivo no momento da compilação.

CallerLineNumberAttribute Número da linha no arquivo fonte no qual o Integer


método é chamado.

CallerMemberNameAttribute Nome do método ou da propriedade do String


chamador. Consulte Nomes dos membros mais
adiante neste tópico.

CallerArgumentExpressionAttribute Expressão usada pelo chamador para um String


argumento. Consulte Expressões de Chamador
adiante, neste tópico.

Exemplo
O exemplo a seguir mostra como usar os atributos de informações do chamador. Em
cada chamada para o método TraceMessage , as informações do chamador são
substituídas como argumentos para os parâmetros opcionais.

VB

Private Sub DoProcessing()

TraceMessage("Something happened.")

End Sub

Public Sub TraceMessage(message As String,

<System.Runtime.CompilerServices.CallerMemberName> Optional
memberName As String = Nothing,

<System.Runtime.CompilerServices.CallerFilePath> Optional
sourcefilePath As String = Nothing,

<System.Runtime.CompilerServices.CallerLineNumber()> Optional
sourceLineNumber As Integer = 0)

System.Diagnostics.Trace.WriteLine("message: " & message)

System.Diagnostics.Trace.WriteLine("member name: " & memberName)

System.Diagnostics.Trace.WriteLine("source file path: " &


sourcefilePath)

System.Diagnostics.Trace.WriteLine("source line number: " &


sourceLineNumber)

End Sub

' Sample output:

' message: Something happened.

' member name: DoProcessing

' source file path: C:\Users\username\Documents\Visual Studio


2012\Projects\CallerInfoVB\CallerInfoVB\Form1.vb

' source line number: 15

Comentários
Você deve especificar um valor padrão explícito para cada parâmetro opcional. Você não
pode aplicar atributos de informações do chamador aos parâmetros que não são
especificados como opcionais.

Os atributos de informações do chamador não tornam um parâmetro opcional. Em vez


disso, eles afetam o valor padrão que é passado quando o argumento é omitido.

Os valores de informações do chamador são emitidos como literais em linguagem


intermediária (IL) em tempo de compilação. Ao contrário dos resultados da propriedade
StackTrace para exceções, os resultados não são afetados por ofuscamento.

Você pode fornecer explicitamente os argumentos opcionais para controlar as


informações do chamador ou ocultá-las.

Nomes dos membros


Você pode usar o atributo CallerMemberName para evitar especificar o nome do membro
como um argumento String ao método chamado. Ao usar essa técnica, você evita o
problema de que a Refatoração de Renomeação não altera os valores de String . Esse
benefício é especialmente útil para as seguintes tarefas:

Usar rotinas de rastreamento e diagnóstico.


Implementando a interface INotifyPropertyChanged ao associar dados. Essa
interface permite que a propriedade de um objeto notifique um controle
associado sobre a alteração da propriedade de modo que o controle possa exibir
as informações atualizadas. Sem o atributo CallerMemberName , você deve
especificar o nome da propriedade como um literal.

O gráfico a seguir mostra os nomes de membros que são retornados quando você usa
o atributo CallerMemberName .

As chamadas ocorrem Resultado de nome de membro


em

Método, propriedade ou O nome do método, da propriedade ou do evento em que a


evento chamada foi originada.

Construtor A cadeia de caracteres “.ctor”

Construtor estático A cadeia de caracteres “.cctor”

Destruidor A cadeia de caracteres "Finalize"

Operadores usuário ou O nome gerado para o membro, por exemplo, “op_Addition”.


conversões definidos pelo
usuário

Construtor de atributos O nome do membro ao qual o atributo se aplica. Se o atributo é


qualquer elemento dentro de um membro (como um parâmetro, um
valor de retorno, ou um parâmetro de tipo genérico), esse resultado
é o nome do membro associado a esse elemento.

Nenhum membro O valor padrão do parâmetro opcional.


contentor (por exemplo,
nível de assembly ou
atributos que são
aplicadas aos tipos)

Expressões de chamador
Você usa o System.Runtime.CompilerServices.CallerArgumentExpressionAttribute
quando quer capturar a expressão usada para um argumento. As bibliotecas de
diagnóstico podem querer fornecer mais detalhes sobre as expressões passadas para um
argumento. Ao fornecer a expressão que disparou o diagnóstico, além do nome do
parâmetro, os desenvolvedores têm mais detalhes sobre a condição que disparou o
diagnóstico. Essas informações extras facilitam a correção. O método a seguir usa o
CallerArgumentExpressionAttribute para exibir a condição que deve ser True :
VB

Public Shared Sub ValidateArgument(ByVal parameterName As String,

ByVal condition As Boolean,

<CallerArgumentExpression("condition")> ByVal Optional message As String? =


Nothing)

If Not condition Then

Throw New ArgumentException($"Argument failed validation:


<{message}>", parameterName)

End If

End Sub

Confira também
Atributos (Visual Basic)
Atributos comuns (Visual Basic)
Parâmetros Opcionais
Conceitos de Programação (Visual Basic)
Coleções (Visual Basic)
Artigo • 22/02/2023 • 15 minutos para o fim da leitura

Para muitos aplicativos, você desejará criar e gerenciar grupos de objetos relacionados.
Há duas maneiras de agrupar objetos: criando matrizes de objetos e criando coleções
de objetos.

As matrizes são mais úteis para criar e trabalhar com um número fixo de objetos
fortemente tipados. Para obter informações sobre matrizes, consulte Matrizes.

As coleções fornecem uma maneira mais flexível de trabalhar com grupos de objetos.
Ao contrário das matrizes, o grupo de objetos com o qual você trabalha pode crescer e
reduzir dinamicamente conforme as necessidades do aplicativo são alteradas. Para
algumas coleções, você pode atribuir uma chave para qualquer objeto que coloque na
coleção para que você possa recuperar rapidamente o objeto usando a chave.

Uma coleção é uma classe, portanto você deve declarar uma instância da classe antes
de adicionar elementos a essa coleção.

Se a coleção contiver elementos de apenas um tipo de dados, você poderá usar uma
das classes no namespace System.Collections.Generic. Uma coleção genérica impõe
segurança de tipos para que nenhum outro tipo de dados possa ser adicionado a ela.
Ao recuperar um elemento de uma coleção genérica, você não precisa determinar seu
tipo de dados ou convertê-lo.

7 Observação

Para os exemplos neste tópico, inclua instruções Imports para os namespaces


System.Collections.Generic e System.Linq .

Usando uma coleção simples


Os exemplos nesta seção usam a classe genérica List<T>, que habilita você a trabalhar
com uma lista de objetos fortemente tipados.

O exemplo a seguir cria uma lista de cadeias de caracteres e, em seguida, itera nas
cadeias de caracteres usando uma instrução For Each…Next.

VB
' Create a list of strings.

Dim salmons As New List(Of String)

salmons.Add("chinook")

salmons.Add("coho")

salmons.Add("pink")

salmons.Add("sockeye")

' Iterate through the list.

For Each salmon As String In salmons

Console.Write(salmon & " ")

Next

'Output: chinook coho pink sockeye

Se o conteúdo de uma coleção for conhecido com antecedência, você poderá usar um
inicializador de coleção para inicializar a coleção. Para obter mais informações, consulte
Inicializadores de coleção.

O exemplo a seguir é igual ao exemplo anterior, exceto que um inicializador de coleção


é usado para adicionar elementos à coleção.

VB

' Create a list of strings by using a

' collection initializer.

Dim salmons As New List(Of String) From

{"chinook", "coho", "pink", "sockeye"}

For Each salmon As String In salmons

Console.Write(salmon & " ")

Next

'Output: chinook coho pink sockeye

Você pode usar uma instrução For…Next em vez de uma instrução For Each para iterar
em uma coleção. Você realiza isso acessando os elementos da coleção pela posição do
índice. O índice dos elementos começa em 0 e termina na contagem de elementos,
menos de 1.

O exemplo a seguir itera nos elementos de uma coleção usando For…Next em vez de
For Each .

VB

Dim salmons As New List(Of String) From

{"chinook", "coho", "pink", "sockeye"}

For index = 0 To salmons.Count - 1

Console.Write(salmons(index) & " ")

Next

'Output: chinook coho pink sockeye

O exemplo a seguir remove um elemento da coleção, especificando o objeto a ser


removido.

VB

' Create a list of strings by using a

' collection initializer.

Dim salmons As New List(Of String) From

{"chinook", "coho", "pink", "sockeye"}

' Remove an element in the list by specifying

' the object.

salmons.Remove("coho")

For Each salmon As String In salmons

Console.Write(salmon & " ")

Next

'Output: chinook pink sockeye

O exemplo a seguir remove elementos de uma lista genérica. Em vez de uma instrução
For Each , é usada uma instrução For…Next que itera em ordem decrescente. Isso é feito
porque o método RemoveAt faz com que os elementos após um elemento removido
tenham um valor de índice menor.

VB

Dim numbers As New List(Of Integer) From

{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}

' Remove odd numbers.

For index As Integer = numbers.Count - 1 To 0 Step -1

If numbers(index) Mod 2 = 1 Then

' Remove the element by specifying

' the zero-based index in the list.

numbers.RemoveAt(index)

End If

Next

' Iterate through the list.

' A lambda expression is placed in the ForEach method

' of the List(T) object.

numbers.ForEach(

Sub(number) Console.Write(number & " "))

' Output: 0 2 4 6 8

Para o tipo dos elementos na List<T>, você também pode definir sua própria classe. No
exemplo a seguir, a classe Galaxy que é usada pela List<T> é definida no código.

VB

Private Sub IterateThroughList()

Dim theGalaxies As New List(Of Galaxy) From

New Galaxy With {.Name = "Tadpole", .MegaLightYears = 400},

New Galaxy With {.Name = "Pinwheel", .MegaLightYears = 25},

New Galaxy With {.Name = "Milky Way", .MegaLightYears = 0},

New Galaxy With {.Name = "Andromeda", .MegaLightYears = 3}

For Each theGalaxy In theGalaxies

With theGalaxy

Console.WriteLine(.Name & " " & .MegaLightYears)

End With

Next

' Output:

' Tadpole 400

' Pinwheel 25

' Milky Way 0

' Andromeda 3

End Sub

Public Class Galaxy

Public Property Name As String

Public Property MegaLightYears As Integer

End Class

Tipos de coleções
Várias coleções comuns são fornecidas pelo .NET Framework. Cada tipo de coleção é
projetado para uma finalidade específica.

Algumas das classes de coleção comuns são descritas nesta seção:

Classes System.Collections.Generic

Classes System.Collections.Concurrent

Classes System.Collections

Classe Collection do Visual Basic

Classes System.Collections.Generic
Você pode criar uma coleção genérica usando uma das classes no namespace
System.Collections.Generic. Uma coleção genérica é útil quando cada item na coleção
tem o mesmo tipo de dados. Uma coleção genérica impõe tipagem forte, permitindo
que apenas o tipo de dados desejado seja adicionado.

A tabela a seguir lista algumas das classes frequentemente usadas do namespace


System.Collections.Generic:

Classe Descrição

Dictionary<TKey,TValue> Representa uma coleção de pares chave-valor organizados com base


na chave.

List<T> Representa uma lista de objetos que podem ser acessados por índice.
Fornece métodos para pesquisar, classificar e modificar listas.

Queue<T> Representa uma coleção de objetos PEPS (primeiro a entrar, primeiro


a sair).

SortedList<TKey,TValue> Representa uma coleção de pares chave/valor que são classificados


por chave com base na implementação de IComparer<T> associada.

Stack<T> Representa uma coleção de objetos UEPS (último a entrar, primeiro a


sair).

Para obter informações adicionais, consulte Tipos de coleção comumente usados,


Selecionando uma classe de coleção e System.Collections.Generic.

Classes System.Collections.Concurrent
No .NET Framework 4 ou mais recente, as coleções no namespace
System.Collections.Concurrent fornecem operações thread-safe eficientes para acessar
itens da coleção de vários threads.

As classes no namespace System.Collections.Concurrent deverão ser usadas em vez dos


tipos correspondentes nos namespaces System.Collections.Generic e System.Collections
sempre que vários threads estiverem acessando a coleção simultaneamente. Para obter
mais informações, veja Coleções thread-safe e System.Collections.Concurrent.

Algumas classes incluídas no namespace System.Collections.Concurrent são


BlockingCollection<T>, ConcurrentDictionary<TKey,TValue>, ConcurrentQueue<T> e
ConcurrentStack<T>.

Classes System.Collections
As classes no namespace System.Collections não armazenam elementos como objetos
especificamente tipados, mas como objetos do tipo Object .

Sempre que possível, você deve usar as coleções genéricas no namespace


System.Collections.Generic ou no System.Collections.Concurrent em vez dos tipos
herdados no namespace System.Collections .

A tabela a seguir lista algumas das classes frequentemente usadas no namespace


System.Collections :

Classe Descrição

ArrayList Representa uma matriz de objetos cujo tamanho é aumentado dinamicamente


conforme necessário.

Hashtable Representa uma coleção de pares chave-valor organizados com base no código hash
da chave.

Queue Representa uma coleção de objetos PEPS (primeiro a entrar, primeiro a sair).

Stack Representa uma coleção de objetos UEPS (último a entrar, primeiro a sair).

O namespace System.Collections.Specialized fornece classes de coleções especializadas


e fortemente tipadas, como coleções somente de cadeias de caracteres, bem como de
dicionários híbridos e de listas vinculadas.

Classe de Coleção do Visual Basic


Você pode usar a classe Collection do Visual Basic para acessar um item de coleção
usando um índice numérico ou uma chave String . Você pode adicionar itens a um
objeto de coleção com ou sem especificar uma chave. Se você adicionar um item sem
uma chave, deverá usar seu índice numérico para acessá-lo.

A classe Collection do Visual Basic armazena todos os seus elementos como tipo
Object , para que você possa adicionar um item de qualquer tipo de dados. Não há
proteção contra tipos de dados inadequados que estejam sendo adicionados.

Quando você usa a classe Collection do Visual Basic, o primeiro item em uma coleção
tem um índice de 1. Isso difere das classes de coleção do .NET Framework, para as quais
o índice inicial é 0.

Sempre que possível, você deve usar as coleções genéricas no namespace


System.Collections.Generic ou no System.Collections.Concurrent em vez da classe
Collection do Visual Basic.
Para obter mais informações, consulte Collection.

Implementando uma coleção de pares chave-


valor
A coleção genérica Dictionary<TKey,TValue> permite que você acesse elementos em
uma coleção usando a chave de cada elemento. Cada adição ao dicionário consiste em
um valor e a respectiva chave associada. A recuperação de um valor usando sua chave é
rápida, porque a classe Dictionary é implementada como uma tabela de hash.

O exemplo a seguir cria uma coleção Dictionary e itera no dicionário usando uma
instrução For Each .

VB

Private Sub IterateThroughDictionary()

Dim elements As Dictionary(Of String, Element) = BuildDictionary()

For Each kvp As KeyValuePair(Of String, Element) In elements

Dim theElement As Element = kvp.Value

Console.WriteLine("key: " & kvp.Key)

With theElement

Console.WriteLine("values: " & .Symbol & " " &

.Name & " " & .AtomicNumber)

End With

Next

End Sub

Private Function BuildDictionary() As Dictionary(Of String, Element)

Dim elements As New Dictionary(Of String, Element)

AddToDictionary(elements, "K", "Potassium", 19)

AddToDictionary(elements, "Ca", "Calcium", 20)

AddToDictionary(elements, "Sc", "Scandium", 21)

AddToDictionary(elements, "Ti", "Titanium", 22)

Return elements

End Function

Private Sub AddToDictionary(ByVal elements As Dictionary(Of String,


Element),

ByVal symbol As String, ByVal name As String, ByVal atomicNumber As Integer)

Dim theElement As New Element

theElement.Symbol = symbol

theElement.Name = name

theElement.AtomicNumber = atomicNumber

elements.Add(Key:=theElement.Symbol, value:=theElement)

End Sub

Public Class Element

Public Property Symbol As String

Public Property Name As String

Public Property AtomicNumber As Integer

End Class

Para, em vez disso, usar um inicializador de coleção para criar a coleção Dictionary ,
você pode substituir os métodos BuildDictionary e AddToDictionary pelo seguinte
método.

VB

Private Function BuildDictionary2() As Dictionary(Of String, Element)

Return New Dictionary(Of String, Element) From

{"K", New Element With

{.Symbol = "K", .Name = "Potassium", .AtomicNumber = 19}},

{"Ca", New Element With

{.Symbol = "Ca", .Name = "Calcium", .AtomicNumber = 20}},

{"Sc", New Element With

{.Symbol = "Sc", .Name = "Scandium", .AtomicNumber = 21}},

{"Ti", New Element With

{.Symbol = "Ti", .Name = "Titanium", .AtomicNumber = 22}}

End Function

O exemplo a seguir usa o método ContainsKey e a propriedade Item[] de Dictionary


para localizar rapidamente um item por chave. A propriedade Item permite que você
acesse um item na coleção elements usando o código elements(symbol) no Visual Basic.

VB

Private Sub FindInDictionary(ByVal symbol As String)

Dim elements As Dictionary(Of String, Element) = BuildDictionary()

If elements.ContainsKey(symbol) = False Then

Console.WriteLine(symbol & " not found")

Else

Dim theElement = elements(symbol)

Console.WriteLine("found: " & theElement.Name)

End If

End Sub

O exemplo a seguir usa o método TryGetValue para localizar rapidamente um item por
chave.
VB

Private Sub FindInDictionary2(ByVal symbol As String)

Dim elements As Dictionary(Of String, Element) = BuildDictionary()

Dim theElement As Element = Nothing

If elements.TryGetValue(symbol, theElement) = False Then

Console.WriteLine(symbol & " not found")

Else

Console.WriteLine("found: " & theElement.Name)

End If

End Sub

Usando LINQ para acessar uma coleção


A LINQ (consulta integrada à linguagem) pode ser usada para acessar coleções. As
consultas LINQ fornecem recursos de filtragem, classificação e agrupamento. Para obter
mais informações, consulte Introdução à LINQ no Visual Basic.

O exemplo a seguir executa uma consulta LINQ em uma List genérica. A consulta LINQ
retorna uma coleção diferente que contém os resultados.

VB

Private Sub ShowLINQ()

Dim elements As List(Of Element) = BuildList()

' LINQ Query.

Dim subset = From theElement In elements

Where theElement.AtomicNumber < 22

Order By theElement.Name

For Each theElement In subset

Console.WriteLine(theElement.Name & " " & theElement.AtomicNumber)

Next

' Output:

' Calcium 20

' Potassium 19

' Scandium 21

End Sub

Private Function BuildList() As List(Of Element)

Return New List(Of Element) From

{New Element With

{.Symbol = "K", .Name = "Potassium", .AtomicNumber = 19}},

{New Element With

{.Symbol = "Ca", .Name = "Calcium", .AtomicNumber = 20}},

{New Element With

{.Symbol = "Sc", .Name = "Scandium", .AtomicNumber = 21}},

{New Element With

{.Symbol = "Ti", .Name = "Titanium", .AtomicNumber = 22}}

End Function

Public Class Element

Public Property Symbol As String

Public Property Name As String

Public Property AtomicNumber As Integer

End Class

Classificando uma coleção


O exemplo a seguir ilustra um procedimento para a classificação de uma coleção. O
exemplo classifica instâncias da classe Car que estão armazenados em uma List<T>. A
classe Car implementa a interface IComparable<T>, que requer que o método
CompareTo seja implementado.

Cada chamada ao método CompareTo faz uma comparação única que é usada para
classificação. Os códigos escritos pelo usuário no método CompareTo retornam um valor
para cada comparação do objeto atual com outro objeto. O valor retornado será menor
que zero se o objeto atual for menor que o outro objeto, maior que zero se o objeto
atual for maior que o outro objeto e zero, se eles forem iguais. Isso permite que você
defina no código os critérios para maior que, menor que e igual.

No método ListCars , a instrução cars.Sort() classifica a lista. Essa chamada para o


método Sort da List<T> faz com que o método CompareTo seja chamado
automaticamente para os objetos Car na List .

VB

Public Sub ListCars()

' Create some new cars.

Dim cars As New List(Of Car) From

New Car With {.Name = "car1", .Color = "blue", .Speed = 20},

New Car With {.Name = "car2", .Color = "red", .Speed = 50},

New Car With {.Name = "car3", .Color = "green", .Speed = 10},

New Car With {.Name = "car4", .Color = "blue", .Speed = 50},

New Car With {.Name = "car5", .Color = "blue", .Speed = 30},

New Car With {.Name = "car6", .Color = "red", .Speed = 60},

New Car With {.Name = "car7", .Color = "green", .Speed = 50}

' Sort the cars by color alphabetically, and then by speed

' in descending order.

cars.Sort()

' View all of the cars.

For Each thisCar As Car In cars

Console.Write(thisCar.Color.PadRight(5) & " ")

Console.Write(thisCar.Speed.ToString & " ")

Console.Write(thisCar.Name)

Console.WriteLine()

Next

' Output:

' blue 50 car4

' blue 30 car5

' blue 20 car1

' green 50 car7

' green 10 car3

' red 60 car6

' red 50 car2

End Sub

Public Class Car

Implements IComparable(Of Car)

Public Property Name As String

Public Property Speed As Integer

Public Property Color As String

Public Function CompareTo(ByVal other As Car) As Integer _

Implements System.IComparable(Of Car).CompareTo

' A call to this method makes a single comparison that is

' used for sorting.

' Determine the relative order of the objects being compared.

' Sort by color alphabetically, and then by speed in

' descending order.

' Compare the colors.

Dim compare As Integer

compare = String.Compare(Me.Color, other.Color, True)

' If the colors are the same, compare the speeds.

If compare = 0 Then

compare = Me.Speed.CompareTo(other.Speed)

' Use descending order for speed.

compare = -compare

End If

Return compare

End Function

End Class

Definindo uma coleção personalizada


Você pode definir uma coleção implementando a interface IEnumerable<T> ou
IEnumerable. Para obter informações adicionais, consulte Enumerar uma coleção.

Embora seja possível definir uma coleção personalizada, é melhor usar as coleções que
estão incluídas no .NET Framework, que estão descritas em Tipos de coleções
anteriormente neste tópico.

O exemplo a seguir define uma classe de coleção personalizada chamada AllColors .


Essa classe implementa a interface IEnumerable, que requer que o método
GetEnumerator seja implementado.

O método GetEnumerator retorna uma instância da classe ColorEnumerator .


ColorEnumerator implementa a interface IEnumerator, que requer que a propriedade
Current, o método MoveNext e o método Reset sejam implementados.

VB

Public Sub ListColors()


Dim colors As New AllColors()

For Each theColor As Color In colors

Console.Write(theColor.Name & " ")

Next

Console.WriteLine()

' Output: red blue green

End Sub

' Collection class.

Public Class AllColors

Implements System.Collections.IEnumerable

Private _colors() As Color =

New Color With {.Name = "red"},

New Color With {.Name = "blue"},

New Color With {.Name = "green"}

Public Function GetEnumerator() As System.Collections.IEnumerator _

Implements System.Collections.IEnumerable.GetEnumerator

Return New ColorEnumerator(_colors)

' Instead of creating a custom enumerator, you could

' use the GetEnumerator of the array.

'Return _colors.GetEnumerator

End Function

' Custom enumerator.

Private Class ColorEnumerator

Implements System.Collections.IEnumerator

Private _colors() As Color

Private _position As Integer = -1

Public Sub New(ByVal colors() As Color)

_colors = colors

End Sub

Public ReadOnly Property Current() As Object _

Implements System.Collections.IEnumerator.Current

Get

Return _colors(_position)

End Get

End Property

Public Function MoveNext() As Boolean _

Implements System.Collections.IEnumerator.MoveNext

_position += 1

Return (_position < _colors.Length)

End Function

Public Sub Reset() Implements System.Collections.IEnumerator.Reset

_position = -1

End Sub

End Class

End Class

' Element class.

Public Class Color

Public Property Name As String

End Class

Iterators
Um iterador é usado para realizar uma iteração personalizada em uma coleção. Um
iterador pode ser um método ou um acessador get . Um iterador usa uma instrução
Yield para retornar um elemento da coleção por vez.

Você chama um iterador usando uma instrução For Each...Next. Cada iteração do loop
For Each chama o iterador. Quando uma instrução Yield é alcançada no iterador, uma

expressão é retornada e o local atual no código é retido. A execução será reiniciada


desse local na próxima vez que o iterador for chamado.

Para obter mais informações, consulte Iteradores (Visual Basic).


O exemplo a seguir usa um método iterador. O método iterador tem uma instrução
Yield que está dentro de um loop For…Next. No método ListEvenNumbers , cada
iteração do corpo da instrução For Each cria uma chamada ao método iterador, que
avança para a próxima instrução Yield .

VB

Public Sub ListEvenNumbers()

For Each number As Integer In EvenSequence(5, 18)

Console.Write(number & " ")

Next

Console.WriteLine()

' Output: 6 8 10 12 14 16 18

End Sub

Private Iterator Function EvenSequence(

ByVal firstNumber As Integer, ByVal lastNumber As Integer) _

As IEnumerable(Of Integer)

' Yield even numbers in the range.

For number = firstNumber To lastNumber

If number Mod 2 = 0 Then

Yield number

End If

Next

End Function

Confira também
Inicializadores de Coleção
Conceitos de Programação (Visual Basic)
Instrução Option Strict
LINQ to Objects (Visual Basic)
LINQ paralelo (PLINQ)
Coleções e Estruturas de Dados
Selecionando uma classe de coleção
Comparações e Classificações Dentro de Coleções
Quando Usar Coleções Genéricas
Covariância e contravariância (Visual
Basic)
Artigo • 15/02/2023 • 3 minutos para o fim da leitura

No Visual Basic, a covariância e a contravariância habilitam a conversão de referência


implícita para tipos de matriz, tipos delegados e argumentos de tipo genérico. A
covariância preserva a compatibilidade de atribuição, e a contravariância reverte.

O código a seguir demonstra a diferença entre a compatibilidade da atribuição, a


covariância e a contravariância.

VB

' Assignment compatibility.

Dim str As String = "test"

' An object of a more derived type is assigned to an object of a less


derived type.

Dim obj As Object = str

' Covariance.

Dim strings As IEnumerable(Of String) = New List(Of String)()

' An object that is instantiated with a more derived type argument

' is assigned to an object instantiated with a less derived type argument.

' Assignment compatibility is preserved.

Dim objects As IEnumerable(Of Object) = strings

' Contravariance.

' Assume that there is the following method in the class:

' Shared Sub SetObject(ByVal o As Object)

' End Sub

Dim actObject As Action(Of Object) = AddressOf SetObject

' An object that is instantiated with a less derived type argument

' is assigned to an object instantiated with a more derived type argument.

' Assignment compatibility is reversed.

Dim actString As Action(Of String) = actObject

A covariância para matrizes permite a conversão implícita de uma matriz de um tipo


mais derivado para uma matriz de um tipo menos derivado. Mas essa operação não é
fortemente tipada, conforme mostrado no exemplo de código a seguir.

VB

Dim array() As Object = New String(10) {}

' The following statement produces a run-time exception.

' array(0) = 10

O suporte de covariância e contravariância aos grupos de método permite a


correspondência de assinaturas de método com tipos de delegados. Isso permite
atribuir a delegados não apenas os métodos que têm correspondência de assinaturas,
mas também métodos que retornam tipos mais derivados (covariância) ou que aceitam
parâmetros que têm tipos menos derivados (contravariância) do que o especificado pelo
tipo delegado. Para obter mais informações, consulte Variação em delegados (Visual
Basic) e Usando variação em delegados (Visual Basic).

O exemplo de código a seguir mostra o suporte da covariância e da contravariância


para grupos de método.

VB

Shared Function GetObject() As Object

Return Nothing

End Function

Shared Sub SetObject(ByVal obj As Object)

End Sub

Shared Function GetString() As String

Return ""

End Function

Shared Sub SetString(ByVal str As String)

End Sub

Shared Sub Test()

' Covariance. A delegate specifies a return type as object,

' but you can assign a method that returns a string.

Dim del As Func(Of Object) = AddressOf GetString

' Contravariance. A delegate specifies a parameter type as string,

' but you can assign a method that takes an object.

Dim del2 As Action(Of String) = AddressOf SetObject

End Sub

No .NET Framework 4 ou mais recente, o Visual Basic dá suporte à covariância e à


contravariância em interfaces e delegados genéricos e permite a conversão implícita de
parâmetros de tipo genérico. Para obter mais informações, consulte Variação em
interfaces genéricas (Visual Basic) e Variação em delegados (Visual Basic).

O exemplo de código a seguir mostra a conversão de referência implícita para interfaces


genéricas.

VB
Dim strings As IEnumerable(Of String) = New List(Of String)

Dim objects As IEnumerable(Of Object) = strings

Uma interface ou delegado genérico será chamado variante se seus parâmetros


genéricos forem declarados covariantes ou contravariantes. O Visual Basic permite que
você crie suas próprias interfaces variantes e delegados. Para obter mais informações,
consulte Criando interfaces genéricas variantes (Visual Basic) e Variação em delegados
(Visual Basic).

Tópicos Relacionados
Título Descrição

Variação em interfaces Discute a covariância e a contravariância em interfaces genéricas e


genéricas (Visual Basic) fornece uma lista de interfaces genéricas variáveis no .NET
Framework.

Criando interfaces genéricas Mostra como criar interfaces variantes personalizadas.


variantes (Visual Basic)

Usando variação em Mostra como o suporte de covariância e contravariância nas


interfaces para coleções interfaces IEnumerable<T> e IComparable<T> pode ajudar na
genéricas (Visual Basic) reutilização do código.

Variação em delegados Discute a covariância e a contravariância em interfaces genéricas e


(Visual Basic) não genéricas e fornece uma lista de interfaces genéricas variáveis
no .NET Framework.

Usando variação em Mostra como usar o suporte de covariância e contravariância em


delegados (Visual Basic) delegados não genéricos para corresponder às assinaturas de
método com tipos delegados.

Usando variação para Mostra como o suporte de covariância e contravariância nos


delegados genéricos Func e delegados Func e Action pode ajudar na reutilização do código.
Action (Visual Basic)
Árvores de expressão (Visual Basic)
Artigo • 22/02/2023 • 4 minutos para o fim da leitura

Árvores de expressão representam código em uma estrutura de dados de árvore, onde


cada nó é, por exemplo, uma expressão, uma chamada de método ou uma operação
binária como x < y .

Você pode compilar e executar código representado por árvores de expressão. Isso
permite a modificação dinâmica de código executável, a execução de consultas LINQ
em vários bancos de dados e a criação de consultas dinâmicas. Para obter mais
informações sobre árvores de expressão no LINQ, consulte Como usar árvores de
expressão para compilar consultas dinâmicas (Visual Basic).

Árvores de expressão também são usadas no runtime de linguagem dinâmica (DLR)


para fornecer interoperabilidade entre linguagens dinâmicas e o .NET Framework e
permitir que gravadores compiladores emitam árvores de expressão em vez de
Microsoft intermediate language (MSIL). Para obter mais informações sobre o DLR,
consulte Visão geral do Dynamic Language Runtime.

Você pode fazer o compilador C# ou do Visual Basic criar uma árvore de expressões
para você com base em uma expressão lambda anônima ou criar árvores de expressão
manualmente usando o namespace System.Linq.Expressions.

Criando árvores de expressão de expressões


Lambda
Quando uma expressão lambda é atribuída a uma variável do tipo
Expression<TDelegate>, o compilador emite código para criar uma árvore de expressão
que representa a expressão lambda.

Os compiladores do Visual Basic podem gerar árvores de expressão de expressões


lambdas (ou lambdas de linha única). Ele não é possível analisar instruções lambdas (ou
lambdas de várias linhas). Para obter mais informações sobre expressões lambda no
Visual Basic, consulte Expressões lambda.

Os exemplos de código a seguir demonstram como fazer os compiladores do Visual


Basic criarem uma árvore de expressão que representa a expressão lambda
Function(num) num < 5 .

VB
Dim lambda As Expression(Of Func(Of Integer, Boolean)) =

Function(num) num < 5

Criando árvores de expressão usando a API


Para criar árvores de expressão usando a API, use a classe Expression. Essa classe
contém métodos de fábrica estáticos para criar nós de árvore de expressão de tipos
específicos, por exemplo, ParameterExpression, que representa uma variável ou
parâmetro, ou MethodCallExpression, que representa uma chamada de método.
ParameterExpression, MethodCallExpression e os outros tipos específicos de expressão
também são definidos no namespace System.Linq.Expressions. Esses tipos derivam do
tipo abstrato Expression.

O exemplo de código a seguir demonstra como criar uma árvore de expressão que
representa a expressão lambda Function(num) num < 5 usando a API.

VB

' Import the following namespace to your project: System.Linq.Expressions

' Manually build the expression tree for the lambda expression num => num <
5.

Dim numParam As ParameterExpression = Expression.Parameter(GetType(Integer),


"num")

Dim five As ConstantExpression = Expression.Constant(5, GetType(Integer))

Dim numLessThanFive As BinaryExpression = Expression.LessThan(numParam,


five)

Dim lambda1 As Expression(Of Func(Of Integer, Boolean)) =

Expression.Lambda(Of Func(Of Integer, Boolean))(

numLessThanFive,

New ParameterExpression() {numParam})

No .NET Framework 4 ou posterior, a API de árvores de expressão também dá suporte a


atribuições e expressões de fluxo de controle, como loops, blocos condicionais e blocos
try-catch . Usando a API, você pode criar árvores de expressão mais complexas do que
aquelas que podem ser criadas por meio de expressões lambda pelos compiladores do
Visual Basic. O exemplo a seguir demonstra como criar uma árvore de expressão que
calcula o fatorial de um número.

VB

' Creating a parameter expression.

Dim value As ParameterExpression =

Expression.Parameter(GetType(Integer), "value")

' Creating an expression to hold a local variable.

Dim result As ParameterExpression =

Expression.Parameter(GetType(Integer), "result")

' Creating a label to jump to from a loop.

Dim label As LabelTarget = Expression.Label(GetType(Integer))

' Creating a method body.

Dim block As BlockExpression = Expression.Block(

New ParameterExpression() {result},

Expression.Assign(result, Expression.Constant(1)),

Expression.Loop(

Expression.IfThenElse(

Expression.GreaterThan(value, Expression.Constant(1)),

Expression.MultiplyAssign(result,

Expression.PostDecrementAssign(value)),

Expression.Break(label, result)

),

label

' Compile an expression tree and return a delegate.

Dim factorial As Integer =

Expression.Lambda(Of Func(Of Integer, Integer))(block, value).Compile()


(5)

Console.WriteLine(factorial)

' Prints 120.

Para saber mais, confira Gerar métodos dinâmicos com árvores de expressão no Visual
Studio 2010 , que também se aplica a versões mais recentes do Visual Studio.

Analisando árvores de expressão


O exemplo de código a seguir demonstra como a árvore de expressão que representa a
expressão lambda Function(num) num < 5 pode ser decomposta em suas partes.

VB

' Import the following namespace to your project: System.Linq.Expressions

' Create an expression tree.

Dim exprTree As Expression(Of Func(Of Integer, Boolean)) = Function(num) num


< 5

' Decompose the expression tree.

Dim param As ParameterExpression = exprTree.Parameters(0)

Dim operation As BinaryExpression = exprTree.Body

Dim left As ParameterExpression = operation.Left

Dim right As ConstantExpression = operation.Right

Console.WriteLine(String.Format("Decomposed expression: {0} => {1} {2} {3}",

param.Name, left.Name, operation.NodeType, right.Value))

' This code produces the following output:

'

' Decomposed expression: num => num LessThan 5

Imutabilidade das árvores de expressão


Árvores de expressão devem ser imutáveis. Isso significa que se você deseja modificar
uma árvore de expressão, deverá criar uma nova árvore de expressão, copiando a
existente e substituindo seus nós. Você pode usar um visitantes de árvore expressão
para percorrer a árvore de expressão existente. Para obter mais informações, consulte
Como modificar árvores de expressão (Visual Basic).

Compilando árvores de expressão


O tipo Expression<TDelegate> fornece o método Compile que compila o código
representado por uma árvore de expressão para um delegado executável.

O exemplo de código a seguir demonstra como compilar uma árvore de expressão e


executar o código resultante.

VB

' Creating an expression tree.

Dim expr As Expression(Of Func(Of Integer, Boolean)) =

Function(num) num < 5

' Compiling the expression tree into a delegate.

Dim result As Func(Of Integer, Boolean) = expr.Compile()

' Invoking the delegate and writing the result to the console.

Console.WriteLine(result(4))

' Prints True.

' You can also use simplified syntax

' to compile and run an expression tree.

' The following line can replace two previous statements.

Console.WriteLine(expr.Compile()(4))

' Also prints True.

Para obter mais informações, consulte Como executar árvores de expressão (Visual
Basic).

Confira também
System.Linq.Expressions
Como executar árvores de expressão (Visual Basic)
Como modificar árvores de expressão (Visual Basic)
Expressões Lambda
Visão geral do Dynamic Language Runtime
Conceitos de Programação (Visual Basic)
Iteradores (Visual Basic)
Artigo • 22/02/2023 • 10 minutos para o fim da leitura

Um iterador pode ser usado para percorrer coleções, como listas e matrizes.

Um método iterador ou um acessador get realiza uma iteração personalizada em uma


coleção. Um método iterador usa a instrução Yield para retornar um elemento de cada
vez. Quando uma instrução Yield for atingida, o local atual no código será lembrado. A
execução será reiniciada desse local na próxima vez que a função iteradora for chamada.

Um iterador é consumido no código cliente, usando uma instrução For Each...Next ou


usando uma consulta LINQ.

No exemplo a seguir, a primeira iteração do loop For Each faz que a execução continue
no método iterador SomeNumbers até que a primeira instrução Yield seja alcançada. Essa
iteração retorna um valor de 3 e o local atual no método iterador é mantido. Na
próxima iteração do loop, a execução no método iterador continuará de onde parou,
parando novamente quando alcançar uma instrução Yield . Essa iteração retorna um
valor de 5 e o local atual no método iterador é mantido novamente. O loop terminará
quando o final do método iterador for alcançado.

VB

Sub Main()

For Each number As Integer In SomeNumbers()

Console.Write(number & " ")

Next

' Output: 3 5 8

Console.ReadKey()

End Sub

Private Iterator Function SomeNumbers() As System.Collections.IEnumerable

Yield 3

Yield 5

Yield 8

End Function

O tipo de retorno de um método iterador ou acessador get pode ser IEnumerable,


IEnumerable<T>, IEnumerator ou IEnumerator<T>.

Você pode usar uma instrução Exit Function ou Return para terminar a iteração.

Uma função iteradora ou declaração de acessador get do Visual Basic inclui um


modificador do Iterador.
Os iteradores foram introduzidos no Visual Basic no Visual Studio 2012.

Neste tópico

Iterador simples

Criando uma classe de coleção

Blocos Try

Métodos anônimos

Usando iteradores com uma lista genérica

Informações de sintaxe

Implementação técnica

Uso de iteradores

7 Observação

Todos os exemplos neste tópico, exceto o exemplo Iterador Simples, incluem


instruções Imports para os namespaces System.Collections e
System.Collections.Generic .

Iterador simples
O exemplo a seguir contém uma única instrução Yield que está dentro de um loop
For...Next. Em Main , cada iteração do corpo da instrução For Each cria uma chamada à
função iteradora, que avança para a próxima instrução Yield .

VB

Sub Main()

For Each number As Integer In EvenSequence(5, 18)

Console.Write(number & " ")

Next

' Output: 6 8 10 12 14 16 18

Console.ReadKey()

End Sub

Private Iterator Function EvenSequence(

ByVal firstNumber As Integer, ByVal lastNumber As Integer) _

As System.Collections.Generic.IEnumerable(Of Integer)

' Yield even numbers in the range.

For number As Integer = firstNumber To lastNumber

If number Mod 2 = 0 Then

Yield number

End If

Next

End Function

Criando uma classe de coleção


No exemplo a seguir, a classe DaysOfTheWeek implementa a interface IEnumerable, que
requer um método GetEnumerator. O compilador chama implicitamente o método
GetEnumerator , que retorna um IEnumerator.

O método GetEnumerator retorna cada cadeia de caracteres uma de cada vez usando a
instrução Yield e um modificador Iterator está na declaração de função.

VB

Sub Main()

Dim days As New DaysOfTheWeek()

For Each day As String In days

Console.Write(day & " ")

Next

' Output: Sun Mon Tue Wed Thu Fri Sat

Console.ReadKey()

End Sub

Private Class DaysOfTheWeek

Implements IEnumerable

Public days =

New String() {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"}

Public Iterator Function GetEnumerator() As IEnumerator _

Implements IEnumerable.GetEnumerator

' Yield each day of the week.

For i As Integer = 0 To days.Length - 1

Yield days(i)

Next

End Function

End Class

O exemplo a seguir cria uma classe Zoo que contém uma coleção de animais.

A instrução For Each , que faz referência à instância de classe ( theZoo ), chama
implicitamente o método GetEnumerator . As instruções For Each , que fazem referência
às propriedades Birds e Mammals , usam o método iterador nomeado AnimalsForType .

VB

Sub Main()

Dim theZoo As New Zoo()

theZoo.AddMammal("Whale")

theZoo.AddMammal("Rhinoceros")

theZoo.AddBird("Penguin")

theZoo.AddBird("Warbler")

For Each name As String In theZoo

Console.Write(name & " ")

Next

Console.WriteLine()

' Output: Whale Rhinoceros Penguin Warbler

For Each name As String In theZoo.Birds

Console.Write(name & " ")

Next

Console.WriteLine()

' Output: Penguin Warbler

For Each name As String In theZoo.Mammals

Console.Write(name & " ")

Next

Console.WriteLine()

' Output: Whale Rhinoceros

Console.ReadKey()

End Sub

Public Class Zoo

Implements IEnumerable

' Private members.

Private animals As New List(Of Animal)

' Public methods.

Public Sub AddMammal(ByVal name As String)

animals.Add(New Animal With {.Name = name, .Type =


Animal.TypeEnum.Mammal})

End Sub

Public Sub AddBird(ByVal name As String)

animals.Add(New Animal With {.Name = name, .Type =


Animal.TypeEnum.Bird})

End Sub

Public Iterator Function GetEnumerator() As IEnumerator _

Implements IEnumerable.GetEnumerator

For Each theAnimal As Animal In animals

Yield theAnimal.Name

Next

End Function

' Public members.

Public ReadOnly Property Mammals As IEnumerable

Get

Return AnimalsForType(Animal.TypeEnum.Mammal)

End Get

End Property

Public ReadOnly Property Birds As IEnumerable

Get

Return AnimalsForType(Animal.TypeEnum.Bird)

End Get

End Property

' Private methods.

Private Iterator Function AnimalsForType( _

ByVal type As Animal.TypeEnum) As IEnumerable

For Each theAnimal As Animal In animals

If (theAnimal.Type = type) Then

Yield theAnimal.Name

End If

Next

End Function

' Private class.

Private Class Animal

Public Enum TypeEnum

Bird

Mammal

End Enum

Public Property Name As String

Public Property Type As TypeEnum

End Class

End Class

Blocos try
O Visual Basic permite uma instrução Yield no bloco Try de uma Instrução Try...
Catch... Finally. Um bloco Try que tem uma instrução Yield pode ter blocos Catch e
pode ter um bloco Finally .

O exemplo a seguir inclui blocos Try , Catch e Finally em uma função iteradora. O
bloco Finally na função iteradora é executado antes da iteração For Each ser
concluída.
VB

Sub Main()

For Each number As Integer In Test()

Console.WriteLine(number)
Next

Console.WriteLine("For Each is done.")

' Output:

' 3

' 4

' Something happened. Yields are done.

' Finally is called.

' For Each is done.

Console.ReadKey()

End Sub

Private Iterator Function Test() As IEnumerable(Of Integer)

Try

Yield 3

Yield 4

Throw New Exception("Something happened. Yields are done.")

Yield 5

Yield 6

Catch ex As Exception

Console.WriteLine(ex.Message)

Finally

Console.WriteLine("Finally is called.")

End Try

End Function

Uma instrução Yield não pode estar dentro de um bloco Catch ou bloco Finally .

Se o corpo For Each (em vez do método iterador) lançar uma exceção, um bloco Catch
na função iteradora não será executado, mas um bloco Finally na função iteradora
será executado. Um bloco Catch dentro de uma função iteradora captura apenas
exceções que ocorrem dentro da função iteradora.

Métodos anônimos
No Visual Basic, uma função anônima pode ser uma função iteradora. O exemplo a
seguir ilustra essa situação.

VB

Dim iterateSequence = Iterator Function() _

As IEnumerable(Of Integer)

Yield 1

Yield 2

End Function

For Each number As Integer In iterateSequence()

Console.Write(number & " ")

Next

' Output: 1 2

Console.ReadKey()

O exemplo a seguir tem um método não iterador que valida os argumentos. O método
retorna o resultado de um iterador anônimo que descreve os elementos da coleção.

VB

Sub Main()

For Each number As Integer In GetSequence(5, 10)

Console.Write(number & " ")

Next

' Output: 5 6 7 8 9 10

Console.ReadKey()

End Sub

Public Function GetSequence(ByVal low As Integer, ByVal high As Integer) _

As IEnumerable

' Validate the arguments.

If low < 1 Then

Throw New ArgumentException("low is too low")

End If

If high > 140 Then

Throw New ArgumentException("high is too high")

End If

' Return an anonymous iterator function.

Dim iterateSequence = Iterator Function() As IEnumerable

For index = low To high

Yield index

Next

End Function

Return iterateSequence()

End Function

Se a validação estiver dentro da função iteradora, a validação não poderá ser executada
até o início da primeira iteração do corpo For Each .

Usando iteradores com uma lista genérica


No exemplo a seguir, a classe Stack(Of T) genérica implementa a interface genérica
IEnumerable<T>. O método Push atribui valores a uma matriz do tipo T . O método
GetEnumerator retorna os valores da matriz usando a instrução Yield .
Além do método GetEnumerator genérico, o método GetEnumerator não genérico
também deve ser implementado. Isso ocorre porque IEnumerable<T> herda de
IEnumerable. A implementação não genérica adia a implementação genérica.

O exemplo usa iteradores nomeados para dar suporte a várias maneiras de iterar na
mesma coleção de dados. Esses iteradores nomeados são as propriedades TopToBottom
e BottomToTop e o método TopN .

A declaração de propriedade BottomToTop inclui a palavra-chave Iterator .

VB

Sub Main()

Dim theStack As New Stack(Of Integer)

' Add items to the stack.

For number As Integer = 0 To 9

theStack.Push(number)

Next

' Retrieve items from the stack.

' For Each is allowed because theStack implements

' IEnumerable(Of Integer).

For Each number As Integer In theStack

Console.Write("{0} ", number)

Next

Console.WriteLine()

' Output: 9 8 7 6 5 4 3 2 1 0

' For Each is allowed, because theStack.TopToBottom

' returns IEnumerable(Of Integer).

For Each number As Integer In theStack.TopToBottom

Console.Write("{0} ", number)

Next

Console.WriteLine()

' Output: 9 8 7 6 5 4 3 2 1 0

For Each number As Integer In theStack.BottomToTop

Console.Write("{0} ", number)

Next

Console.WriteLine()

' Output: 0 1 2 3 4 5 6 7 8 9

For Each number As Integer In theStack.TopN(7)

Console.Write("{0} ", number)

Next

Console.WriteLine()

' Output: 9 8 7 6 5 4 3

Console.ReadKey()

End Sub

Public Class Stack(Of T)

Implements IEnumerable(Of T)

Private values As T() = New T(99) {}

Private top As Integer = 0

Public Sub Push(ByVal t As T)

values(top) = t

top = top + 1

End Sub

Public Function Pop() As T

top = top - 1

Return values(top)

End Function

' This function implements the GetEnumerator method. It allows


' an instance of the class to be used in a For Each statement.
Public Iterator Function GetEnumerator() As IEnumerator(Of T) _

Implements IEnumerable(Of T).GetEnumerator

For index As Integer = top - 1 To 0 Step -1

Yield values(index)

Next

End Function

Public Iterator Function GetEnumerator1() As IEnumerator _

Implements IEnumerable.GetEnumerator

Yield GetEnumerator()

End Function

Public ReadOnly Property TopToBottom() As IEnumerable(Of T)

Get

Return Me

End Get

End Property

Public ReadOnly Iterator Property BottomToTop As IEnumerable(Of T)

Get

For index As Integer = 0 To top - 1

Yield values(index)

Next

End Get

End Property

Public Iterator Function TopN(ByVal itemsFromTop As Integer) _

As IEnumerable(Of T)

' Return less than itemsFromTop if necessary.

Dim startIndex As Integer =

If(itemsFromTop >= top, 0, top - itemsFromTop)

For index As Integer = top - 1 To startIndex Step -1

Yield values(index)

Next

End Function

End Class

Informações de sintaxe
Um iterador pode ocorrer como um método ou como um acessador get . Um iterador
não pode ocorrer em um evento, um construtor de instância, um construtor estático ou
um destruidor estático.

Deve existir uma conversão implícita do tipo de expressão na instrução Yield , para o
tipo de retorno do iterador.

No Visual Basic, um método iterador não pode ter parâmetros ByRef .

No Visual Basic, "Yield" não é uma palavra reservada e tem um significado especial
somente quando é usado em um método Iterator ou acessador get .

Implementação Técnica
Embora você escreva um iterador como um método, o compilador o traduz em uma
classe aninhada que é, na verdade, uma máquina de estado. Essa classe mantém o
controle da posição do iterador enquanto o loop For Each...Next no código cliente
continuar.

Para ver o que o compilador faz, você pode usar a ferramenta Ildasm.exe para exibir o
código Microsoft Intermediate Language que é gerado para um método iterador.

Quando você cria um iterador para uma classe ou struct, não é necessário implementar
toda a interface IEnumerator. Quando o compilador detecta o iterador, ele gera
automaticamente os métodos Current , MoveNext e Dispose da interface IEnumerator ou
IEnumerator<T>.

A cada iteração sucessiva do loop For Each…Next (ou a chamada direta ao


IEnumerator.MoveNext ), o próximo corpo de código do iterador continua, depois da

instrução Yield anterior. Em seguida, ele continuará até a próxima instrução Yield , até
que o final do corpo do iterador seja alcançado ou até que uma instrução Exit
Function ou Return seja encontrada.

Iteradores não dão suporte ao método IEnumerator.Reset. Para iterar novamente desde
o início, você deve obter um novo iterador.
Para obter informações adicionais, consulte a Especificação da linguagem Visual Basic.

Uso de iteradores
Os iteradores permitem que você mantenha a simplicidade de um loop For Each
quando for necessário usar um código complexo para preencher uma sequência de
lista. Isso pode ser útil quando você quiser fazer o seguinte:

Modificar a sequência de lista após a primeira iteração de loop For Each .

Evitar o carregamento completo de uma grande lista antes da primeira iteração de


um loop For Each . Um exemplo é uma busca paginada para carregar um lote de
linhas da tabela. Outro exemplo é o método EnumerateFiles, que implementa os
iteradores dentro do .NET Framework.

Encapsular a criação da lista no iterador. No método iterador, você pode criar a


lista e, em seguida, gerar cada resultado em um loop.

Confira também
System.Collections.Generic
IEnumerable<T>
Instrução For Each...Next
Instrução Yield
Iterador
LINQ (consulta integrada à linguagem)
(Visual Basic)
Artigo • 15/02/2023 • 2 minutos para o fim da leitura

O LINQ é um conjunto de recursos que estende os recursos avançados de consulta à


sintaxe das linguagens do Visual Basic. O LINQ apresenta padrões com aprendizado
facilitado para consultar e atualizar dados, e a tecnologia pode ser estendida para dar
suporte a, potencialmente, qualquer tipo de armazenamento de dados. O NET
Framework inclui assemblies de provedor LINQ que permitem o uso do LINQ com
coleções do .NET Framework, bancos de dados do SQL Server, conjuntos de dados
ADO.NET e documentos XML.

Nesta seção
Introdução ao LINQ (Visual Basic)

Fornece uma introdução geral dos tipos de aplicativos que você pode escrever e dos
tipos de problemas que você pode resolver com consultas do LINQ.

Introdução a LINQ no Visual Basic

Descreve os fatos básicos que você deve saber para entender a documentação do Visual
Basic e exemplos.

Suporte do Visual Studio IDE e ferramentas para LINQ (Visual Basic)

Descreve o Object Relational Designer do Visual Studio, suporte do depurador para


consultas e outros recursos do IDE relacionados ao LINQ.

Visão geral de operadores de consulta padrão (Visual Basic)

Fornece uma introdução aos operadores de consulta padrão. Ele também fornece links
para tópicos que contêm mais informações sobre cada tipo de operação de consulta.

LINQ to Objects (Visual Basic)

Inclui links para tópicos que explicam como usar o LINQ to Objects para acessar
estruturas de dados na memória.

LINQ to XML (Visual Basic)

Inclui links para tópicos que explicam como usar o LINQ to XML, o qual fornece os
recursos de modificação de documentos na memória do DOM (Modelo de Objeto do
Documento) e dão suporte a expressões de consulta do LINQ.

LINQ to ADO.NET (página do portal)

Fornece um ponto de entrada para a documentação sobre LINQ to DataSet, LINQ to


SQL e LINQ to Entities. O LINQ to DataSet permite que você crie recursos mais
sofisticados de consulta no DataSet usando a mesma funcionalidade de consultas que
está disponível para outras fontes de dados. O LINQ to SQL fornece uma infraestrutura
em tempo de execução para gerenciar dados relacionais como objetos. O LINQ to
Entities permite que os desenvolvedores escrevam consultas no modelo conceitual de
Entity Framework usando C #.

Habilitando uma fonte de dados para consulta LINQ

Fornece uma introdução aos provedores LINQ personalizados, a árvores de expressões


de LINQ e a outras formas de estender o LINQ.
Programação orientada a objeto (Visual
Basic)
Artigo • 22/02/2023 • 10 minutos para o fim da leitura

O C# dá suporte completo à programação orientada a objeto, incluindo


encapsulamento, herança e polimorfismo.

Encapsulamento significa que um grupo de propriedades, métodos e outros membros


relacionados é tratado como uma única unidade ou objeto.

Herança descreve a capacidade de criar novas classes com base em uma classe
existente.

Polimorfismo significa que você pode ter várias classes que podem ser usadas de forma
intercambiável, ainda que cada classe implemente as mesmas propriedades ou métodos
de maneiras diferentes.

Esta seção descreve os seguintes conceitos:

Classes e objetos
Membros de classe
Propriedades e campos
Métodos
Construtores
Destruidores
Eventos
Classes aninhadas
Modificadores de acesso e níveis de acesso
Instanciando classes
Classes e membros compartilhados
Tipos anônimos
Herança
Substituindo membros
Interfaces
Genéricos
Representantes

Classes e objetos
Os termos classe e objeto às vezes são usados de forma intercambiável, mas, na verdade,
as classes descrevem o tipo dos objetos, enquanto os objetos são instâncias utilizáveis
das classes. Sendo assim, o ato de criar um objeto é chamado de instanciação. Usando a
analogia da uma planta, uma classe é a planta e um objeto é a construção feita com
base naquela planta.

Para definir uma classe:

VB

Class SampleClass

End Class

O C# também oferece uma versão leve das classes chamada de estruturas, que são úteis
quando você precisa criar uma matriz grande de objetos e não quer consumir muita
memória para isso.

Para definir uma estrutura:

VB

Structure SampleStructure

End Structure

Para obter mais informações, consulte:

Instrução Class
Instrução Structure

Membros de classe
Cada classe tem diferentes membros de classe que incluem propriedades que descrevem
dados da classe, métodos que definem o comportamento da classe e eventos que
fornecem comunicação entre diferentes classes e objetos.

Propriedades e campos

Os campos e as propriedades representam as informações que um objeto contém. Os


campos são como variáveis, porque podem ser lidos ou definidos de forma direta.

Para definir um campo:

VB
Class SampleClass

Public SampleField As String

End Class

As propriedades têm procedimentos de obter e definir, que oferecem mais controle


sobre como os valores são definidos ou retornados.

O C# permite criar um campo particular para armazenar o valor da propriedade ou usar


as chamadas propriedade autoimplementada que criam esse campo automaticamente
em segundo plano e fornecem a lógica básica para os procedimentos de propriedade.

Para definir uma propriedade autoimplementada:

VB

Class SampleClass

Public Property SampleProperty as String

End Class

Se você precisar executar operações adicionais para ler e gravar o valor da propriedade,
defina um campo para armazenar o valor da propriedade e forneça a lógica básica para
armazenar e recuperá-la:

VB

Class SampleClass

Private m_Sample As String

Public Property Sample() As String

Get

' Return the value stored in the field.

Return m_Sample

End Get

Set(ByVal Value As String)

' Store the value in the field.

m_Sample = Value

End Set

End Property

End Class

A maioria das propriedades têm métodos ou procedimentos para definir e obter o valor
da propriedade. No entanto, você pode criar propriedades somente leitura ou somente
gravação para impedir que elas sejam modificadas ou lidas. No Visual Basic, você pode
usar ReadOnly e WriteOnly palavras-chave. No entanto, propriedades
autoimplementadas não podem ser somente leitura ou somente gravação.

Para obter mais informações, consulte:


Instrução Property
Instrução Get
Instrução Set
ReadOnly (somente-leitura)
WriteOnly

Métodos
Um método é uma ação que um objeto pode executar.

7 Observação

No Visual Basic, há duas maneiras de criar um método: a Sub instrução será usada
se o método não retornar um valor; a Function instrução será usada se um método
retornar um valor.

Para definir um método de uma classe:

VB

Class SampleClass

Public Function SampleFunc(ByVal SampleParam As String)

' Add code here

End Function

End Class

Uma classe pode ter várias implementações ou sobrecargas, do mesmo método que
diferem quanto ao número de parâmetros ou tipos de parâmetro.

Para sobrecarregar um método:

VB

Overloads Sub Display(ByVal theChar As Char)

' Add code that displays Char data.

End Sub

Overloads Sub Display(ByVal theInteger As Integer)

' Add code that displays Integer data.

End Sub

Na maioria dos casos, você declara um método dentro de uma definição de classe. No
entanto, o C# também dá suporte a métodos de extensão que permitem adicionar
métodos a uma classe existente fora da definição real da classe.
Para obter mais informações, consulte:

Instrução Function
Instrução Sub
Sobrecargas
Métodos de Extensão

Construtores
Construtores são métodos de classe que são executados automaticamente quando um
objeto de um determinado tipo é criado. Os construtores normalmente inicializam os
membros de dados do novo objeto. Um construtor pode ser executado apenas uma vez
quando uma classe é criada. Além disso, o código no construtor sempre é executado
antes de qualquer outro código em uma classe. No entanto, é possível criar várias
sobrecargas de construtor da mesma forma que é feita para qualquer outro método.

Para definir um construtor para uma classe:

VB

Class SampleClass

Sub New(ByVal s As String)

// Add code here.

End Sub

End Class

Para obter mais informações, confira Tempo de vida do objeto: como os objetos são
criados e destruídos.

Destruidores
Destruidores são usados para destruir instâncias de classes. No .NET Framework, o
coletor de lixo gerencia automaticamente a alocação e a liberação de memória para os
objetos gerenciados em seu aplicativo. No entanto, talvez ainda seja necessário usar os
destruidores para limpar recursos não gerenciados que seu aplicativo criar. Pode haver
apenas um destruidor para uma classe.

Para obter mais informações sobre os destruidores e a coleta de lixo no .NET


Framework, consulte Coleta de lixo.

Eventos
Eventos permitem que uma classe ou objeto notifique outras classes ou objetos quando
algo interessante ocorrer. A classe que envia (ou aciona) o evento é chamada de editor e
as classes que recebem (ou manipulam) os eventos são chamadas assinantes. Para obter
mais informações sobre os eventos e como eles são gerados e manipulados, consulte
Eventos.

Para declarar eventos, use a Instrução event.

Para gerar eventos, use a Instrução RaiseEvent.

Para especificar manipuladores de eventos usando uma maneira declarativa, use a


instrução WithEvents e a cláusula Handles.

Para poder adicionar, remover e alterar dinamicamente o manipulador de eventos


associado a um evento, use a Instrução AddHandler e a Instrução RemoveHandler
junto com o Operador AddressOf.

Classes aninhadas

Uma classe definida dentro de outra classe é chamada de aninhada. Por padrão, a classe
aninhada é particular.

VB

Class Container

Class Nested

' Add code here.

End Class

End Class

Para criar uma instância da classe aninhada, use o nome da classe de contêiner seguido
pelo ponto e, em seguida, seguido pelo nome da classe aninhada:

VB

Dim nestedInstance As Container.Nested = New Container.Nested()

Modificadores de acesso e níveis de acesso


Todas as classes e membros de classe podem especificar o nível de acesso que
fornecem a outras classes usando modificadores de acesso.

Os modificadores de acesso a seguir estão disponíveis:


Modificador Definição
do Visual Basic

Público O tipo ou membro pode ser acessado por qualquer outro código no mesmo
assembly ou em outro assembly que faz referência a ele.

Privado O tipo ou membro pode ser acessado somente pelo código na mesma classe.

Protegido O tipo ou membro pode ser acessado somente pelo código na mesma classe
ou em uma classe derivada.

Friend O tipo ou membro pode ser acessado por qualquer código no mesmo
assembly, mas não de outro assembly.

Protected O tipo ou membro pode ser acessado por qualquer código no mesmo
Friend assembly ou por qualquer classe derivada em outro assembly.

Para obter mais informações, consulte Níveis de acesso no Visual Basic.

Instanciando classes
Para criar um objeto, você precisa instanciar uma classe ou criar uma instância da classe.

VB

Dim sampleObject as New SampleClass()

Após instanciar uma classe, você pode atribuir valores às propriedades e campos da
instância e invocar métodos da classe.

VB

' Set a property value.

sampleObject.SampleProperty = "Sample String"

' Call a method.

sampleObject.SampleMethod()

Para atribuir valores a propriedades durante o processo de instanciação de classe, use


os inicializadores de objeto:

VB

Dim sampleObject = New SampleClass With

{.FirstProperty = "A", .SecondProperty = "B"}

Para obter mais informações, consulte:


Novo Operador
Inicializadores de objeto: tipos nomeados e anônimos

Classes e membros compartilhados


Um membro estático da classe é uma propriedade, procedimento ou campo que é
compartilhado por todas as instâncias de uma classe.

Para definir um membro compartilhado:

VB

Class SampleClass

Public Shared SampleString As String = "Sample String"

End Class

Para acessar o membro estático, use o nome da classe sem criar um objeto dessa classe:

VB

MsgBox(SampleClass.SampleString)

Os módulos compartilhados no Visual Basic têm apenas membros compartilhados e não


podem ser instanciados. Membros estáticos também não podem acessar propriedades,
métodos ou campos não estáticos

Para obter mais informações, consulte:

Compartilhado
Instrução Module

Tipos anônimos
Os tipos anônimos permitem criar objetos sem escrever uma definição de classe para o
tipo de dados. Em vez disso, o compilador gera uma classe para você. A classe não tem
nenhum nome utilizável e contém as propriedades que você especificar ao declarar o
objeto.

Para criar uma instância de um tipo anônimo:

VB

' sampleObject is an instance of a simple anonymous type.

Dim sampleObject =

New With {Key .FirstProperty = "A", .SecondProperty = "B"}

Para obter mais informações, consulte Tipos Anônimos.

Herança
A herança permite que você crie uma nova classe que reutiliza, estende e modifica o
comportamento definido em outras classes. A classe cujos membros são herdados é
chamada classe base e a classe que herda esses membros é chamada classe derivada. No
entanto, todas as classes em C# herdam implicitamente da classe Object que dá suporte
à hierarquia de classes do .NET e fornece serviços de nível baixo para todas as classes.

7 Observação

O Visual Basic não dá suporte a várias heranças. Ou seja, você pode especificar
apenas uma classe base para uma classe derivada.

Para herdar de uma classe base:

VB

Class DerivedClass

Inherits BaseClass

End Class

Por padrão, todas as classes podem ser herdadas. No entanto, é possível especificar se
uma classe não deve ser usada como classe base ou criar uma classe que possa ser
usada apenas como classe base.

Para especificar que uma classe não pode ser usada como classe base:

VB

NotInheritable Class SampleClass

End Class

Para especificar que uma classe pode ser usada apenas como classe base e não pode
ser instanciada:

VB

MustInherit Class BaseClass

End Class

Para obter mais informações, consulte:

Instrução Inherits
NotInheritable
MustInherit

Substituindo membros
Por padrão, uma classe derivada herda todos os membros de sua classe base. Se quiser
alterar o comportamento do membro herdado, você precisa substituí-la. Ou seja, você
pode definir uma nova implementação de método, propriedade ou evento na classe
derivada.

Os seguintes modificadores são usados para controlar como as propriedades e métodos


são substituídos:

Modificador do Visual Definição


Basic

Substituível Permite que um membro de classe seja substituído em uma classe


derivada.

Substituições Substitui um membro virtual (substituível) definido na classe base.

NotOverridable Impede que um membro seja substituído em uma classe herdada.

MustOverride Requer que um membro de classe seja substituído na classe


derivada.

Sombras Oculta um membro herdado de uma classe base

Interfaces
Interfaces, como classes, definem um conjunto de propriedades, métodos e eventos.
Mas, diferente das classes, as interfaces não fornecem implementação. Elas são
implementadas por classes e definidas como entidades separadas das classes. Uma
interface representa um contrato, no sentido em que uma classe que implementa uma
interface deve implementar todos os aspectos da interface exatamente como ela está
definida.

Para definir uma interface:

VB
Public Interface ISampleInterface

Sub DoSomething()

End Interface

Para implementar uma interface em uma classe:

VB

Class SampleClass

Implements ISampleInterface

Sub DoSomething

' Method implementation.

End Sub

End Class

Para obter mais informações, consulte:

Interfaces
Instrução Interface
Instrução Implements

Genéricos
Classes, estruturas, interfaces e métodos do .NET Framework podem incluir parâmetros
de tipo que definem tipos de objetos que podem armazenar ou usar. O exemplo mais
comum dos genéricos é uma coleção, em que você pode especificar o tipo dos objeto a
serem armazenados em uma coleção.

Para definir uma classe genérica:

VB

Class SampleGeneric(Of T)

Public Field As T

End Class

Para criar uma instância de uma classe genérica:

VB

Dim sampleObject As New SampleGeneric(Of String)

sampleObject.Field = "Sample string"

Para obter mais informações, consulte:


Genéricos
Tipos genéricos no Visual Basic

Delegados
Um delegado é um tipo que define uma assinatura de método e pode fornecer uma
referência a qualquer método com uma assinatura compatível. Você pode invocar (ou
chamar) o método através do delegado. Delegados são usados para passar métodos
como argumentos a outros métodos.

7 Observação

Os manipuladores de eventos nada mais são do que métodos chamados por meio
de delegados. Para obter mais informações sobre como usar delegados na
manipulação de eventos, consulte Eventos.

Para criar um delegado:

VB

Delegate Sub SampleDelegate(ByVal str As String)

Para criar uma referência a um método que corresponde à assinatura especificada pelo
delegado:

VB

Class SampleClass

' Method that matches the SampleDelegate signature.

Sub SampleSub(ByVal str As String)

' Add code here.

End Sub

' Method that instantiates the delegate.

Sub SampleDelegateSub()

Dim sd As SampleDelegate = AddressOf SampleSub

sd("Sample string")

End Sub

End Class

Para obter mais informações, consulte:

Representantes
Instrução Delegate
Operador AddressOf
Confira também
Guia de programação do Visual Basic
Reflexão (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

A reflexão fornece objetos (do tipo Type) que descrevem assemblies, módulos e tipos. É
possível usar a reflexão para criar dinamicamente uma instância de um tipo, associar o
tipo a um objeto existente ou obter o tipo de um objeto existente e invocar seus
métodos ou acessar suas propriedades e campos. Se você estiver usando atributos em
seu código, a reflexão permite acessá-los. Para obter mais informações, consulte
Atributos.

Veja um exemplo simples de reflexão usando o método estático GetType – herdado por
todos os tipos da classe base Object – para obter o tipo de uma variável:

VB

' Using GetType to obtain type information:

Dim i As Integer = 42

Dim type As System.Type = i.GetType()

System.Console.WriteLine(type)

A saída é:

System.Int32

O exemplo a seguir usa a reflexão para obter o nome completo do assembly carregado.

VB

' Using Reflection to get information from an Assembly:

Dim info As System.Reflection.Assembly = GetType(System.Int32).Assembly

System.Console.WriteLine(info)

A saída é:

mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

Visão geral da reflexão


A reflexão é útil nas seguintes situações:

Quando você precisa acessar atributos nos metadados do seu programa. Para
obter mais informações, consulte Recuperando informações armazenadas em
atributos.
Para examinar e instanciar tipos em um assembly.

Para compilar novos tipos em tempo de execução. Usar as classes em


System.Reflection.Emit.

Para executar a associação tardia, acessar métodos em tipos criados em tempo de


execução. Consulte o tópico Carregando e usando tipos dinamicamente.

Seções relacionadas
Para mais informações:

Reflexão

Exibindo informações de tipo

Reflexão e tipos genéricos

System.Reflection.Emit

Recuperando informações armazenadas em atributos

Confira também
Guia de programação do Visual Basic
Assemblies no .NET
Serialização (Visual Basic)
Artigo • 15/02/2023 • 4 minutos para o fim da leitura

A serialização é o processo de converter um objeto em um fluxo de bytes para


armazenar o objeto ou transmiti-los na memória, um banco de dados ou um arquivo.
Sua finalidade principal é salvar o estado de um objeto para recriá-lo quando
necessário. O processo inverso é chamado desserialização.

Como a serialização funciona


Esta ilustração mostra o processo geral de serialização.

O objeto é serializado em um fluxo, que transporta não apenas os dados, mas


informações sobre o tipo de objeto, como sua versão, cultura e nome do assembly.
Desse fluxo, ele pode ser armazenado em um banco de dados, um arquivo ou uma
memória.

Usos para serialização


A serialização permite que o desenvolvedor salve o estado de um objeto e recrie
conforme necessário, fornecendo o armazenamento dos objetos, bem como a troca de
dados. Pela serialização, um desenvolvedor pode executar ações como enviar o objeto
para um aplicativo remoto por meio de um serviço Web, passando um objeto de um
domínio para outro, passando um objeto por um firewall como uma cadeia de
caracteres XML ou mantendo a segurança ou as informações específicas de usuários
entre aplicativos.

Tornando um objeto serializável


Para serializar um objeto, é necessário que ele esteja serializado, um fluxo contenha o
objeto serializado e um Formatter. O System.Runtime.Serialization contém as classes
necessárias para serializar e desserializar objetos.
Aplique o atributo SerializableAttribute a um tipo para indicar que as instâncias desse
tipo podem ser serializadas. Uma exceção de SerializationException será gerada se você
tentar serializar, mas o tipo não tiver o atributo SerializableAttribute.

Se não desejar que um campo em sua classe seja serializável, aplique o atributo
NonSerializedAttribute. Se um campo de um tipo serializável contiver um ponteiro, um
identificador ou outra estrutura de dados que é específica de um determinado ambiente
e o campo não puder ser reconstituído em um ambiente diferente, será necessário
torná-lo não serializável.

Se uma classe serializada contiver referências a objetos de outras classes que estão
marcadas como SerializableAttribute, esses objetos também serão serializados.

Serialização XML e binária


É possível usar serialização XML ou binária. Na serialização binária, todos os membros,
mesmo aqueles que são somente leitura, são serializados, e o desempenho é
aprimorado. A serialização XML fornece código mais legível, bem como maior
flexibilidade de compartilhamento do objeto e uso para fins de interoperabilidade.

Serialização binária
A serialização binária usa a codificação binária para produzir uma serialização compacta
para usos como armazenamento ou fluxos de rede com base em soquete.

Serialização XML
A serialização XML serializa as propriedades e os campos públicos de um objeto, ou os
parâmetros e os valores de retorno de métodos, em um fluxo XML que esteja de acordo
com um documento XSD (linguagem de definição de esquema XML) específico. A
serialização XML resulta em classes fortemente tipadas com propriedades e campos
públicos que são convertidos em XML. O System.Xml.Serialization contém as classes
necessárias para serializar e desserializar XML.

Você pode aplicar atributos a classes e membros de classe para controlar a maneira
como o XmlSerializer serializa ou desserializa uma instância da classe.

Serialização personalizada e básica


A serialização pode ser realizada de duas maneiras: básica e personalizada. A
serialização básica usa o .NET Framework para serializar o objeto automaticamente.
Serialização básica
O único requisito na serialização básica é que o objeto tenha o atributo
SerializableAttribute aplicado. O NonSerializedAttribute pode ser usado para impedir a
serialização de campos específicos.

Quando você usa a serialização básica, a versão dos objetos pode criar problemas e,
nesse caso, a serialização personalizada pode ser preferível. A serialização básica é a
maneira mais fácil de executar a serialização, mas ela não fornece muito controle sobre
o processo.

Serialização personalizada
Na serialização personalizada, você pode especificar exatamente quais objetos vão ser
serializados e como isso será feito. A classe deve ser marcada como SerializableAttribute
e implementar a interface ISerializable.

Se você quiser que o objeto também seja desserializado de uma maneira personalizada,
você deverá usar um construtor personalizado.

Serialização de designer
A serialização de designer é um formulário especial de serialização que envolve o tipo
de persistência do objeto geralmente associado a ferramentas de desenvolvimento. A
serialização de designer é o processo de conversão de um grafo do objeto em um
arquivo de origem que pode, posteriormente, ser usado para recuperar o grafo do
objeto. Um arquivo de origem pode conter código, marcação ou até mesmo
informações de tabela do SQL.

Exemplos e tópicos relacionados


Passo a passo: mantendo um objeto no Visual Studio (Visual Basic)

Demonstra como a serialização pode ser usada para manter dados de um objeto entre
instâncias, permitindo que você armazene e recupere valores na próxima vez que o
objeto for instanciado.

Como ler dados de objeto de um arquivo XML (Visual Basic)

Mostra como ler dados de objeto que foram previamente gravados em um arquivo XML
usando a classe XmlSerializer.
Como gravar dados de objeto em um arquivo XML (Visual Basic)

Mostra como gravar o objeto de uma classe para um arquivo XML usando a classe
XmlSerializer.
Estrutura do programa e convenções de
código (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Esta seção apresenta a estrutura típica de programas do Visual Basic, fornece um


programa simples em Visual Basic, "Olá, Mundo", e discute as convenções de código do
Visual Basic. Convenções de código são sugestões que se concentram não na lógica de
um programa, mas em sua estrutura física e aparência. Segui-las facilita a leitura, o
entendimento e a manutenção do código. As convenções de código podem incluir os
seguintes, entre outros:

Formatos padronizados para rotular e comentar o código.

Diretrizes para espaçamento, formatação e recuo do código.

Convenções de nomenclatura para objetos, variáveis e procedimentos.

Os tópicos a seguir apresentam um conjunto de diretrizes de programação para


programas em Visual Basic, juntamente com exemplos de bom uso.

Nesta seção
Estrutura de um programa Visual Basic

Fornece uma visão geral dos elementos que compõem um programa em Visual Basic.

Procedimento principal no Visual Basic

Discute o procedimento que serve como ponto de partida e controle geral para seu
aplicativo.

Referências e a instrução Imports

Discute como referenciar objetos em outros assemblies.

Namespaces no Visual Basic

Descreve como os namespaces organizam objetos nos assemblies.

Convenções de nomenclatura do Visual Basic

Inclui diretrizes gerais para procedimentos de nomenclatura, constantes, variáveis,


argumentos e objetos.

Convenções de codificação do Visual Basic

Analisa as diretrizes usadas no desenvolvimento dos exemplos nesta documentação.


Compilação Condicional

Descreve como compilar blocos específicos de código seletivamente enquanto orienta o


compilador a ignorar outros.

Como: Quebrar e combinar instruções no código

Mostra como dividir instruções longas em várias linhas e combinar instruções curtas em
uma linha.

Como: Recolher e ocultar seções do código

Mostra como recolher e ocultar seções de código no editor de código do Visual Basic.

Como: Rotular instruções

Mostra como marcar uma linha de código para identificá-la para uso com instruções
como On Error Goto .

Caracteres especiais no código

Mostra como e onde usar caracteres não numéricos e não alfabéticos.

Comentários no código

Discute como adicionar comentários descritivos ao código.

Palavras-chave como nomes de elemento no código

Descreve como usar colchetes ( [] ) para delimitar nomes de variáveis que também são
palavras-chave no Visual Basic.

Me, My, MyBase e MyClass

Descreve várias maneiras de se referir a elementos de um programa em Visual Basic.

Limitações do Visual Basic

Discute a remoção de limites de codificação conhecidos no Visual Basic.

Seções relacionadas
Convenções tipográficas e de código

Fornece convenções de codificação padrão para o Visual Basic.

Escrevendo código

Descreve recursos que tornam mais fácil para você escrever e gerenciar seu código.
Estrutura de um programa Visual Basic
Artigo • 22/02/2023 • 3 minutos para o fim da leitura

Um programa do Visual Basic é compilado a partir de blocos de construção padrão.


Uma solução contém um ou mais projetos. Um projeto, por sua vez, pode conter um ou
mais assemblies. Cada assembly é compilado de um ou mais arquivos de origem. Um
arquivo de origem fornece a definição e a implementação de classes, estruturas,
módulos e interfaces, que, em última análise, contêm todo o código.

Para obter mais informações sobre esses blocos de construção de um programa do


Visual Basic, consulte Soluções e Projetos e Assemblies no .NET.

File-Level elementos de programação


Ao iniciar um projeto ou arquivo e abrir o editor de código, você verá algum código já
em vigor e na ordem correta. Qualquer código que você escrever deve seguir a seguinte
sequência:

1. Option instruções

2. Imports instruções

3. Namespace instruções e elementos no nível do namespace

Se você inserir instruções em uma ordem diferente, erros de compilação poderão


resultar.

Um programa também pode conter instruções de compilação condicional. Você pode


intercalá-los no arquivo de origem entre as instruções da sequência anterior.

Instruções option
Option as instruções estabelecem regras básicas para o código subsequente, ajudando

a evitar erros de sintaxe e lógica. A Instrução Option Explicit garante que todas as
variáveis sejam declaradas e escritas corretamente, o que reduz o tempo de depuração.
A Instrução Option Strict ajuda a minimizar erros lógicos e perda de dados que podem
ocorrer quando você trabalha entre variáveis de diferentes tipos de dados. A Instrução
Option Compare especifica a forma como as cadeias de caracteres são comparadas
entre si, com base em seus Binary valores ou Text valores.

Importa instruções
Você pode incluir uma Instrução Imports (Namespace e Tipo do .NET) para importar
nomes definidos fora do projeto. Uma Imports instrução permite que seu código faça
referência a classes e outros tipos definidos dentro do namespace importado, sem
precisar qualificá-las. Você pode usar tantas instruções Imports quantas forem
necessárias. Para obter mais informações, consulte Referências e a Instrução Imports.

Instruções de namespace
Namespaces ajudam você a organizar e classificar seus elementos de programação para
facilitar o agrupamento e o acesso. Use a Instrução Namespace para classificar as
instruções a seguir em um namespace específico. Para obter mais informações, consulte
Namespaces no Visual Basic.

Instruções de compilação condicional


Instruções de compilação condicional podem aparecer em praticamente qualquer lugar
no arquivo de origem. Elas fazem com que partes do código sejam incluídas ou
excluídas no tempo de compilação, dependendo de determinadas condições. Você
também pode usá-los para depurar seu aplicativo, pois o código condicional é
executado somente no modo de depuração. Para saber mais, confira Constructos
condicionais.

Namespace-Level elementos de programação


Classes, estruturas e módulos contêm todo o código em seu arquivo de origem. Eles são
elementos no nível do namespace, que podem aparecer em um namespace ou no nível
do arquivo de origem. Eles mantêm as declarações de todos os outros elementos de
programação. As interfaces, que definem assinaturas de elemento, mas não fornecem
nenhuma implementação, também aparecem no nível do módulo. Para obter mais
informações sobre os elementos no nível do módulo, consulte o seguinte:

Instrução Class

Instrução Structure

Instrução Module

Instrução Interface

Elementos de dados no nível do namespace são enumerações e delegados.


Module-Level elementos de programação
Procedimentos, operadores, propriedades e eventos são os únicos elementos de
programação que podem conter código executável (instruções que executam ações em
tempo de execução). Eles são os elementos no nível do módulo do programa. Para obter
mais informações sobre os elementos no nível do procedimento, consulte o seguinte:

Instrução Function

Instrução Sub

Instrução Declare

Instrução Operator

Instrução Property

Instrução Event

Elementos de dados no nível do módulo são variáveis, constantes, enumerações e


delegados.

Procedure-Level elementos de programação


A maioria dos conteúdos de elementos no nível do procedimento são instruções
executáveis, que constituem o código de tempo de execução do programa. Todo código
executável deve estar em algum procedimento ( Function , Sub , Operator , Get , Set ,
AddHandler , RemoveHandler , RaiseEvent ). Para obter mais informações, consulte
Instruções.

Os elementos de dados no nível do procedimento são limitados a variáveis locais e


constantes.

O procedimento principal
O Main procedimento é o primeiro código a ser executado quando seu aplicativo foi
carregado. Main serve como o ponto de partida e o controle geral para seu aplicativo.
Há quatro variedades de Main :

Sub Main()

Sub Main(ByVal cmdArgs() As String)


Function Main() As Integer

Function Main(ByVal cmdArgs() As String) As Integer

A variedade mais comum deste procedimento é Sub Main() . Para obter mais
informações, consulte o Procedimento Principal no Visual Basic.

Confira também
Procedimento principal no Visual Basic
Convenções de nomenclatura do Visual Basic
Limitações do Visual Basic
Procedimento principal no Visual Basic
Artigo • 22/02/2023 • 3 minutos para o fim da leitura

Todo aplicativo do Visual Basic deve conter um procedimento chamado Main . Este
procedimento serve como ponto de partida e controle geral para seu aplicativo. O .NET
Framework chama o procedimento Main quando ele carrega seu aplicativo e está
pronto para passar o controle para ele. A menos que você esteja criando um aplicativo
do Windows Forms, você deve escrever o procedimento Main para aplicativos
executados por conta própria.

Main contém o código que é executado primeiro. Em Main , você pode determinar qual

formulário deve ser carregado primeiro quando o programa for iniciado, descobrir se
uma cópia do aplicativo já está em execução no sistema, estabelecer um conjunto de
variáveis para o seu aplicativo ou abrir um banco de dados que o aplicativo exige.

Requisitos para o procedimento principal


Um arquivo que é executado por conta própria (geralmente com a extensão .exe) deve
conter um procedimento Main . Uma biblioteca (por exemplo, com extensão .dll) não é
executada por conta própria e não requer um procedimento Main . Os requisitos para os
diferentes tipos de projetos que você pode criar são os seguintes:

Os aplicativos de console são executados por conta própria, e você deve fornecer
pelo menos um procedimento Main .

Os aplicativos do Windows Forms são executados por conta própria. No entanto, o


compilador do Visual Basic gera automaticamente um procedimento Main em um
aplicativo como esses, e você não precisa escrever um.

Bibliotecas de classes não exigem um procedimento Main . Elas incluem bibliotecas


de controle do Windows e bibliotecas de controle da Web. Aplicativos Web são
implantados como bibliotecas de classes.

Declarar o procedimento principal


Há quatro maneiras de declarar o procedimento Main . Ele pode usar argumentos ou
não, e pode retornar um valor ou não.

7 Observação
Se você declarar Main em uma classe, deverá usar a palavra-chave Shared . Em um
módulo, Main não precisa ser Shared .

A maneira mais simples é declarar um procedimento Sub que não aceita


argumentos ou retorna um valor.

VB

Module mainModule

Sub Main()

MsgBox("The Main procedure is starting the application.")

' Insert call to appropriate starting place in your code.

MsgBox("The application is terminating.")

End Sub

End Module

Main também pode retornar um valor Integer , que o sistema operacional usa

como o código de saída do programa. Outros programas podem testar esse


código examinando o valor ERRORLEVEL do Windows. Para retornar um código de
saída, você deve declarar Main como um procedimento Function em vez de um
procedimento Sub .

VB

Module mainModule

Function Main() As Integer

MsgBox("The Main procedure is starting the application.")

Dim returnValue As Integer = 0

' Insert call to appropriate starting place in your code.

' On return, assign appropriate value to returnValue.

' 0 usually means successful completion.

MsgBox("The application is terminating with error level " &

CStr(returnValue) & ".")

Return returnValue

End Function

End Module

Main também pode tomar uma matriz String como um argumento. Cada cadeia

de caracteres na matriz contém um dos argumentos de linha de comando usados


para invocar seu programa. Você pode executar ações diferentes dependendo de
seus valores.

VB

Module mainModule

Function Main(ByVal cmdArgs() As String) As Integer

MsgBox("The Main procedure is starting the application.")

Dim returnValue As Integer = 0

' See if there are any arguments.

If cmdArgs.Length > 0 Then

For argNum As Integer = 0 To UBound(cmdArgs, 1)

' Insert code to examine cmdArgs(argNum) and take

' appropriate action based on its value.

Next

End If

' Insert call to appropriate starting place in your code.

' On return, assign appropriate value to returnValue.

' 0 usually means successful completion.

MsgBox("The application is terminating with error level " &

CStr(returnValue) & ".")

Return returnValue

End Function

End Module

Você pode declarar Main para examinar os argumentos de linha de comando, mas
não retornar um código de saída, da seguinte maneira.

VB

Module mainModule

Sub Main(ByVal cmdArgs() As String)

MsgBox("The Main procedure is starting the application.")

Dim returnValue As Integer = 0

' See if there are any arguments.

If cmdArgs.Length > 0 Then

For argNum As Integer = 0 To UBound(cmdArgs, 1)

' Insert code to examine cmdArgs(argNum) and take

' appropriate action based on its value.

Next

End If

' Insert call to appropriate starting place in your code.

MsgBox("The application is terminating.")

End Sub

End Module

Confira também
MsgBox
Length
UBound
Estrutura de um programa Visual Basic
-main
Compartilhado
Instrução Sub
Instrução Function
Tipo de Dados Integer
Tipo de Dados String
Referências e a instrução Imports (Visual
Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Você pode disponibilizar objetos externos para seu projeto escolhendo o comando
Adicionar Referência no menu Projeto. As referências no Visual Basic podem apontar
para assemblies, que são como bibliotecas de tipos, mas contêm mais informações.

A Instrução Imports
Os assemblies incluem um ou mais namespaces. Ao adicionar uma referência a um
assembly, você também pode adicionar uma instrução Imports a um módulo que
controla a visibilidade dos namespaces desse assembly dentro do módulo. A Imports
instrução fornece um contexto de escopo que permite que você use apenas a parte do
namespace necessária para fornecer uma referência exclusiva.

A instrução Imports utiliza esta sintaxe:

Imports [Aliasname =] Namespace

Aliasname refere-se a um nome curto que você pode usar dentro do código para se

referir a um namespace importado. Namespace é um namespace disponível por meio de


uma referência de projeto, por meio de uma definição dentro do projeto ou por meio
de uma instrução anterior Imports .

O módulo pode conter qualquer número de instruções Imports . Eles devem aparecer
após quaisquer Option instruções, se presentes, mas antes de qualquer outro código.

7 Observação

Não confunda referências de projeto com a Imports instrução ou a instrução


Declare . As referências de projeto disponibilizam objetos externos, como objetos

em assemblies, para projetos do Visual Basic. A Imports instrução é usada para


simplificar o acesso a referências de projeto, mas não fornece acesso a esses
objetos. A Declare instrução é usada para declarar uma referência a um
procedimento externo em uma DLL (biblioteca de vínculo dinâmico).

Usando aliases com a instrução Imports


A Imports instrução facilita o acesso a métodos de classes eliminando a necessidade de
digitar explicitamente os nomes totalmente qualificados de referências. Os aliases
permitem atribuir um nome mais amigável a apenas uma parte de um namespace. Por
exemplo, a sequência de retorno de carro/feed de linha que faz com que uma única
parte do texto seja exibida em várias linhas faz parte do ControlChars módulo no
Microsoft.VisualBasic namespace. Para usar essa constante em um programa sem um
alias, você precisaria digitar o seguinte código:

VB

MsgBox("Some text" & Microsoft.VisualBasic.ControlChars.CrLf &

"Some more text")

Imports as instruções sempre devem ser as primeiras linhas que seguem imediatamente

as Option instruções em um módulo. O fragmento de código a seguir mostra como


importar e atribuir um alias ao Microsoft.VisualBasic.ControlChars módulo:

VB

Imports CtrlChrs = Microsoft.VisualBasic.ControlChars

As referências futuras a esse namespace podem ser consideravelmente mais curtas:

VB

MsgBox("Some text" & CtrlChrs.CrLf & "Some more text")

Se uma instrução Imports não incluir um nome de alias, os elementos definidos no


namespace importado poderão ser usados no módulo sem qualificação. Se o nome do
alias for especificado, ele deverá ser usado como um qualificador para nomes contidos
nesse namespace.

Confira também
ControlChars
Microsoft.VisualBasic
Namespaces no Visual Basic
Assemblies no .NET
Instrução Imports (tipo e namespace .NET)
Namespaces no Visual Basic
Artigo • 22/02/2023 • 6 minutos para o fim da leitura

Namespaces organizam os objetos definidos em um assembly. Os assemblies podem


conter vários namespaces, que por sua vez podem conter outros namespaces. Os
namespaces impedem a ambiguidade e simplificam as referências ao usar grandes
grupos de objetos, como bibliotecas de classes.

Por exemplo, o .NET Framework define a ListBox classe no System.Windows.Forms


namespace. O seguinte fragmento de código mostra como declarar uma variável
usando o nome totalmente qualificado para esta classe:

VB

Dim LBox As System.Windows.Forms.ListBox

Evitando colisões de nome


.NET Framework namespaces resolvem um problema às vezes chamado de poluição de
namespace, no qual o desenvolvedor de uma biblioteca de classes é dificultado pelo uso
de nomes semelhantes em outra biblioteca. Esses conflitos com componentes existentes
às vezes são chamados de colisões de nome.

Por exemplo, se você criar uma nova classe chamada ListBox , poderá usá-la dentro de
seu projeto sem qualificação. No entanto, se você quiser usar a classe .NET Framework
ListBox no mesmo projeto, deverá usar uma referência totalmente qualificada para
tornar a referência exclusiva. Se a referência não for exclusiva, o Visual Basic produzirá
um erro informando que o nome é ambíguo. O exemplo de código a seguir demonstra
como declarar o controle de botão:

VB

' Define a new object based on your ListBox class.

Dim LBC As New ListBox

' Define a new Windows.Forms ListBox control.

Dim MyLB As New System.Windows.Forms.ListBox

A ilustração a seguir mostra duas hierarquias de namespace, ambas contendo um


objeto chamado ListBox :
Por padrão, cada arquivo executável criado com Visual Basic contém um namespace
com o mesmo nome do projeto. Por exemplo, se você definir um objeto dentro de um
projeto nomeado ListBoxProject , o arquivo executável ListBoxProject.exe conterá um
namespace chamado ListBoxProject .

Vários assemblies podem usar o mesmo namespace. O Visual Basic os trata como um
único conjunto de nomes. Por exemplo, você pode definir classes para um namespace
chamado SomeNameSpace em um assembly nomeado Assemb1 e definir classes adicionais
para o mesmo namespace de um assembly chamado Assemb2 .

Nomes totalmente qualificados


Nomes totalmente qualificados são referências de objeto que são prefixadas com o
nome do namespace no qual o objeto é definido. Você pode usar objetos definidos em
outros projetos se criar uma referência à classe (escolhendo Adicionar Referência no
menu Projeto ) e, em seguida, usar o nome totalmente qualificado para o objeto em seu
código. O fragmento de código a seguir mostra como usar o nome totalmente
qualificado para um objeto do namespace de outro projeto:

VB

Dim LBC As New ListBoxProject.Form1.ListBox

Nomes totalmente qualificados impedem conflitos de nomenclatura porque


possibilitam que o compilador determine qual objeto está sendo usado. No entanto, os
próprios nomes podem ficar longos e complicados. Para contornar isso, você pode usar
a Imports instrução para definir um alias — um nome abreviado que você pode usar no
lugar de um nome totalmente qualificado. Por exemplo, o exemplo de código a seguir
cria aliases para dois nomes totalmente qualificados e usa esses aliases para definir dois
objetos.

VB

Imports LBControl = System.Windows.Forms.ListBox

Imports MyListBox = ListBoxProject.Form1.ListBox

VB
Dim LBC As LBControl

Dim MyLB As MyListBox

Se você usar a Imports instrução sem um alias, poderá usar todos os nomes nesse
namespace sem qualificação, desde que eles sejam exclusivos para o projeto. Se o
projeto contiver Imports instruções para namespaces que contenham itens com o
mesmo nome, você deverá qualificar totalmente esse nome quando usá-lo. Suponha,
por exemplo, que seu projeto contiver as duas Imports instruções a seguir:

VB

' This namespace contains a class called Class1.

Imports MyProj1

' This namespace also contains a class called Class1.

Imports MyProj2

Se você tentar usar Class1 sem qualificá-lo totalmente, o Visual Basic produzirá um erro
informando que o nome Class1 é ambíguo.

Instruções de nível de namespace


Em um namespace, você pode definir itens como módulos, interfaces, classes,
delegados, enumerações, estruturas e outros namespaces. Você não pode definir itens
como propriedades, procedimentos, variáveis e eventos no nível do namespace. Esses
itens devem ser declarados dentro de contêineres, como módulos, estruturas ou classes.

Palavra-chave global em nomes totalmente


qualificados
Se você tiver definido uma hierarquia aninhada de namespaces, o código dentro dessa
hierarquia poderá ser impedido de acessar o System namespace do .NET Framework. O
exemplo a seguir ilustra uma hierarquia na qual o namespace bloqueia o
SpecialSpace.System acesso.System

VB

Namespace SpecialSpace

Namespace System

Class abc

Function getValue() As System.Int32

Dim n As System.Int32

Return n

End Function

End Class

End Namespace

End Namespace

Como resultado, o compilador do Visual Basic não pode resolver com êxito a referência,
System.Int32pois SpecialSpace.System não define Int32 . Você pode usar a Global
palavra-chave para iniciar a cadeia de qualificação no nível mais externo da biblioteca
de classes .NET Framework. Isso permite que você especifique o System namespace ou
qualquer outro namespace na biblioteca de classes. O exemplo a seguir ilustra essa
situação.

VB

Namespace SpecialSpace

Namespace System

Class abc

Function getValue() As Global.System.Int32


Dim n As Global.System.Int32

Return n

End Function

End Class

End Namespace

End Namespace

Você pode usar Global para acessar outros namespaces de nível raiz, como
Microsoft.VisualBasic, e qualquer namespace associado ao seu projeto.

Palavra-chave global em instruções de


namespace
Você também pode usar a Global palavra-chave em uma instrução namespace. Isso
permite definir um namespace fora do namespace raiz do projeto.

Todos os namespaces no projeto são baseados no namespace raiz do projeto. O Visual


Studio atribui o nome do projeto como o namespace raiz padrão para todos os códigos
no projeto. Por exemplo, se o projeto for nomeado ConsoleApplication1 , os elementos
de programação pertencem ao namespace ConsoleApplication1 . Se você declarar
Namespace Magnetosphere , as referências no Magnetosphere projeto acessarão

ConsoleApplication1.Magnetosphere .

Os exemplos a seguir usam a Global palavra-chave para declarar um namespace fora


do namespace raiz do projeto.
VB

Namespace Global.Magnetosphere

End Namespace

Namespace Global

Namespace Magnetosphere

End Namespace

End Namespace

Em uma declaração de namespace, Global não é possível aninhar em outro namespace.

Você pode usar a Página do Aplicativo, o Designer de Projeto (Visual Basic) para exibir e
modificar o namespace raiz do projeto. Para novos projetos, o Namespace Raiz usa
como padrão o nome do projeto. Para causar Global o namespace de nível superior,
você pode limpar a entrada do Namespace Raiz para que a caixa esteja vazia. Limpar
namespace raiz remove a necessidade da Global palavra-chave em declarações de
namespace.

Se uma Namespace instrução declarar um nome que também é um namespace no .NET


Framework, o namespace .NET Framework ficará indisponível se a Global palavra-chave
não for usada em um nome totalmente qualificado. Para habilitar o acesso a esse
namespace .NET Framework sem usar a Global palavra-chave, você pode incluir a
Global palavra-chave na Namespace instrução.

O exemplo a seguir tem a Global palavra-chave na declaração de System.Text


namespace.

Se a Global palavra-chave não estava presente na declaração de namespace,


StringBuilder não foi possível acessar sem especificar
Global.System.Text.StringBuilder . Para um projeto nomeado ConsoleApplication1 , as
referências seriam System.Text acessadas ConsoleApplication1.System.Text se a Global
palavra-chave não fosse usada.

VB

Module Module1

Sub Main()

Dim encoding As New System.Text.TitanEncoding

' If the namespace defined below is System.Text

' instead of Global.System.Text, then this statement

' causes a compile-time error.

Dim sb As New System.Text.StringBuilder

End Sub

End Module

Namespace Global.System.Text

Class TitanEncoding

End Class

End Namespace

Confira também
ListBox
System.Windows.Forms
Assemblies no .NET
Referências e a instrução Imports
Instrução Imports (tipo e namespace .NET)
Escrevendo código em soluções do Office
Convenções de nomenclatura do Visual
Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Quando você nomeia um elemento em seu aplicativo do Visual Basic, o primeiro


caractere desse nome deverá ser um caractere alfabético ou um sublinhado. No
entanto, observe que os nomes que começam com um sublinhado não estão em
conformidade com a CLS (Independência da Linguagem e Componentes Independentes
de Linguagem).

As sugestões a seguir se aplicam à nomenclatura.

Inicie cada palavra separada em um nome com uma letra maiúscula, como em
FindLastRecord e RedrawMyForm .

Inicie nomes de função e método com um verbo, como em InitNameArray ou


CloseDialog .

Inicie nomes de classe, estrutura, módulo e propriedade com um substantivo,


como em EmployeeName ou CarAccessory .

Inicie nomes de interface com o prefixo "I", seguido por um substantivo ou uma
frase nominal, como IComponent , ou com um adjetivo descrevendo o
comportamento da interface, como IPersistable . Não use o sublinhado e use
abreviações com moderação, pois abreviações podem causar confusão.

Inicie os nomes do manipulador de eventos com um substantivo que descreve o


tipo de evento seguido pelo sufixo " EventHandler " como em " MouseEventHandler ".

Em nomes de classes de argumento de evento, inclua o sufixo " EventArgs ".

Se um evento tiver um conceito de "antes" ou "depois", use um sufixo no tempo


presente ou passado, como em " ControlAdd " ou " ControlAdded ".

Para termos longos ou frequentemente usados, use abreviações para manter os


comprimentos de nome razoáveis, por exemplo, "HTML", em vez de "Linguagem
de Marcação de Hipertexto". Em geral, nomes de variáveis maiores que 32
caracteres são difíceis de ler em um monitor definido com uma resolução baixa.
Além disso, verifique se suas abreviações são consistentes em todo o aplicativo.
Alternar aleatoriamente em um projeto entre "HTML" e "Linguagem de Marcação
de Hipertexto" pode causar confusão.
Evite usar nomes em um escopo interno que sejam os mesmos que nomes em um
escopo externo. Podem ocorrer erros se a variável errada for acessada. Se ocorrer
um conflito entre uma variável e a palavra-chave de mesmo nome, você deverá
identificar a palavra-chave precedendo-a com a biblioteca de tipos apropriada. Por
exemplo, se você tiver uma variável chamada Date , poderá usar a função
intrínseca Date apenas chamando DateTime.Date.

Confira também
Palavras-chave como nomes de elemento no código
Me, My, MyBase e MyClass
Nomes de elementos declarados
Estrutura do Programa e Convenções de Código
Referência da linguagem Visual Basic
Convenções de codificação do Visual
Basic
Artigo • 07/04/2023 • 6 minutos para o fim da leitura

A Microsoft desenvolve exemplos e documentação que seguem as diretrizes neste


tópico. Se você seguir as mesmas convenções de codificação, poderá obter os seguintes
benefícios:

Seu código terá uma aparência consistente, para que os leitores possam se
concentrar melhor no conteúdo, não no layout.

Os leitores entendem seu código mais rapidamente porque podem fazer


suposições com base na experiência anterior.

Você pode copiar, alterar e manter o código com mais facilidade.

Você ajuda a garantir que seu código demonstre "práticas recomendadas" para o
Visual Basic.

Convenções de nomenclatura
Para obter informações sobre diretrizes de nomenclatura, consulte o tópico
Diretrizes de Nomenclatura.

Não use "My" ou "my" como parte de um nome de variável. Essa prática cria
confusão com os My objetos.

Você não precisa alterar os nomes dos objetos no código gerado


automaticamente para torná-los adequados às diretrizes.

Convenções de Layout
Insira guias como espaços e use recuos inteligentes com recuos de quatro
espaços.

Use a listagem Bonita (reformatação) do código para reformatar seu código no


editor de código. Para obter mais informações, consulte Opções, Editor de Texto,
Básico (Visual Basic).

Gravar apenas uma instrução por linha. Não use o caractere separador de linha do
Visual Basic ( : ).
Evite usar o caractere de continuação de linha explícita " _ " em favor da
continuação de linha implícita onde o idioma permitir.

Gravar apenas uma declaração por linha.

Se a listagem bonita (reformatação) do código não formatar linhas de


continuação automaticamente, recuo manual das linhas de continuação uma
parada de tabulação. No entanto, sempre alinhe itens à esquerda em uma lista.

VB

a As Integer,

b As Integer

Adicione pelo menos uma linha em branco entre as definições de método e de


propriedade.

Comentando Convenções
Coloque comentários em uma linha separada, ao invés do final de uma linha de
código.

Inicie o texto de comentário com uma letra maiúscula e encerre o texto do


comentário com um período.

Insira um espaço entre o delimitador de comentário ( ' ) e o texto do comentário.

VB

' Here is a comment.

Não envolva comentários com blocos formatados de asteriscos.

Estrutura do programa
Ao usar o Main método, use o constructo padrão para novos aplicativos de
console e use My para argumentos de linha de comando.

VB

Sub Main()

For Each argument As String In My.Application.CommandLineArgs

' Add code here to use the string variable.

Next

End Sub

Diretrizes de Linguagem

Tipo de dados da cadeia de caracteres


Use a interpolação de cadeia de caracteres para concatenar cadeias de caracteres
curtas, como é mostrado no código a seguir.

VB

MsgBox($"hello{vbCrLf}goodbye")

Para acrescentar cadeias de caracteres em loops, use o StringBuilder objeto.

VB

Dim longString As New System.Text.StringBuilder

For count As Integer = 1 To 1000

longString.Append(count)

Next

Delegados relaxados em manipuladores de eventos


Não qualifique explicitamente os argumentos ( Object e EventArgs ) para manipuladores
de eventos. Se você não estiver usando os argumentos de evento que são passados
para um evento (por exemplo, sender As Object , ), e As EventArgs use delegados
relaxados e deixe de fora os argumentos de evento em seu código:

VB

Public Sub Form1_Load() Handles Form1.Load

End Sub

Tipo de Dados Sem Sinal


Use Integer em vez de tipos não assinados, exceto onde eles são necessários.

Matrizes
Use a sintaxe concisa ao inicializar matrizes na linha da declaração. Por exemplo,
use a sintaxe a seguir.

VB

Dim letters1 As String() = {"a", "b", "c"}

Não use a sintaxe a seguir.

VB

Dim letters2() As String = New String() {"a", "b", "c"}

Coloque o designador de matriz no tipo, não na variável. Por exemplo, use a


seguinte sintaxe:

VB

Dim letters4 As String() = {"a", "b", "c"}

Não use a seguinte sintaxe:

VB

Dim letters3() As String = {"a", "b", "c"}

Use a sintaxe { } ao declarar e inicializar matrizes de tipos de dados básicos. Por


exemplo, use a seguinte sintaxe:

VB

Dim letters5 As String() = {"a", "b", "c"}

Não use a seguinte sintaxe:

VB

Dim letters6(2) As String

letters6(0) = "a"

letters6(1) = "b"

letters6(2) = "c"

Usar a palavra-chave Com


Ao fazer uma série de chamadas para um objeto, considere usar a With palavra-chave:

VB

With orderLog

.Log = "Application"

.Source = "Application Name"

.MachineName = "Computer Name"

End With

Use o Try... Capturar e usar instruções ao usar o


Tratamento de Exceções
Não use On Error Goto .

Usar a palavra-chave IsNot


Use ... IsNot Nothing em vez de Not ... Is Nothing .

Nova palavra-chave
Use uma instância curta. Por exemplo, use a seguinte sintaxe:

VB

Dim employees As New List(Of String)

A linha precedente é equivalente a isso:

VB

Dim employees2 As List(Of String) = New List(Of String)

Use inicializadores de objeto para novos objetos em vez do construtor sem


parâmetros:

VB

Dim orderLog As New EventLog With {

.Log = "Application",

.Source = "Application Name",

.MachineName = "Computer Name"}

Tratamento de Evento
Use Handles em vez de AddHandler :

VB

Private Sub ToolStripMenuItem1_Click() Handles ToolStripMenuItem1.Click

End Sub

Use AddressOf e não instancie o delegado explicitamente:

VB

Dim closeItem As New ToolStripMenuItem(

"Close", Nothing, AddressOf ToolStripMenuItem1_Click)

Me.MainMenuStrip.Items.Add(closeItem)

Ao definir um evento, use a sintaxe curta e deixe o compilador definir o delegado:

VB

Public Event SampleEvent As EventHandler(Of SampleEventArgs)

' or

Public Event SampleEvent(ByVal source As Object,

ByVal e As SampleEventArgs)

Não verifique se um evento é Nothing (nulo) antes de chamar o RaiseEvent


método. RaiseEvent verifica antes Nothing que ele acione o evento.

Usando membros compartilhados


Chame Shared os membros usando o nome da classe, não de uma variável de instância.

Usar literais XML


Literais XML simplificam as tarefas mais comuns encontradas quando você trabalha com
XML (por exemplo, carregar, consultar e transformar). Ao desenvolver com XML, siga
estas diretrizes:

Use literais XML para criar documentos XML e fragmentos em vez de chamar APIs
XML diretamente.
Importe namespaces XML no nível do arquivo ou do projeto para aproveitar as
otimizações de desempenho para literais XML.

Use as propriedades do eixo XML para acessar elementos e atributos em um


documento XML.

Use expressões inseridas para incluir valores e criar XML com base em valores
existentes em vez de usar chamadas à API, como o Add método:

VB

Private Function GetHtmlDocument(

ByVal items As IEnumerable(Of XElement)) As String

Dim htmlDoc = <html>

<body>

<table border="0" cellspacing="2">

<%=

From item In items

Select <tr>

<td style="width:480">

<%= item.<title>.Value %>

</td>

<td><%= item.<pubDate>.Value %></td>

</tr>

%>

</table>

</body>

</html>

Return htmlDoc.ToString()

End Function

Consultas LINQ
Use nomes significativos para variáveis de consulta:

VB

Dim seattleCustomers = From cust In customers

Where cust.City = "Seattle"

Forneça nomes para elementos em uma consulta para garantir que os nomes de
propriedades de tipos anônimos sejam maiúsculas corretamente usando o uso de
maiúsculas e minúsculas pascal:

VB
Dim customerOrders = From customer In customers

Join order In orders

On customer.CustomerID Equals order.CustomerID

Select Customer = customer, Order = order

Renomeie propriedades quando os nomes de propriedades no resultado forem


ambíguos. Por exemplo, se a sua consulta retornar um nome de cliente e um ID de
ordem, renome-os ao invés de deixá-los como Name e ID no resultado:

VB

Dim customerOrders2 = From cust In customers

Join ord In orders

On cust.CustomerID Equals ord.CustomerID

Select CustomerName = cust.Name,

OrderID = ord.ID

Usa a inferência de tipos na declaração de variáveis de consulta e de intervalo:

VB

Dim customerList = From cust In customers

Alinhar cláusulas de consulta na instrução From :

VB

Dim newyorkCustomers = From cust In customers

Where cust.City = "New York"

Select cust.LastName, cust.CompanyName

Use as cláusulas Where antes de outras cláusulas de consulta, para garantir que as
cláusulas de consulta posteriores operem no conjunto de dados filtrado:

VB

Dim newyorkCustomers2 = From cust In customers

Where cust.City = "New York"

Order By cust.LastName

Use a Join cláusula para definir explicitamente uma operação de junção em vez
de usar a Where cláusula para definir implicitamente uma operação de junção:

VB
Dim customerList2 = From cust In customers

Join order In orders

On cust.CustomerID Equals order.CustomerID

Select cust, order

Confira também
Diretrizes de codificação segura
Compilação condicional no Visual Basic
Artigo • 12/12/2022 • 2 minutos para o fim da leitura

Na compilação condicional, blocos específicos de código em um programa são


compilados seletivamente enquanto outros são ignorados.

Por exemplo, talvez você queira escrever instruções de depuração que comparem a
velocidade de diferentes abordagens com a mesma tarefa de programação, ou talvez
você queira localizar um aplicativo para vários idiomas. Instruções de compilação
condicional são projetadas para serem executadas durante o tempo de compilação, não
no tempo de execução.

Você denota blocos de código a serem compilados condicionalmente com a diretiva


#If...Then...#Else . Por exemplo, para criar versões em francês e alemão do mesmo

aplicativo do mesmo código-fonte, você insere segmentos de código específicos da


plataforma em instruções #If...Then usando as constantes predefinidas FrenchVersion
e GermanVersion . O exemplo a seguir demonstra como:

VB

#If FrenchVersion Then

' <code specific to the French language version>.

#ElseIf GermanVersion Then

' <code specific to the German language version>.

#Else

' <code specific to other versions>.

#End If

Se você definir o valor da constante de compilação condicional FrenchVersion para


True no tempo de compilação, o código condicional da versão francesa será compilado.

Se você definir o valor da constante GermanVersion como True , o compilador usará a


versão alemã. Se nenhum dos dois estiver definido como True , será executado o código
no último bloco Else .

7 Observação

O preenchimento automático não funcionará ao editar código e usar diretivas de


compilação condicional se o código não fizer parte do branch atual.
Declarando constantes de compilação
condicional
Você pode definir constantes de compilação condicional de uma das três maneiras:

No Designer de Projeto

Na linha de comando ao usar o compilador da linha de comando

No seu código

As constantes de compilação condicional têm um escopo especial e não podem ser


acessadas pelo código padrão. O escopo de uma constante de compilação condicional
depende da maneira como ela é definida. A tabela a seguir lista o escopo das
constantes declaradas usando cada uma das três maneiras citadas anteriormente.

Como é definida uma Escopo da constante


constante

Designer de Projeto Público para todos os arquivos no projeto

Linha de comando Público para todos os arquivos passados para o compilador da


linha de comando

#Const instrução no código Privado para o arquivo no qual ele é declarado

Para definir constantes no Designer de Projeto

– Antes de criar seu arquivo executável, defina as constantes no Designer de Projeto seguindo as
etapas fornecidas no Gerenciando propriedades do projeto e da solução.

Para definir as constantes na linha de comando

– Use o switch -d para inserir constantes de compilação condicional, como no exemplo a seguir:

vbc MyProj.vb /d:conFrenchVersion=–1:conANSI=0

Não é necessário espaço entre o switch -d e a primeira constante. Para obter mais informações,
confira -define (Visual Basic).

As declarações da linha de comando substituem as declarações inseridas no Designer de Projeto,


mas não as apagam. Os argumentos definidos no Designer de Projeto permanecem em vigor
para as compilações subsequentes.

Ao escrever as constantes no próprio código, não há regras rígidas quanto ao seu


posicionamento, pois seu escopo é o módulo inteiro no qual elas são declaradas.

Para definir as constantes no seu código


Para definir as constantes no seu código

– Coloque as constantes no bloco de declaração do módulo no qual elas são usadas. Isso ajuda a
manter o seu código organizado e mais fácil de ler.

Tópicos Relacionados
Título Descrição

Estrutura do Programa e Convenções Fornece sugestões para facilitar a leitura e a


de Código manutenção do código.

Referência
Diretiva #Const

Diretivas #If...Then...#Else

-define (Visual Basic)


Como quebrar e combinar instruções no
código (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Ao escrever seu código, você pode criar instruções longas que exigem rolagem
horizontal no Editor de Código. Embora isso não afete a maneira como seu código é
executado, isso dificulta que você ou qualquer outra pessoa leia o código como ele
aparece no monitor. Nesses casos, você deve considerar dividir a única instrução longa
em várias linhas.

Para dividir uma única instrução em várias


linhas
Use o caractere de continuação de linha, que é um sublinhado ( _ ), no ponto em que
você deseja que a linha quebre. O sublinhado deve ser imediatamente precedido por
um espaço e imediatamente seguido por um terminador de linha (código de fim de
linha) ou (começando com a versão 16.0) um comentário seguido por um código de fim
de linha.

7 Observação

Em alguns casos, se você omitir o caractere de continuação de linha, o compilador


do Visual Basic continuará implicitamente a instrução na próxima linha de código.
Para obter uma lista de elementos de sintaxe para os quais você pode omitir o
caractere de continuação de linha, consulte "Continuação de linha implícita" em
Instruções.

No exemplo a seguir, a instrução é dividida em quatro linhas com caracteres de


continuação de linha encerrando todas, exceto a última linha.

VB

cmd.CommandText = _

"SELECT * FROM Titles JOIN Publishers " _

& "ON Publishers.PubId = Titles.PubID " _

& "WHERE Publishers.State = 'CA'"

O uso dessa sequência facilita a leitura do código, tanto online como impresso.
O caractere de continuação de linha deve ser o último caractere em uma linha. Você não
pode segui-lo com mais nada na mesma linha.

Existem algumas limitações sobre onde você pode usar o caractere de continuação de
linha; por exemplo, você não pode usá-lo no meio de um nome de argumento. Você
pode quebrar uma lista de argumentos com o caractere de continuação de linha, mas os
nomes individuais dos argumentos devem permanecer intactos.

Você não pode continuar um comentário usando um caractere de continuação de linha.


O compilador não examina os caracteres em um comentário para obter um significado
especial. Para um comentário de várias linhas, repita o símbolo de comentário ( ' ) em
cada linha.

Embora colocar cada instrução em uma linha separada seja o método recomendado, o
Visual Basic também permite que você coloque várias instruções na mesma linha.

Para colocar várias instruções na mesma linha


Separe as instruções com dois-pontos ( : ), como no exemplo a seguir:

VB

text1.Text = "Hello" : text1.BackColor = System.Drawing.Color.Red

Confira também
Estrutura do Programa e Convenções de Código
Instruções
Como recolher e ocultar seções do
código (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A diretiva #Region permite recolher e ocultar seções de código em arquivos do Visual


Basic. A diretiva #Region permite que você especifique um bloco de código que pode
ser expandido ou recolhido ao usar o editor de código do Visual Studio. A capacidade
de ocultar código seletivamente torna seus arquivos mais gerenciáveis e mais fáceis de
ler. Para obter mais informações, consulte Estrutura de tópicos.

#Region as diretivas dão suporte à semântica de bloco de código, como #If...#End If .


Isso significa que eles não podem começar em um bloco e terminar em outro; o início e
o fim devem estar no mesmo bloco. #Region não há suporte para diretivas dentro das
funções.

Para recolher e ocultar uma seção de código


Coloque a seção de código entre as instruções e #Region as #End Region instruções,
como no exemplo a seguir:

VB

#Region "This is the code to be collapsed"

Private components As System.ComponentModel.Container

Dim WithEvents Form1 As System.Windows.Forms.Form

Private Sub InitializeComponent()

components = New System.ComponentModel.Container

Me.Text = "Form1"

End Sub

#End Region

O #Region bloco pode ser usado várias vezes em um arquivo de código; portanto, os
usuários podem definir seus próprios blocos de procedimentos e classes que podem,
por sua vez, ser recolhidos. #Region blocos também podem ser aninhados em outros
#Region blocos.

7 Observação

Ocultar código não o impede de ser compilado e não afeta #If...#End If


instruções.
Confira também
Compilação Condicional
Diretiva #Region
Diretivas #If...Then...#Else
Estrutura de tópicos
Como rotular instruções (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os blocos de instrução são compostos por linhas de código delimitadas por dois-
pontos. As linhas de código precedidas por uma cadeia de caracteres de identificação
ou inteiro são rotuladas. Os rótulos de instrução são usados para marcar uma linha de
código para identificá-la para uso com instruções como On Error Goto .

Os rótulos podem ser identificadores válidos do Visual Basic, como aqueles que
identificam elementos de programação, ou literais inteiros. Um rótulo deve aparecer no
início de uma linha de código-fonte e deve ser seguido por dois-pontos,
independentemente de ser seguido por uma instrução na mesma linha.

O compilador identifica rótulos verificando se o início da linha corresponde a qualquer


identificador já definido. Se isso não acontecer, o compilador pressupõe que seja um
rótulo.

Os rótulos têm seu próprio espaço de declaração e não interferem em outros


identificadores. O escopo de um rótulo é o corpo do método. A declaração de rótulo
tem precedência em qualquer situação ambígua.

7 Observação

Os rótulos só podem ser usados em instruções executáveis dentro dos métodos.

Para rotular uma linha de código


Coloque um identificador, seguido por dois-pontos, no início da linha do código-fonte.

Por exemplo, as seguintes linhas de código são rotuladas com Jump e 120 ,
respectivamente:

VB

Jump: FileOpen(1, "testFile", OpenMode.Input)

' ...

120: FileClose(1)

Confira também
Instruções
Nomes de elementos declarados
Estrutura do Programa e Convenções de Código
Caracteres especiais no código (Visual
Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Às vezes você precisa usar caracteres especiais em seu código, ou seja, caracteres que
não são alfabéticos ou numéricos. Os sinais de pontuação e os caracteres especiais têm
vários usos no conjunto de caracteres do C, desde a organização do texto do programa
até a definição das tarefas que o compilador ou o programa compilado executam. Eles
não especificam uma operação a ser executada.

Parênteses
Use parênteses quando definir um procedimento, como um Sub ou Function . Você
deve incluir todas as listas de argumentos de procedimento em parênteses. Você
também usa parênteses para colocar variáveis ou argumentos em grupos lógicos,
especialmente para substituir a ordem padrão de precedência do operador em uma
expressão complexa. O exemplo a seguir ilustra essa situação.

VB

Dim a, b, c, d, e As Double

a = 3.2

b = 7.6

c = 2

d = b + c / a

e = (b + c) / a

Após a execução do código anterior, o valor de d é 8.225, e o valor de e é 3. O cálculo


para d usa a precedência padrão de / sobre + , e é equivalente a d = b + (c / a) . Os
parênteses no cálculo para e substituem a precedência padrão.

Separadores
Separadores fazem o que nome sugere: eles separam seções de código. No Visual Basic,
o caractere separador é o dois-pontos ( : ). Use separadores quando quiser incluir várias
instruções em uma única linha em vez de linhas separadas. Isso economiza espaço e
melhora a legibilidade do código. O exemplo a seguir mostra três instruções separadas
por dois-pontos.

VB
a = 3.2 : b = 7.6 : c = 2

Para obter mais informações, consulte Como quebrar e combinar instruções no código.

O caractere de dois-pontos ( : ) também é usado para identificar um rótulo de instrução.


Para obter mais informações, consulte Como rotular instruções.

Concatenação
Use o operador & para concatenação ou vinculação de cadeias de caracteres. Não o
confunda com o operador + , que adiciona valores numéricos. Se você usar o operador
+ para concatenar quando operar em valores numéricos, poderá obter resultados
incorretos. O exemplo a seguir demonstra isso.

VB

var1 = "10.01"

var2 = 11

resultA = var1 + var2

resultB = var1 & var2

Após a execução do código anterior, o valor de resultA é 21.01, e o valor de resultB é


10.0111.

Operadores de acesso a membros


Para acessar um membro de um tipo, use o operador ponto ( . ) ou ponto de
exclamação ( ! ) entre o nome do tipo e o nome do membro.

Operador ponto (.)


Use o operador . em uma classe, estrutura, interface ou enumeração como um
operador de acesso a membro. O membro pode ser um campo, uma propriedade, um
evento ou um método. O exemplo a seguir ilustra essa situação.

VB

Dim nextForm As New System.Windows.Forms.Form

' Access Text member (property) of Form class (on nextForm object).

nextForm.Text = "This is the next form"

' Access Close member (method) on nextForm.

nextForm.Close()

Operador ponto de exclamação (!)


Use o operador ! somente em uma classe ou interface como um operador de acesso a
dicionário. A classe ou interface deve ter uma propriedade padrão que aceite um único
argumento String . O identificador imediatamente após o operador ! se torna o valor
do argumento passado para a propriedade padrão como uma cadeia de caracteres. O
exemplo a seguir demonstra isso.

VB

Public Class hasDefault


Default Public ReadOnly Property index(ByVal s As String) As Integer

Get

Return 32768 + AscW(s)

End Get

End Property

End Class

Public Class testHasDefault

Public Sub compareAccess()

Dim hD As hasDefault = New hasDefault()

MsgBox("Traditional access returns " & hD.index("X") & vbCrLf &

"Default property access returns " & hD("X") & vbCrLf &

"Dictionary access returns " & hD!X)

End Sub

End Class

Todas as três linhas de saída de MsgBox exibem o valor 32856 . A primeira linha usa o
acesso tradicional à propriedade index , a segunda usa o fato de que index é a
propriedade padrão da classe hasDefault , e a terceira usa o acesso de dicionário à
classe.

Observe que o segundo operando do operador ! deve ser um identificador válido do


Visual Basic não contido entre aspas duplas ( " " ). Em outras palavras, você não pode
usar uma literal de cadeia de caracteres ou uma variável de cadeia de caracteres. A
alteração a seguir na última linha da chamada MsgBox gera um erro, porque "X" é um
literal de cadeia de caracteres fechado.

"Dictionary access returns " & hD!"X")

7 Observação

As referências a coleções padrão devem ser explícitas. Em especial, você não pode
usar o operador ! em uma variável com associação tardia.
O caractere ! também é usado como o caractere de tipo Single .

Confira também
Estrutura do Programa e Convenções de Código
Caracteres de tipo
Comentários no código (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

À medida que você lê os exemplos de código, você encontra geralmente o símbolo de


comentário ( ' ). Esse símbolo diz para o compilador do Visual Basic ignorar o texto ou o
comentário que o segue. Os comentários são uma breve explicação e/ou anotações
adicionadas ao código para o benefício de quem os lê.

É uma prática de programação recomendável iniciar todos os procedimentos com um


breve comentário descrevendo as características do procedimento e sua funcionalidade
(o que ele faz). Isso é um benefício para o programador e é vantajoso para qualquer
pessoa que examinar o código. Você deve separar os detalhes de implementação (como
o procedimento faz isso) dos comentários que descrevem as características funcionais.
Quando você incluir detalhes da implementação na descrição, lembre-se de atualizá-los
quando você atualizar a função.

Comentários podem seguir uma instrução na mesma linha ou ocupar uma linha inteira.
Ambos são ilustrados no código a seguir.

VB

' This is a comment beginning at the left edge of the screen.

text1.Text = "Hi!" ' This is an inline comment.

Se seu comentário exigir mais de uma linha, use o símbolo de comentário em cada
linha, como o exemplo a seguir mostra.

VB

' This comment is too long to fit on a single line, so we break

' it into two lines. Some comments might need three or more lines.

Diretrizes de comentários
A tabela a seguir fornece diretrizes gerais para os tipos de comentários que podem
preceder uma seção de código. São sugestões; o Visual Basic não impõe regras para
adicionar comentários. Escreva o que funciona melhor, tanto para você quanto para
qualquer outra pessoa que leia seu código.

Tipo de Descrição do comentário


comentário
Tipo de Descrição do comentário
comentário

Finalidade Descreve o que o procedimento faz (não como ele faz)

Suposições Lista cada variável externa, controle, arquivo aberto ou outro elemento acessado
pelo procedimento

Efeitos Listas cada variável externa, controle ou arquivo afetado, e o efeito que ele tem
(somente se não for óbvio)

Entradas Especifica a finalidade do argumento

Retornos Explica os valores retornados pelo procedimento

Lembre-se dos seguintes pontos:

Cada declaração de variável importante deve ser precedida por um comentário


sobre o uso da variável sendo declarada.

Variáveis, controles e procedimentos devem ser chamados claramente o bastante


para que os comentários sejam necessários somente para detalhes de
implementação complexos.

Os comentários não podem seguir uma sequência de continuação de linha na


mesma linha.

Você pode adicionar ou remover símbolos de comentário para um bloco de código


selecionando uma ou mais linhas de código e escolhendo os botões Comentário ( )e
Remover marca de comentário ( ) na barra de ferramentas Editar.

7 Observação

Você também pode adicionar comentários ao código precedendo o texto com a


palavra-chave REM . No entanto, o símbolo ' e os botões Comentar/Remover
marca de comentário são mais fáceis de usar e exigem menos espaço e memória.

Confira também
Basic Instincts - Documentando seu código com comentários em XML
Como criar documentação XML
Marcações de Comentário XML
Estrutura do Programa e Convenções de Código
Instrução REM
Palavras-chave como nomes de
elemento em código (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Qualquer elemento de programa, como uma variável, classe ou membro, pode ter o
mesmo nome que uma palavra-chave restrita. Por exemplo, você pode recriar uma
variável nomeada Loop . No entanto, para se referir à sua versão dele, que tem o mesmo
nome que a palavra-chave restrita Loop , você deve precedê-la com uma cadeia de
caracteres de qualificação completa ou colocá-la entre colchetes ( [ ] ), como mostra o
exemplo a seguir.

VB

' The following statement precedes Loop with a full qualification string.

sampleForm.Loop.Visible = True

' The following statement encloses Loop in square brackets.

[Loop].Visible = True

Se você não fizer nenhuma delas, o Visual Basic assumirá o uso da palavra-chave
intrínseca Loop e produzirá um erro, como no exemplo a seguir:

' The following statement causes a compiler error.

Loop.Visible = True

Você pode usar colchetes ao se referir a formulários e controles e ao declarar uma


variável ou definir um procedimento com o mesmo nome que uma palavra-chave
restrita. Pode ser fácil esquecer de qualificar nomes ou incluir colchetes e, portanto,
introduzir erros em seu código e dificultar a leitura. Por esse motivo, recomendamos
que você não use palavras-chave restritas como os nomes dos elementos do programa.
No entanto, se uma versão futura do Visual Basic definir uma nova palavra-chave que
entra em conflito com um formulário ou nome de controle existente, você poderá usar
essa técnica ao atualizar seu código para trabalhar com a nova versão.

7 Observação

Seu programa também pode incluir nomes de elementos fornecidos por outros
assemblies referenciados. Se esses nomes entrarem em conflito com palavras-
chave restritas, colocar colchetes ao redor deles fará com que o Visual Basic os
interprete como elementos definidos.
Confira também
Convenções de nomenclatura do Visual Basic
Estrutura do Programa e Convenções de Código
Palavras-chave
Me, My, MyBase e MyClass no Visual
Basic
Artigo • 11/04/2023

Me , My , MyBase e MyClass no Visual Basic têm nomes semelhantes, mas propósitos


diferentes. Este tópico descreve cada uma dessas entidades para distingui-las.

Eu
A palavra-chave Me fornece uma maneira de se referir à instância específica de uma
classe ou estrutura na qual o código está sendo executado no momento. Me se
comporta como uma variável de objeto ou uma variável de estrutura que se refere à
instância atual. Usar Me é particularmente útil para passar informações sobre a instância
em execução atualmente de uma classe ou estrutura para um procedimento em outra
classe, estrutura ou módulo.

Por exemplo, suponha que você tenha o procedimento a seguir em um módulo.

VB

Sub ChangeFormColor(FormName As Form)

Randomize()

FormName.BackColor = Color.FromArgb(Rnd() * 256, Rnd() * 256, Rnd() *


256)

End Sub

Você pode chamar esse procedimento e passar a instância atual da classe Form como
um argumento usando a instrução a seguir.

VB

ChangeFormColor(Me)

Meu
O recurso My oferece acesso rápido e intuitivo a inúmeras classes do .NET Framework,
permitindo que o usuário do Visual Basic interaja com o computador, com o aplicativo,
com as configurações, com os recursos e assim por diante. Para obter uma lista dessas
classes, confira a referência Objetos de Tempo de Execução do Visual Basic.
MyBase
A palavra-chave MyBase se comporta como uma variável de objeto que se refere à
classe base da instância atual de uma classe. MyBase é comumente usado para acessar
membros de classe base que são substituídos ou sombreados em uma classe derivada.
MyBase.New é usado para chamar explicitamente um construtor de classe base de um

construtor de classe derivada.

MyClass
A palavra-chave MyClass se comporta como uma variável de objeto que se refere à
instância atual de uma classe, conforme implementado originalmente. MyClass é
semelhante a Me , mas todas as chamadas de método nele são tratadas como se o
método fosse NotOverridable .

Confira também
Noções básicas de herança
Limitações do Visual Basic
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Versões anteriores do Visual Basic impuseram limites no código, como o comprimento


de nomes de variáveis, o número de variáveis permitidas em módulos e o tamanho do
módulo. No Visual Basic .NET, essas restrições foram flexibilizadas, proporcionando
maior liberdade na escrita e na organização do código.

Os limites físicos dependem mais da memória em tempo de execução do que das


considerações em tempo de compilação. Se você usar práticas de programação
prudentes e dividir aplicativos grandes em várias classes e módulos, há muito pouca
chance de encontrar uma limitação interna do Visual Basic.

Veja a seguir algumas limitações que você pode encontrar em casos extremos:

Comprimento do Nome. Há um número máximo de caracteres para o nome de


cada elemento de programação declarado. Esse máximo se aplica a uma cadeia de
caracteres inteira de qualificação se o nome do elemento for qualificado. Confira
Nomes de elementos declarados.

Comprimento da linha. Há um máximo de 65535 caracteres em uma linha física


do código-fonte. A linha de código-fonte lógica pode ser mais longa se você usar
caracteres de continuação de linha. Confira Como quebrar e combinar instruções
no código.

Dimensões da matriz. Há um número máximo de dimensões que você pode


declarar para uma matriz. Isso limita quantos índices você pode usar para
especificar um elemento da matriz. Confira Dimensões de matriz no Visual Basic.

Comprimento da cadeias de caracteres. Há um número máximo de caracteres


Unicode que você pode armazenar em uma única cadeia de caracteres. Confira
Tipo de dados String.

Comprimento da cadeia de caracteres do ambiente. Há um máximo de 32768


caracteres para qualquer cadeia de caracteres de ambiente usada como um
argumento de linha de comando. Essa é uma limitação em todas as plataformas.

Confira também
Estrutura do Programa e Convenções de Código
Convenções de nomenclatura do Visual Basic
Funcionalidades da linguagem do Visual
Basic
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Os tópicos a seguir apresentam e discutem os componentes essenciais do Visual Basic,


uma linguagem de programação orientada a objeto. Depois de criar a interface do
usuário para o seu aplicativo usando formulários e controles, você precisa escrever o
código que define o comportamento do aplicativo. Como acontece com qualquer
linguagem de programação moderna, o Visual Basic é compatível com muitos
constructos de programação e elementos de linguagem comuns.

Se você já programou em outras linguagens, grande parte do material abordado nesta


seção poderá parecer familiar. Embora a maioria dos constructos seja semelhante a de
outras linguagens, a natureza orientada a eventos do Visual Basic apresenta algumas
diferenças sutis.

Se você for novo em programação, o material desta seção servirá como uma introdução
aos blocos de compilação básicos para escrever código. Depois de compreender os
conceitos básicos, você pode criar aplicativos avançados usando Visual Basic.

Nesta seção
matrizes

Discute como tornar seu código mais eficiente e compacto declarando e usando
matrizes, que contêm vários valores relacionados.

Inicializadores de Coleção

Descreve os inicializadores de coleção, que permitem que você crie e preencha uma
coleção com um conjunto inicial de valores.

Constantes e Enumerações

Discute o armazenamento de valores sem variação para uso repetido, inclusive


conjuntos de valores constantes relacionados.

Fluxo de Controle

Mostra como regular o fluxo de execução do programa.

Data Types

Descreve quais tipos de dados um elemento de programação pode armazenar e como


esses dados são armazenados.
Elementos Declarados

Aborda a programação de elementos que você pode declarar, seus nomes e


características e como o compilador resolve referências para eles.

Representantes

Fornece uma introdução aos delegados e como eles são usados no Visual Basic.

Associação Antecipada e Tardia

Descreve a vinculação, que é executada pelo compilador quando um objeto é atribuído


a uma variável de objeto e as diferenças entre objetos com associação inicial e tardia.

Tipos de Erro

Fornece uma visão geral dos erros de sintaxe, erros de tempo de execução e erros
lógicos.

Eventos

Mostra como declarar e usar eventos.

Interfaces

Descreve o que são as interfaces e como usá-las em seus aplicativos.

LINQ

Fornece links para tópicos que apresentam recursos e programação de LINQ (consulta
integrada à linguagem).

Objetos e Classes

Fornece uma visão geral dos objetos e classes, como eles são usados, suas relações
entre si e as propriedades, métodos e eventos que expõem.

Operadores e Expressões

Descreve os elementos de código que manipulam elementos contendo valores, como


usá-los com eficiência e como combiná-los para gerar novos valores.

Procedimentos

Descreve os procedimentos Sub , Function , Property e Operator , bem como tópicos


avançados como procedimentos recursivos e sobrecarregados.

Instruções

Descreve as instruções de declaração e executável.

Cadeias de caracteres

Fornece links para tópicos que descrevem os conceitos básicos sobre o uso de cadeias
de caracteres no Visual Basic.
Variáveis

Apresenta as variáveis e descreve como usá-las no Visual Basic.

XML

Também fornece links para tópicos que descrevem como usar XML no Visual Basic.

Seções relacionadas
Coleções

Descreve alguns dos tipos de coleções fornecidas pelo .NET Framework. Demonstra
como usar coleções simples e coleções de pares chave/valor.

Referência da linguagem Visual Basic

Fornece informações de referência sobre vários aspectos da programação do Visual


Basic.
Matrizes no Visual Basic
Artigo • 15/02/2023 • 29 minutos para o fim da leitura

Uma matriz é um conjunto de valores, que são chamados de elementos, que estão
logicamente relacionados entre si. Por exemplo, uma matriz pode consistir no número
de alunos em cada série em uma escola de gramática; cada elemento da matriz é o
número de alunos em uma única série. Da mesma forma, uma matriz pode consistir em
notas de um aluno para uma classe; cada elemento da matriz é uma única nota.

É possível usar variáveis individuais para armazenar cada um de nossos itens de dados.
Por exemplo, se nosso aplicativo analisar as notas dos alunos, podemos usar uma
variável separada para a nota de cada aluno, como englishGrade1 , englishGrade2 etc.
Essa abordagem tem três limitações principais:

Temos que saber exatamente em tempo de design quantas notas temos que lidar.
Lidar com grandes números de notas rapidamente torna-se desordado. Isso, por
sua vez, torna um aplicativo muito mais propenso a ter bugs graves.
É difícil de manter. Cada nova nota que adicionamos requer que o aplicativo seja
modificado, recompilado e reimplantado.

Usando uma matriz, você pode consultar esses valores relacionados com o mesmo
nome e usar um número que é chamado de índice ou subscrito para identificar um
elemento individual baseado na sua posição na matriz. Os índices de uma matriz variam
de 0 a 1 a menos do que o número total de elementos na matriz. Quando você usa a
sintaxe do Visual Basic para definir o tamanho de uma matriz, especifique seu índice
mais alto, não o número total de elementos na matriz. Você pode trabalhar com a
matriz como uma unidade e a capacidade de iterar seus elementos libera você de
precisar saber exatamente quantos elementos ele contém em tempo de design.

Alguns exemplos rápidos antes da explicação:

VB

' Declare a single-dimension array of 5 numbers.

Dim numbers(4) As Integer

' Declare a single-dimension array and set its 4 values.

Dim numbers = New Integer() {1, 2, 4, 8}

' Change the size of an existing array to 16 elements and retain the current
values.

ReDim Preserve numbers(15)

' Redefine the size of an existing array and reset the values.

ReDim numbers(15)

' Declare a 6 x 6 multidimensional array.

Dim matrix(5, 5) As Double

' Declare a 4 x 3 multidimensional array and set array element values.

Dim matrix = New Integer(,) {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}}

' Declare a jagged array

Dim sales()() As Double = New Double(11)() {}

Elementos da matriz em uma matriz simples


Vamos criar uma matriz nomeada students para armazenar o número de alunos em
cada série em uma escola de gramática. Os índices dos elementos variam de 0 a 6. Ter
essa matriz é mais simples do que declarar sete variáveis.

A ilustração a seguir mostra a matriz students . Para cada elemento da matriz:

O índice do elemento representa a classificação (o índice 0 representa o jardim de


infância).

O valor contido no elemento representa o número de alunos nessa série.

O exemplo a seguir contém o código do Visual Basic que cria e usa a matriz:

VB

Module SimpleArray

Public Sub Main()

' Declare an array with 7 elements.

Dim students(6) As Integer

' Assign values to each element.

students(0) = 23

students(1) = 19

students(2) = 21

students(3) = 17

students(4) = 19

students(5) = 20

students(6) = 22

' Display the value of each element.

For ctr As Integer = 0 To 6

Dim grade As String = If(ctr = 0, "kindergarten", $"grade {ctr}")

Console.WriteLine($"Students in {grade}: {students(ctr)}")

Next

End Sub

End Module

' The example displays the following output:

' Students in kindergarten: 23

' Students in grade 1: 19

' Students in grade 2: 21

' Students in grade 3: 17

' Students in grade 4: 19

' Students in grade 5: 20

' Students in grade 6: 22

O exemplo faz três coisas:

Ele declara uma students matriz com sete elementos. O número 6 na declaração
de matriz indica o último índice na matriz; ele é um menor que o número de
elementos na matriz.
Ele atribui valores a cada elemento na matriz. Os elementos de matriz são
acessados usando o nome da matriz e incluindo o índice do elemento individual
em parênteses.
Ele lista cada valor da matriz. O exemplo usa uma For instrução para acessar cada
elemento da matriz por seu número de índice.

A students matriz no exemplo anterior é uma matriz unidimensional porque usa um


índice. Uma matriz que usa mais de um índice ou subscrito é chamada multidimensional.
Para obter mais informações, consulte o restante deste tópico e Dimensões de matriz no
Visual Basic.

Criando uma matriz


Você pode definir o tamanho de uma matriz de várias maneiras:

Você pode especificar o tamanho quando uma matriz é declarada:

VB

' Declare an array with 10 elements.

Dim cargoWeights(9) As Double

' Declare a 24 x 2 array.

Dim hourlyTemperatures(23, 1) As Integer

' Declare a jagged array with 31 elements.

Dim januaryInquiries(30)() As String

Você pode usar uma cláusula New para fornecer o tamanho de uma matriz quando
ela é criada:

VB

' Declare an array with 10 elements.

Dim cargoWeights() As Double = New Double(9) {}

' Declare a 24 x 2 array.

Dim hourlyTemperatures(,) As Integer = New Integer(23, 1) {}

' Declare a jagged array with 31 elements.

Dim januaryInquiries()() As String = New String(30)() {}

Se tiver uma matriz existente, você poderá redefinir o tamanho usando a instrução
ReDim. Você pode especificar que a instrução ReDim deve manter os valores na matriz
ou você pode especificar que ela crie uma matriz vazia. O exemplo a seguir mostra os
diferentes usos da instrução ReDim para modificar o tamanho de uma matriz existente.

VB

' Assign a new array size and retain the current values.

ReDim Preserve cargoWeights(20)

' Assign a new array size and retain only the first five values.

ReDim Preserve cargoWeights(4)

' Assign a new array size and discard all current element values.

ReDim cargoWeights(15)

Para obter mais informações, consulte Instrução ReDim.

Armazenando valores em uma matriz


Você pode acessar cada local em uma matriz usando um índice do tipo Integer . Você
pode armazenar e recuperar valores em uma matriz, fazendo referência a cada local de
matriz usando seu índice entre parênteses. Índices de matrizes multidimensionais são
separados por vírgulas (,). Você precisa de um índice para cada dimensão de matriz.

O exemplo a seguir mostra algumas instruções que armazenam valores em matrizes.

VB

Module Example

Public Sub Main()

' Create a 10-element integer array.

Dim numbers(9) As Integer

Dim value As Integer = 2

' Write values to it.

For ctr As Integer = 0 To 9

numbers(ctr) = value

value *= 2

Next

' Read and sum the array values.

Dim sum As Integer

For ctr As Integer = 0 To 9

sum += numbers(ctr)

Next

Console.WriteLine($"The sum of the values is {sum:N0}")

End Sub

End Module

' The example displays the following output:

' The sum of the values is 2,046

Populando uma matriz com literais de matriz


Usando um literal de matriz, você pode preencher uma matriz com um conjunto inicial
de valores ao mesmo tempo em que a cria. Um literal de matriz consiste em uma lista
de valores separados por vírgulas que são colocados entre chaves ( {} ).

Ao criar uma matriz usando um literal de matriz, você pode fornecer o tipo de matriz ou
usar inferência de tipos para determinar o tipo de matriz. O exemplo abaixo mostra
duas opções.

VB

' Array literals with explicit type definition.

Dim numbers = New Integer() {1, 2, 4, 8}

' Array literals with type inference.

Dim doubles = {1.5, 2, 9.9, 18}

' Array literals with explicit type definition.

Dim articles() As String = { "the", "a", "an" }

' Array literals with explicit widening type definition.

Dim values() As Double = { 1, 2, 3, 4, 5 }

Quando você usa a inferência de tipos, o tipo da matriz é determinado pelo tipo
dominante na lista de valores que é fornecida para o literal de matriz. O tipo dominante
é um tipo exclusivo ao qual todos os outros tipos no literal da matriz podem ser
ampliados. Se esse tipo exclusivo não puder ser determinado, o tipo dominante será o
tipo exclusivo ao qual todos os outros tipos na matriz poderão restringir. Se nenhum
desses tipos exclusivos puder ser determinado, o tipo dominante será Object . Por
exemplo, se a lista de valores que é fornecida para o literal de matriz contiver os valores
do tipo Integer , Long e Double , a matriz resultante será do tipo Double . Porque
Integer e Long ampliar somente para Double , Double é o tipo dominante. Para obter

mais informações, consulte Ampliando e restringindo conversões.

7 Observação

Você pode usar a inferência de tipo apenas para matrizes definidas como variáveis
locais em um membro do tipo. Se uma definição de tipo explícito estiver ausente,
as matrizes definidas com literais de matriz no nível da classe serão do tipo
Object[] . Para obter mais informações, confira Inferência de tipo de variável local.

Observe que o exemplo anterior define values como uma matriz de tipo Double ,
embora todos os literais de matriz sejam do tipo Integer . Você pode criar essa matriz
porque os valores no literal da matriz podem ser ampliados para Double valores.

Você pode criar uma matriz multidimensional usando literais de matriz aninhados. Os
literais de matriz aninhados devem ter uma dimensão e o número de dimensões, ou
classificação, consistentes com a matriz resultante. O exemplo de código a seguir cria
uma matriz bidimensional de números inteiros usando um literal de matriz.

VB

' Create and populate a 2 x 2 array.

Dim grid1 = {{1, 2}, {3, 4}}

' Create and populate a 2 x 2 array with 3 elements.

Dim grid2(,) = {{1, 2}, {3, 4}, {5, 6}}

Ao usar literais de matriz aninhados para criar e preencher uma matriz, ocorrerá um erro
se o número de elementos nos literais de matriz aninhados não corresponder. Um erro
também ocorrerá se você declarar explicitamente a variável de matriz para ter um
número diferente de dimensões que os literais da matriz.

Assim como você pode para matrizes unidimensionais, você pode confiar na inferência
de tipo ao criar uma matriz multidimensional com literais de matriz aninhada. Quando
você usa a inferência de tipos, o tipo inferido é o tipo dominante para todos os valores
em todos os literais de matriz para um nível de aninhamento. O exemplo de código a
seguir cria uma matriz bidimensional de tipo Double[,] de valores que são do tipo
Integer e Double .
VB

Dim arr = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}

Para obter exemplos adicionais, consulte Como inicializar uma variável de matriz no
Visual Basic.

Iterando por uma matriz


Quando você itera por uma matriz, pode acessar cada elemento na matriz do índice
menor para o índice maior. Normalmente, use o For... Instrução Next ou For Each...
Próxima Instrução para iterar por meio dos elementos de uma matriz. Quando você não
conhece os limites superiores da matriz, pode chamar o Array.GetUpperBound método
para obter o valor mais alto do índice. Embora o menor valor de índice seja quase
sempre 0, você pode chamar o Array.GetLowerBound método para obter o valor mais
baixo do índice.

O exemplo a seguir itera por meio de uma matriz unidimensional usando a instrução
For...Next.

VB

Module IterateArray

Public Sub Main()

Dim numbers = {10, 20, 30}

For index = 0 To numbers.GetUpperBound(0)

Console.WriteLine(numbers(index))

Next

End Sub

End Module

' The example displays the following output:

' 10

' 20

' 30

O exemplo a seguir itera por meio de uma matriz multidimensional usando uma
instrução For...Next. O método GetUpperBound tem um parâmetro que especifica a
dimensão. GetUpperBound(0) retorna o índice mais alto para a primeira dimensão, e
GetUpperBound(1) retorna o índice mais alto para a segunda dimensão.

VB
Module IterateArray

Public Sub Main()

Dim numbers = {{1, 2}, {3, 4}, {5, 6}}

For index0 = 0 To numbers.GetUpperBound(0)

For index1 = 0 To numbers.GetUpperBound(1)

Console.Write($"{numbers(index0, index1)} ")

Next

Console.WriteLine()

Next

End Sub

End Module

' The example displays the following output:

' Output

' 1 2

' 3 4

' 5 6

O exemplo a seguir usa um For Each... Próxima Instruçãopara iterar por meio de uma
matriz unidimensional e uma matriz bidimensional.

VB

Module IterateWithForEach

Public Sub Main()

' Declare and iterate through a one-dimensional array.

Dim numbers1 = {10, 20, 30}

For Each number In numbers1

Console.WriteLine(number)

Next

Console.WriteLine()

Dim numbers = {{1, 2}, {3, 4}, {5, 6}}

For Each number In numbers

Console.WriteLine(number)

Next

End Sub

End Module

' The example displays the following output:

' 10

' 20

' 30

'

' 1

' 2

' 3

' 4

' 5

' 6

Tamanho da matriz
O tamanho de uma matriz é o produto dos comprimentos de todas as suas dimensões.
Ele representa o número total de elementos contidos no momento na matriz. Por
exemplo, o exemplo a seguir declara uma matriz bidimensional com quatro elementos
em cada dimensão. Como mostra a saída do exemplo, o tamanho da matriz é 16 (ou (3
+ 1) * (3 + 1).

VB

Module Example

Public Sub Main()

Dim arr(3, 3) As Integer

Console.WriteLine(arr.Length)

End Sub

End Module

' The example displays the following output:

' 16

7 Observação

Essa discussão sobre o tamanho da matriz não se aplica a matrizes irregulares. Para
obter informações sobre matrizes irregulares e determinar o tamanho de uma
matriz irregular, consulte a seção matrizes denteadas.

Você pode encontrar o tamanho de uma matriz usando a propriedade Array.Length.


Você pode encontrar o tamanho de cada dimensão de uma matriz multidimensional
usando o método Array.GetLength.

Você pode redimensionar uma variável de matriz atribuindo um novo objeto de matriz a
ela ou usando a ReDiminstrução. O exemplo a seguir usa a ReDim instrução para alterar
uma matriz de 100 elementos para uma matriz de 51 elementos.

VB

Module Example

Public Sub Main()

Dim arr(99) As Integer

Console.WriteLine(arr.Length)

Redim arr(50)

Console.WriteLine(arr.Length)

End Sub

End Module

' The example displays the following output:

' 100

' 51

Há várias coisas para ter em mente ao lidar com o tamanho de uma matriz.

Observações

Tamanho da O índice de cada dimensão é baseado em 0, o que significa que ele varia de 0
dimensão até o limite superior. Portanto, o tamanho de uma determinada dimensão é
maior em 1 dígito que o limite superior declarado para a dimensão.

Limites de O tamanho de cada dimensão de uma matriz é limitado ao valor máximo do tipo
comprimento de dados Integer , que é Int32.MaxValue ou (2 ^ 31) – 1. No entanto, o tamanho
total de uma matriz também é limitado pela memória disponível no sistema. Se
você tentar inicializar uma matriz que excede a quantidade de RAM disponível, o
Common Language Runtime lançará uma exceção OutOfMemoryException.

Tamanho e Um tamanho de matriz é independente do tipo de dados de seus elementos. O


tamanho do tamanho sempre representa o número total de elementos, não o número de
elemento bytes que eles consomem no armazenamento.

Consumo de Não é seguro fazer suposições sobre como uma matriz é armazenada na
memória memória. O armazenamento varia em plataformas de larguras de dados
diferentes, então a mesma matriz pode consumir mais memória em um sistema
de 64 bits que em um sistema de 32 bits. Dependendo da configuração do
sistema ao inicializar uma matriz, o CLR (Common Language Runtime) pode
atribuir armazenamento para elementos do pacote o mais próximo possível, ou
alinhá-los em limites naturais de hardware. Além disso, uma matriz de
armazenamento requer sobrecarga de armazenamento para suas informações
de controle, e essa sobrecarga aumenta com cada nova dimensão.

O tipo de matriz
Cada matriz tem um tipo de dados, que difere do tipo de dados de seus elementos. Não
há nenhum tipo de dados único para todas as matrizes. Em vez disso, o tipo de dados
de uma matriz é determinado pelo número de dimensões, ou classificação, da matriz e o
tipo de dados dos elementos na matriz. Duas variáveis de matriz são consideradas
tendo os mesmos dados somente quando elas têm a mesma classificação e quando
seus elementos têm os mesmo tipo de dados. Os comprimentos das dimensões de uma
matriz não influenciam o tipo de dados de matriz.

Cada matriz herda da classe System.Array e você pode declarar uma variável para ser do
tipo Array , mas não pode criar uma matriz do tipo Array . Por exemplo, embora o
código a seguir declare que a arr variável é do tipo Array e chama o
Array.CreateInstance método para instanciar a matriz, o tipo da matriz se mostra
Objeto[].

VB

Module Example

Public Sub Main()

Dim arr As Array = Array.CreateInstance(GetType(Object), 19)

Console.WriteLine(arr.Length)

Console.WriteLine(arr.GetType().Name)

End Sub

End Module

' The example displays the following output:

' 19

' Object[]

Além disso, a instrução ReDim não pode operar em uma variável declarada como tipo
Array . Por esses motivos, e para a segurança de tipo, é aconselhável declarar cada
matriz como um tipo específico.

Você pode descobrir o tipo de dados de uma matriz ou seus elementos de várias
maneiras.

Você pode chamar o método GetType na variável para receber um objeto Type
para o tipo de tempo de execução da variável. O objeto Type mantém informações
abrangentes em suas propriedades e métodos.
Você pode passar a variável para o a função TypeName para receber um String
que contém o nome do tipo de tempo de execução.

O exemplo a seguir chama o GetType método e a TypeName função para determinar o


tipo de uma matriz. O tipo de matriz é Byte(,) . Observe que a Type.BaseType
propriedade também indica que o tipo base da matriz de bytes é a Array classe.

VB

Module Example

Public Sub Main()

Dim bytes(9,9) As Byte

Console.WriteLine($"Type of {nameof(bytes)} array:


{bytes.GetType().Name}")

Console.WriteLine($"Base class of {nameof(bytes)}:


{bytes.GetType().BaseType.Name}")

Console.WriteLine()

Console.WriteLine($"Type of {nameof(bytes)} array: {TypeName(bytes)}")

End Sub

End Module

' The example displays the following output:

' Type of bytes array: Byte[,]

' Base class of bytes: Array

'

' Type of bytes array: Byte(,)

Matrizes como valores de retorno e parâmetros


Para retornar uma matriz de um procedimento Function , especifique o tipo de dados
de matriz e o número de dimensões como o tipo de retorno de instrução de função.
Dentro da função, declare uma variável da matriz local com o mesmo tipo de dados e
número de dimensões. Na instrução Return, inclua a variável da matriz local sem
parênteses.

Para especificar uma matriz como um parâmetro para um procedimento Sub ou


Function , defina o parâmetro como uma matriz com um tipo de dados especificado e o
número de dimensões. Na chamada para o procedimento, envie uma variável de matriz
com o mesmo tipo de dados e o número de dimensões.

No exemplo a seguir, a GetNumbers função retorna uma Integer() matriz unidimensional


do tipo Integer . O procedimento ShowNumbers aceita um argumento Integer() .

VB

Module ReturnValuesAndParams

Public Sub Main()

Dim numbers As Integer() = GetNumbers()

ShowNumbers(numbers)

End Sub

Private Function GetNumbers() As Integer()

Dim numbers As Integer() = {10, 20, 30}

Return numbers

End Function

Private Sub ShowNumbers(numbers As Integer())

For index = 0 To numbers.GetUpperBound(0)

Console.WriteLine($"{numbers(index)} ")

Next

End Sub

End Module

' The example displays the following output:

' 10

' 20

' 30

No exemplo a seguir, a GetNumbersMultiDim função retorna uma Integer(,) matriz


bidimensional do tipo Integer . O procedimento ShowNumbersMultiDim aceita um
argumento Integer(,) .

VB

Module Example

Public Sub Main()

Dim numbers As Integer(,) = GetNumbersMultidim()

ShowNumbersMultidim(numbers)

End Sub

Private Function GetNumbersMultidim() As Integer(,)

Dim numbers As Integer(,) = {{1, 2}, {3, 4}, {5, 6}}

Return numbers

End Function

Private Sub ShowNumbersMultidim(numbers As Integer(,))

For index0 = 0 To numbers.GetUpperBound(0)

For index1 = 0 To numbers.GetUpperBound(1)

Console.Write($"{numbers(index0, index1)} ")

Next

Console.WriteLine()

Next

End Sub

End Module

' The example displays the following output:

' 1 2

' 3 4

' 5 6

Matrizes denteadas
Às vezes, a estrutura de dados em seu aplicativo é bidimensional, mas não retangular.
Por exemplo, você pode usar uma matriz para armazenar dados sobre a alta
temperatura de cada dia do mês. A primeira dimensão da matriz representa o mês, mas
a segunda dimensão representa o número de dias e o número de dias em um mês não
é uniforme. Uma matriz irregular, que também é chamada de matrizes, foi projetada
para esses cenários. Uma matriz denteada é uma matriz cujos elementos são matrizes.
Uma matriz denteada e cada elemento em uma matriz denteada podem ter uma ou
mais dimensões.

O exemplo a seguir tem uma matriz de meses, cada elemento é uma matriz de dias. O
exemplo usa uma matriz irregular porque meses diferentes têm números diferentes de
dias. O exemplo mostra como criar uma matriz irregular, atribuir valores a ela e
recuperar e exibir seus valores.

VB

Imports System.Globalization

Module JaggedArray

Public Sub Main()

' Declare the jagged array of 12 elements. Each element is an array of


Double.

Dim sales(11)() As Double

' Set each element of the sales array to a Double array of the
appropriate size.

For month As Integer = 0 To 11


' The number of days in the month determines the appropriate size.

Dim daysInMonth As Integer =

DateTime.DaysInMonth(Year(Now), month + 1)

sales(month) = New Double(daysInMonth - 1) {}

Next

' Store values in each element.

For month As Integer = 0 To 11


For dayOfMonth = 0 To sales(month).GetUpperBound(0)

sales(month)(dayOfMonth) = (month * 100) + dayOfMonth

Next

Next

' Retrieve and display the array values.

Dim monthNames = DateTimeFormatInfo.CurrentInfo.AbbreviatedMonthNames

' Display the month names.

Console.Write(" ")

For ctr = 0 To sales.GetUpperBound(0)

Console.Write($" {monthNames(ctr)} ")

Next

Console.WriteLine()

' Display data for each day in each month.

For dayInMonth = 0 To 30

Console.Write($"{dayInMonth + 1,2}. ")

For monthNumber = 0 To sales.GetUpperBound(0)

If dayInMonth > sales(monthNumber).GetUpperBound(0) Then

Console.Write(" ")

Else

Console.Write($"{sales(monthNumber)(dayInMonth),-5} ")

End If

Next

Console.WriteLine()

Next

End Sub

End Module

' The example displays the following output:

' Jan Feb Mar Apr May Jun Jul Aug Sep Oct
Nov Dec

' 1. 0 100 200 300 400 500 600 700 800 900
1000 1100

' 2. 1 101 201 301 401 501 601 701 801 901
1001 1101

' 3. 2 102 202 302 402 502 602 702 802 902
1002 1102

' 4. 3 103 203 303 403 503 603 703 803 903
1003 1103

' 5. 4 104 204 304 404 504 604 704 804 904
1004 1104

' 6. 5 105 205 305 405 505 605 705 805 905
1005 1105

' 7. 6 106 206 306 406 506 606 706 806 906
1006 1106

' 8. 7 107 207 307 407 507 607 707 807 907
1007 1107

' 9. 8 108 208 308 408 508 608 708 808 908
1008 1108

' 10. 9 109 209 309 409 509 609 709 809 909
1009 1109

' 11. 10 110 210 310 410 510 610 710 810 910
1010 1110

' 12. 11 111 211 311 411 511 611 711 811 911
1011 1111

' 13. 12 112 212 312 412 512 612 712 812 912
1012 1112

' 14. 13 113 213 313 413 513 613 713 813 913
1013 1113

' 15. 14 114 214 314 414 514 614 714 814 914
1014 1114

' 16. 15 115 215 315 415 515 615 715 815 915
1015 1115

' 17. 16 116 216 316 416 516 616 716 816 916
1016 1116

' 18. 17 117 217 317 417 517 617 717 817 917
1017 1117

' 19. 18 118 218 318 418 518 618 718 818 918
1018 1118

' 20. 19 119 219 319 419 519 619 719 819 919
1019 1119

' 21. 20 120 220 320 420 520 620 720 820 920
1020 1120

' 22. 21 121 221 321 421 521 621 721 821 921
1021 1121

' 23. 22 122 222 322 422 522 622 722 822 922
1022 1122

' 24. 23 123 223 323 423 523 623 723 823 923
1023 1123

' 25. 24 124 224 324 424 524 624 724 824 924
1024 1124

' 26. 25 125 225 325 425 525 625 725 825 925
1025 1125

' 27. 26 126 226 326 426 526 626 726 826 926
1026 1126

' 28. 27 127 227 327 427 527 627 727 827 927
1027 1127

' 29. 28 228 328 428 528 628 728 828 928
1028 1128

' 30. 29 229 329 429 529 629 729 829 929
1029 1129

' 31. 30 230 430 630 730 930


1130

O exemplo anterior atribui valores à matriz irregular em uma base elemento por
elemento usando um For...Next loop. Você também pode atribuir valores aos
elementos de uma matriz irregular usando literais de matriz aninhada. No entanto, a
tentativa de usar literais de matriz aninhada (por exemplo, Dim valuesjagged = {{1, 2},
{2, 3, 4}} ) gera o erro do compilador BC30568. Para corrigir o erro, coloque entre

parênteses os literais da matriz interna. Os parênteses forçam a avaliação da expressão


literal de matriz, e os valores resultantes são usados com o literal de matriz externo,
como mostra o código a seguir.

VB

Module Example

Public Sub Main()

Dim values1d = { 1, 2, 3 }

Dim values2d = {{1, 2}, {2, 3}, {3, 4}}

Dim valuesjagged = {({1, 2}), ({2, 3, 4})}

End Sub

End Module

Uma matriz denteada é uma matriz unidimensional cujos elementos contém matrizes.
Portanto, a Array.Length propriedade e o Array.GetLength(0) método retornam o
número de elementos na matriz unidimensional e Array.GetLength(1) gera um
IndexOutOfRangeException porque uma matriz irregular não é multidimensional. Você
determina o número de elementos em cada subarray recuperando o valor da
propriedade de Array.Length cada subarray. O exemplo a seguir ilustra como determinar
o número de elementos em uma matriz irregular.
VB

Module Example

Public Sub Main()

Dim jagged = { ({1, 2}), ({2, 3, 4}), ({5, 6}), ({7, 8, 9, 10}) }

Console.WriteLine($"The value of jagged.Length: {jagged.Length}.")

Dim total = jagged.Length

For ctr As Integer = 0 To jagged.GetUpperBound(0)

Console.WriteLine($"Element {ctr + 1} has {jagged(ctr).Length}


elements.")

total += jagged(ctr).Length

Next

Console.WriteLine($"The total number of elements in the jagged array:


{total}")

End Sub

End Module

' The example displays the following output:

' The value of jagged.Length: 4.

' Element 1 has 2 elements.

' Element 2 has 3 elements.

' Element 3 has 2 elements.

' Element 4 has 4 elements.

' The total number of elements in the jagged array: 15

Matrizes de tamanho igual a zero


O Visual Basic diferencia entre uma matriz não inicializada (uma matriz cujo valor é
Nothing ) e uma matriz de comprimento zero ou uma matriz vazia (uma matriz que não

tem elementos). Uma matriz não inicializada é aquela que não foi dimensionada ou teve
valores atribuídos a ela. Por exemplo:

VB

Dim arr() As String

Uma matriz de comprimento zero é declarada com uma dimensão de -1. Por exemplo:

VB

Dim arrZ(-1) As String

Talvez seja necessário criar uma matriz de tamanho igual a zero nas seguintes
circunstâncias:
Sem arriscar uma exceção NullReferenceException, seu código precisa acessar
membros da classe Array, como Length ou Rank, ou chamar uma função do Visual
Basic como UBound.

Você deseja manter o código de consumo mais simples por não ter que procurar
Nothing como um caso especial.

Seu código interage com uma API (interface de programação do aplicativo) que
exige que você passe uma matriz de tamanho igual a zero para um ou mais
procedimentos ou retorna uma matriz de tamanho igual a zero de um ou mais
procedimentos.

Dividir uma matriz


Em alguns casos, talvez seja necessário dividir uma única matriz em várias matrizes. Isso
envolve identificar o ponto ou os pontos em que a matriz deve ser dividida e, em
seguida, cuspir a matriz em duas ou mais matrizes separadas.

7 Observação

Esta seção não discute a divisão de uma única cadeia de caracteres em uma matriz
de cadeias de caracteres com base em algum delimitador. Para obter informações
sobre como dividir uma cadeia de caracteres, consulte o String.Split método.

Os critérios mais comuns para dividir uma matriz são:

O número de elementos na matriz. Por exemplo, talvez você queira dividir uma
matriz de mais do que um número especificado de elementos em um número de
partes aproximadamente iguais. Para essa finalidade, você pode usar o valor
retornado pelo método ou Array.Length pelo Array.GetLength método.

O valor de um elemento, que serve como um delimitador que indica onde a matriz
deve ser dividida. Você pode pesquisar um valor específico chamando os métodos
e Array.FindIndex os Array.FindLastIndex métodos.

Depois de determinar o índice ou os índices nos quais a matriz deve ser dividida, você
poderá criar as matrizes individuais chamando o Array.Copy método.

O exemplo a seguir divide uma matriz em duas matrizes de tamanho aproximadamente


igual. (Se o número total de elementos de matriz for ímpar, a primeira matriz terá um
elemento a mais que o segundo.)
VB

Module Example

Public Sub Main()

' Create an array of 100 elements.

Dim arr(99) As Integer

' Populate the array.

Dim rnd As new Random()

For ctr = 0 To arr.GetUpperBound(0)

arr(ctr) = rnd.Next()

Next

' Determine how many elements should be in each array.

Dim divisor = 2

Dim remainder As Integer

Dim boundary = Math.DivRem(arr.GetLength(0), divisor, remainder)

' Copy the array.

Dim arr1(boundary - 1 + remainder), arr2(boundary - 1) as Integer

Array.Copy(arr, 0, arr1, 0, boundary + remainder)

Array.Copy(arr, boundary + remainder, arr2, 0, arr.Length - boundary)

End Sub

End Module

O exemplo a seguir divide uma matriz de cadeias de caracteres em duas matrizes com
base na presença de um elemento cujo valor é "zzz", que serve como delimitador de
matriz. As novas matrizes não incluem o elemento que contém o delimitador.

VB

Module Example

Public Sub Main()

Dim rnd As New Random()

' Create an array of 100 elements.

Dim arr(99) As String

' Populate each element with an arbitrary ASCII character.

For ctr = 0 To arr.GetUpperBound(0)

arr(ctr) = ChrW(Rnd.Next(&h21, &h7F))

Next

' Get a random number that will represent the point to insert the
delimiter.

arr(rnd.Next(0, arr.GetUpperBound(0))) = "zzz"

' Find the delimiter.

Dim location = Array.FindIndex(arr, Function(x) x = "zzz")

' Create the arrays.

Dim arr1(location - 1) As String

Dim arr2(arr.GetUpperBound(0) - location - 1) As String

' Populate the two arrays.

Array.Copy(arr, 0, arr1, 0, location)

Array.Copy(arr, location + 1, arr2, 0, arr.GetUpperBound(0) -


location)

End Sub

End Module

Como unir matrizes


Você também pode combinar várias matrizes em uma única matriz maior. Para fazer
isso, você também usa o método Array.Copy.

7 Observação

Esta seção não discute a junção de uma matriz de cadeias de caracteres em uma
única cadeia de caracteres. Para obter informações sobre como ingressar em uma
matriz de cadeias de caracteres, consulte o String.Join método.

Antes de copiar os elementos de cada matriz para a nova matriz, primeiro você deve
garantir que você tenha inicializado a matriz para que ela seja grande o suficiente para
acomodar a nova matriz. É possível fazer isso de duas formas:

Use a ReDim Preserve instrução para expandir dinamicamente a matriz antes de


adicionar novos elementos a ela. Essa é a técnica mais fácil, mas pode resultar em
degradação de desempenho e consumo excessivo de memória quando você está
copiando grandes matrizes.
Calcule o número total de elementos necessários para a nova matriz grande e
adicione os elementos de cada matriz de origem a ela.

O exemplo a seguir usa a segunda abordagem para adicionar quatro matrizes com dez
elementos cada uma a uma única matriz.

VB

Imports System.Collections.Generic

Imports System.Threading.Tasks

Module Example

Public Sub Main()

Dim tasks As New List(Of Task(Of Integer()))

' Generate four arrays.

For ctr = 0 To 3

Dim value = ctr

tasks.Add(Task.Run(Function()

Dim arr(9) As Integer

For ndx = 0 To arr.GetUpperBound(0)

arr(ndx) = value

Next

Return arr

End Function))

Next

Task.WaitAll(tasks.ToArray())

' Compute the number of elements in all arrays.

Dim elements = 0
For Each task In tasks

elements += task.Result.Length

Next

Dim newArray(elements - 1) As Integer

Dim index = 0

For Each task In tasks

Dim n = task.Result.Length

Array.Copy(task.Result, 0, newArray, index, n)

index += n

Next

Console.WriteLine($"The new array has {newArray.Length} elements.")

End Sub

End Module

' The example displays the following output:

' The new array has 40 elements.

Como nesse caso as matrizes de origem são todas pequenas, também podemos
expandir dinamicamente a matriz à medida que adicionamos os elementos de cada
nova matriz a ela. O exemplo a seguir faz isso.

VB

Imports System.Collections.Generic

Imports System.Threading.Tasks

Module Example

Public Sub Main()

Dim tasks As New List(Of Task(Of Integer()))

' Generate four arrays.

For ctr = 0 To 3

Dim value = ctr

tasks.Add(Task.Run(Function()

Dim arr(9) As Integer

For ndx = 0 To arr.GetUpperBound(0)

arr(ndx) = value

Next

Return arr

End Function))

Next

Task.WaitAll(tasks.ToArray())

' Dimension the target array and copy each element of each source
array to it.

Dim newArray() As Integer = {}

' Define the next position to copy to in newArray.

Dim index = 0

For Each task In tasks

Dim n = Task.Result.Length

ReDim Preserve newArray(newArray.GetUpperBound(0) + n)

Array.Copy(task.Result, 0, newArray, index, n)

index += n

Next

Console.WriteLine($"The new array has {newArray.Length} elements.")

End Sub

End Module

' The example displays the following output:

' The new array has 40 elements.

Coleções como uma alternativa para matrizes


As matrizes são mais úteis para criar e trabalhar com um número fixo de objetos
fortemente tipados. As coleções fornecem uma maneira mais flexível de trabalhar com
grupos de objetos. Ao contrário das matrizes, que exigem que você altere
explicitamente o tamanho de uma matriz com a ReDimInstrução, as coleções crescem e
reduzem dinamicamente à medida que as necessidades de um aplicativo mudam.

Quando você usa ReDim para redimensionar uma matriz, o Visual Basic cria uma nova
matriz e libera a anterior. Isso leva o tempo da execução. Portanto, se o número de itens
com o qual você está trabalhando for alterado com frequência ou se você não puder
prever o número máximo de itens que precisa, você poderá obter melhor desempenho
usando uma coleção.

Para algumas coleções, você pode atribuir uma chave para qualquer objeto que coloque
na coleção para que você possa recuperar rapidamente o objeto usando a chave.

Se a coleção contiver elementos de apenas um tipo de dados, você poderá usar uma
das classes no namespace System.Collections.Generic. Uma coleção genérica impõe
segurança de tipos para que nenhum outro tipo de dados possa ser adicionado a ela.

Para obter mais informações sobre coleções, consulte Coleções.

Tópicos relacionados
Termo Definição

Dimensões de matriz no Visual Basic Explica a classificação e as dimensões em matrizes.

Como inicializar uma variável de Descreve como preencher matrizes com valores iniciais.
matriz no Visual Basic

Como classificar uma matriz no Visual Mostra como classificar os elementos de uma matriz em
Basic ordem alfabética.

Como atribuir uma matriz a outra Descreve as regras e as etapas para atribuir uma matriz a
matriz outra variável de matriz.

Solução de problemas de matrizes Aborda alguns problemas comuns que surgem ao


trabalhar com matrizes.

Confira também
System.Array
Instrução Dim
Instrução ReDim
Inicializadores de coleção (Visual Basic)
Artigo • 07/04/2023 • 5 minutos para o fim da leitura

Os inicializadores de coleção fornecem uma sintaxe abreviada que permite criar uma
coleção e preenchê-la com um conjunto inicial de valores. Os inicializadores de coleção
são úteis quando você está criando uma coleção de um conjunto de valores conhecidos,
por exemplo, uma lista de opções de menu ou de categorias, um conjunto inicial de
valores numéricos, uma lista estática de cadeias de caracteres, como nomes de mês ou
de dias, ou localizações geográficas, como uma lista de estados usada para validação.

Para obter mais informações sobre coleções, consulte Coleções.

Você identificará um inicializador de coleção usando a palavra-chave From seguida por


chaves ( {} ). Isso é semelhante à sintaxe de literal de matriz descrita em Matrizes. Os
exemplos a seguir mostram várias maneiras de usar inicializadores de coleção para criar
coleções.

VB

' Create an array of type String().

Dim winterMonths = {"December", "January", "February"}

' Create an array of type Integer()

Dim numbers = {1, 2, 3, 4, 5}

' Create a list of menu options. (Requires an extension method

' named Add for List(Of MenuOption)

Dim menuOptions = New List(Of MenuOption) From {{1, "Home"},

{2, "Products"},

{3, "News"},

{4, "Contact Us"}}

7 Observação

O C# também fornece inicializadores de coleção. Os inicializadores de coleção C#


fornecem a mesma funcionalidade que a dos inicializadores de coleção do Visual
Basic. Para obter mais informações sobre os inicializadores de coleção do C#,
consulte Inicializadores de objeto e de coleção.

Syntax
Um inicializador de coleção consiste em uma lista de valores separados por vírgula
colocados entre chaves ( {} ), precedidos pela palavra-chave From , conforme mostrado
no código a seguir.

VB

Dim names As New List(Of String) From {"Christa", "Brian", "Tim"}

Ao criar uma coleção, como uma List<T> ou uma Dictionary<TKey,TValue>, você deverá
fornecer o tipo de coleção antes do inicializador de coleção, conforme mostrado no
código a seguir.

VB

Public Class AppMenu

Public Property Items As List(Of String) =

New List(Of String) From {"Home", "About", "Contact"}

End Class

7 Observação

Você não pode combinar um inicializador de coleção com um inicializador de


objeto para inicializar o mesmo objeto de coleção. Você pode usar os
inicializadores de objeto para inicializar objetos em um inicializador de coleção.

Criando uma coleção usando um inicializador


de coleção
Ao criar uma coleção usando um inicializador de coleção, todo valor fornecido no
inicializador de coleção será passado ao método Add apropriado da coleção. Por
exemplo, se você criar uma List<T> usando um inicializador de coleção, todo valor de
cadeia de caracteres no inicializador de coleção será passado ao método Add. Se
desejar criar uma coleção usando um inicializador de coleção, o tipo especificado
deverá ser um tipo de coleção válido. Os exemplos de tipos de coleção válidos incluem
as classes que implementam a interface IEnumerable<T> ou que herdam a classe
CollectionBase. O tipo especificado também deve expor um método Add que atenda
aos seguintes critérios.

O método Add deve estar disponível no escopo em que o inicializador de coleção


está sendo chamado. Se você estiver usando o inicializador de coleção em um
cenário no qual os métodos não públicos da coleção possam ser acessados, o
método Add não precisará ser público.

O método Add deve ser um membro de instância ou um membro Shared da classe


da coleção ou um método de extensão.

Um método Add que possa ser correspondido deve existir, com base nas regras de
resolução de sobrecarga, para os tipos fornecidos no inicializador de coleção.

Por exemplo, o exemplo de código a seguir mostra como criar uma coleção List(Of
Customer) usando um inicializador de coleção. Quando o código for executado, todo

objeto Customer será passado ao método Add(Customer) da lista genérica.

VB

Dim customers = New List(Of Customer) From

New Customer("City Power & Light", "http://www.cpandl.com/"),

New Customer("Wide World Importers",


"http://www.wideworldimporters.com/"),

New Customer("Lucerne Publishing",


"http://www.lucernepublishing.com/")

O exemplo de código a seguir mostra o código equivalente que não usa um


inicializador de coleção.

VB

Dim customers = New List(Of Customer)

customers.Add(New Customer("City Power & Light", "http://www.cpandl.com/"))

customers.Add(New Customer("Wide World Importers",


"http://www.wideworldimporters.com/"))

customers.Add(New Customer("Lucerne Publishing",


"http://www.lucernepublishing.com/"))

Se a coleção tiver um método Add com parâmetros correspondentes ao construtor do


objeto Customer , você poderá aninhar os valores de parâmetro do método Add nos
inicializadores de coleção, conforme será discutido na próxima seção. Se a coleção não
tiver um método Add , você poderá criar um como um método de extensão. Para obter
um exemplo de como criar um método Add como um método de extensão para uma
coleção, consulte Como criar um método de extensão Add usado por um inicializador
de coleção. Para obter um exemplo de como criar uma coleção personalizada que pode
ser usada com um inicializador de coleção, consulte Como criar uma coleção usada por
um inicializador de coleção.
Aninhando inicializadores de coleção
Você pode aninhar valores em um inicializador de coleção para identificar uma
sobrecarga específica de um método Add para a coleção que está sendo criada. Os
valores passados ao método Add devem ser separados por vírgula e colocados entre
chaves ( {} ), como você faria em uma literal de matriz ou em um inicializador de
coleção.

Ao criar uma coleção usando valores aninhados, todo elemento da lista de valores
aninhados é passado como um argumento ao método Add correspondente aos tipos de
elemento. Por exemplo, o exemplo de código a seguir cria um Dictionary<TKey,TValue>
em que as chaves são do tipo Integer e os valores, do tipo String . Cada uma das listas
de valores aninhados corresponde ao método Add do Dictionary .

VB

Dim days = New Dictionary(Of Integer, String) From

{{0, "Sunday"}, {1, "Monday"}}

O exemplo de código anterior é equivalente ao seguinte código.

VB

Dim days = New Dictionary(Of Integer, String)

days.Add(0, "Sunday")

days.Add(1, "Monday")

Somente as listas de valores aninhados do primeiro nível de aninhamento são enviadas


ao método Add do tipo de coleção. Níveis de aninhamento mais profundos são tratados
como literais de matriz e as listas de valores aninhados não correspondem ao método
Add de nenhuma coleção.

Tópicos Relacionados
Título Descrição

Como criar um método para Mostra como criar um método de extensão chamado Add ,
adicionar extensão usado por um que pode ser usado para preencher uma coleção com valores
inicializador de coleção de um inicializador de coleção.

Como criar uma coleção usada Mostra como habilitar o uso de um inicializador de coleção,
por um inicializador de coleção incluindo um método Add em uma classe de coleção que
implementa IEnumerable .
Confira também
Coleções
matrizes
Inicializadores de objeto: tipos nomeados e anônimos
Novo Operador
Propriedades autoimplementadas
Como inicializar uma variável de matriz no Visual Basic
Inferência de Tipo de Variável Local
Tipos anônimos
Introdução a LINQ no Visual Basic
Como: criar uma lista de itens
Constantes e enumerações no Visual
Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Constantes são uma maneira de usar nomes significativos no lugar de um valor que não
é alterado. Constantes armazenam valores que, como o nome implica, permanecem
constantes durante a execução de um aplicativo. Você pode usar constantes para
fornecer nomes significativos, em vez de números, tornando o código mais legível.

Enumerações fornecem uma maneira conveniente para trabalhar com conjuntos de


constantes relacionadas e para associar valores de constante a nomes. Por exemplo, é
possível declarar uma enumeração de um conjunto de constantes de inteiros associados
aos dias da semana e, em seguida, usar os nomes de dias em vez de seus valores de
inteiros em seu código.

Nesta seção
Termo Definição

Visão geral de constantes Os tópicos nesta seção descrevem as constantes e seus usos.

Visão geral de enumerações Os tópicos nesta seção descrevem as enumerações e seus usos.

Seções relacionadas
Termo Definição

Instrução Descreve a instrução Const , que é usada para declarar constantes.


Const

Instrução Descreve a instrução Enum , que é usada para criar enumerações.


Enum

Instrução Descreve a instrução Option Explicit , que é usada no nível de módulo para forçar a
Option declaração explícita de todas as variáveis nesse módulo.
Explicit

Instrução Descreve a instrução Option Infer , que permite o uso de inferência de tipo de
Option variável local ao declarar variáveis.
Infer
Termo Definição

Instrução Descreve a instrução Option Strict , que restringe conversões de tipo de dados
Option implícitas para somente conversões de expansão, não permite associação tardia e não
Strict permite digitação implícita que resulta em um tipo Object .
Fluxo de controle no Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Se deixado sem regulagem, um programa passa por suas instruções do início ao fim.
Alguns programas muito simples podem ser escritos com apenas esse fluxo
unidirecional. No entanto, muito da eficiência e da utilidade de qualquer linguagem de
programação é derivada da capacidade de alterar a ordem de execução com instruções
de controle e loops.

As estruturas de controle permitem regular o fluxo de execução do programa. Ao usar


as estruturas de controle, é possível gravar o código do Visual Basic que toma decisões
ou repete ações. Outras estruturas de controle permitem assegurar disponibilidade de
um recurso ou executar uma série de instruções na mesma referência de objeto.

Nesta seção
Estruturas de Decisão

Descreve estruturas de controle usadas para ramificação.

Estruturas de Loop

Descreve estruturas de controle usadas para repetir processos.

Outras Estruturas de Controle

Descreve estruturas de controle usadas para descarte de recursos e acesso de objetos.

Estruturas de Controle Aninhadas

Cobre as estruturas de controle dentro de outras estruturas de controle.

Seções relacionadas
Resumo do Fluxo de Controle

Fornece links para páginas de referência de linguagem sobre esse assunto.


Tipos de dados no Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O tipo de dados de um elemento de programação se refere a que tipo de dados ele


pode armazenar e como ele armazena esses dados. Os tipos de dados se aplicam a
todos os valores que podem ser armazenados na memória do computador ou
participam da avaliação de uma expressão. Cada variável, literal, constante, enumeração,
propriedade, parâmetro de procedimento, argumento de procedimento e valor
retornado do procedimento tem um tipo de dados.

Tipos de dados declarados


Você define um elemento de programação com uma instrução de declaração, e você
especifica o tipo de dados com a cláusula As . A tabela a seguir mostra as instruções que
você usa para declarar vários elementos.

Elemento de Declaração de tipo de dados


programação

Variável Em uma instrução Dim

Dim amount As Double

Static yourName As String

Public billsPaid As Decimal = 0

Literal Com um caractere de tipo literal. Consulte "Caracteres de tipo Literal" em


Caracteres de tipo

Dim searchChar As Char = "." C

Constante Em uma instrução Const

Const modulus As Single = 4.17825F

Enumeração Em uma instrução Enum

Public Enum colors

Propriedade Em uma instrução Property

Property region() As String


Elemento de Declaração de tipo de dados
programação

Parâmetro de Em uma instrução Sub, instrução Function ou instrução Operator

procedimento
Sub addSale(ByVal amount As Double)

Argumento de No código de chamada. Cada argumento é um elemento de programação que


procedimento já foi declarado ou uma expressão que contém elementos declarados

subString = Left( inputString , 5 )

Valor retornado Em uma instrução Function ou instrução Operator

do
procedimento Function convert(ByVal b As Byte) As String

Para obter uma lista dos tipos de dados do Visual Basic, consulte Tipos de dados.

Confira também
Caracteres de tipo
Tipos de dados elementares
Tipos de dados compostos
Tipos genéricos no Visual Basic
Tipos de Valor e Tipos de Referência
Conversões de tipo no Visual Basic
Estruturas
Tuplas
Solução de problemas de tipos de dados
Data Types
Uso eficiente de tipos de dados
Caracteres de tipo (Visual Basic)
Artigo • 07/04/2023 • 4 minutos para o fim da leitura

Além de especificar um tipo de dados em uma instrução de declaração, você pode


forçar o tipo de dados de alguns elementos de programação com um caractere de tipo.
O caractere de tipo deve seguir imediatamente o elemento, sem nenhum tipo de
caractere intervindo.

O caractere de tipo não faz parte do nome do elemento. Um elemento definido com um
caractere de tipo pode ser referenciado sem o caractere de tipo.

Caracteres de tipo identificador


O Visual Basic fornece um conjunto de caracteres de tipo de identificador que você pode
usar em uma declaração para especificar o tipo de dados de uma variável ou constante.
A tabela a seguir mostra os caracteres de tipo de identificador disponíveis com
exemplos de uso.

Caractere de tipo identificador Tipo de dados Exemplo

% Integer Dim L%

& Long Dim M&

@ Decimal Const W@ = 37.5

! Single Dim Q!

# Double Dim X#

$ String Dim V$ = "Secret"

Não existem caracteres de tipo de identificador para os tipos de dados Boolean , Byte ,
Char , Date , Object , SByte , Short , UInteger , ULong ou UShort para tipos de dados
compostos, como matrizes ou estruturas.

Em alguns casos, você pode acrescentar o $ caractere a uma função do Visual Basic, por
exemplo Left$ , em vez de Left , para obter um valor retornado do tipo String .

Em todos os casos, o caractere de tipo de identificador deve seguir imediatamente o


nome do identificador.
Caracteres de tipo literal
Um literal é uma representação textual de um valor específico de um tipo de dados.

Tipos de literal padrão


A forma de um literal como ele aparece em seu código normalmente determina seu tipo
de dados. A tabela a seguir mostra os valores padrão.

Forma textual de literal Tipo de dados Exemplo


padrão

Numérico, sem parte fracionária Integer 2147483647

Numérico, sem parte fracionária, muito grande para Long 2147483648


Integer

Parte numérica e fracionária Double 1.2

Entre aspas duplas String "A"

Entre sinais numéricos Date #5/17/1993 9:32


AM#

Tipos literais forçados


O Visual Basic fornece um conjunto de caracteres de tipo literal, que você pode usar
para forçar um literal a assumir um tipo de dados diferente do que seu formulário
indica. Você faz isso acrescentando o caractere ao final do literal. A tabela a seguir
mostra os caracteres de tipo literal disponíveis com exemplos de uso.

Caractere de tipo literal Tipo de dados Exemplo

S Short I = 347S

I Integer J = 347I

L Long K = 347L

D Decimal X = 347D

F Single Y = 347F

R Double Z = 347R

US UShort L = 347US
Caractere de tipo literal Tipo de dados Exemplo

UI UInteger M = 347UI

UL ULong N = 347UL

C Char Q = "."C

Não existem caracteres de tipo literal para os tipos de dados Boolean , Byte , Date ,
Object , SByte ou String para qualquer tipo de dados composto, como matrizes ou

estruturas.

Literais também podem usar os caracteres de tipo de identificador ( % , & , @ , ! , # , $ )


assim como variáveis, constantes e expressões. No entanto, os caracteres de tipo literal
( S , I , L , D , F , R , C ) podem ser usados apenas com literais.

Em todos os casos, o caractere de tipo literal deve seguir imediatamente o valor literal.

Literais hexadecimais, binários e octais


O compilador normalmente interpreta um literal inteiro para estar no sistema de
números decimal (base 10). Você também pode definir um literal inteiro como um
número hexadecimal (base 16) com o &H prefixo, como um número binário (base 2)
com o &B prefixo e como um número octal (base 8) com o &O prefixo. Os dígitos que
seguem o prefixo devem ser apropriados para o sistema de números. A tabela a seguir
ilustra isso.

Base numérica Prefixo Valores de dígito válidos Exemplo

Hexadecimal (base 16) &H 0-9 e A-F &HFFFF

Binário (base 2) &B 0-1 &B01111100

Octal (base 8) &O 0-7 &O77

A partir do Visual Basic 2017, você pode usar o caractere sublinhado ( _ ) como
separador de grupo para aprimorar a legibilidade de um literal integral. O exemplo a
seguir usa o _ caractere para agrupar um literal binário em grupos de 8 bits:

VB

Dim number As Integer = &B00100010_11000101_11001111_11001101

Você pode seguir um literal prefixado com um caractere de tipo literal. O exemplo a
seguir mostra a isso.

VB

Dim counter As Short = &H8000S

Dim flags As UShort = &H8000US

No exemplo anterior, counter tem o valor decimal de -32768 e flags tem o valor
decimais de +32768.

A partir do Visual Basic 15.5, você também pode usar o caractere de sublinhado ( _ )
como separador à esquerda entre o prefixo e os dígitos hexadecimais, binários ou
octais. Por exemplo:

VB

Dim number As Integer = &H_C305_F860

Para usar o caractere de sublinhado como separador à esquerda, você deve adicionar o
seguinte elemento ao arquivo de projeto do Visual Basic (*.vbproj):

XML

<PropertyGroup>

<LangVersion>15.5</LangVersion>

</PropertyGroup>

Para obter mais informações, consulte Selecionar a versão da linguagem Visual Basic.

Confira também
Data Types
Tipos de dados elementares
Tipos de Valor e Tipos de Referência
Conversões de tipo no Visual Basic
Solução de problemas de tipos de dados
Declaração de Variável
Data Types
Tipos de dados elementares (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O Visual Basic fornece um conjunto de tipos de dados predefinidos, que você pode usar
para muitos dos seus elementos de programação. Esta seção descreve esses tipos e
como usá-los.

7 Observação

Todos os tipos de dados elementares no Visual Basic têm suporte por uma
estrutura ou classe que está no namespace System. O compilador usa cada
palavra-chave de tipo de dados como alias para a estrutura ou classe subjacente.
Por exemplo, declarar uma variável usando a palavra reservada Byte é o mesmo
que declará-la usando o nome de estrutura totalmente qualificado System.Byte.

Nesta seção
Tipos de Dados Numéricos

Descreve os tipos numéricos integrais e não integrais.

Tipos de Dados de Caractere

Descreve os tipos Char e String .

Tipos de dados diversos

Descreve os tipos Boolean , Date e Object .

Seções relacionadas
Data Types

Apresenta os tipos de dados do Visual Basic e descreve como usá-los.

Data Types

Fornece uma visão geral dos tipos de dados elementares fornecidos pelo Visual Basic.
Tipos de dados numéricos (Visual Basic)
Artigo • 07/04/2023 • 4 minutos para o fim da leitura

O Visual Basic fornece vários tipos de dados numéricos para lidar com números em várias
representações. Os tipos integrais representam apenas números inteiros (positivo,
negativo e zero) e os tipos não integrais representam números com partes de inteiros e
fracionárias.

Para obter uma tabela mostrando uma comparação lado a lado dos tipos de dados do
Visual Basic, consulte Tipos de Dados.

Tipos Numéricos Integrais


Tipos de dados integrais são aqueles que representam apenas números sem partes
fracionárias.

Os tipos de dados integrais assinados são Tipo de Dados SByte (8 bits), Tipo de Dados
Curtos (16 bits), Tipo de Dados Inteiros (32 bits) e Tipo de Dados Longos (64 bits). Se
uma variável sempre armazenar inteiros em vez de números fracionários, declare-a
como um desses tipos.

Os tipos integrais não assinados são Tipo de Dados de Byte (8 bits), Tipo de Dados
UShort (16 bits), Tipo de Dados UInteger (32 bits) e Tipo de Dados ULong (64 bits). Se
uma variável contiver dados binários ou dados de natureza desconhecida, declare-os
como um desses tipos.

Desempenho
As operações aritméticas são mais rápidas com tipos de dados integrais do que com
outros tipos de dados. Elas são mais rápidas com os tipos e Integer no UInteger Visual
Basic.

Inteiros Grandes
Se você precisar manter um inteiro maior do que o tipo de dados Integer pode conter,
você poderá usar o tipo de dados Long . As variáveis Long podem conter números de
-9.223.372.036.854.775.808 a 9.223.372.036.854.775.807. As operações com Long são
ligeiramente mais lentas do que as com Integer .
Se você precisar de valores ainda maiores, poderá usar o Tipo de Dados Decimais. Você
pode conter números de -79.228.162.514.264.337.593.543.950.335 a
79,228.162.514.264.337.593.543.950.335 em uma variável Decimal se você não usar
casas decimais. No entanto, as operações com números Decimal são consideravelmente
mais lentas do que com qualquer outro tipo de dados numérico.

Inteiros Pequenos
Se você não precisar do intervalo completo do tipo de dados Integer , poderá usar o
tipo de dados Short , que pode conter inteiros de -32.768 a 32.767. Para o menor
intervalo inteiro, o tipo de dados SByte contém inteiros de -128 a 127. Se você tiver um
número muito grande de variáveis que contêm números inteiros pequenos, o Common
Language Runtime às vezes pode armazenar suas variáveis Short e SByte de maneira
mais eficiente e economizar o consumo de memória. No entanto, as operações com
Short e SByte são um pouco mais lentas do que as com Integer .

Inteiros sem Sinal


Se você souber que sua variável nunca precisa conter um número negativo, você pode
usar os tipos não assinados Byte , UShort , UInteger e ULong . Cada um desses tipos de
dados pode conter um inteiro positivo duas vezes maior que o tipo assinado
correspondente dele ( SByte , Short , Integer e Long ). Em termos de desempenho, cada
tipo não assinado é exatamente tão eficiente quanto o tipo assinado correspondente
dele. Em particular, UInteger compartilha com Integer a distinção de ser o mais
eficiente de todos os tipos de dados numéricos elementares.

Tipos Numéricos não Integrais


Tipos de dados não integrais são aqueles que representam números com partes de
inteiros e fracionárias.

Os tipos de dados numéricos não integrais são Decimal (ponto fixo de 128 bits), Tipo de
Dados Únicos (ponto flutuante de 32 bits) e Tipo de Dados Duplos (ponto flutuante de
64 bits). Todos eles são tipos assinados. Se uma variável puder conter uma fração,
declare-a como um desses tipos.

Decimal não é um tipo de dados de ponto flutuante. Decimal os números têm um valor

inteiro binário e um fator de dimensionamento inteiro que especifica qual parte do valor
é uma fração decimal.
Você pode usar variáveis Decimal para valores de dinheiro. A vantagem é a precisão dos
valores. O tipo de dados Double é mais rápido e requer menos memória, mas está
sujeito a erros de arredondamento. O tipo de dados Decimal retém a precisão completa
para 28 casas decimais.

Os números de ponto flutuante ( Single e Double ) têm intervalos maiores que os


números Decimal , mas podem estar sujeitos a erros de arredondamento. Os tipos de
ponto flutuante dão suporte a menos dígitos significativos do que Decimal , mas podem
representar valores de maior magnitude.

Os valores de número não integrais podem ser expressos como mmmEeee, no qual
mmm é a mantissa (os dígitos significativos) e eee é o expoente (uma potência de 10).
Os valores positivos mais altos dos tipos não integrais são
7,922816251426437593543950335E+28 para Decimal , 3,4028235E+38 para Single e
1,79769313486231570E+308 para Double .

Desempenho
Double é o mais eficiente dos tipos de dados fracionários, pois os processadores nas
plataformas atuais executam operações de ponto flutuante com precisão dupla. No
entanto, as operações com Double não são tão rápidas quanto com os tipos integrais,
como Integer .

Pequenas Magnitudes
Para números com a menor magnitude possível (mais próxima de 0), as variáveis Double
podem conter números tão pequenos quanto -4,94065645841246544E-324 para valores
negativos e 4,94065645841246544E-324 para valores positivos.

Números Fracionários Pequenos


Se você não precisar do intervalo completo do tipo de dados Double , poderá usar o tipo
de dados Single , que pode conter números de ponto flutuante de -3,4028235E+38 a
3,4028235E+38. As menores magnitudes para variáveis Single são -1,401298E-45 para
valores negativos e 1,401298E-45 para valores positivos. Se você tiver um número muito
grande de variáveis que contêm números de ponto flutuante pequenos, o Common
Language Runtime às vezes pode armazenar suas variáveis Single de maneira mais
eficiente e economizar o consumo de memória.
Confira também
Tipos de dados elementares
Tipos de Dados de Caractere
Tipos de dados diversos
Solução de problemas de tipos de dados
Como: Chamar uma função do Windows que use tipos não assinados
Tipos de dados de caractere (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O Visual Basic fornece tipos de dados de caracteres para lidar com caracteres imprimíveis
e exibíveis. Embora ambos lidem com caracteres Unicode, Char contém um único
caractere, enquanto String contém um número indefinido de caracteres.

Para obter uma tabela que mostre uma comparação lado a lado dos tipos de dados do
Visual Basic, consulte Tipos de Dados.

Tipo Char
O tipo de dados Char é um único caractere Unicode de dois bytes (16 bits). Se uma
variável sempre armazenar exatamente um caractere, declare-a como Char . Por
exemplo:

VB

' Initialize the prefix variable to the character 'a'.

Dim prefix As Char = "a"

Cada valor possível em uma variável Char ou String é um ponto de código ou código
de caractere no conjunto de caracteres Unicode. Os caracteres Unicode incluem o
conjunto de caracteres ASCII básico, várias outras letras alfabéticas, acentos, símbolos
de moeda, frações, diacríticos e símbolos matemáticos e técnicos.

7 Observação

O conjunto de caracteres Unicode reserva os pontos de código D800 por DFFF


(decimais de 55296 a 55551) para pares alternativos que exigem dois valores de 16
bits para representar um único ponto de código. Uma variável Char não pode
conter um par alternativo e um String usa duas posições para manter esse par.

Para mais informações, confira Tipos de dados Char.

Tipo de cadeia de caracteres


O tipo de dados String é uma sequência de zero ou mais caracteres Unicode de dois
bytes (16 bits). Se uma variável puder conter um número indefinido de caracteres,
declare-a como String . Por exemplo:

VB

' Initialize the name variable to "Monday".

Dim name As String = "Monday"

Para obter mais informações, confira Tipo de dados String.

Confira também
Tipos de dados elementares
Tipos de dados compostos
Tipos genéricos no Visual Basic
Tipos de Valor e Tipos de Referência
Conversões de tipo no Visual Basic
Solução de problemas de tipos de dados
Caracteres de tipo
Tipos de dados diversos (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O Visual Basic fornece vários tipos de dados que não são orientados para números ou
caracteres. Em vez disso, eles lidam com dados especializados, como valores sim/não,
valores de data/hora e endereços de objeto.

Para obter uma tabela mostrando uma comparação lado a lado dos tipos de dados do
Visual Basic, consulte Tipos de Dados.

Tipos boolianos
O tipo de dados booliano é um valor sem sinal que é interpretado como ou True False .
Sua largura de dados depende da plataforma de implementação. Se uma variável puder
conter apenas valores de dois estados, como true/false, yes/no ou on/off, declare-a
como Boolean .

Tipo de data
O Tipo de Dados de Data é um valor de 64 bits que contém informações de data e hora.
Cada incremento representa 100 nanossegundos de tempo decorrido desde o início
(12h00) de 1º de janeiro do ano 1 no calendário gregoriano. Se uma variável puder
conter um valor de data, um valor de hora ou ambos, declare-o como Date .

Tipo de objeto
O Tipo de Dados de Objeto é um endereço de 32 bits que aponta para uma instância de
objeto em seu aplicativo ou em algum outro aplicativo. Uma Object variável pode se
referir a qualquer objeto que seu aplicativo reconheça ou a dados de qualquer tipo de
dados. Isso inclui tipos de valor, como Integer Boolean instâncias de estrutura, e tipos de
referência, que são instâncias de objetos criados a partir de classes como String e
Form, e instâncias de matriz.

Se uma variável armazenar um ponteiro para uma instância de uma classe que você não
conhece no momento da compilação ou se ela puder apontar para dados de vários
tipos de dados, declare-a como Object .

A vantagem do Object tipo de dados é que você pode usá-lo para armazenar dados de
qualquer tipo de dados. A desvantagem é que você incorre em operações extras que
levam mais tempo de execução e fazem com que seu aplicativo tenha um desempenho
mais lento. Se você usar uma Object variável para tipos de valor, incorrerá em boxe e
unboxing. Se você usá-lo para tipos de referência, incorrerá em associação tardia.

Confira também
Caracteres de tipo
Tipos de dados elementares
Tipos de Dados Numéricos
Tipos de Dados de Caractere
Solução de problemas de tipos de dados
Associação Antecipada e Tardia
Tipos de dados compostos (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Além dos tipos de dados elementares fornecidos pelo Visual Basic, você também pode
montar itens de diferentes tipos para criar tipos de dados compostos, como estruturas,
matrizes e classes. Você pode criar tipos de dados compostos de tipos elementares e de
outros tipos compostos. Por exemplo, você pode definir uma matriz de elementos de
estrutura ou uma estrutura com membros da matriz.

Tipos de dados
Um tipo composto é diferente do tipo de dados de qualquer um de seus componentes.
Por exemplo, uma matriz de Integer elementos não é do Integer tipo de dados.

Normalmente, um tipo de dados de matriz é representado usando o tipo de elemento,


parênteses e vírgulas, conforme necessário. Por exemplo, uma matriz unidimensional de
String elementos é representada como String() , e uma matriz bidimensional de
Boolean elementos é representada como Boolean(,) .

Tipos de estrutura
Não existe um único tipo de dados que abrange todas as estruturas. Em vez disso, cada
definição de uma estrutura representa um tipo de dados exclusivo, mesmo que duas
estruturas definam elementos idênticos na mesma ordem. No entanto, se você criar
duas ou mais instâncias da mesma estrutura, o Visual Basic as considerará do mesmo
tipo de dados.

Tuplas
Uma tupla é uma estrutura leve que contém dois ou mais campos cujos tipos são
predefinidos. Há suporte para tuplas a partir do Visual Basic 2017. As tuplas são mais
comumente usadas para retornar vários valores de uma única chamada de método sem
precisar passar argumentos por referência ou empacotar os campos retornados em uma
classe ou estrutura mais pesada. Consulte o tópico Tuplas para obter mais informações
sobre tuplas.

Tipos de matriz
Não há nenhum tipo de dados único para todas as matrizes. O tipo de dados de uma
instância específica de uma matriz é determinado pelo seguinte:

O fato de ser uma matriz

A classificação (número de dimensões) da matriz

O tipo de elemento de uma matriz

Em particular, o comprimento de uma determinada dimensão não faz parte do tipo de


dados da instância. O exemplo a seguir ilustra essa situação.

VB

Dim arrayA( ) As Byte = New Byte(12) {}

Dim arrayB( ) As Byte = New Byte(100) {}

Dim arrayC( ) As Short = New Short(100) {}

Dim arrayD( , ) As Short

Dim arrayE( , ) As Short = New Short(4, 10) {}

No exemplo anterior, as variáveis de matriz e arrayA são consideradas arrayB do


mesmo tipo de dados — Byte() embora sejam inicializadas com comprimentos
diferentes. Variáveis arrayB e arrayC não são do mesmo tipo porque seus tipos de
elemento são diferentes. Variáveis arrayC e arrayD não são do mesmo tipo porque suas
classificações são diferentes. Variáveis arrayD e arrayE têm o mesmo tipo — Short(,)
porque suas classificações e tipos de elemento são iguais, embora ainda não tenham
arrayD sido inicializados.

Para obter mais informações sobre matrizes, confira Matrizes.

Tipos de classe
Não existe um único tipo de dados que abrange todas as classes. Embora uma classe
possa herdar de outra classe, cada uma é um tipo de dados separado. Várias instâncias
da mesma classe são do mesmo tipo de dados. Se você atribuir uma variável de
instância de classe a outra, não só elas têm o mesmo tipo de dados, como apontam
para a mesma instância de classe na memória.

Para obter mais informações sobre classes, consulte Objetos e Classes.

Confira também
Data Types
Tipos de dados elementares
Tipos genéricos no Visual Basic
Tipos de Valor e Tipos de Referência
Conversões de tipo no Visual Basic
Estruturas
Solução de problemas de tipos de dados
Como: Manter mais de um valor em uma variável
Como manter mais de um valor em uma
variável (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma variável contém mais de um valor se você declarar que é de um tipo de dados
composto.

Os Tipos de Dados Compostos incluem estruturas, matrizes e classes. Uma variável de


um tipo de dados composto pode conter uma combinação de tipos de dados
elementares e outros tipos de composição. Estruturas e classes podem conter código,
assim como dados.

Para manter mais de um valor em uma variável


1. Determine qual tipo de dados composto você deseja usar para sua variável.

2. Se o tipo de dados composto ainda não estiver definido, defina-o para que sua
variável possa usá-lo.

Defina uma estrutura com uma Instrução Structure.

Defina uma matriz com uma Instrução Dim.

Defina uma classe com uma Instrução Class.

3. Declare sua variável com uma instrução Dim .

4. Siga o nome da variável com uma cláusula As .

5. Siga a palavra-chave As com o nome do tipo de dados composto apropriado.

Confira também
Data Types
Caracteres de tipo
Tipos de dados compostos
Estruturas
matrizes
Objetos e Classes
Tipos de Valor e Tipos de Referência
Tipos genéricos no Visual Basic (Visual
Basic)
Artigo • 22/02/2023 • 7 minutos para o fim da leitura

Um tipo genérico é um único elemento de programação que se adapta para executar a


mesma funcionalidade para diversos tipos de dados. Ao definir uma classe ou
procedimento genérico, você não precisa definir uma versão separada para cada tipo de
dados para o qual você talvez queira executar essa funcionalidade.

Uma analogia é um conjunto de chaves de fenda com cabeças removíveis. Inspecione o


parafuso que você precisa girar e selecione a cabeça correta para esse parafuso (de
fenda, fenda cruzada, torx). Depois de inserir a cabeça correta no cabo da chave de
fenda, você executa exatamente a mesma função com a chave de fenda, ou seja,
girando o parafuso.

Quando você define um tipo genérico, ele é parametrizado com um ou mais tipos de
dados. Isso permite que o código de uso adapte os tipos de dados aos seus requisitos.
Seu código pode declarar vários elementos de programação diferentes do elemento
genérico, cada um atuando em um conjunto de tipos de dados diferente. Mas todos os
elementos declarados executam uma lógica idêntica, independentemente dos tipos de
dados sendo usados.

Por exemplo, talvez você queira criar e usar uma classe de fila que opere em um tipo de
dados específico, como String . Você pode declarar essa classe de
System.Collections.Generic.Queue<T>, como mostra o exemplo a seguir.

VB

Public stringQ As New System.Collections.Generic.Queue(Of String)

Agora você pode usar stringQ para trabalhar exclusivamente com os valores String .
Como stringQ é específico para String , em vez de ser generalizado para valores
Object , você não tem uma conversão de tipo ou associação tardia. Isso economiza

tempo de execução e reduz erros em tempo de execução.

Para obter mais informações sobre como usar um tipo genérico, consulte Como usar
uma classe genérica.

Exemplo de uma classe genérica


O exemplo a seguir mostra uma definição de esqueleto de uma classe genérica.

VB

Public Class classHolder(Of t)

Public Sub processNewItem(ByVal newItem As t)

Dim tempItem As t

' Insert code that processes an item of data type t.

End Sub

End Class

No esqueleto anterior, t é um parâmetro de tipo, ou seja, um espaço reservado para um


tipo de dados que você fornece quando declara a classe. Em outro lugar do código,
você pode declarar várias versões de classHolder fornecendo vários tipos de dados
para t . O exemplo a seguir mostra duas dessas instruções.

VB

Public integerClass As New classHolder(Of Integer)

Friend stringClass As New classHolder(Of String)

As instruções acima declaram classes construídas, nas quais um tipo específico substitui
o parâmetro de tipo. Essa substituição é propagada em todo o código na classe
construída. O exemplo a seguir mostra a aparência do procedimento processNewItem no
integerClass .

VB

Public Sub processNewItem(ByVal newItem As Integer)

Dim tempItem As Integer

' Inserted code now processes an Integer item.

End Sub

Para obter um exemplo mais completo, consulte Como definir uma classe capaz de
fornecer uma funcionalidade idêntica em tipos de dados diferentes.

Elementos de Programação Qualificados


Você pode definir e usar classes genéricas, estruturas, interfaces, procedimentos e
delegados. Observe que o .NET Framework define várias classes genéricas, estruturas e
interfaces que representam elementos genéricos comumente usados. O namespace
System.Collections.Generic fornece dicionários, listas, filas e pilhas. Antes de definir seu
próprio elemento genérico, veja se ele está disponível em System.Collections.Generic.

Os procedimentos não são tipos, mas é possível definir e usar procedimentos genéricos.
Consulte Procedimentos genéricos no Visual Basic.

Vantagens dos tipos genéricos


Um tipo genérico serve como base para declarar vários elementos de programação
diferentes, cada um operando em um tipo de dados específico. As alternativas a um tipo
genérico são:

1. Um único tipo que opera no tipo de dados Object .

2. Um conjunto de versões específicas ao tipo, cada uma codificada individualmente e


operando em um tipo de dados específico, como String , Integer ou um tipo
definido pelo usuário, como customer .

Um tipo genérico tem as seguintes vantagens em relação a essas alternativas:

Segurança de tipos. Tipos genéricos impõem a verificação de tipo de tempo de


compilação. Tipos baseados em Object aceitam qualquer tipo de dados e você
deve gravar o código para verificar se um tipo de dados de entrada é aceitável.
Com tipos genéricos, o compilador pode detectar incompatibilidades de tipo antes
do tempo de execução.

Desempenho. Tipos genéricos não precisam realizar a operação de box e unbox


dos dados, pois cada um deles é especializado em um tipo de dados. As operações
baseadas em Object devem realizar a operação de box dos tipos de dados de
entrada para convertê-los em Object e realizar a operação de unbox dos dados
destinados à saída. As conversões boxing e unboxing reduzem o desempenho.

Os tipos com base em Object também são associados tardiamente, o que significa
que o acesso a seus membros requer código extra no tempo de execução. Isso
também reduz o desempenho.

Consolidação de código. O código em um tipo genérico deve ser definido apenas


uma vez. Um conjunto de versões específicas de tipo de um tipo deve replicar o
mesmo código em cada versão, sendo a única diferença o tipo de dados específico
para essa versão. Com tipos genéricos, as versões específicas de tipo são geradas
do tipo genérico original.

Reutilização de código. O código que não depende de um tipo de dados


específico pode ser reutilizado com vários tipos de dados, se for genérico.
Geralmente, é possível reutilizá-lo mesmo com um tipo de dados não previsto
originalmente.

Suporte ao IDE. Quando você usa um tipo construído declarado a partir de um


tipo genérico, o IDE (ambiente de desenvolvimento integrado) pode oferecer mais
suporte enquanto você está desenvolvendo seu código. Por exemplo, o
IntelliSense pode mostrar as opções específicas de tipo de um argumento para um
construtor ou método.

Algoritmos genéricos. Algoritmos abstratos independentes de tipo são bons


candidatos para tipos genéricos. Por exemplo, um procedimento genérico que
classifica itens usando a interface IComparable pode ser usado com qualquer tipo
de dados que implemente IComparable.

Restrições
Embora o código em uma definição de tipo genérico deva ser o mais independente de
tipo possível, talvez seja necessário exigir uma determinada funcionalidade de qualquer
tipo de dados fornecido ao tipo genérico. Por exemplo, se você quiser comparar dois
itens para classificar ou agrupar, o tipo de dados deve implementar a interface
IComparable. Você pode impor esse requisito adicionando uma restrição ao parâmetro
de tipo.

Exemplo de uma restrição


O exemplo a seguir mostra uma definição de esqueleto de uma classe com uma
restrição que requer o argumento de tipo para implementar IComparable.

VB

Public Class itemManager(Of t As IComparable)

' Insert code that defines class members.

End Class

Se o código subsequente tentar construir uma classe de itemManager que fornece um


tipo que não implementa IComparable, o compilador sinalizará um erro.

Tipos de restrições
A restrição pode especificar os seguintes requisitos em qualquer combinação:

O argumento de tipo deve implementar uma ou mais interfaces

O argumento de tipo deve ser do tipo ou herdar de, no máximo, uma classe

O argumento de tipo deve expor um construtor sem parâmetros acessível ao


código que cria objetos a partir dele

O argumento de tipo deve ser um tipo de referência ou um tipo de valor

Se você precisar impor mais de um requisito, use uma lista de restrições separada por
vírgulas dentro de chaves ( { } ). Para exigir um construtor acessível, inclua a palavra-
chave Novo operador na lista. Para exigir um tipo de referência, inclua a palavra-chave
Class ; para exigir um tipo de valor, inclua a palavra-chave Structure .

Para obter mais informações sobre restrições, consulte Tipo de lista.

Exemplo de várias restrições


O exemplo a seguir mostra uma definição de esqueleto de uma classe genérica com
uma lista de restrições no parâmetro de tipo. No código que cria uma instância dessa
classe, o argumento de tipo deve implementar as interfaces IComparable e IDisposable,
ser um tipo de referência e expor um construtor sem parâmetros acessível.

VB

Public Class thisClass(Of t As {IComparable, IDisposable, Class, New})

' Insert code that defines class members.

End Class

Termos Importantes
Os tipos genéricos introduzem e usam os seguintes termos:

Tipo genérico. Uma definição de uma classe, estrutura, interface, procedimento ou


delegado para o qual você fornece pelo menos um tipo de dados ao declará-lo.
Parâmetro de tipo. Em uma definição de tipo genérico, um espaço reservado para
um tipo de dados fornecido ao declarar o tipo.

Argumento de tipo. Um tipo de dados específico que substitui um parâmetro de


tipo ao declarar um tipo construído de um tipo genérico.

Restrição. Uma condição em um parâmetro de tipo que restringe o argumento de


tipo que você pode fornecer. Uma restrição pode exigir que o argumento de tipo
deva implementar uma interface específica, ser ou herdar de uma determinada
classe, ter um construtor sem parâmetros acessível ou ser um tipo de referência ou
um tipo de valor. Você pode combinar essas restrições, mas pode especificar no
máximo uma classe.

Tipo construído. Uma classe, estrutura, interface, procedimento ou delegado


declarado de um tipo genérico fornecendo argumentos de tipo para os
parâmetros de tipo.

Confira também
Data Types
Caracteres de tipo
Tipos de Valor e Tipos de Referência
Conversões de tipo no Visual Basic
Solução de problemas de tipos de dados
Data Types
Of
As
Tipo de dados Object
Covariância e Contravariância
Iteradores
Como definir uma classe capaz de
fornecer uma funcionalidade idêntica
em tipos de dados diferentes (Visual
Basic)
Artigo • 07/04/2023 • 4 minutos para o fim da leitura

Você pode definir uma classe da qual você pode criar objetos que fornecem
funcionalidade idêntica em diferentes tipos de dados. Para fazer isso, especifique um ou
mais parâmetros de tipo na definição. Em seguida, a classe pode servir como um modelo
para objetos que usam vários tipos de dados. Uma classe definida dessa forma é
chamada de classe genérica.

A vantagem de definir uma classe genérica é que você a define apenas uma vez e seu
código pode usá-la para criar muitos objetos que usam uma ampla variedade de tipos
de dados. Isso resulta em melhor desempenho do que definir a classe com o tipo
Object .

Além das classes, você também pode definir e usar estruturas genéricas, interfaces,
procedimentos e delegados.

Para definir uma classe com um parâmetro de tipo


1. Defina a classe da maneira normal.

2. Adicione (Of typeparameter ) imediatamente após o nome de classe para


especificar um parâmetro de tipo.

3. Se você tiver mais de um parâmetro de tipo, faça uma lista separada por vírgula
dentro dos parênteses. Não repita a palavra-chave Of .

4. Se o código executar operações em um parâmetro de tipo diferente de atribuição


simples, siga esse parâmetro de tipo com uma cláusula As para adicionar uma ou
mais restrições. Uma restrição garante que o tipo fornecido para esse parâmetro de
tipo atenda a um requisito como o seguinte:

Dá suporte a uma operação, por exemplo > , que seu código executa

Dá suporte a um membro, como um método, que seu código acessa

Expõe um construtor sem parâmetros


Se você não especificar nenhuma restrição, as únicas operações e membros que
seu código pode usar serão aqueles compatíveis com o Tipo de Dados de Objeto.
Para obter mais informações, consulte Lista de Tipos.

5. Identifique todos os membros da classe que devem ser declarados com um tipo
fornecido e declare-os As typeparameter . Isso se aplica ao armazenamento interno,
aos parâmetros de procedimento e aos valores retornados.

6. Verifique se o código usa apenas operações e métodos compatíveis com qualquer


tipo de dados que ele possa fornecer para itemType .

O exemplo a seguir define uma classe que gerencia uma lista muito simples. Ele
contém a lista na matriz interna items e o código de uso pode declarar o tipo de
dados dos elementos de lista. Um construtor parametrizado permite que o código
de uso defina o limite superior de items e o construtor sem parâmetros define
isso como 9 (para um total de 10 itens).

VB

Public Class simpleList(Of itemType)

Private items() As itemType

Private top As Integer

Private nextp As Integer

Public Sub New()

Me.New(9)
End Sub

Public Sub New(ByVal t As Integer)

MyBase.New()

items = New itemType(t) {}

top = t

nextp = 0

End Sub

Public Sub add(ByVal i As itemType)

insert(i, nextp)

End Sub

Public Sub insert(ByVal i As itemType, ByVal p As Integer)

If p > nextp OrElse p < 0 Then

Throw New System.ArgumentOutOfRangeException("p",

" less than 0 or beyond next available list position")

ElseIf nextp > top Then

Throw New System.ArgumentException("No room to insert at ",

"p")

ElseIf p < nextp Then

For j As Integer = nextp To p + 1 Step -1

items(j) = items(j - 1)

Next j

End If

items(p) = i

nextp += 1

End Sub

Public Sub remove(ByVal p As Integer)

If p >= nextp OrElse p < 0 Then

Throw New System.ArgumentOutOfRangeException("p",

" less than 0 or beyond last list item")

ElseIf nextp = 0 Then

Throw New System.ArgumentException("List empty; cannot remove


",

"p")

ElseIf p < nextp - 1 Then

For j As Integer = p To nextp - 2

items(j) = items(j + 1)

Next j

End If

nextp -= 1

End Sub

Public ReadOnly Property listLength() As Integer

Get

Return nextp

End Get

End Property

Public ReadOnly Property listItem(ByVal p As Integer) As itemType

Get

If p >= nextp OrElse p < 0 Then

Throw New System.ArgumentOutOfRangeException("p",

" less than 0 or beyond last list item")

End If

Return items(p)

End Get

End Property

End Class

Você pode declarar uma classe de simpleList para manter uma lista de valores de
Integer , outra classe para manter uma lista de valores de String e outra para

manter valores de Date . Exceto pelo tipo de dados dos membros da lista, os
objetos criados de todas essas classes se comportam de maneira idêntica.

O argumento de tipo que o código de uso fornece para itemType pode ser um
tipo intrínseco, como Boolean ou Double , uma estrutura, uma enumeração ou
qualquer tipo de classe, incluindo um que seu aplicativo define.

Você pode testar a classe simpleList com o código a seguir.

VB

Public Sub useSimpleList()

Dim iList As New simpleList(Of Integer)(2)

Dim sList As New simpleList(Of String)(3)

Dim dList As New simpleList(Of Date)(2)

iList.add(10)

iList.add(20)

iList.add(30)

sList.add("First")

sList.add("extra")

sList.add("Second")

sList.add("Third")

sList.remove(1)

dList.add(#1/1/2003#)

dList.add(#3/3/2003#)

dList.insert(#2/2/2003#, 1)

Dim s =

"Simple list of 3 Integer items (reported length " &

CStr(iList.listLength) & "):" &

vbCrLf & CStr(iList.listItem(0)) &

vbCrLf & CStr(iList.listItem(1)) &

vbCrLf & CStr(iList.listItem(2)) &

vbCrLf &

"Simple list of 4 - 1 String items (reported length " &

CStr(sList.listLength) & "):" &

vbCrLf & CStr(sList.listItem(0)) &

vbCrLf & CStr(sList.listItem(1)) &

vbCrLf & CStr(sList.listItem(2)) &

vbCrLf &

"Simple list of 2 + 1 Date items (reported length " &

CStr(dList.listLength) & "):" &

vbCrLf & CStr(dList.listItem(0)) &

vbCrLf & CStr(dList.listItem(1)) &

vbCrLf & CStr(dList.listItem(2))

MsgBox(s)

End Sub

Confira também
Data Types
Tipos genéricos no Visual Basic
Independência da linguagem e componentes independentes da linguagem
Of
Lista de Tipos
Como: Usar uma classe genérica
Tipo de dados Object
Como usar uma classe genérica (Visual
Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Uma classe que usa parâmetros de tipo é chamada de classe genérica. Se você estiver
usando uma classe genérica, poderá gerar uma classe construída dela fornecendo um
argumento de tipo para cada um desses parâmetros. Em seguida, você pode declarar
uma variável do tipo de classe construída e pode criar uma instância da classe
construída e atribuí-la a essa variável.

Além das classes, você também pode definir e usar estruturas genéricas, interfaces,
procedimentos e delegados.

O procedimento a seguir usa uma classe genérica definida no .NET Framework e cria
uma instância dela.

Para usar uma classe que usa um parâmetro de tipo


1. No início do arquivo de origem, inclua uma Instrução Imports (Namespace e Tipo
do .NET) para importar o namespace System.Collections.Generic. Isso permite que
você se refira à classe System.Collections.Generic.Queue<T> sem precisar
qualificá-la totalmente para diferenciá-la de outras classes de fila, como
System.Collections.Queue.

2. Crie o objeto da maneira normal, mas adicione (Of type) imediatamente após o
nome de classe.

O exemplo a seguir usa a mesma classe (System.Collections.Generic.Queue<T>)


para criar dois objetos de fila que contêm itens de diferentes tipos de dados. Ele
adiciona itens ao final de cada fila e, em seguida, remove e exibe itens da frente de
cada fila.

VB

Public Sub usequeue()

Dim queueDouble As New System.Collections.Generic.Queue(Of Double)

Dim queueString As New System.Collections.Generic.Queue(Of String)

queueDouble.Enqueue(1.1)

queueDouble.Enqueue(2.2)

queueDouble.Enqueue(3.3)

queueDouble.Enqueue(4.4)

queueString.Enqueue("First string of three")

queueString.Enqueue("Second string of three")

queueString.Enqueue("Third string of three")

Dim s As String = "Queue of Double items (reported length " &

CStr(queueDouble.Count) & "):"

For i As Integer = 1 To queueDouble.Count

s &= vbCrLf & CStr(queueDouble.Dequeue())

Next i

s &= vbCrLf & "Queue of String items (reported length " &

CStr(queueString.Count) & "):"

For i As Integer = 1 To queueString.Count

s &= vbCrLf & queueString.Dequeue()

Next i

MsgBox(s)

End Sub

Confira também
Data Types
Tipos genéricos no Visual Basic
Independência da linguagem e componentes independentes da linguagem
Of
Instrução Imports (tipo e namespace .NET)
Como: Definir uma classe capaz de fornecer uma funcionalidade idêntica em tipos
de dados diferentes
Iteradores
Procedimentos genéricos no Visual
Basic
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Um procedimento genérico, também chamado de método genérico, é um procedimento


definido com pelo menos um parâmetro de tipo genérico. Isso permite que o código de
chamada adapte os tipos de dados aos seus requisitos sempre que ele chama o
procedimento.

Um procedimento não é genérico simplesmente em virtude de ser definido dentro de


uma classe genérica ou uma estrutura genérica. Para ser genérico, o procedimento deve
usar pelo menos um parâmetro de tipo genérico, além de quaisquer parâmetros
normais que possa ser necessário. Uma classe ou estrutura genérica pode conter
procedimentos não genéricos, e uma classe, estrutura ou módulo não genérico pode
conter procedimentos genéricos.

Um procedimento genérico pode usar seus parâmetros de tipo na sua lista de


parâmetros normal, no seu tipo de retorno, se tiver um e no seu código de
procedimento.

Inferência de tipos
Você pode chamar um procedimento genérico sem fornecer nenhum argumento de
tipo. Se você chamá-lo dessa forma, o compilador tentará determinar os tipos de dados
apropriados para passar para os argumentos de tipo do procedimento. Isso é chamado
de inferência de tipos. O código a seguir mostra uma chamada na qual o compilador
infere que ele deve passar o tipo String para o parâmetro de tipo t .

VB

Public Sub testSub(Of t)(ByVal arg As t)

End Sub

Public Sub callTestSub()

testSub("Use this string")

End Sub

Se o compilador não puder inferir os argumentos de tipo do contexto da sua chamada,


ele relatará um erro. Uma possível causa desse erro é uma incompatibilidade de
classificação de matriz. Por exemplo, suponha que você defina um parâmetro normal
como uma matriz de um parâmetro de tipo. Se você chamar o procedimento genérico
que fornece uma matriz de uma classificação diferente (número de dimensões), a
incompatibilidade fará com que a inferência de tipo falhe. O código a seguir mostra
uma chamada na qual uma matriz bidimensional é passada para um procedimento que
espera uma matriz unidimensional.

VB

Public Sub demoSub(Of t)(ByVal arg() As t)

End Sub

Public Sub callDemoSub()

Dim twoDimensions(,) As Integer

demoSub(twoDimensions)

End Sub

Você pode invocar a inferência de tipo apenas omitindo todos os argumentos de tipo.
Se você fornecer um argumento de tipo, deverá fornecer todos eles.

Somente procedimentos genéricos dão suporte para inferência de tipo. Não é possível
invocar inferência de tipo em classes genéricas, estruturas, interfaces ou delegados.

Exemplo

Descrição
O exemplo a seguir define um procedimento genérico Function para localizar um
elemento específico em uma matriz. Ele define um parâmetro de tipo e o usa para
construir os dois parâmetros na lista de parâmetros.

Código
VB

Public Function findElement(Of T As IComparable) (

ByVal searchArray As T(), ByVal searchValue As T) As Integer

If searchArray.GetLength(0) > 0 Then

For i As Integer = 0 To searchArray.GetUpperBound(0)

If searchArray(i).CompareTo(searchValue) = 0 Then Return i

Next i

End If

Return -1

End Function

Comentários
O exemplo anterior requer a capacidade de comparar searchValue com cada elemento
de searchArray . Para garantir essa capacidade, ele restringe o parâmetro de tipo T para
implementar a interface IComparable<T>. O código usa o método CompareTo em vez
do operador = , pois não há garantia de que um argumento de tipo fornecido para T dê
suporte ao operador = .

Você pode testar o procedimento findElement com o código a seguir.

VB

Public Sub tryFindElement()

Dim stringArray() As String = {"abc", "def", "xyz"}

Dim stringSearch As String = "abc"

Dim integerArray() As Integer = {7, 8, 9}

Dim integerSearch As Integer = 8

Dim dateArray() As Date = {#4/17/1969#, #9/20/1998#, #5/31/2004#}


Dim dateSearch As Date = Microsoft.VisualBasic.DateAndTime.Today

MsgBox(CStr(findElement(Of String)(stringArray, stringSearch)))

MsgBox(CStr(findElement(Of Integer)(integerArray, integerSearch)))

MsgBox(CStr(findElement(Of Date)(dateArray, dateSearch)))

End Sub

As chamadas anteriores para MsgBox exibem "0", "1" e "-1", respectivamente.

Confira também
Tipos genéricos no Visual Basic
Como: Definir uma classe capaz de fornecer uma funcionalidade idêntica em tipos
de dados diferentes
Como: Usar uma classe genérica
Procedimentos
Parâmetros e Argumentos de Procedimento
Lista de Tipos
Lista de parâmetros
Tipos de valor que permitem valor nulo
(Visual Basic)
Artigo • 07/04/2023 • 6 minutos para o fim da leitura

Às vezes, você trabalha com um tipo de valor que não tem um valor definido em
determinadas circunstâncias. Por exemplo, um campo em um banco de dados pode ter
que distinguir entre ter um valor atribuído que seja significativo e não ter um valor
atribuído. Os tipos de valor podem ser estendidos para obter seus valores normais ou
um valor nulo. Essa extensão é chamada de tipo que permite valor nulo.

Cada tipo de valor anulável é construído da estrutura genérica Nullable<T>. Considere


um banco de dados que rastreia atividades relacionadas ao trabalho. O exemplo a
seguir constrói um tipo que permite valor nulo Boolean e declara uma variável desse
tipo. Você pode gravar a declaração de três maneiras:

VB

Dim ridesBusToWork1? As Boolean

Dim ridesBusToWork2 As Boolean?

Dim ridesBusToWork3 As Nullable(Of Boolean)

A variável ridesBusToWork pode conter um valor de True , um valor de False ou


nenhum valor. O valor padrão inicial dela é nenhum valor, o que, nesse caso, pode
significar que as informações ainda não foram obtidas para essa pessoa. Por outro lado,
False pode significar que as informações foram obtidas e que a pessoa não anda de
ônibus para o trabalho.

Você pode declarar variáveis e propriedades com tipos de valor anuláveis e declarar
uma matriz com elementos de um tipo de valor anulável. Você pode declarar
procedimentos com tipos de valor anuláveis como parâmetros e pode retornar um tipo
de valor anulável de um procedimento Function .

Você não pode construir um tipo que permite valor nulo em um tipo de referência,
como uma matriz, uma String ou uma classe. O tipo subjacente precisa ser um tipo de
valor. Para obter mais informações, consulte Tipos de Valor e Tipos de Referência.

Usando uma Variável de Tipo que Permite Valor


Nulo
Os membros mais importantes de um tipo de valor anulável são as propriedades
HasValue e Value dele. Para uma variável de um tipo de valor anulável, HasValue informa
se a variável contém um valor definido. Se HasValue for True , você poderá ler o valor de
Value. Observe que ambas HasValue e Value são propriedades ReadOnly .

Valores padrão
Quando você declara uma variável com um tipo de valor anulável, a propriedade
HasValue dela tem um valor padrão de False . Isso significa que, por padrão, a variável
não tem nenhum valor definido, em vez do valor padrão do tipo de valor subjacente. No
exemplo a seguir, a variável numberOfChildren inicialmente não tem nenhum valor
definido, embora o valor padrão do tipo Integer seja 0.

VB

Dim numberOfChildren? As Integer

Um valor nulo é útil para indicar um valor indefinido ou desconhecido. Se


numberOfChildren tivesse sido declarado como Integer , não haveria nenhum valor que
pudesse indicar que as informações não estão disponíveis no momento.

Armazenando Valores
Você armazena um valor em uma variável ou propriedade de um tipo de valor anulável
da maneira típica. O exemplo a seguir atribui um valor à variável numberOfChildren
declarada no exemplo anterior.

VB

numberOfChildren = 2

Se uma variável ou propriedade de um tipo de valor anulável contiver um valor definido,


você poderá fazer com que ele seja revertido para o estado inicial de não ter um valor
atribuído. Você faz isso definindo a variável ou a propriedade como Nothing , como
mostra o exemplo a seguir.

VB

numberOfChildren = Nothing

7 Observação

Embora você possa atribuir Nothing a uma variável de um tipo de valor anulável,
não é possível testá-la para Nothing usando o sinal de igual. Comparação que usa
o sinal de igual, someVar = Nothing , sempre é avaliada como Nothing . Você pode
testar a propriedade HasValue da variável False ou testar usando o operador o
operador Is ou IsNot .

Recuperando Valores
Para recuperar o valor de uma variável de um tipo de valor anulável, primeiro você deve
testar a propriedade HasValue dela para confirmar que ela tem um valor. Se você tentar
ler o valor quando HasValue estiver False , o Visual Basic lançará uma exceção
InvalidOperationException. O exemplo a seguir mostra a maneira recomendada de ler a
variável numberOfChildren dos exemplos anteriores.

VB

If numberOfChildren.HasValue Then

MsgBox("There are " & CStr(numberOfChildren) & " children.")

Else

MsgBox("It is not known how many children there are.")

End If

Comparando Tipos que Permitem Valores


Nulos
Quando variáveis anuláveis Boolean são usadas em expressões Boolianas, o resultado
pode ser True , False ou Nothing . A seguir está a tabela de verdade para And e Or .
Como b1 e b2 agora têm três valores possíveis, há nove combinações a serem
avaliadas.

b1 b2 b1 E b2 b1 Ou b2

Nothing Nothing Nothing Nothing

Nothing True Nothing True

Nothing False False Nothing

True Nothing Nothing True


b1 b2 b1 E b2 b1 Ou b2

True True True True

True False False True

False Nothing False Nothing

False True False True

False False False False

Quando o valor de uma variável ou expressão Booliana é Nothing , ele não é nem true
ou false . Considere o exemplo a seguir.

VB

Dim b1? As Boolean

Dim b2? As Boolean

b1 = True

b2 = Nothing

' The following If statement displays "Expression is not true".

If (b1 And b2) Then

Console.WriteLine("Expression is true")

Else

Console.WriteLine("Expression is not true")

End If

' The following If statement displays "Expression is not false".

If Not (b1 And b2) Then

Console.WriteLine("Expression is false")

Else

Console.WriteLine("Expression is not false")

End If

Neste exemplo, b1 And b2 avalia como Nothing . Como resultado, a cláusula Else é
executada em cada instrução If e a saída é a seguinte:

Expression is not true

Expression is not false

7 Observação

AndAlso e OrElse , que usam a avaliação de curto-circuito, precisam avaliar os


segundos operandos quando o primeiro for avaliado como Nothing .
Propagação
Se um ou ambos os operandos de uma operação aritmética, comparação, deslocamento
ou tipo forem um tipo de valor anulável, o resultado da operação também será um tipo
de valor anulável. Se ambos os operandos tiverem valores que não são Nothing , a
operação será executada nos valores subjacentes dos operandos, como se nenhum
deles fosse um tipo de valor anulável. No exemplo a seguir, as variáveis compare1 e
sum1 são digitadas implicitamente. Se você descansar o ponteiro do mouse sobre elas,

verá que o compilador infere tipos de valor anuláveis para ambas.

VB

' Variable n is a nullable type, but both m and n have proper values.

Dim m As Integer = 3

Dim n? As Integer = 2

' The comparison evaluated is 3 > 2, but compare1 is inferred to be of

' type Boolean?.

Dim compare1 = m > n

' The values summed are 3 and 2, but sum1 is inferred to be of type
Integer?.

Dim sum1 = m + n

' The following line displays: 3 * 2 * 5 * True

Console.WriteLine($"{m} * {n} * {sum1} * {compare1}")

Se um ou ambos os operandos tiverem um valor de Nothing , o resultado será Nothing .

VB

' Change the value of n to Nothing.

n = Nothing

Dim compare2 = m > n

Dim sum2 = m + n

' Because the values of n, compare2, and sum2 are all Nothing, the

' following line displays: 3 * <null> * <null> * <null>

Console.WriteLine($"{m} * {If(n, "<null>")} * {If(sum2, "<null>")} *


{If(compare2, "<null>")}")

Usando Tipos que Permitem Valores Nulos com


os Dados
Um banco de dados é um dos locais mais importantes para usar tipos de valor
anuláveis. Nem todos os objetos de banco de dados dão suporte atualmente a tipos de
valor anuláveis, mas os adaptadores de tabela gerados pelo designer dão. Consulte o
Suporte do TableAdapter para tipos que permite valores nulos.

Confira também
InvalidOperationException
HasValue
Data Types
Tipos de Valor e Tipos de Referência
Solução de problemas de tipos de dados
Preencher conjuntos de dados usando TableAdapters
Operador If
Inferência de Tipo de Variável Local
Operador Is
Operador IsNot
Tipos de Valores Anuláveis (C#)
Tipos de valor e referência
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Há dois tipos em Visual Basic: tipos de referência e tipos de valor. Variáveis de tipos de
referência armazenam referências em seus dados (objetos) enquanto que variáveis de
tipos de valor contém diretamente seus dados. Com tipos de referência, duas variáveis
podem fazer referência ao mesmo objeto; portanto, operações em uma variável podem
afetar o objeto referenciado pela outra variável. Com tipos de valor, cada variável tem
sua própria cópia dos dados, e não é possível que operações em uma variável afetem a
outra (exceto no caso de variáveis de modificadores ByRef em parâmetros).

Tipos de valor
Um tipo de dados é um tipo de valor se ele mantém os dados dentro de sua própria
alocação de memória. Os tipos de valor incluem o seguinte:

Todos os tipos de dados numéricos

Boolean , Char , e Date

Todas as estruturas, mesmo que seus membros sejam tipos de referência

Enumerações, já que seu tipo subjacente é sempre SByte , Short , Integer , Long ,
Byte , UShort , UInteger , ou ULong

Cada estrutura é um tipo de valor, mesmo que contenha membros do tipo de


referência. Por esse motivo, tipos de valor como Char e Integer são implementados por
estruturas .NET Framework.

Você pode declarar um tipo de valor usando a palavra-chave reservada, por exemplo,
Decimal . Você também pode usar a palavra-chave New para inicializar um tipo de valor.
Isso será especialmente útil se o tipo tiver um construtor que usa parâmetros. Um
exemplo disso é o construtor Decimal(Int32, Int32, Int32, Boolean, Byte), que cria um
novo valor Decimal a partir das partes fornecidas.

Tipos de referência
Um tipo de referência armazena uma referência aos seus dados. Os tipos de referência
incluem o seguinte:

String
Todas as matrizes, mesmo se seus elementos forem tipos de valor

Tipos de classe, como Form

Delegados

Uma classe é um tipo de referência. Observe que cada matriz é um tipo de referência,
mesmo que seus membros sejam tipos de valor.

Como cada tipo de referência representa uma classe .NET Framework subjacente, você
deve usar a palavra-chave Novo operador ao inicializá-la. A instrução a seguir inicializa
uma matriz.

VB

Dim totals() As Single = New Single(8) {}

Elementos que não são tipos


Os seguintes elementos de programação não se qualificam como tipos, pois você não
pode especificar nenhum deles como um tipo de dados para um elemento declarado:

Namespaces

Módulos

Eventos

Propriedades e procedimentos

Variáveis, constantes e campos

Trabalhar com o tipo de dados do objeto


Você pode atribuir um tipo de referência ou um tipo de valor a uma variável do tipo de
dados Object . Uma variável Object sempre contém uma referência aos dados, nunca os
próprios dados. No entanto, se você atribuir um tipo de valor a uma variável Object , ele
se comportará como se tivesse seus próprios dados. Para obter mais informações,
confira Tipo de dados de objeto.

Você pode descobrir se uma variável Object está agindo como um tipo de referência ou
um tipo de valor passando-a para o método IsReference na classe Information do
namespace Microsoft.VisualBasic. Information.IsReference retornará True se o conteúdo
da variável Object representar um tipo de referência.

Confira também
Tipos de Valor Anulável
Conversões de tipo no Visual Basic
Instrução Structure
Uso eficiente de tipos de dados
Tipo de dados Object
Data Types
Conversões de tipo no Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O processo de alteração de um valor de um tipo de dados para outro é chamado de


conversão. As conversões estão se expandindo ou estreitando, dependendo das
capacidades de dados dos tipos envolvidos. Elas também são implícitas ou explícitas,
dependendo da sintaxe no código-fonte.

Nesta seção
Conversões de Widening e Narrowing

Explica as conversões classificadas se o tipo de destino pode conter os dados.

Conversões implícitas e explícitas

Discute conversões classificadas se o Visual Basic as executa automaticamente.

Conversões entre cadeias de caracteres e outros tipos

Ilustra a conversão entre cadeias de caracteres e valores numéricos, Boolean ou de


data/hora.

Como converter um objeto em outro tipo no Visual Basic

Mostra como converter uma variável Object em qualquer outro tipo de dados.

Conversões de matriz

Percorre o processo de conversão entre matrizes de diferentes tipos de dados.

Seções relacionadas
Data Types

Apresenta os tipos de dados do Visual Basic e descreve como usá-los.

Data Types

Lista os tipos de dados elementares fornecidos pelo Visual Basic.

Solução de problemas de tipos de dados

Aborda alguns problemas comuns que surgem ao trabalhar com tipo de dados.
Conversões de Widening e Narrowing
(Visual Basic)
Artigo • 28/11/2022 • 4 minutos para o fim da leitura

Uma consideração importante com uma conversão de tipo é se o resultado da


conversão está dentro do intervalo do tipo de dados de destino.

Uma conversão de expansão altera um valor para um tipo de dados que pode permitir
qualquer valor possível dos dados originais. As conversões de expansão preservam o
valor de origem, mas podem alterar sua representação. Isso ocorrerá se você converter
de um tipo integral para Decimal ou de Char para String .

Uma conversão de restrição altera um valor para um tipo de dados que pode não ser
capaz de manter alguns dos valores possíveis. Por exemplo, um valor fracionário é
arredondado quando ele é convertido em um tipo integral e um tipo numérico sendo
convertido para Boolean é reduzido a um True ou False .

Conversões de expansão
A tabela a seguir mostra as conversões de expansão padrão.

Tipo de dados Expande para os tipos de dados 1

SByte SByte , Short , Integer , Long , Decimal , Single , Double

Byte Byte , Short , UShort , Integer , UInteger , Long , ULong , Decimal ,


Single , Double

Short Short , Integer , Long , Decimal , Single , Double

UShort UShort , Integer , UInteger , Long , ULong , Decimal , Single ,


Double

Inteiro Integer , Long , Decimal , Single , Double 2

UInteger UInteger , Long , ULong , Decimal , Single , Double 2

Long Long , Decimal , Single , Double 2

ULong ULong , Decimal , Single , Double 2

Decimal Decimal , Single , Double 2

Single Single , Double


Tipo de dados Expande para os tipos de dados 1

Double Double

Qualquer tipo enumerado Seu tipo integral subjacente e qualquer tipo ao qual o tipo
(Enumerado) subjacente é expandido.

Char Char , String

Matriz Char Char matriz, String

Qualquer tipo Objeto

Qualquer tipo derivado Qualquer tipo base do qual ele é derivado 3.

Qualquer tipo Qualquer interface implementada.

Nothing Qualquer tipo de dados ou tipo de objeto.

1 Por definição, cada tipo de dados é ampliado para si mesmo.

2
Conversões de Integer , UInteger , Long , ULong ou Decimal para Single ou Double
pode resultar em perda de precisão, mas nunca em perda de magnitude. Nesse sentido,
eles não incorrem em perda de informações.

3 Pode parecer surpreendente que uma conversão de um tipo derivado para um de seus
tipos base seja expansão. A justificativa é que o tipo derivado contém todos os
membros do tipo base, portanto, ele se qualifica como uma instância do tipo base. Na
direção oposta, o tipo base não contém nenhum novo membro definido pelo tipo
derivado.

As conversões de expansão sempre são bem-sucedidas em tempo de execução e nunca


incorrem em perda de dados. Você sempre pode executá-las implicitamente, se a
Instrução Opção Estrita define a opção de verificação de tipo para On ou para Off .

Conversões de redução
As conversões de restrição padrão incluem o seguinte:

As direções inversas das conversões de expansão na tabela anterior (exceto que


cada tipo é expandido para si mesmo)

Conversões em qualquer direção entre booliano e qualquer tipo numérico

Conversões de qualquer tipo numérico para qualquer tipo enumerado ( Enum )


Conversões em qualquer direção entre cadeia de caracteres e qualquer tipo
numérico, Boolean ou Data

Conversões de um tipo de dados ou tipo de objeto para um tipo derivado dele

As conversões de restrição nem sempre são bem-sucedidas em tempo de execução e


podem falhar ou incorrer em perda de dados. Ocorrerá um erro se o tipo de dados de
destino não puder receber o valor que está sendo convertido. Por exemplo, uma
conversão numérica pode resultar em um estouro. O compilador não permite que você
execute conversões de restrição implicitamente, a menos que a Instrução Option Strict
defina a opção de verificação de tipo como Off .

7 Observação

O erro de conversão de restrição é suprimido para conversões dos elementos em


uma coleção For Each…Next para a variável de controle de loop. Para obter mais
informações e exemplos, consulte a seção "Conversões de restrição" em Para
cada... Próxima instrução.

Quando usar conversões de restrição


Você usa uma conversão de restrição quando sabe que o valor de origem pode ser
convertido no tipo de dados de destino sem erro ou perda de dados. Por exemplo, se
você tiver um String que você sabe que contém "True" ou "False", você poderá usar a
palavra-chave CBool para converter em Boolean .

Exceções durante a conversão


Como as conversões de expansão sempre são bem-sucedidas, elas não geram exceções.
As conversões de restrição, quando elas falham, geralmente geram as seguintes
exceções:

InvalidCastException — se nenhuma conversão for definida entre os dois tipos

OverflowException — (somente tipos integrais) se o valor convertido for muito


grande para o tipo de destino

Se uma classe ou estrutura definir uma Função CType para servir como um operador de
conversão para ou dessa classe ou estrutura, isso poderá gerar qualquer exceção que
CType considerar apropriada. Além disso, isso CType pode chamar funções do Visual
Basic ou métodos .NET Framework, o que, por sua vez, pode gerar uma variedade de
exceções.

Alterações durante conversões de tipo de


referência
Uma conversão de um tipo de referência copia apenas o ponteiro para o valor. O valor
em si não é copiado nem alterado de forma alguma. A única coisa que pode alterar é o
tipo de dados da variável que contém o ponteiro. No exemplo a seguir, o tipo de dados
é convertido da classe derivada em sua classe base, mas o objeto para o qual ambas as
variáveis agora apontam está inalterado.

VB

' Assume class cSquare inherits from class cShape.

Dim shape As cShape

Dim square As cSquare = New cSquare

' The following statement performs a widening

' conversion from a derived class to its base class.

shape = square

Confira também
Data Types
Conversões de tipo no Visual Basic
Conversões implícitas e explícitas
Conversões entre cadeias de caracteres e outros tipos
Como converter um objeto em outro tipo no Visual Basic
Conversões de matriz
Data Types
Funções de conversão do tipo
Conversões implícitas e explícitas (Visual
Basic)
Artigo • 12/12/2022 • 5 minutos para o fim da leitura

Uma conversão implícita não requer nenhuma sintaxe especial no código-fonte. No


exemplo a seguir, o Visual Basic converte implicitamente o valor de k para o valor de
um ponto flutuante de precisão única antes de atribuí-lo a q .

VB

Dim k As Integer

Dim q As Double

' Integer widens to Double, so you can do this with Option Strict On.

k = 432

q = k

Uma conversão explícita usa uma palavra-chave de conversão de tipo. O Visual Basic
fornece várias dessas palavras-chave, que forçam uma expressão entre parênteses ao
tipo de dados desejado. Essas palavras-chave agem como funções, mas o compilador
gera o código embutido; portanto, a execução é um pouco mais rápida do que com
uma chamada de função.

Na extensão a seguir do exemplo anterior, a palavra-chave CInt converte o valor de q


de volta em um inteiro antes de atribuí-lo a k .

VB

' q had been assigned the value 432 from k.

q = Math.Sqrt(q)

k = CInt(q)

' k now has the value 21 (rounded square root of 432).

Palavras-chave de conversão
A tabela a seguir mostra as regras de conversão disponíveis.

Palavra- Converte uma Tipos de dados de expressão permitidos para serem


chave de expressão em convertidos
conversão tipo de dados
de tipo
Palavra- Converte uma Tipos de dados de expressão permitidos para serem
chave de expressão em convertidos
conversão tipo de dados
de tipo

CBool Tipo de dados Qualquer tipo numérico (incluindo Byte , SByte e tipos
booliano enumerados), String , Object

CByte Tipo de Dados Qualquer tipo numérico (incluindo SByte e tipos enumerados),
Byte Boolean , String , Object

CChar Tipo de Dados String , Object


de Caractere

CDate Tipo de Dados String , Object


de Data

CDbl Tipo de Dados Qualquer tipo numérico (incluindo Byte , SByte e tipos
Duplo enumerados), Boolean , String , Object

CDec Tipo de Dados Qualquer tipo numérico (incluindo Byte , SByte e tipos
Decimal enumerados), Boolean , String , Object

CInt Tipo de Dados Qualquer tipo numérico (incluindo Byte , SByte e tipos
Integer enumerados), Boolean , String , Object

CLng Tipo de Dados Qualquer tipo numérico (incluindo Byte , SByte e tipos
Long enumerados), Boolean , String , Object

CObj Tipo de dados Qualquer tipo


Object

CSByte Tipo de Dados Qualquer tipo numérico (incluindo Byte e tipos enumerados),
SByte Boolean , String , Object

CShort Tipo de Dados Qualquer tipo numérico (incluindo Byte , SByte e tipos
Short enumerados), Boolean , String , Object

CSng Tipo de Dados Qualquer tipo numérico (incluindo Byte , SByte e tipos
Simples enumerados), Boolean , String , Object

CStr Tipo de Dados Qualquer tipo numérico (incluindo Byte , SByte e tipos
String enumerados), Boolean , Char , matriz Char , Date , Object
Palavra- Converte uma Tipos de dados de expressão permitidos para serem
chave de expressão em convertidos
conversão tipo de dados
de tipo

CType Tipo Ao converter em um tipo de dados elementar (incluindo uma


especificado matriz de um tipo elementar), os mesmos tipos permitidos para
após a vírgula a palavra-chave de conversão correspondente

(,)
Ao converter em um tipo de dados composto, as interfaces que
ele implementa e as classes das quais herda

Ao converter em uma classe ou estrutura na qual você


sobrecarregou CType , essa mesma classe ou estrutura

CUInt Tipo de Dados Qualquer tipo numérico (incluindo Byte , SByte e tipos
UInteger enumerados), Boolean , String , Object

CULng Tipo de Dados Qualquer tipo numérico (incluindo Byte , SByte e tipos
ULong enumerados), Boolean , String , Object

CUShort Tipo de Dados Qualquer tipo numérico (incluindo Byte , SByte e tipos
UShort enumerados), Boolean , String , Object

Função CType
A Função CType opera em dois argumentos. O primeiro é a expressão a ser convertida,
e o segundo é o tipo de dados de destino ou classe de objeto. Observe que o primeiro
argumento deve ser uma expressão, não um tipo.

CType é uma função embutida, o que significa que o código compilado faz a conversão,

muitas vezes sem gerar uma chamada de função. Isso melhora o desempenho.

Para obter uma comparação de CType com as outras palavras-chave de conversão de


tipo, consulte Operador DirectCast e Operador TryCast.

Tipos elementares
O exemplo a seguir demonstra o uso de CType .

VB

k = CType(q, Integer)

' The following statement coerces w to the specific object class Label.

f = CType(w, Label)

Tipos compostos
Você pode usar CType para converter valores em tipos de dados compostos, bem como
em tipos elementares. Você também pode usá-la para forçar uma classe de objeto ao
tipo de uma de suas interfaces, como no exemplo a seguir.

VB

' Assume class cZone implements interface iZone.

Dim h As Object

' The first argument to CType must be an expression, not a type.

Dim cZ As cZone

' The following statement coerces a cZone object to its interface iZone.

h = CType(cZ, iZone)

Tipos de matriz
CType também pode converter tipos de dados de matriz, como no exemplo a seguir.

VB

Dim v() As classV

Dim obArray() As Object

' Assume some object array has been assigned to obArray.

' Check for run-time type compatibility.

If TypeOf obArray Is classV()

' obArray can be converted to classV.

v = CType(obArray, classV())

End If

Para obter mais informações e um exemplo, consulte Conversões de matriz.

Tipos que definem CType


Você pode definir CType em uma classe ou estrutura que você definiu. Isso permite que
você converta valores de e para o tipo de sua classe ou estrutura. Para obter mais
informações e um exemplo, consulte Como definir um operador de conversão.

7 Observação

Os valores usados com uma palavra-chave de conversão devem ser válidos para o
tipo de dados de destino, ou ocorrerá um erro. Por exemplo, se você tentar
converter um Long em um Integer , o valor do Long deve estar dentro do intervalo
válido para o tipo de dados Integer .
U Cuidado

Especificar que CType converta de um tipo de classe para outro falhará em tempo
de execução se o tipo de origem não derivar do tipo de destino. Essa falha gera
uma exceção InvalidCastException.

No entanto, se um dos tipos for uma estrutura ou classe que você definiu, e se tiver
definido CType nessa estrutura ou classe, uma conversão poderá ser bem-sucedida se
atender aos requisitos do seu CType . Veja Como definir um operador de conversão.

A execução de uma conversão explícita também é conhecida como conversão de uma


expressão para um determinado tipo de dados ou classe de objeto.

Confira também
Conversões de tipo no Visual Basic
Conversões entre cadeias de caracteres e outros tipos
Como converter um objeto em outro tipo no Visual Basic
Estruturas
Data Types
Funções de conversão do tipo
Solução de problemas de tipos de dados
Conversões entre cadeias de caracteres
e outros tipos (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você pode converter um valor numérico Boolean ou de data/hora em um String . Você


também pode converter na direção inversa – de um valor de cadeia de caracteres para
numérico Boolean ou Date – desde que o conteúdo da cadeia de caracteres possa ser
interpretado como um valor válido do tipo de dados de destino. Se não puderem,
ocorrerá um erro em tempo de execução.

As conversões para todas essas atribuições, em qualquer direção, estão restringindo as


conversões. Você deve usar as palavras-chave de conversão de tipo ( CBool , CByte ,
CDate , CDbl , CDec , CInt , CLng , CSByte , CShort , CSng , CStr , CUInt , CULng , CUShort e

CType ). As Format funções e as Val funções oferecem controle adicional sobre


conversões entre cadeias de caracteres e números.

Se você tiver definido uma classe ou estrutura, poderá definir operadores de conversão
de tipo entre String e o tipo de sua classe ou estrutura. Para obter mais informações,
confira Como definir um operador de conversão.

Conversão de números em cadeias de


caracteres
Você pode usar a Format função para converter um número em uma cadeia de
caracteres formatada, que pode incluir não apenas os dígitos apropriados, mas também
formatar símbolos como um sinal de moeda (como $ ), milhares de separadores ou
símbolos de agrupamento de dígitos (como , ) e um separador decimal (como . ).
Format usa automaticamente os símbolos apropriados de acordo com as configurações
de Opções Regionais especificadas no Painel de Controle do Windows.

Observe que o operador de concatenação ( & ) pode converter um número em uma


cadeia de caracteres implicitamente, como mostra o exemplo a seguir.

VB

' The following statement converts count to a String value.

Str = "The total count is " & count

Conversão de cadeias de caracteres em


números
Você pode usar a Val função para converter explicitamente os dígitos em uma cadeia
de caracteres em um número. Val lê a cadeia de caracteres até encontrar um caractere
diferente de um dígito, espaço, guia, feed de linha ou ponto. As sequências "&O" e
"&H" alteram a base do sistema de números e encerram a verificação. Até que ele pare
de ler, Val converte todos os caracteres apropriados em um valor numérico. Por
exemplo, a instrução a seguir retorna o valor 141.825 .

Val(" 14 1.825 miles")

Quando o Visual Basic converte uma cadeia de caracteres em um valor numérico, ele
usa as configurações de Opções Regionais especificadas no Windows Painel de
Controle para interpretar o separador de milhares, o separador decimal e o símbolo de
moeda. Isso significa que uma conversão pode ter êxito em uma configuração, mas não
em outra. Por exemplo, "$14.20" é aceitável na localidade em inglês (Estados Unidos),
mas não em nenhuma localidade francesa.

Confira também
Conversões de tipo no Visual Basic
Conversões de Widening e Narrowing
Conversões implícitas e explícitas
Como converter um objeto em outro tipo no Visual Basic
Conversões de matriz
Data Types
Funções de conversão do tipo
Desenvolver aplicativos localizados e globalizados
Como converter um objeto em outro
tipo no Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você converte uma Object variável em outro tipo de dados usando uma palavra-chave
de conversão, como CType Function.

Exemplo
O exemplo a seguir converte uma Object variável em um Integer e um String .

VB

Public Sub objectConversion(ByVal anObject As Object)

Dim anInteger As Integer

Dim aString As String

anInteger = CType(anObject, Integer)

aString = CType(anObject, String)

End Sub

Se você souber que o conteúdo de uma Object variável é de um tipo de dados


específico, é melhor converter a variável nesse tipo de dados. Se você continuar a usar a
Object variável, incorrerá em boxing e unboxing (para um tipo de valor) ou associação

tardia (para um tipo de referência). Todas essas operações levam tempo extra de
execução e tornam o desempenho mais lento.

Compilar o código
Este exemplo requer:

Uma referência ao namespace System.

Confira também
Object
Conversões de tipo no Visual Basic
Conversões de Widening e Narrowing
Conversões implícitas e explícitas
Conversões entre cadeias de caracteres e outros tipos
Conversões de matriz
Estruturas
Data Types
Funções de conversão do tipo
Conversões de matriz (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você pode converter o tipo de uma matriz em um tipo diferente, desde que atenda às
seguintes condições:

Classificação igual. As classificações das duas matrizes devem ser as mesmas, ou


seja, elas devem ter o mesmo número de dimensões. No entanto, os
comprimentos das respectivas dimensões não precisam ser os mesmos.

Tipo de dados do elemento. Os tipos de dados dos elementos de ambas as


matrizes devem ser tipos de referência. Você não pode converter uma matriz
Integer em uma matriz Long ou mesmo em uma matriz Object , porque pelo
menos um tipo de valor está envolvido. Para obter mais informações, consulte
Tipos de Valor e Tipos de Referência.

Convertibilidade. Uma conversão, ampliando ou restringindo, deve ser possível


entre os tipos de elemento das duas matrizes. Um exemplo que falha nesse
requisito é uma tentativa de conversão entre uma matriz String e uma matriz de
uma classe derivada de System.Attribute. Esses dois tipos não têm nada em
comum e não existe conversão de nenhum tipo entre eles.

Uma conversão de um tipo de matriz para outro é de ampliação ou de restrição


dependendo se a conversão dos respectivos elementos está ampliando ou restringindo.
Para obter mais informações, consulte Ampliando e restringindo conversões.

Conversão em uma Matriz de Objetos


Quando você declara uma matriz Object sem inicializá-la, seu tipo de elemento é
Object desde que ele permaneça não inicializado. Quando você a define como uma

matriz de uma classe específica, ela assume o tipo dessa classe. No entanto, seu tipo
subjacente ainda é Object , e você pode defini-la posteriormente como outra matriz de
uma classe não relacionada. Como todas as classes derivam de Object , você pode
alterar o tipo de elemento da matriz de qualquer classe para qualquer outra classe.

No exemplo a seguir, não existe nenhuma conversão entre os tipos student e String ,
mas ambos derivam de Object , portanto, todas as atribuições são válidas.

VB
' Assume student has already been defined as a class.

Dim testArray() As Object

' testArray is still an Object array at this point.

Dim names() As String = New String(3) {"Name0", "Name1", "Name2", "Name3"}

testArray = New student(3) {}

' testArray is now of type student().

testArray = names

' testArray is now a String array.

Tipo subjacente de uma matriz


Se você declarar originalmente uma matriz com uma classe específica, seu tipo de
elemento subjacente será essa classe. Se posteriormente você defini-lo como uma
matriz de outra classe, deve haver uma conversão entre as duas classes.

No exemplo a seguir, students é uma matriz student . Como não existe conversão entre
String e student , a última instrução falha.

VB

Dim students() As student

Dim names() As String = New String(3) {"Name0", "Name1", "Name2", "Name3"}

students = New Student(3) {}

' The following statement fails at compile time.

students = names

Confira também
Data Types
Conversões de tipo no Visual Basic
Conversões implícitas e explícitas
Conversões entre cadeias de caracteres e outros tipos
Como converter um objeto em outro tipo no Visual Basic
Data Types
Funções de conversão do tipo
matrizes
Estruturas (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma estrutura é uma generalização de tipo definido pelo usuário (UDT) compatível com
versões anteriores do Visual Basic. Além dos campos, as estruturas podem expor
propriedades, métodos e eventos. Uma estrutura pode implementar uma ou mais
interfaces e você pode declarar níveis de acesso individuais para cada campo.

Você pode combinar itens de dados de diferentes tipos para criar uma estrutura. Uma
estrutura associa um ou mais elementos uns aos outros e à própria estrutura. Quando
você declara uma estrutura, ela se torna um tipo de dados composto e você pode
declarar variáveis desse tipo.

Estruturas são úteis quando você deseja que uma única variável contenha várias
informações relacionadas. Por exemplo, talvez você queira manter o nome, o ramal de
telefone e o salário de um funcionário juntos. Você pode usar diversas variáveis para
essas informações ou pode definir uma estrutura e usá-la para uma única variável de
funcionário. A vantagem da estrutura fica evidente quando você tem muitos
funcionários e, portanto, muitas instâncias da variável.

Nesta seção
Como: Declarar uma estrutura

Mostra como declarar uma estrutura e seus elementos.

Variáveis de estrutura

Abrange a atribuição de uma estrutura a uma variável e o acesso aos seus elementos.

Estruturas e outros elementos de programação

Resume como as estruturas interagem com matrizes, objetos, procedimentos e entre si.

Estruturas e classes

Descreve as semelhanças e diferenças entre estruturas e classes.

Seções relacionadas
Data Types

Apresenta os tipos de dados do Visual Basic e descreve como usá-los.

Data Types

Lista os tipos de dados elementares fornecidos pelo Visual Basic.


Como declarar uma estrutura (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você inicia uma declaração de estrutura com a Instrução Structure e a encerra com a
instrução End Structure . Entre essas duas instruções, você deve declarar pelo menos
um elemento. Os elementos podem ser de qualquer tipo de dados, mas pelo menos um
deve ser uma variável não compartilhada ou um evento não compartilhado e não
personalizado.

Não é possível inicializar nenhum dos elementos de estrutura na declaração de


estrutura. Quando você declara uma variável como de um tipo de estrutura, atribui
valores aos elementos acessando-os por meio da variável.

Para uma discussão sobre as diferenças entre estruturas e classes, consulte Estruturas e
Classes.

Para fins de demonstração, considere uma situação em que você deseja controlar o
nome, a extensão telefônica e o salário de um funcionário. Uma estrutura permite que
você faça isso em uma única variável.

Para declarar uma estrutura


1. Crie as instruções de início e término para a estrutura.

Você pode especificar o nível de acesso de uma estrutura usando a palavra-chave


Pública, Protegida, Amiga ou Privada ou pode deixá-la padrão Public .

VB

Private Structure employee

End Structure

2. Adicione elementos ao corpo da estrutura.

Uma estrutura deve ter pelo menos um elemento. Você deve declarar cada
elemento e especificar um nível de acesso para ele. Se você usar a Instrução Dim
sem palavras-chave, a acessibilidade será padrão Public .

VB
Private Structure employee

Public givenName As String

Public familyName As String

Public phoneExtension As Long

Private salary As Decimal

Public Sub giveRaise(raise As Double)

salary *= raise

End Sub

Public Event salaryReviewTime()

End Structure

O campo salary no exemplo anterior é Private , o que significa que ele está
inacessível fora da estrutura, mesmo da classe que contém. No entanto, o
procedimento giveRaise é Public ; portanto, pode ser chamado de fora da
estrutura. Da mesma forma, você pode gerar o evento salaryReviewTime de fora
da estrutura.

Além de variáveis, os procedimentos Sub e eventos, você também pode definir


constantes, procedimentos Function e propriedades em uma estrutura. Você pode
designar no máximo uma propriedade como a propriedade padrão, desde que ela
utilize pelo menos um argumento. Você pode lidar com um evento com um
procedimento Compartilhado Sub . Para obter mais informações, consulte Como
declarar e chamar uma propriedade padrão no Visual Basic.

Confira também
Data Types
Tipos de dados elementares
Tipos de dados compostos
Tipos de Valor e Tipos de Referência
Estruturas
Solução de problemas de tipos de dados
Variáveis de estrutura
Estruturas e outros elementos de programação
Estruturas e classes
Tipo de Dados Definido pelo Usuário
Variáveis de estrutura (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Depois de criar uma estrutura, você pode declarar variáveis no nível do procedimento e
no nível do módulo como esse tipo. Por exemplo, você pode criar uma estrutura que
registra informações sobre um sistema de computador. O exemplo a seguir demonstra
isso.

VB

Public Structure systemInfo

Public cPU As String

Public memory As Long

Public purchaseDate As Date

End Structure

Agora você pode declarar variáveis desse tipo. A declaração a seguir ilustra isso.

VB

Dim mySystem, yourSystem As systemInfo

7 Observação

Em classes e módulos, estruturas declaradas usando a Instrução Dim padrão para


acesso público. Se você pretende que uma estrutura seja privada, declare-a usando
a palavra-chave Privada.

Acesso a valores de estrutura


Para atribuir e recuperar valores dos elementos de uma variável de estrutura, use a
mesma sintaxe usada para definir e obter propriedades em um objeto. Coloque o
operador de acesso de membro ( . ) entre o nome da variável de estrutura e o nome do
elemento. O exemplo a seguir acessa elementos das variáveis declaradas anteriormente
como tipo systemInfo .

VB

mySystem.cPU = "486"

Dim tooOld As Boolean

If yourSystem.purchaseDate < #1/1/1992# Then tooOld = True

Atribuir variáveis de estrutura


Você também pode atribuir uma variável a outra se ambas forem do mesmo tipo de
estrutura. Isso copia todos os elementos de uma estrutura para os elementos
correspondentes na outra. A declaração a seguir ilustra isso.

VB

yourSystem = mySystem

Se um elemento de estrutura for um tipo de referência, como um String , Object ou


matriz, o ponteiro para os dados será copiado. No exemplo anterior, se systemInfo
tivesse incluído uma variável de objeto, o exemplo anterior teria copiado o ponteiro de
mySystem para yourSystem , e uma alteração nos dados do objeto por meio de uma

estrutura estaria em vigor quando acessada pela outra estrutura.

Confira também
Data Types
Tipos de dados elementares
Tipos de dados compostos
Tipos de Valor e Tipos de Referência
Estruturas
Solução de problemas de tipos de dados
Como: Declarar uma estrutura
Estruturas e outros elementos de programação
Estruturas e classes
Instrução Structure
Estruturas e outros elementos de
programação (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você pode usar estruturas em conjunto com matrizes, objetos e procedimentos, bem
como entre si. As interações usam a mesma sintaxe que esses elementos usam
individualmente.

7 Observação

Não é possível inicializar nenhum dos elementos de estrutura na declaração de


estrutura. Você pode atribuir valores somente a elementos de uma variável que foi
declarada como de um tipo de estrutura.

Estruturas e matrizes
Uma estrutura pode conter uma matriz como um ou mais de seus elementos. O
exemplo a seguir ilustra essa situação.

VB

Public Structure systemInfo

Public cPU As String

Public memory As Long

Public diskDrives() As String

Public purchaseDate As Date

End Structure

Você acessa os valores de uma matriz dentro de uma estrutura da mesma forma que
acessa uma propriedade em um objeto. O exemplo a seguir ilustra essa situação.

VB

Dim mySystem As systemInfo

ReDim mySystem.diskDrives(3)

mySystem.diskDrives(0) = "1.44 MB"

Você também pode declarar uma matriz de estruturas. O exemplo a seguir ilustra essa
situação.

VB
Dim allSystems(100) As systemInfo

Você segue as mesmas regras para acessar os componentes dessa arquitetura de dados.
O exemplo a seguir ilustra essa situação.

VB

ReDim allSystems(5).diskDrives(3)

allSystems(5).CPU = "386SX"

allSystems(5).diskDrives(2) = "100M SCSI"

Estruturas e objetos
Uma estrutura pode conter um objeto como um ou mais de seus elementos. O exemplo
a seguir ilustra essa situação.

VB

Protected Structure userInput

Public userName As String

Public inputForm As System.Windows.Forms.Form

Public userFileNumber As Integer

End Structure

Você deve usar uma classe de objeto específica em tal declaração, em vez de Object .

Estruturas e procedimentos
Você pode passar uma estrutura como um argumento de procedimento. O exemplo a
seguir ilustra essa situação.

VB

Public currentCPUName As String = "700MHz Pentium compatible"

Public currentMemorySize As Long = 256

Public Sub fillSystem(ByRef someSystem As systemInfo)

someSystem.cPU = currentCPUName

someSystem.memory = currentMemorySize

someSystem.purchaseDate = Now

End Sub

O exemplo anterior passa a estrutura por referência, o que permite que o procedimento
modifique seus elementos para que as alterações entrem em vigor no código de
chamada. Se você quiser proteger uma estrutura contra essa modificação, passe-a por
valor.

Você também pode retornar uma estrutura de um Function procedimento. O exemplo a


seguir ilustra essa situação.

VB

Dim allSystems(100) As systemInfo

Function findByDate(ByVal searchDate As Date) As systemInfo

Dim i As Integer

For i = 1 To 100

If allSystems(i).purchaseDate = searchDate Then Return allSystems(i)

Next i

' Process error: system with desired purchase date not found.
End Function

Estruturas dentro de estruturas


Estruturas podem conter outras estruturas. O exemplo a seguir ilustra essa situação.

VB

Public Structure driveInfo

Public type As String

Public size As Long

End Structure

Public Structure systemInfo

Public cPU As String

Public memory As Long

Public diskDrives() As driveInfo

Public purchaseDate As Date

End Structure

VB

Dim allSystems(100) As systemInfo

ReDim allSystems(1).diskDrives(3)

allSystems(1).diskDrives(0).type = "Floppy"

Você também pode usar essa técnica para encapsular uma estrutura definida em um
módulo dentro de uma estrutura definida em um módulo diferente.

Estruturas podem conter outras estruturas a uma profundidade arbitrária.


Confira também
Data Types
Tipos de dados elementares
Tipos de dados compostos
Tipos de Valor e Tipos de Referência
Estruturas
Solução de problemas de tipos de dados
Como: Declarar uma estrutura
Variáveis de estrutura
Estruturas e classes
Instrução Structure
Estruturas e classes (Visual Basic)
Artigo • 07/04/2023 • 4 minutos para o fim da leitura

O Visual Basic unifica a sintaxe para estruturas e classes, com o resultado de que ambas
as entidades dão suporte à maioria dos mesmos recursos. No entanto, também há
diferenças importantes entre estruturas e classes.

As classes têm a vantagem de serem tipos de referência – passar uma referência é mais
eficiente do que passar uma variável de estrutura com todos os seus dados. Por outro
lado, as estruturas não exigem alocação de memória no heap global.

Como você não pode herdar de uma estrutura, as estruturas devem ser usadas apenas
para objetos que não precisam ser estendidos. Use estruturas quando o objeto que
você deseja criar tiver um tamanho de instância pequeno e leve em conta as
características de desempenho de classes versus estruturas.

Semelhanças
Estruturas e classes são semelhantes nos seguintes aspectos:

Ambos são tipos de contêiner, o que significa que eles contêm outros tipos como
membros.

Ambos têm membros, que podem incluir construtores, métodos, propriedades,


campos, constantes, enumerações, eventos e manipuladores de eventos.

Os membros de ambos podem ter níveis de acesso individualizados. Por exemplo,


um membro pode ser declarado Public e outro Private .

Ambos podem implementar interfaces.

Ambos podem ter construtores compartilhados, com ou sem parâmetros.

Ambos podem expor uma propriedade padrão, desde que essa propriedade tenha
pelo menos um parâmetro.

Ambos podem declarar e gerar eventos, e ambos podem declarar delegados.

Diferenças
Estruturas e classes diferem nas seguintes particularidades:
Estruturas são tipos de valor e classes são tipos de referência. Uma variável de um
tipo de estrutura contém os dados da estrutura, em vez de conter uma referência
aos dados como um tipo de classe faz.

As estruturas usam alocação de heap; as classes usam alocação de heap.

Todos os elementos de estrutura são Public por padrão; variáveis de classe e


constantes são Private por padrão, enquanto outros membros de classe estão
Public por padrão. Esse comportamento para membros de classe fornece
compatibilidade com o sistema de padrões do Visual Basic 6.0.

Uma estrutura deve ter pelo menos uma variável não compartilhada ou um
elemento de evento não compartilhado e não compartilhado; uma classe pode
estar completamente vazia.

Os elementos de estrutura não podem ser declarados como Protected ; os


membros da classe podem.

Um procedimento de estrutura só pode lidar com eventos se for um procedimento


Shared Sub e somente por meio da Instrução AddHandler; qualquer procedimento
de classe pode lidar com eventos, usando a palavra-chave Handles ou a instrução
AddHandler . Para obter mais informações, consulte Eventos.

As declarações de variável de estrutura não podem especificar inicializadores ou


tamanhos iniciais para matrizes; as declarações de variável de classe podem.

As estruturas herdam implicitamente da classe System.ValueType e não podem


herdar de nenhum outro tipo; as classes podem herdar de qualquer classe ou
classes diferentes de System.ValueType.

As estruturas não são herdáveis; as classes são.

As estruturas nunca são encerradas, portanto, o CLR (common language runtime)


nunca chama o método Finalize em qualquer estrutura; as classes são encerradas
pelo GC (coletor de lixo), que chama Finalize em uma classe quando detecta que
não há referências ativas restantes.

Uma estrutura não requer um construtor; uma classe sim.

As estruturas só poderão ter construtores não compartilhados se tiverem


parâmetros; as classes podem tê-las com ou sem parâmetros.

Cada estrutura tem um construtor público implícito sem parâmetros. Esse construtor
inicializa todos os elementos de dados da estrutura para seus valores padrão. Você não
pode redefinir esse comportamento.
Instâncias e variáveis
Como as estruturas são tipos de valor, cada variável de estrutura está permanentemente
associada a uma instância de estrutura individual. Mas as classes são tipos de referência
e uma variável de objeto pode se referir a várias instâncias de classe em momentos
diferentes. Essa distinção afeta o uso de estruturas e classes das seguintes maneiras:

Inicialização. Uma variável de estrutura inclui implicitamente uma inicialização dos


elementos usando o construtor sem parâmetros da estrutura. Portanto, Dim s As
struct1 é equivalente a Dim s As struct1 = New struct1() .

Atribuição de variáveis. Quando você atribui uma variável de estrutura a outra ou


passa uma instância de estrutura para um argumento de procedimento, os valores
atuais de todos os elementos variáveis são copiados para a nova estrutura.
Quando você atribui uma variável de objeto a outra ou passa uma variável de
objeto para um procedimento, somente o ponteiro de referência é copiado.

Atribuição de Nothing. Você pode atribuir o valor Nothing a uma variável de


estrutura, mas a instância continua a ser associada à variável. Você ainda pode
chamar seus métodos e acessar seus elementos de dados, embora os elementos
variáveis sejam reinicializados pela atribuição.

Por outro lado, se você definir uma variável de objeto a Nothing , desassocie-a de
qualquer instância de classe e não poderá acessar nenhum membro por meio da
variável até atribuir outra instância a ela.

Várias instâncias. Uma variável de objeto pode ter instâncias de classe diferentes
atribuídas a ela em momentos diferentes, e várias variáveis de objeto podem se
referir à mesma instância de classe ao mesmo tempo. As alterações feitas nos
valores dos membros da classe afetam esses membros quando acessados por
meio de outra variável que aponta para a mesma instância.

Os elementos de estrutura, no entanto, são isolados dentro de sua própria


instância. As alterações em seus valores não são refletidas em nenhuma outra
variável de estrutura, mesmo em outras instâncias da mesma declaração
Structure .

Igualdade. O teste de igualdade de duas estruturas deve ser executado com um


teste de elemento por elemento. Duas variáveis de objeto podem ser comparadas
usando o método Equals. Equals indica se as duas variáveis apontam para a
mesma instância.
Confira também
Data Types
Tipos de dados compostos
Tipos de Valor e Tipos de Referência
Estruturas
Solução de problemas de tipos de dados
Estruturas e outros elementos de programação
Objetos e Classes
Tuplas (Visual Basic)
Artigo • 22/02/2023 • 12 minutos para o fim da leitura

A partir do Visual Basic 2017, a linguagem do Visual Basic oferece suporte interno para
tuplas que facilitam a criação de tuplas e o acesso aos elementos de tuplas. Tupla é uma
estrutura de dados leve que possui um número específico e uma sequência de valores.
Ao instanciar a tupla, você define o número e o tipo de dados de cada valor (ou
elemento). Por exemplo, uma tupla de 2 (ou par) tem dois elementos. O primeiro pode
ser um valor Boolean , enquanto o segundo é um String . Como as tuplas facilitam o
armazenamento de vários valores em um único objeto, elas geralmente são usadas
como uma maneira leve de retornar vários valores de um método.

) Importante

O suporte à tupla requer o tipo ValueTuple. Se o .NET Framework 4.7 não estiver
instalado, você deverá adicionar o pacote System.ValueTuple do et, que está
disponível na Galeria do NuGet. Sem esse pacote, você pode obter um erro de
compilação semelhante a "O tipo predefinido 'ValueTuple(Of,,,)' não é definido ou
importado."

Instanciar e usar uma tupla


Você cria uma instância de uma tupla colocando seus valores delimitados por vírgula
entre parênteses. Cada um desses valores, em seguida, torna-se um campo da tupla. Por
exemplo, o código a seguir define um triplo (ou 3 tuplas) com um Date como seu
primeiro valor, um String como segundo valor e um Boolean como terceiro.

VB

Dim holiday = (#07/04/2017#, "Independence Day", True)

Por padrão, o nome de cada campo em uma tupla consiste na cadeia de caracteres
Item junto com a posição baseada em um campo na tupla. Para esta tupla de 3, o

campo Date é Item1 , o campo String é Item2 e o campo Boolean é Item3 . O exemplo
a seguir exibe os valores dos campos da tupla para qual foi criada uma instância na
linha de código anterior

VB
Console.WriteLine($"{holiday.Item1} is {holiday.Item2}" +

$"{If(holiday.Item3, ", a national holiday",


String.Empty)}")

' Output: 7/4/2017 12:00:00 AM Is Independence Day, a national holiday

Os campos de uma tupla do Visual Basic são leitura-gravação. Depois de instanciar uma
tupla, você pode modificar seus valores. O exemplo a seguir modifica dois dos três
campos da tupla criada no exemplo anterior e exibe o resultado.

VB

holiday.Item1 = #01/01/2018#

holiday.Item2 = "New Year's Day"

Console.WriteLine($"{holiday.Item1} is {holiday.Item2}" +

$"{If(holiday.Item3, ", a national holiday",


String.Empty)}")

' Output: 1/1/2018 12:00:00 AM Is New Year's Day, a national holiday

Criar uma instância e usar uma tupla nomeada


Em vez de usar nomes padrão para os campos de uma tupla, você pode criar uma
instância para uma tupla nomeada atribuindo seus próprios nomes aos elementos da
tupla. Os campos da tupla podem ser acessados por seus nomes atribuídos ou por seus
nomes padrão. O exemplo a seguir cria a mesma tupla de 3 como antes, exceto que ele
nomeia explicitamente o primeiro campo EventDate , o segundo Name e o terceiro
IsHoliday . Em seguida, ele exibe os valores de campo, modifica-os e exibe os valores

do campo novamente.

VB

Dim holiday = (EventDate:=#07/04/2017#, Name:="Independence Day",


IsHoliday:=True)

Console.WriteLine($"{holiday.EventDate} Is {holiday.Name}" +

$"{If(holiday.IsHoliday, ", a national holiday",


String.Empty)}")

holiday.Item1 = #01/01/2018#

holiday.Item2 = "New Year's Day"

Console.WriteLine($"{holiday.Item1} is {holiday.Item2}" +

$"{If(holiday.Item3, ", a national holiday",


String.Empty)}")

' The example displays the following output:

' 7/4/2017 12:00:00 AM Is Independence Day, a national holiday

' 1/1/2018 12:00:00 AM Is New Year's Day, a national holiday

Você também pode especificar os nomes de tupla como parte da declaração de tipo de
uma variável, campo ou parâmetro:

VB

Dim holiday As (EventDate As Date, Name As String, IsHoliday As Boolean) =

(#07/04/2017#, "Independence Day", True)

Console.WriteLine(holiday.Name)

' Output: Independence Day

ou no tipo de retorno de um método.

Isso é particularmente útil ao fornecer tuplas para um inicializador de coleção; os nomes


de tupla podem ser fornecidos como parte da declaração de tipo da coleção:

VB

Dim events As New List(Of (EventDate As Date, Name As String, IsHoliday As


Boolean)) From {

(#07/04/2017#, "Independence Day", True),

(#04/22/2017#, "Earth Day", False)

Console.WriteLine(events(1).IsHoliday)

' Output: False

Nomes de elementos de tupla inferidos


A partir do Visual Basic 15.3, o Visual Basic pode inferir os nomes dos elementos de
tupla – você não precisa atribuí-los explicitamente. Os nomes de tupla inferidos são
úteis quando você inicializa uma tupla de um conjunto de variáveis e deseja que o nome
do elemento tupla seja o mesmo que o nome da variável.

O exemplo a seguir cria uma tupla stateInfo que contém três elementos explicitamente
nomeados, state , stateName e capital . Observe que, ao nomear os elementos, a
instrução de inicialização de tupla simplesmente atribui aos elementos nomeados os
valores das variáveis nomeadas de forma idêntica.

VB

Const state As String = "MI"

Const stateName As String = "Michigan"

Const capital As String = "Lansing"

Dim stateInfo = (state:=state, stateName:=stateName, capital:=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

Como elementos e variáveis têm o mesmo nome, o compilador do Visual Basic pode
inferir os nomes dos campos, como mostra o exemplo a seguir.

VB

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

Para habilitar nomes de elementos de tupla inferidos, você deve definir a versão do
compilador do Visual Basic a ser usada no arquivo do projeto do Visual Basic (*.vbproj):

XML

<PropertyGroup>

<LangVersion>15.3</LangVersion>

</PropertyGroup>

O número de versão pode ser qualquer versão do compilador do Visual Basic


começando com 15.3. Em vez de codificar uma versão específica do compilador, você
também pode especificar "Latest" como o valor de LangVersion para compilar com a
versão mais recente do compilador do Visual Basic instalado em seu sistema.

Para obter mais informações, confira Definir da versão de linguagem do Visual Basic.

Em alguns casos, o compilador do Visual Basic não pode inferir o nome do elemento de
tupla do nome do candidato e o campo de tupla só pode ser referenciado usando seu
nome padrão, como Item1 , Item2 etc. Eles incluem:

O nome do candidato é o mesmo que o nome de um membro de tupla, como


Item3 , Rest ou ToString .

O nome do candidato é duplicado na tupla.

Quando a inferência do nome do campo falha, o Visual Basic não gera um erro do
compilador nem é uma exceção gerada no tempo de execução. Em vez disso, os
campos de tupla devem ser referenciados por seus nomes predefinidos, como Item1 e
Item2 .

Tuplas versus estruturas


Uma tupla do Visual Basic é um tipo de valor que é uma instância de um dos tipos
genéricos System.ValueTuple. Por exemplo, a tupla holiday definida no exemplo
anterior é uma instância da estrutura ValueTuple<T1,T2,T3>. Ela foi projetada para ser
um contêiner leve para dados. Como a tupla tem como objetivo facilitar a criação de um
objeto com vários itens de dados, ela não tem alguns dos recursos que uma estrutura
personalizada pode ter. Estão incluídos:

Membros personalizados. Você não pode definir suas próprias propriedades,


métodos ou eventos para uma tupla.

Validação. Não é possível validar os dados atribuídos aos campos.

Imutabilidade. As tuplas do Visual Basic são mutáveis. Por outro lado, uma
estrutura personalizada permite que você controle se uma instância é mutável ou
imutável.

Se membros personalizados, validação de propriedade e campo ou imutabilidade forem


importantes, você deverá usar a instrução Estrutura do Visual Basic para definir um tipo
de valor personalizado.

Uma tupla do Visual Basic herda os membros de seu tipo ValueTuple. Além de seus
campos, eles incluem os seguintes métodos:

Método Descrição

CompareTo Compara a tupla atual com outra tupla com o mesmo número de elementos.

É igual a Determina se a tupla atual é igual a outra tupla ou objeto.

GetHashCode Calcula o código hash para a instância atual.

ToString Retorna a representação de cadeia de caracteres dessa tupla, que usa o


formulário (Item1, Item2...) , onde Item1 e Item2 representam os valores dos
campos da tupla.

Além disso, os tipos ValueTuple implementam as interfaces IStructuralComparable e


IStructuralEquatable, que permitem definir comparadores personalizados.

Atribuição e tuplas
O Visual Basic dá suporte à atribuição entre tipos de tupla que têm o mesmo número de
campos. Os tipos de campo poderão ser convertidos se um dos seguintes for
verdadeiro:

O campo de origem e de destino é do mesmo tipo.

Uma conversão de ampliação (ou implícita) do tipo de origem para o tipo de


destino é definida.

Option Strict é On , e uma conversão de redução (ou explícita) do tipo de origem


para o tipo de destino é definida. Essa conversão poderá gerar uma exceção se o
valor de origem estiver fora do intervalo do tipo de destino.

Outras conversões não são consideradas para atribuições. Vamos examinar os tipos de
atribuições que são permitidos entre tipos de tupla.

Considere estas variáveis usadas nos exemplos a seguir:

VB

' The number and field types of all these tuples are compatible.

' The only difference Is the field names being used.

Dim unnamed = (42, "The meaning of life")

Dim anonymous = (16, "a perfect square")

Dim named = (Answer:=42, Message:="The meaning of life")


Dim differentNamed = (SecretConstant:=42, Label:="The meaning of life")

As primeiras duas variáveis, unnamed e anonymous , não têm nomes semânticos


fornecidos para os campos. Seus nomes de campo são o padrão Item1 e Item2 . As duas
últimas variáveis, named e differentName , têm nomes semânticos de campos. Observe
que essas duas tuplas têm nomes diferentes para os campos.

Todas essas quatro tuplas têm o mesmo número de campos (chamados de ‘arity’) e os
tipos desses campos são idênticos. Portanto, todas essas atribuições funcionam:

VB

' Assign named to unnamed.

named = unnamed

' Despite the assignment, named still has fields that can be referred to as
'answer' and 'message'.

Console.WriteLine($"{named.Answer}, {named.Message}")

' Output: 42, The meaning of life

' Assign unnamed to anonymous.

anonymous = unnamed

' Because of the assignment, the value of the elements of anonymous changed.

Console.WriteLine($"{anonymous.Item1}, {anonymous.Item2}")

' Output: 42, The meaning of life

' Assign one named tuple to the other.

named = differentNamed

' The field names are Not assigned. 'named' still has 'answer' and 'message'
fields.

Console.WriteLine($"{named.Answer}, {named.Message}")

' Output: 42, The meaning of life

Observe que os nomes das tuplas não são atribuídos. Os valores dos campos são
atribuídos na ordem dos campos na tupla.

Por fim, observe que podemos atribuir a tupla à named tupla conversion , mesmo que o
primeiro campo de named seja um Integer , e o primeiro campo de conversion seja um
Long . Essa atribuição é bem-sucedida porque converter um Integer em um Long é uma

conversão de expansão.

VB

' Assign an (Integer, String) tuple to a (Long, String) tuple (using


implicit conversion).

Dim conversion As (Long, String) = named

Console.WriteLine($"{conversion.Item1} ({conversion.Item1.GetType().Name}),
" +

$"{conversion.Item2} ({conversion.Item2.GetType().Name})")

' Output: 42 (Int64), The meaning of life (String)

As tuplas com diferentes números de campos não são atribuíveis:

VB

' Does not compile.

' VB30311: Value of type '(Integer, Integer, Integer)' cannot be converted

' to '(Answer As Integer, Message As String)'

var differentShape = (1, 2, 3)

named = differentShape

Tuplas como valores retornados do método


Um método pode retornar apenas um único valor. Com frequência, porém, você
gostaria que uma chamada de método retornasse vários valores. Para solucionar essa
limitação, há algumas alternativas:
Você pode criar uma classe ou estrutura personalizada cujas propriedades ou
campos representam valores retornados pelo método. Esta é uma solução pesada
e requer que você defina um tipo personalizado cuja única finalidade é recuperar
valores de uma chamada de método.

Você pode retornar um único valor do método e retornar os valores restantes


passando-os por referência ao método. Isso envolve a sobrecarga da criação de
instância para uma variável e corre o risco de substituir inadvertidamente o valor
da variável que você passa por referência.

Você pode usar uma tupla, que fornece uma solução leve para recuperar vários
valores retornados.

Por exemplo, os métodos TryParse no .NET retornam um valor Boolean que indica se a
operação de análise foi bem-sucedida. O resultado da operação de análise é retornado
em uma variável passada por referência ao método. Normalmente, uma chamada para
um método de análise, como Int32.TryParse se parece com o seguinte:

VB

Dim numericString As String = "123456"

Dim number As Integer

Dim result = Integer.TryParse(numericString, number)

Console.WriteLine($"{If(result, $"Success: {number:N0}", "Failure")}")

' Output: Success: 123,456

Podemos retornar uma tupla da operação de análise se encapsularmos a chamada para


o método Int32.TryParse em nosso próprio método. No exemplo a seguir,
NumericLibrary.ParseInteger chama o método Int32.TryParse e retorna uma tupla

nomeada com dois elementos.

VB

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

O chamador pode então chamar o método com o código semelhante ao seguinte:


VB

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

Tuplas do Visual Basic e tuplas no .NET


Framework
Uma tupla do Visual Basic é uma instância de um dos tipos genéricos
System.ValueTuple, que foram introduzidos no .NET Framework 4.7. O .NET Framework
também inclui um conjunto de classes genéricas System.Tuple. Essas classes, no
entanto, diferem das tuplas do Visual Basic e dos tipos genéricos System.ValueTuple de
várias maneiras:

Os elementos das classes Tupla são propriedades nomeadas Item1 , Item2 e assim
por diante. Nas tuplas do Visual Basic e nos tipos ValueTuple, os elementos de
tupla são campos.

Você não pode atribuir nomes significativos aos elementos de uma instância de
Tupla ou de uma instância do ValueTuple. O Visual Basic permite atribuir nomes
que comunicam o significado dos campos.

As propriedades de uma instância de Tupla são somente leitura; as tuplas são


imutáveis. Nas tuplas do Visual Basic e nos tipos ValueTuple, os campos de tupla
são leitura-gravação e as tuplas são mutáveis.

Os tipos genéricos de Tupla são tipos de referência. Usar esses tipos de Tupla
significa alocar objetos. Em caminhos de acesso, isso pode ter um impacto
mensurável no desempenho do aplicativo. Tuplas do Visual Basic e os tipos
ValueTuple são tipos de valor.

Os métodos de extensão na classe TupleExtensions facilitam a conversão entre tuplas


do Visual Basic e objetos Tuple do .NET. O método ToTuple converte uma tupla do
Visual Basic em um objeto Tupledo .NET e o método ToValueTuple converte um objeto
Tuple do .NET em uma tupla do Visual Basic.

O exemplo a seguir cria uma tupla, converte-a em um objeto Tuple do .NET e converte-
a, novamente, em uma tupla do Visual Basic. Em seguida, o exemplo compara essa tupla
com a original para garantir que elas sejam iguais.
VB

Dim cityInfo = (name:="New York", area:=468.5, population:=8_550_405)

Console.WriteLine($"{cityInfo}, type {cityInfo.GetType().Name}")

' Convert the Visual Basic tuple to a .NET tuple.

Dim cityInfoT = TupleExtensions.ToTuple(cityInfo)

Console.WriteLine($"{cityInfoT}, type {cityInfoT.GetType().Name}")

' Convert the .NET tuple back to a Visual Basic tuple and ensure they are
the same.

Dim cityInfo2 = TupleExtensions.ToValueTuple(cityInfoT)

Console.WriteLine($"{cityInfo2}, type {cityInfo2.GetType().Name}")

Console.WriteLine($"{NameOf(cityInfo)} = {NameOf(cityInfo2)}:
{cityInfo.Equals(cityInfo2)}")

' The example displays the following output:

' (New York, 468.5, 8550405), type ValueTuple`3

' (New York, 468.5, 8550405), type Tuple`3

' (New York, 468.5, 8550405), type ValueTuple`3

' cityInfo = cityInfo2 : True

Confira também
Referência da linguagem Visual Basic
Uso eficiente de tipos de dados (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Variáveis não declaradas e variáveis declaradas sem um tipo de dados recebem o


Object tipo de dados. Isso facilita a gravação de programas rapidamente, mas pode

fazer com que eles sejam executados mais lentamente.

Tipagem forte
Especificar tipos de dados para todas as variáveis é conhecido como digitação forte. O
uso de digitação forte tem várias vantagens:

Ele habilita o suporte do IntelliSense para suas variáveis. Isso permite que você
veja suas propriedades e outros membros ao digitar o código.

Ele aproveita a verificação de tipo do compilador. Isso captura instruções que


podem falhar em tempo de execução devido a erros como estouro. Ele também
captura chamadas para métodos em objetos que não dão suporte a eles.

Resulta em uma execução mais rápida do seu código.

Tipos de dados mais eficientes


Para variáveis que nunca contêm frações, os tipos de dados integrais são mais eficientes
do que os tipos nonintegral. No Visual Basic, Integer e UInteger são os tipos
numéricos mais eficientes.

Para números fracionários, Double é o tipo de dados mais eficiente, pois os


processadores nas plataformas atuais executam operações de ponto flutuante com
precisão dupla. No entanto, as operações com Double não são tão rápidas quanto com
os tipos integrais, como Integer .

Especificando os tipos de dados


Use a Instrução Dim para declarar uma variável de um tipo específico. Você pode
especificar simultaneamente seu nível de acesso usando a palavra-chave Pública,
Protegida, Amiga ou Privada, como no exemplo a seguir.
VB

Private x As Double

Protected s As String

Conversão de caracteres
As AscW funções e as ChrW funções operam no Unicode. Você deve usá-los em
preferência para Asc e Chr , o que deve se traduzir para dentro e para fora do Unicode.

Confira também
Asc
AscW
Chr
ChrW
Data Types
Tipos de Dados Numéricos
Declaração de Variável
Usando o IntelliSense
Solucionando problemas de tipos de
dados (Visual Basic)
Artigo • 28/11/2022 • 7 minutos para o fim da leitura

Esta página lista alguns problemas comuns que podem ocorrer quando você executa
operações em tipos de dados intrínsecos.

Expressões de Ponto Flutuante não são


Comparadas como Iguais
Quando você trabalha com números de ponto flutuante (Tipo de Dados Único e Tipo de
Dados Duplo), lembre-se de que eles são armazenados como frações binárias. Isso
significa que eles não podem conter uma representação exata de qualquer quantidade
que não seja uma fração binária (da forma k / (2 ^ n) em que k e n são inteiros). Por
exemplo, 0,5 (= 1/2) e 0,3125 (= 5/16) podem ser mantidos como valores precisos,
enquanto 0,2 (= 1/5) e 0,3 (= 3/10) podem ser apenas aproximações.

Devido a essa imprecisão, você não pode confiar em resultados exatos quando opera
em valores de ponto flutuante. Em particular, dois valores teoricamente iguais podem
ter representações ligeiramente diferentes.

Para comparar quantidades de ponto flutuante

1. Calcule o valor absoluto da diferença deles usando o método Abs da classe Math no
namespace System.

2. Determine uma diferença máxima aceitável, de modo que você possa considerar as duas
quantidades iguais para fins práticos se a diferença não for maior.

3. Compare o valor absoluto da diferença com a diferença aceitável.

O exemplo a seguir demonstra a comparação incorreta e correta de dois valores Double .

VB

Dim oneThird As Double = 1.0 / 3.0

Dim pointThrees As Double = 0.333333333333333

' The following comparison does not indicate equality.

Dim exactlyEqual As Boolean = (oneThird = pointThrees)

' The following comparison indicates equality.

Dim closeEnough As Double = 0.000000000000001

Dim absoluteDifference As Double = Math.Abs(oneThird - pointThrees)

Dim practicallyEqual As Boolean = (absoluteDifference < closeEnough)

MsgBox("1.0 / 3.0 is represented as " & oneThird.ToString("G17") &

vbCrLf & "0.333333333333333 is represented as " &

pointThrees.ToString("G17") &

vbCrLf & "Exact comparison generates " & CStr(exactlyEqual) &

vbCrLf & "Acceptable difference comparison generates " &

CStr(practicallyEqual))

O exemplo anterior usa o método ToString da estrutura Double para que possa
especificar uma precisão melhor do que a palavra-chave CStr usa. O padrão é 15
dígitos, mas o formato "G17" estende-o para 17 dígitos.

O Operador Mod não Retorna Resultado


Preciso
Devido à imprecisão do armazenamento de ponto flutuante, o Operador Mod pode
retornar um resultado inesperado quando pelo menos um dos operandos é um ponto
flutuante.

O Tipo de Dados Decimais não usa representação de ponto flutuante. Muitos números
que são inexatos em Single e Double são exatos em Decimal (por exemplo, 0,2 e 0,3).
Embora a aritmética seja mais lenta no Decimal do que no ponto flutuante, pode valer a
pena diminuir o desempenho para obter melhor precisão.

Para localizar o restante inteiro de quantidades de ponto flutuante

1. Declare as variáveis como Decimal .

2. Use o caractere de tipo literal D para forçar literais para Decimal , caso os valores deles sejam
muito grandes para o tipo de dados Long .

O exemplo a seguir demonstra a possível imprecisão dos operandos de ponto flutuante.

VB

Dim two As Double = 2.0

Dim zeroPointTwo As Double = 0.2

Dim quotient As Double = two / zeroPointTwo

Dim doubleRemainder As Double = two Mod zeroPointTwo

MsgBox("2.0 is represented as " & two.ToString("G17") &

vbCrLf & "0.2 is represented as " & zeroPointTwo.ToString("G17") &

vbCrLf & "2.0 / 0.2 generates " & quotient.ToString("G17") &

vbCrLf & "2.0 Mod 0.2 generates " &

doubleRemainder.ToString("G17"))

Dim decimalRemainder As Decimal = 2D Mod 0.2D

MsgBox("2.0D Mod 0.2D generates " & CStr(decimalRemainder))

O exemplo anterior usa o método ToString da estrutura Double para que possa
especificar uma precisão melhor do que a palavra-chave CStr usa. O padrão é 15
dígitos, mas o formato "G17" estende-o para 17 dígitos.

Porque zeroPointTwo é Double , o valor dele para 0,2 é uma fração binária infinitamente
repetitiva com um valor armazenado de 0,2000000000000001. Dividir 2,0 por essa
quantidade produz 9,9999999999999995 com um restante de
0,19999999999999999999999991.

Na expressão para decimalRemainder , o caractere de tipo literal D força ambos os


operandos a Decimal e 0,2 tem uma representação precisa. Portanto, o operador Mod
produz o restante esperado de 0,0.

Observe que não é suficiente declarar decimalRemainder como Decimal . Você também
precisa forçar os literais para Decimal ou eles usam Double por padrão e
decimalRemainder recebe o mesmo valor impreciso que doubleRemainder .

O Tipo Booliano não Converte em Tipo


Numérico com Precisão
Os valores de Tipo de Dados Boolianos não são armazenados como números e os
valores armazenados não devem ser equivalentes a números. Para compatibilidade com
versões anteriores, o Visual Basic fornece palavras-chave de conversão (Função CType ,
CBool , CInt e assim por diante) para converter entre Boolean e tipos numéricos. No

entanto, outras linguagens às vezes executam essas conversões de maneira diferente,


assim como os métodos .NET Framework.

Você nunca deve gravar um código que dependa de valores numéricos equivalentes
para True e False . Sempre que possível, você deve restringir o uso de variáveis Boolean
aos valores lógicos para os quais elas são projetadas. Se você precisar misturar Boolean
e valores numéricos, verifique se entendeu o método de conversão selecionado.

Conversão no Visual Basic


Quando você usa as palavras-chave de conversão CType ou CBool para converter tipos
de dados numéricos para Boolean , 0 se torna False e todos os outros valores se tornam
True . Quando você converte valores Boolean em tipos numéricos usando as palavras-

chave de conversão, False torna-se 0 e True torna-se -1.

Conversão no Framework
O método ToInt32 da classe Convert no namespace System converte True em +1.

Se você precisar converter um valor Boolean em um tipo de dados numérico, tenha


cuidado com qual método de conversão você usa.

Literal de Caractere Gera Erro do Compilador


Na ausência de caracteres de tipo, o Visual Basic pressupõe tipos de dados padrão para
literais. O tipo padrão para um literal de caractere – entre aspas ( " " ) – é String .

O tipo de dados String não é ampliado para o Tipo de Dados de Caractere. Isso
significa que, se você quiser atribuir um literal a uma variável Char , deverá fazer uma
conversão de restrição ou forçar o literal para o tipo Char .

Para criar um literal Char para atribuir a uma variável ou constante

1. Declare a variável ou a constante como Char .

2. Coloque o valor do caractere entre aspas ( " " ).

3. Siga as aspas duplas de fechamento com o caractere de tipo literal C para forçar o literal a
Char . Isso será necessário se a opção de verificação de tipo (Instrução Option Strict) for On e for
desejável em qualquer caso.

O exemplo a seguir demonstra atribuições malsucedidas e bem-sucedidas de um literal


para uma variável Char .

VB

Dim charVar As Char

' The following statement attempts to convert a String literal to Char.

' Because Option Strict is On, it generates a compiler error.

charVar = "Z"

' The following statement succeeds because it specifies a Char literal.

charVar = "Z"c

' The following statement succeeds because it converts String to Char.

charVar = CChar("Z")

Há sempre um risco em usar conversões de restrição, pois elas podem falhar em tempo
de execução. Por exemplo, uma conversão de String para Char pode falhar se o valor
String contiver mais de um caractere. Portanto, é melhor a programação usar o

caractere de tipo C .

Falha na Conversão de Cadeia de Caracteres em


Tempo de Execução
O Tipo de Dados String participa de pouquíssimas conversões de expansão. String
amplia somente para si mesmo e Object e somente Char e Char() (uma matriz Char )
ampliam para String . Isso ocorre porque variáveis e constantes String podem conter
valores que outros tipos de dados não podem conter.

Quando a opção de verificação de tipo (Instrução Option Strict) é On , o compilador não


permite todas as conversões de restrição implícitas. Isso inclui aquelas que envolvem
String . Seu código ainda pode usar palavras-chave de conversão, como CStr e Função
CType, que direcionam o .NET Framework para tentar a conversão.

7 Observação

O erro de conversão de restrição é suprimido para conversões dos elementos em


uma coleção For Each…Next para a variável de controle de loop. Para obter mais
informações e exemplos, consulte a seção "Conversões de restrição" em Para
cada... Próxima instrução.

Proteção de Conversão de Restrição


A desvantagem das conversões de restrição é que elas podem falhar em tempo de
execução. Por exemplo, se uma variável String contiver algo diferente de "True" ou
"False", ela não poderá ser convertida em Boolean . Se ela contiver caracteres de
pontuação, a conversão para qualquer tipo numérico falhará. A menos que você saiba
que sua variável String sempre contém valores que o tipo de destino pode aceitar,
você não deve tentar uma conversão.

Se você precisar converter de String para outro tipo de dados, o procedimento mais
seguro é incluir a tentativa de conversão na Instrução Try...Catch...Finally. Isso permite
que você lide com uma falha em tempo de execução.

Matrizes de Caracteres
Um único Char e uma matriz de elementos Char são ampliados para String . No
entanto, String não é ampliado para Char() . Para converter um valor String em uma
matriz Char , você pode usar o método ToCharArray da classe System.String.

Valores sem Sentido


Em geral, os valores String não são significativos em outros tipos de dados e a
conversão é altamente artificial e perigosa. Sempre que possível, você deve restringir o
uso de variáveis String para as sequências de caracteres para as quais elas são
projetadas. Você nunca deve gravar um código que dependa de valores equivalentes
em outros tipos.

Confira também
Data Types
Caracteres de tipo
Tipos de Valor e Tipos de Referência
Conversões de tipo no Visual Basic
Data Types
Funções de conversão do tipo
Uso eficiente de tipos de dados
Elementos declarados no Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um elemento declarado é um elemento de programação que está definido em uma


instrução de declaração. Elementos declarados incluem variáveis, constantes,
enumerações, classes, estruturas, módulos, interfaces, procedimentos, parâmetros de
procedimento, retornos de função, referências a procedimentos externos, operadores,
propriedades, eventos e delegados.

Instruções de declaração incluem os seguintes itens:

Instrução Dim

Instrução Const

Instrução Enum

Instrução Class

Instrução Structure

Instrução Module

Instrução Interface

Instrução Function

Instrução Sub

Instrução Declare

Instrução Operator

Instrução Property

Instrução Event

Instrução Delegate

Nesta seção
Nomes de elementos declarados

Descreve como nomear elementos e usar letras maiúsculas.


Características do Elemento Declarado

Aborda as características, como o escopo, possuídas por elementos declarados.

Referências a elementos declarados

Descreve como o compilador combina uma referência a uma declaração e como


qualificar um nome.

Seções relacionadas
Estrutura do Programa e Convenções de Código

Apresenta diretrizes para tornar mais fácil de ler, compreender e manter o seu código.

Instruções

Descreve as instruções que nomeiam e definem procedimentos, variáveis, matrizes e


constantes.

Contextos de Declaração e Níveis de Acesso Padrão

Lista os tipos de elementos declarados e mostra para cada um sua instrução de


declaração, em que contexto você pode declará-lo e seu nível de acesso padrão.
Delegados (Visual Basic)
Artigo • 07/04/2023 • 5 minutos para o fim da leitura

Os delegados são objetos que se referem aos métodos. Às vezes, eles são descritos
como ponteiros de função fortemente tipados porque eles são semelhante aos ponteiros
de função usados em outras linguagens de programação. Mas, ao contrário dos
ponteiros de função, os delegados do Visual Basic são um tipo de referência baseado na
classe System.Delegate. Os delegados podem fazer referência a ambos os métodos
compartilhados: os métodos que podem ser chamados sem uma instância específica de
uma classe e os métodos de instância.

Representantes e eventos
Os delegados são úteis em situações em que é necessário um intermediário entre um
procedimento de chamada e o procedimento sendo chamado. Por exemplo, você pode
desejar que um objeto que aciona eventos possa chamar manipuladores de eventos
diferentes em diferentes circunstâncias. Infelizmente, o objeto que aciona os eventos
não pode saber de antemão quais manipulador de eventos estarão tratando um evento
específico. O Visual Basic permite que você associe dinamicamente os manipuladores de
eventos a eventos criando um delegado para você quando você usa a instrução
AddHandler . No tempo de execução, o delegado encaminha chamadas para o
manipulador de eventos apropriado.

Embora você possa criar seus próprios delegados, na maioria dos casos Visual Basic cria
o delegado e cuida dos detalhes para você. Por exemplo, uma instrução Event define
implicitamente uma classe delegada chamada <EventName>EventHandler como uma
classe aninhada da classe que contém a instrução Event e com a mesma assinatura que
o evento. A instrução AddressOf cria implicitamente uma instância de um delegado que
se refere a um procedimento específico. As duas linhas de código a seguir são
equivalentes. Na primeira linha, você vê a criação explícita de uma instância do
EventHandler , com uma referência ao método Button1_Click enviado como o
argumento. A segunda linha é uma maneira mais conveniente de fazer a mesma coisa.

VB

AddHandler Button1.Click, New EventHandler(AddressOf Button1_Click)

' The following line of code is shorthand for the previous line.

AddHandler Button1.Click, AddressOf Me.Button1_Click

Você pode usar a forma mais simples de criar delegados em qualquer local que o
compilador possa determinar o tipo do delegado pelo contexto.

Declarando eventos que usam um tipo


delegado existente
Em algumas situações, convém declarar um evento para usar um tipo delegado
existente como seu delegado subjacente. A sintaxe a seguir demonstra como:

VB

Delegate Sub DelegateType()

Event AnEvent As DelegateType

Isso é útil quando você deseja rotear vários eventos para o mesmo manipulador.

Variáveis e parâmetros de delegado


Você pode usar delegados para outras tarefas não relacionadas a eventos, como
threading livre ou com os procedimentos que precisem chamar diferentes versões de
funções no tempo de execução.

Por exemplo, suponha que você tenha um aplicativo com anúncio classificado que inclui
uma caixa de listagem com os nomes de carros. Os anúncios são classificados por título,
que é, normalmente, a marca do carro. Um problema que você pode enfrentar ocorre
quando alguns carros incluem o ano antes do fabricante. O problema é que a
funcionalidade interna de classificação da caixa de listagem classifica somente por
códigos de caracteres. Ela coloca todos os anúncios começando com datas primeiro,
seguidos de anúncios começando com o fabricante.

Para corrigir isso, você pode criar um procedimento de classificação em uma classe que
usa a classificação alfabética padrão na maioria das caixas de listagem, mas é possível
mudar no tempo de execução para o procedimento de classificação personalizada para
anúncios de carro. Para fazer isso, você passa o procedimento de classificação
personalizada para a classe de classificação no tempo de execução usando delegados.

Expressões lambda e AddressOf


Cada classe de delegado define um construtor que é passado para a especificação de
um método do objeto. Um argumento para o construtor delegado deve ser uma
referência a um método ou uma expressão lambda.

Para especificar uma referência a um método, use a seguinte sintaxe:

AddressOf [ expression .] methodName

O tipo de tempo de compilação do expression deve ser o nome de uma classe ou uma
interface que contém um método do nome especificado cuja assinatura coincide com a
assinatura da classe delegada. O methodName pode ser um método compartilhado ou um
método de instância. O methodName não é opcional, mesmo se você criar um delegado
para o método padrão da classe.

Para especificar uma expressão lambda, use a seguinte sintaxe:

Function ([ parm As type , parm2 As type2 , ...]) expression

O exemplo a seguir mostra as expressões lambda e AddressOf usadas para especificar a


referência para um delegado.

VB

Module Module1

Sub Main()

' Create an instance of InOrderClass and assign values to the


properties.

' InOrderClass method ShowInOrder displays the numbers in ascending

' or descending order, depending on the comparison method you


specify.

Dim inOrder As New InOrderClass

inOrder.Num1 = 5

inOrder.Num2 = 4

' Use AddressOf to send a reference to the comparison function you


want

' to use.

inOrder.ShowInOrder(AddressOf GreaterThan)

inOrder.ShowInOrder(AddressOf LessThan)

' Use lambda expressions to do the same thing.

inOrder.ShowInOrder(Function(m, n) m > n)

inOrder.ShowInOrder(Function(m, n) m < n)

End Sub

Function GreaterThan(ByVal num1 As Integer, ByVal num2 As Integer) As


Boolean

Return num1 > num2

End Function

Function LessThan(ByVal num1 As Integer, ByVal num2 As Integer) As


Boolean

Return num1 < num2

End Function

Class InOrderClass

' Define the delegate function for the comparisons.

Delegate Function CompareNumbers(ByVal num1 As Integer, ByVal num2


As Integer) As Boolean

' Display properties in ascending or descending order.

Sub ShowInOrder(ByVal compare As CompareNumbers)


If compare(_num1, _num2) Then

Console.WriteLine(_num1 & " " & _num2)

Else

Console.WriteLine(_num2 & " " & _num1)

End If

End Sub

Private _num1 As Integer

Property Num1() As Integer

Get

Return _num1

End Get

Set(ByVal value As Integer)

_num1 = value

End Set

End Property

Private _num2 As Integer

Property Num2() As Integer

Get

Return _num2

End Get

Set(ByVal value As Integer)

_num2 = value

End Set

End Property

End Class

End Module

A assinatura da função deve corresponder a do tipo delegado. Para obter mais


informações sobre expressões lambda, consulte Expressões lambda. Para obter mais
exemplos de expressão lambda e atribuições AddressOf aos delegados, consulte
Conversão de delegado amena.

Tópicos Relacionados
Título Descrição
Título Descrição

Como invocar um método Fornece um exemplo que mostra como associar um método a
delegado um delegado e depois invoca esse método por meio do
delegado.

Como passar procedimentos Demonstra como usar delegados para passar um


para outro procedimento no procedimento para outro.
Visual Basic

Conversão de delegado Descreve como você pode atribuir assinaturas e funções a


reduzida delegados ou manipuladores mesmo quando as assinaturas
não são idênticas

Eventos Fornece uma visão geral dos eventos no Visual Basic.


Associação antecipada e tardia (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O compilador do Visual Basic executa um processo chamado binding quando um


objeto é atribuído a uma variável de objeto. Um objeto é associado inicialmente quando
ele é atribuído a uma variável declarada como de um tipo de objeto específico. Os
objetos de associação inicial permitem que o compilador aloque memória e execute
outras otimizações antes que um aplicativo seja executado. Por exemplo, o seguinte
fragmento de código declara que uma variável é do tipo FileStream:

VB

' Create a variable to hold a new object.

Dim FS As System.IO.FileStream

' Assign a new object to the variable.

FS = New System.IO.FileStream("C:\tmp.txt",

System.IO.FileMode.Open)

Uma vez que FileStream é um tipo de objeto específico, a instância atribuída a FS é


associada no início.

Por outro lado, um objeto associado tardiamente quando ele é atribuído a uma variável
declarada para ser do tipo Object . Objetos desse tipo podem conter referências a
qualquer objeto, mas têm muitas das vantagens de objetos de associação inicial. Por
exemplo, o fragmento de código a seguir declara uma variável de objeto para conter
um objeto retornado pela função CreateObject :

VB

' To use this example, you must have Microsoft Excel installed on your
computer.

' Compile with Option Strict Off to allow late binding.

Sub TestLateBinding()

Dim xlApp As Object

Dim xlBook As Object

Dim xlSheet As Object

xlApp = CreateObject("Excel.Application")

' Late bind an instance of an Excel workbook.

xlBook = xlApp.Workbooks.Add

' Late bind an instance of an Excel worksheet.

xlSheet = xlBook.Worksheets(1)

xlSheet.Activate()

' Show the application.

xlSheet.Application.Visible = True

' Place some text in the second row of the sheet.

xlSheet.Cells(2, 2) = "This is column B row 2"

End Sub

Vantagens da associação inicial


Você deve usar objetos associação inicial sempre que possível, pois eles permitem que o
compilador faça otimizações importantes que resultam em aplicativos mais eficientes.
Os objetos de associação inicial são significativamente mais rápidos do que objetos de
associação tardia e tornam seu código mais fácil de ler e manter informando
exatamente quais tipos de objetos estão sendo usados. Outra vantagem da associação
antecipada é que ela permite que recursos úteis, como a conclusão de código
automática e a Ajuda Dinâmica, pois o IDE (ambiente de desenvolvimento integrado) do
Visual Studio pode determinar exatamente com qual tipo de objeto você está
trabalhando conforme você edita o código. A associação inicial reduz o número e a
gravidade dos erros em tempo de execução porque ela permite que o compilador relate
erros quando um programa é compilado.

7 Observação

A associação tardia só pode ser usada para acessar membros de tipo que são
declarados como Public . Acessando membros declarados como Friend ou
Protected Friend resulta em um erro em tempo de execução.

Confira também
CreateObject
Tempo de vida do objeto: como os objetos são criados e destruídos
Tipo de dados Object
Tipos de erro (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

No Visual Basic, os erros se enquadram em uma das três categorias: erros de sintaxe,
erros de tempo de execução e erros lógicos.

Erros de sintaxe
Erros de sintaxe são aqueles que aparecem enquanto você escreve código. Se você
estiver usando o Visual Studio, o Visual Basic verificará seu código ao digitá-lo na janela
do Editor de Código e alertará se você cometer um erro, como digitar incorretamente
uma palavra ou usar um elemento de linguagem incorretamente. Se você compilar na
linha de comando, o Visual Basic exibirá um erro do compilador com informações sobre
o erro de sintaxe. Erros de sintaxe são o tipo mais comum de erros. Você pode corrigi-
los facilmente no ambiente de codificação assim que eles ocorrem.

7 Observação

A Option Explicit instrução é um meio de evitar erros de sintaxe. Isso força você a
declarar, com antecedência, todas as variáveis a serem usadas no aplicativo.
Portanto, quando essas variáveis são usadas no código, todos os erros tipográficos
são pegos imediatamente e podem ser corrigidos.

Erros em tempo de execução


Erros em tempo de execução são aqueles que aparecem somente depois que você
compila e executa o código. Isso envolve código que pode parecer correto, pois não
tem erros de sintaxe, mas que não serão executados. Por exemplo, você pode escrever
corretamente uma linha de código para abrir um arquivo. No entanto, se o arquivo não
existir, o aplicativo não poderá abrir o arquivo e gerará uma exceção. Você pode corrigir
a maioria dos erros em tempo de execução reescrevendo o código com falha ou usando
o tratamento de exceção e recompilando-o e executando-o novamente.

Erros de lógica
Erros lógicos são aqueles que aparecem quando o aplicativo está em uso. Geralmente,
são suposições defeituosas feitas pelo desenvolvedor ou resultados indesejados ou
inesperados em resposta às ações do usuário. Por exemplo, uma chave mal tipada pode
fornecer informações incorretas a um método ou você pode assumir que um valor
válido sempre é fornecido a um método quando esse não é o caso. Embora os erros
lógicos possam ser tratados usando o tratamento de exceções (por exemplo, testando
se um argumento é Nothing e lançando um ArgumentNullException), geralmente eles
devem ser resolvidos corrigindo o erro na lógica e recompilando o aplicativo.

Confira também
Instrução Try...Catch...Finally
Noções básicas do depurador
Eventos (Visual Basic)
Artigo • 22/02/2023 • 7 minutos para o fim da leitura

Enquanto você visualiza um projeto Visual Studio como uma série de procedimentos
que executam em uma sequência, na realidade, a maioria dos programas é orientada a
eventos, o que significa que o fluxo de execução é determinado pelas ocorrências
externas chamadas eventos.

Um evento é um sinal que informa a um aplicativo que algo importante ocorreu. Por
exemplo, quando um usuário clica em um controle em um formulário, o formulário
pode lançar um evento Click e chamar um procedimento que manipula o evento. Os
eventos também permitem que tarefas separadas se comuniquem. Por exemplo,
digamos que seu aplicativo executa uma tarefa de classificação separadamente do
aplicativo principal. Se um usuário cancelar a classificação, seu aplicativo poderá enviar
um evento de cancelamento instruindo o processo de classificação para parar.

Conceitos e termos de evento


Esta seção descreve os termos e os conceitos usados com eventos em Visual Basic.

Declarando eventos
Você declara eventos dentro de classes, estruturas, módulos e interfaces usando a
palavra-chave Event , como no exemplo a seguir:

VB

Event AnEvent(ByVal EventNumber As Integer)

Acionar eventos
Um evento é como uma mensagem anunciando que algo importante ocorreu. O ato de
transmitir a mensagem é chamado para acionar o evento. Em Visual Basic, você aciona
eventos com a instrução RaiseEvent , como no exemplo a seguir:

VB

RaiseEvent AnEvent(EventNumber)

Os eventos devem ser acionados dentro do escopo da classe, módulo ou estrutura na


qual eles são declarados. Por exemplo, uma classe derivada não pode acionar eventos
herdados de uma classe base.

Remetentes do evento
Qualquer objeto capaz de acionar um evento é um remetente do evento, também
conhecido como uma origem do evento. Formulários, controles e objetos definidos pelo
usuário são exemplos de remetentes de eventos.

Manipuladores de eventos
Manipuladores de eventos são procedimentos que são chamados quando ocorre um
evento correspondente. Você pode usar qualquer sub-rotina válida com uma assinatura
correspondente como um manipulador de eventos. Você não pode usar uma função
como um manipulador de eventos, porque ela não retorna um valor para a origem do
evento.

Visual Basic usa uma convenção de nomenclatura padrão para manipuladores de


eventos que combina o nome do remetente do evento, um sublinhado e o nome do
evento. Por exemplo, o evento Click de um botão chamado button1 seria nomeado
Sub button1_Click .

7 Observação

É recomendável que você use esta convenção de nomenclatura ao definir


manipuladores de eventos para seus próprios eventos, mas não é necessário. Você
pode usar qualquer nome de sub-rotina válido.

Associar eventos a manipuladores de eventos


Antes de um manipulador de eventos se tornar útil, você deve primeiro associá-lo a um
evento usando a instrução Handles ou AddHandler .

WithEvents e a cláusula Handles


A instrução WithEvents e a cláusula Handles fornecem uma maneira declarativa de
especificar os manipuladores de eventos. Um evento gerado por um objeto declarado
com a palavra-chave WithEvents pode ser tratado por qualquer procedimento com uma
instrução Handles para esse evento, conforme mostrado no exemplo a seguir:

VB

' Declare a WithEvents variable.

Dim WithEvents EClass As New EventClass

' Call the method that raises the object's events.

Sub TestEvents()

EClass.RaiseEvents()

End Sub

' Declare an event handler that handles multiple events.

Sub EClass_EventHandler() Handles EClass.XEvent, EClass.YEvent

MsgBox("Received Event.")

End Sub

Class EventClass

Public Event XEvent()

Public Event YEvent()

' RaiseEvents raises both events.

Sub RaiseEvents()

RaiseEvent XEvent()

RaiseEvent YEvent()

End Sub

End Class

A instrução WithEvents e a cláusula Handles geralmente são a melhor opção para


manipuladores de eventos, pois a sintaxe declarativa usada torna mais fácil a
codificação, a leitura e a depuração para a manipulação de eventos. No entanto, esteja
ciente das seguintes limitações no uso de variáveis WithEvents :

Não é possível usar uma variável WithEvents como uma variável de objeto. Ou
seja, você não pode declará-la como Object — você deve especificar o nome da
classe quando declarar a variável.

Como os eventos compartilhados não são ligados às instâncias de classe, você não
pode usar WithEvents para manipular eventos compartilhados declarativamente.
Da mesma forma, você não pode usar WithEvents ou Handles para manipular
eventos de um Structure . Em ambos os casos, você pode usar a instrução
AddHandler para manipular esses eventos.

Não é possível criar matrizes de variáveis WithEvents .

As variáveis WithEvents permitem que um único manipulador de eventos manipule um


ou mais tipos de evento, ou que um ou mais manipuladores de eventos manipulem o
mesmo tipo de evento.

Embora a cláusula Handles seja a maneira padrão de associar um evento a um


manipulador de eventos, ela é limitada a associar eventos a manipuladores de eventos
em tempo de compilação.

Em alguns casos, como com os eventos associados a formulários ou controles, Visual


Basic automaticamente extingue um manipulador de eventos vazio e o associa a um
evento. Por exemplo, quando você clica duas vezes em um formulário no modo de
design, Visual Basic cria um manipulador de eventos vazio e uma variável WithEvents
para o botão de comando, como no seguinte código:

VB

Friend WithEvents Button1 As System.Windows.Forms.Button


Protected Sub Button1_Click() Handles Button1.Click

End Sub

AddHandler e RemoveHandler
A instrução AddHandler é semelhante à cláusula Handles , pois ambas permitem que
você especifique um manipulador de eventos. No entanto, AddHandler , usado com
RemoveHandler , fornece maior flexibilidade do que a cláusula Handles , permitindo que

você adicione, remova e altere dinamicamente o manipulador de eventos associado a


um evento. Se quiser manipular eventos compartilhados ou eventos de uma estrutura,
você deverá usar AddHandler .

AddHandler leva dois argumentos: o nome de um evento de um remetente do evento,


como um controle, e uma expressão que avalia um delegado. Você não precisa
especificar explicitamente a classe delegado ao usar AddHandler , pois a instrução
AddressOf sempre retorna uma referência ao delegado. O exemplo a seguir associa um
manipulador de eventos a um evento acionado por um objeto:

VB

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

RemoveHandler , que desconecta um evento de um manipulador de eventos, usa a


mesma sintaxe que AddHandler . Por exemplo:

VB
RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

No exemplo a seguir, um manipulador de eventos é associado a um evento e o evento é


acionado. O manipulador de evento captura o evento e exibe uma mensagem.

Em seguida, o primeiro manipulador de eventos é removido e um manipulador de


eventos diferente é associado ao evento. Quando o evento for acionado novamente,
será exibida uma mensagem diferente.

Por fim, o segundo manipulador de eventos é removido e o evento é acionado pela


terceira vez. Como não há um manipulador de eventos associado ao evento, nenhuma
ação será tomada.

VB

Module Module1

Sub Main()

Dim c1 As New Class1

' Associate an event handler with an event.

AddHandler c1.AnEvent, AddressOf EventHandler1

' Call a method to raise the event.

c1.CauseTheEvent()

' Stop handling the event.

RemoveHandler c1.AnEvent, AddressOf EventHandler1

' Now associate a different event handler with the event.

AddHandler c1.AnEvent, AddressOf EventHandler2

' Call a method to raise the event.

c1.CauseTheEvent()

' Stop handling the event.

RemoveHandler c1.AnEvent, AddressOf EventHandler2

' This event will not be handled.

c1.CauseTheEvent()

End Sub

Sub EventHandler1()

' Handle the event.

MsgBox("EventHandler1 caught event.")

End Sub

Sub EventHandler2()

' Handle the event.

MsgBox("EventHandler2 caught event.")

End Sub

Public Class Class1


' Declare an event.

Public Event AnEvent()

Sub CauseTheEvent()

' Raise an event.

RaiseEvent AnEvent()

End Sub

End Class

End Module

Manipulação de eventos herdados de uma


classe base
Classes derivadas — classes que herdam características de uma classe base e que
podem manipular eventos acionados por suas classes base usando a instrução Handles
MyBase .

Como manipular eventos de uma classe base


Declare um manipulador de eventos na classe derivada adicionando uma instrução
Handles MyBase. eventname à linha da declaração de seu procedimento do

manipulador de eventos, no qual eventname é o nome do evento na classe base


manipulada. Por exemplo:

VB

Public Class BaseClass

Public Event BaseEvent(ByVal i As Integer)

' Place methods and properties here.

End Class

Public Class DerivedClass

Inherits BaseClass

Sub EventHandler(ByVal x As Integer) Handles MyBase.BaseEvent

' Place code to handle events from BaseClass here.

End Sub

End Class

Seções relacionadas
Título Descrição

Instruções passo a passo: Fornece uma descrição passo a passo de como declarar e
declarando e acionando eventos acionar eventos para uma classe.

Instruções passo a passo: tratando Demonstra como escrever um procedimento de


eventos manipulador de eventos.
Título Descrição

Como declarar eventos Demonstra como definir um evento personalizado que


personalizados para evitar permite que seus manipuladores de eventos sejam
bloqueio chamados assincronicamente.

Como declarar eventos Demonstra como definir um evento personalizado que


personalizados para conservar utiliza memória somente quando o evento é manipulado.
memória

Solucionando problemas de Lista problemas comuns que ocorrem com os


manipuladores de eventos manipuladores de eventos em componentes herdados.
herdados no Visual Basic

Eventos Apresenta uma visão geral do modelo de evento no .NET


Framework.

Criando manipuladores de eventos Descreve como trabalhar com eventos associados aos
no Windows Forms objetos do Windows Forms.

Representantes Fornece uma visão geral de delegados no Visual Basic.


Interfaces (Visual Basic)
Artigo • 22/02/2023 • 5 minutos para o fim da leitura

As interfaces definem as propriedades, os métodos e os eventos que as classes podem


implementar. As interfaces permitem definir as funcionalidades como pequenos grupos
de propriedades, de métodos e de eventos estreitamente relacionados. Isso reduz os
problemas de compatibilidade, uma vez que é possível desenvolver implementações
avançadas para as interfaces sem arriscar o código existente. Você pode adicionar novas
funcionalidades a qualquer momento desenvolvendo interfaces e implementações
adicionais.

Há vários outros motivos pelos quais você possa querer usar interfaces em vez da
herança de classe:

As interfaces são mais adequadas para situações em que os aplicativos exigem


muitos tipos de objeto possivelmente não relacionados para fornecer
determinadas funcionalidades.

As interfaces são mais flexíveis que as classes base, uma vez que é possível definir
uma única implementação que pode implementar várias interfaces.

As interfaces são mais adequadas em situações em que você não precisa herdar a
implementação de uma classe base.

As interfaces são úteis quando você não pode usar herança de classe. Por exemplo,
as estruturas não podem herdar de classes, mas podem implementar interfaces.

Declarando interfaces
As definições de interface são colocadas entre as instruções Interface e End Interface .
Após a instrução Interface , você pode adicionar uma instrução Inherits opcional que
lista uma ou mais interfaces herdadas. As instruções Inherits devem preceder todas as
outras instruções nos comentários de exceção de declaração. As instruções restantes na
definição da interface devem ser as instruções Event , Sub , Function , Property ,
Interface , Class , Structure e Enum . As interfaces não podem conter código de
implementação nem instruções associadas ao código de implementação, como End Sub
ou End Property .

Em um namespace, as instruções de interface são Friend por padrão, mas também


podem ser declaradas explicitamente como Public ou Friend . As interfaces definidas
em classes, em módulos, em interfaces e em estruturas são Public por padrão, mas
também podem ser explicitamente declaradas como Public , Friend , Protected ou
Private .

7 Observação

A palavra-chave Shadows pode ser aplicada a todos os membros de interface. A


palavra-chave Overloads pode ser aplicada às instruções Sub , Function e Property
declaradas em uma definição de interface. Além disso, as instruções Property
podem ter os modificadores Default , ReadOnly ou WriteOnly . Nenhum dos outros
modificadores ( Public , Private , Friend , Protected , Shared , Overrides ,
MustOverride ou Overridable ) são permitidos. Para obter mais informações,
consulte Contextos de declaração e níveis de acesso padrão.

Por exemplo, o código a seguir define uma interface com uma função, uma propriedade
e um evento.

VB

Interface IAsset

Event ComittedChange(ByVal Success As Boolean)

Property Division() As String

Function GetID() As Integer

End Interface

Implementando interfaces
A palavra reservada Implements de Visual Basic é usada de dois modos. A instrução
Implements significa que uma classe ou estrutura implementa uma interface. A palavra-

chave Implements significa que um membro de classe ou um membro da estrutura


implementa um membro de interface específico.

Instrução Implements
Se uma classe ou estrutura implementa uma ou mais interfaces, ela deve incluir a
instrução Implements imediatamente após a instrução Class ou Structure . A instrução
Implements exige uma lista de interfaces separadas por vírgula a serem implementadas

por uma classe. A classe ou a estrutura deve implementar todos os membros da


interface usando a palavra-chave Implements .
Palavra-chave Implements
A palavra-chave Implements exige uma lista dos membros de interface separados por
vírgula a serem implementados. Em geral, apenas um único membro de interface é
especificado, mas você pode especificar vários membros. A especificação de um
membro de interface é composta pelo nome da interface, que deve ser especificado em
uma instrução implements na classe, um período e o nome da função, da propriedade
ou do evento do membro a ser implementado. O nome de um membro que
implementa um membro de interface pode usar qualquer identificador válido e não está
limitado à convenção InterfaceName_MethodName usada em versões anteriores do Visual
Basic.

Por exemplo, o código a seguir mostra como declarar uma sub-rotina chamada Sub1
que implementa um método de uma interface:

VB

Class Class1

Implements interfaceclass.interface2

Sub Sub1(ByVal i As Integer) Implements interfaceclass.interface2.Sub1

End Sub

End Class

Os tipos de parâmetro e de retorno do membro implementado devem corresponder à


propriedade da interface ou à declaração do membro na interface. A maneira mais
comum de implementar um elemento de uma interface é com um membro que tem o
mesmo nome que a interface, conforme mostrado no exemplo anterior.

Para declarar a implementação de um método de interface, você pode usar os atributos


válidos em declarações de método de instância, incluindo Overloads , Overrides ,
Overridable , Public , Private , Protected , Friend , Protected Friend , MustOverride ,
Default e Static . O atributo Shared não é válido, uma vez que define uma classe em

vez de um método de instância.

Ao usar Implements , você também pode escrever um único método que implementa
vários métodos definidos em uma interface, como no exemplo a seguir:

VB

Class Class2

Implements I1, I2

Protected Sub M1() Implements I1.M1, I1.M2, I2.M3, I2.M4

End Sub

End Class

Você pode usar um membro particular para implementar um membro de interface.


Quando um membro particular implementa um membro de uma interface, esse
membro fica disponível por meio da interface, embora não esteja disponível
diretamente em variáveis de objeto para a classe.

Exemplos de implementação de interface


As classes que implementam uma interface devem implementar todas as suas
propriedades, métodos e eventos.

O exemplo a seguir define duas interfaces. A segunda interface, Interface2 , herda


Interface1 e define uma propriedade e um método adicionais.

VB

Interface Interface1

Sub sub1(ByVal i As Integer)

End Interface

' Demonstrates interface inheritance.

Interface Interface2

Inherits Interface1

Sub M1(ByVal y As Integer)

ReadOnly Property Num() As Integer

End Interface

O exemplo a seguir implementa Interface1 , a interface definida no exemplo anterior:

VB

Public Class ImplementationClass1

Implements Interface1

Sub Sub1(ByVal i As Integer) Implements Interface1.sub1

' Insert code here to implement this method.

End Sub

End Class

O exemplo final implementa Interface2 , incluindo um método herdado de Interface1 :

VB

Public Class ImplementationClass2

Implements Interface2

Dim INum As Integer = 0

Sub sub1(ByVal i As Integer) Implements Interface2.sub1

' Insert code here that implements this method.

End Sub

Sub M1(ByVal x As Integer) Implements Interface2.M1

' Insert code here to implement this method.

End Sub

ReadOnly Property Num() As Integer Implements Interface2.Num

Get

Num = INum

End Get

End Property

End Class

Você pode implementar uma propriedade readonly com uma propriedade readwrite (ou
seja, você não precisa declará-la como readonly na classe sendo implementada).
Implementar uma interface significa implementar pelo menos os membros que a
interface declara, mas você pode oferecer mais funcionalidades, como permitir que a
propriedade seja gravável.

Tópicos Relacionados
Título Descrição

Passo a passo: Criação e Fornece um procedimento detalhado que o guiará pelo processo de
implementação de definição e de implementação de sua própria interface.
interfaces

Variação em interfaces Discute a covariância e a contravariância em interfaces genéricas e


genéricas fornece uma lista de interfaces genéricas variáveis no .NET
Framework.
Instruções passo a passo: criando e
implementando interfaces (Visual Basic)
Artigo • 07/04/2023 • 4 minutos para o fim da leitura

As interfaces descrevem as características de propriedades, métodos e eventos, mas


deixam os detalhes da implementação com estruturas ou classes.

Este passo a passo demonstra como declarar e implementar uma interface.

7 Observação

Este passo a passo não fornece informações sobre como criar uma interface do
usuário.

7 Observação

Seu computador pode mostrar diferentes nomes ou locais para alguns dos
elementos de interface do usuário do Visual Studio nas instruções a seguir. A
edição do Visual Studio que você possui e as configurações que você usa
determinam esses elementos. Para obter mais informações, consulte
Personalizando o IDE.

Para definir uma interface


1. Abra um novo projeto de aplicativo do Windows Visual Basic.

2. Adicione um novo módulo ao projeto clicando em Adicionar Módulo no menu


Projeto.

3. Dê um nome ao novo módulo Module1.vb e clique em Adicionar. O código do


novo módulo é exibido.

4. Defina uma interface nomeada TestInterface dentro de Module1 digitando


Interface TestInterface entre as instruções Module e End Module e, em seguida,

pressione ENTER. O Editor de Código recuou a palavra-chave Interface e


adiciona uma instrução End Interface para formar um bloco de código.

5. Defina uma propriedade, um método e um evento para a interface colocando o


seguinte código entre as instruções Interface e End Interface :
VB

Property Prop1() As Integer

Sub Method1(ByVal X As Integer)

Event Event1()

Implementação
Você pode observar que a sintaxe usada para declarar membros da interface é diferente
da sintaxe usada para declarar membros da classe. Essa diferença reflete o fato de que
as interfaces não podem conter código de implementação.

Para implementar a interface


1. Adicione uma classe nomeada ImplementationClass adicionando a seguinte
instrução a Module1 , após a instrução End Interface , mas antes da instrução End
Module e, em seguida, pressionando ENTER:

VB

Class ImplementationClass

Se você estiver trabalhando no ambiente de desenvolvimento integrado, o Editor


de Código fornecerá uma instrução End Class correspondente quando você
pressionar ENTER.

2. Adicione a seguinte instrução Implements a ImplementationClass , que nomeia a


interface que a classe implementa:

VB

Implements TestInterface

Quando listada separadamente de outros itens na parte superior de uma classe ou


estrutura, a instrução Implements indica que a classe ou estrutura implementa uma
interface.

Se você estiver trabalhando no ambiente de desenvolvimento integrado, o Editor


de Código implementará os membros de classe exigidos por TestInterface
quando você pressionar ENTER e poderá ignorar a próxima etapa.
3. Se você não estiver trabalhando no ambiente de desenvolvimento integrado,
deverá implementar todos os membros da interface MyInterface . Adicione o
seguinte código para ImplementationClass para implementar Event1 , Method1 e
Prop1 :

VB

Event Event1() Implements TestInterface.Event1

Public Sub Method1(ByVal X As Integer) Implements TestInterface.Method1

End Sub

Public Property Prop1() As Integer Implements TestInterface.Prop1

Get

End Get

Set(ByVal value As Integer)

End Set

End Property

A instrução Implements nomeia a interface e o membro da interface que está


sendo implementado.

4. Conclua a definição de Prop1 adicionando um campo privado à classe que


armazenava o valor da propriedade:

VB

' Holds the value of the property.

Private pval As Integer

Retorne o valor de pval do acessador get da propriedade.

VB

Return pval

Defina o valor de pval do acessador do conjunto de propriedades.

VB

pval = value

5. Conclua a definição de Method1 adicionando o código a seguir.

VB
MsgBox("The X parameter for Method1 is " & X)

RaiseEvent Event1()

Para testar a implementação da interface


1. Clique com o botão direito do mouse no formulário de inicialização do projeto no
Gerenciador de Soluções e clique em Exibir Código. O editor exibe a classe do
formulário de inicialização. Por padrão, o formulário de inicialização é chamado de
Form1 .

2. Adicione o seguinte campo testInstance à classe Form1 :

VB

Dim WithEvents testInstance As TestInterface

Ao declarar testInstance como WithEvents , a classe Form1 pode lidar com os


eventos dele.

3. Adicione o seguinte manipulador de eventos à classe Form1 para lidar com


eventos gerados por testInstance :

VB

Sub EventHandler() Handles testInstance.Event1

MsgBox("The event handler caught the event.")

End Sub

4. Adicione uma sub-rotina nomeada Test à classe Form1 para testar a classe de
implementação:

VB

Sub Test()

' Create an instance of the class.

Dim T As New ImplementationClass

' Assign the class instance to the interface.

' Calls to the interface members are

' executed through the class instance.

testInstance = T

' Set a property.

testInstance.Prop1 = 9

' Read the property.

MsgBox("Prop1 was set to " & testInstance.Prop1)

' Test the method and raise an event.

testInstance.Method1(5)

End Sub

O procedimento Test cria uma instância da classe que implementa MyInterface ,


atribui essa instância ao campo testInstance , define uma propriedade e executa
um método por meio da interface.

5. Adicione código para chamar o procedimento Test do procedimento Form1 Load


do formulário de inicialização:

VB

Private Sub Form1_Load(ByVal sender As System.Object,

ByVal e As System.EventArgs) Handles MyBase.Load

Test() ' Test the class.

End Sub

6. Execute o procedimento Test pressionando F5. A mensagem "Prop1 foi definida


como 9" é exibida. Depois de clicar em OK, a mensagem "O parâmetro X para
Method1 é 5" será exibida. Clique em OK e a mensagem "O manipulador de
eventos capturou o evento" é exibida.

Confira também
Instrução Implements
Interfaces
Instrução Interface
Instrução Event
LINQ no Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Esta seção contém exemplos, visões gerais e informações que ajudarão você a
compreender e usar o Visual Basic e LINQ (consulta integrada à linguagem).

Nesta seção
Introdução a LINQ no Visual Basic

Fornece uma introdução aos provedores, operadores, estrutura de consulta e recursos


de linguagem LINQ.

Como consultar um banco de dados

Fornece um exemplo de como se conectar a um banco de dados do SQL Server e


executar uma consulta usando LINQ.

Como chamar um procedimento armazenado

Fornece um exemplo de como se conectar a um banco de dados do SQL Server e


executar um procedimento armazenado usando LINQ.

Como modificar dados em um banco de dados

Fornece um exemplo de como se conectar a um banco de dados do SQL Server e


recuperar e modificar dados usando o LINQ.

Como combinar dados com junções

Fornece exemplos de como associar dados de maneira semelhante a junções de banco


de dados usando LINQ.

Como classificar resultados de consulta

Fornece um exemplo de como ordenar os resultados de uma consulta usando LINQ.

Como filtrar resultados de consulta

Fornece um exemplo de como incluir critérios de pesquisa em uma consulta usando


LINQ.

Como contar, somar ou fazer média de dados

Fornece exemplos de como incluir funções agregadas para contar, somar ou fazer
média de dados retornadas de uma consulta usando LINQ.

Como localizar o valor mínimo ou máximo em um resultado de consulta

Fornece exemplos de como incluir funções agregadas para determinar os valores


mínimo e máximo dos dados retornados de uma consulta usando LINQ.
Como retornar um resultado de consulta LINQ como um tipo específico

Fornece um exemplo de como retornar os resultados de uma consulta LINQ como um


tipo específico em vez de um tipo anônimo.

Confira também
LINQ (Consulta Integrada à Linguagem)
Visão geral de LINQ to XML no Visual Basic
LINQ para visão geral do DataSet
LINQ to SQL
Objetos e classes no Visual Basic
Artigo • 15/02/2023 • 12 minutos para o fim da leitura

Um objeto é uma combinação de código e dados que podem ser tratados como uma
unidade. Um objeto pode ser uma parte de um aplicativo, como um controle ou um
formulário. Todo o aplicativo também pode ser um objeto.

Ao criar um aplicativo em Visual Basic, você constantemente trabalha com objetos. Você
pode usar os objetos fornecidos pelo Visual Basic, como controles, formulários e objetos
de acesso a dados. Você também pode usar objetos de outros aplicativos em seu
aplicativo Visual Basic. Você pode até mesmo criar seus próprios objetos e definir
propriedades e métodos adicionais para eles. Os objetos atuam como blocos de
construção pré-fabricados para programas. Eles permitem que você escreva um trecho
de código uma vez e reutilize repetidamente.

Este tópico discute os objetos em detalhes.

Objetos e classes
Cada objeto no Visual Basic é definido por uma classe. Uma classe descreve as variáveis,
as propriedades, os procedimentos e os eventos de um objeto. Os objetos são
instâncias de classes. Você pode criar a quantidade de objetos que precisar após ter
definido uma classe.

Para entender a relação entre um objeto e sua classe, pense em cookies e cortadores de
cookie. O cortador de cookie é a classe. Ele define as características de cada cookie, por
exemplo, tamanho e forma. A classe é usada para criar objetos. Os objetos são os
cookies.

Você deve criar um objeto antes de poder acessar seus membros, exceto para Shared
membros que podem ser acessados sem um objeto da classe.

Criar um objeto com base em uma classe


1. Determine de qual classe você deseja criar um objeto ou defina sua própria classe.
Por exemplo:

VB

Public Class Customer

Public Property AccountNumber As Integer

End Class

2. Escreva uma instrução Dim para criar uma variável a qual você pode atribuir uma
instância da classe. A variável deve ser do tipo da classe desejada.

VB

Dim nextCustomer As Customer

3. Adicione a palavra-chave novo operador para inicializar a variável a uma nova


instância da classe.

VB

Dim nextCustomer As New Customer

4. Agora você pode acessar os membros da classe pela variável de objeto.

VB

nextCustomer.AccountNumber = lastAccountNumber + 1

7 Observação

Sempre que possível, você deve declarar a variável para ser do tipo de classe que
você pretende atribuir a ela. Isso é chamado de associação inicial. Se não souber o
tipo de classe no tempo de compilação, você poderá invocar a associação tardia,
declarando a variável como o Tipo de Dados do Objeto. Entretanto, a associação
tardia pode tornar o desempenho mais lento e limitar o acesso a membros do
objeto do tempo de execução. Para obter mais informações, consulte Declaração
de variável de objeto.

Várias instâncias
Objetos recentemente criados de uma classe geralmente são idênticos entre si. Assim
que existem como objetos individuais, no entanto, suas propriedades e variáveis podem
ser alteradas independentemente de outras instâncias. Por exemplo, se você adicionar
três caixas de seleção a um formulário, cada objeto da caixa de seleção será uma
instância da classe CheckBox. Os objetos CheckBox individuais compartilham um
conjunto comum de características e recursos (propriedades, variáveis, procedimentos e
eventos) definidos pela classe. No entanto, cada um tem seu próprio nome, pode ser
separadamente habilitado e desabilitado e pode ser colocado em um local diferente no
formulário.

Membros do objeto
Um objeto é um elemento de um aplicativo, que representa uma instância de uma
classe. Campos, propriedades, métodos e eventos são os blocos de construção de
objetos e constituem seus membros.

Acesso de membro
É possível acessar um membro de um objeto especificando, em ordem, o nome da
variável do objeto, um período ( . ) e o nome do membro. O exemplo a seguir define a
propriedade Text de um objeto Label.

VB

warningLabel.Text = "Data not saved"

Lista do IntelliSense de membros

O IntelliSense lista os membros de uma classe quando você invoca sua opção de
membros da lista, por exemplo, ao digitar um ponto final ( . ) como um operador de
acesso de membro. Se você digitar o período após o nome de uma variável declarada
como uma instância da classe, o IntelliSense listará todos os membros de instância e
nenhum dos membros compartilhados. Se você digitar o ponto final após o nome da
classe, o IntelliSense listará todos os membros compartilhados e nenhum dos membros
de instância. Para obter mais informações, veja Usando o IntelliSense.

Campos e propriedades
Os campos e as propriedades representam as informações armazenadas em um objeto.
Você recupera e define seus valores com instruções de atribuição da mesma maneira
que você recupera e define variáveis locais em um procedimento. O exemplo a seguir
recupera a propriedade Width e define a propriedade ForeColor de um objeto Label.

VB

Dim warningWidth As Integer = warningLabel.Width

warningLabel.ForeColor = System.Drawing.Color.Red

Observe que um campo também é chamado de uma variável membro.

Use os procedimentos de propriedade quando:

Precisar controlar quando e como um valor é definido ou recuperado.

A propriedade tiver um conjunto bem definido de valores que precisam ser


validados.

Definir o valor causa algumas alterações perceptíveis no estado do objeto, como


um propriedade IsVisible .

Definir a propriedade faz alterações em outras variáveis internas ou nos valores de


outras propriedades.

Um conjunto de etapas deve ser executado antes de a propriedade pode ser


definida ou recuperada.

Use os campos quando:

O valor for de um tipo de validação automática. Por exemplo, um erro ou a


conversão automática de dados ocorrerá se um valor diferente de True ou False
for atribuído a uma variável Boolean .

Qualquer valor no intervalo com suporte do tipo de dados é válido. Isso é


verdadeiro para muitas propriedades de tipo Single ou Double .

A propriedade é um tipo de dados String e não há restrição sobre o tamanho ou


o valor da cadeia de caracteres.

Para obter mais informações, consulte Procedimentos de propriedade.

 Dica

Sempre mantenha os campos não constantes privados. Quando você quiser torná-
la pública, use uma propriedade.

Métodos
Um método é uma ação que um objeto pode executar. Por exemplo, Add é um método
do objeto ComboBox que adiciona uma nova entrada para uma caixa de combinação.

O exemplo a seguir demonstra o método Start de um objeto Timer.


VB

Dim safetyTimer As New System.Windows.Forms.Timer

safetyTimer.Start()

Observe que um método é simplesmente um procedimento que é exposto por um


objeto.

Para obter mais informações, consulte Procedimentos.

Eventos
Um evento é uma ação reconhecida por um objeto, como clicar com o mouse ou
pressionar uma tecla e para o qual você pode escrever código para responder. Os
eventos podem ocorrer como resultado de uma ação do usuário ou código do
programa, ou eles podem ser causados pelo sistema. O código que sinaliza um evento
aciona o evento e o código que responde a ele lida com ele.

Você também pode desenvolver seus próprios eventos personalizados para serem
acionados por seus objetos e manipulados por outros objetos. Para obter mais
informações, consulte Eventos.

Membros de instância e membros compartilhados


Quando você cria um objeto de uma classe, o resultado é uma instância dessa classe.
Membros que não são declarados com a palavra-chave compartilhado são membros de
instância, que pertencem estritamente a essa instância em particular. Um membro de
instância em uma instância é independente do mesmo membro em outra instância da
mesma classe. Por exemplo, uma variável de membro de instância pode ter valores
diferentes em instâncias diferentes.

Membros declarados com a palavra-chave Shared são membros compartilhados, que


pertencem à classe como um todo e não a qualquer instância específica. Um membro
compartilhado existe somente uma vez, independentemente de quantas instâncias de
sua classe você cria ou mesmo se você não criar nenhuma instância. Uma variável de
membro compartilhado, por exemplo, tem apenas um valor, que está disponível para
todo o código que pode acessar a classe.

Acessando membros não compartilhados


1. Verifique se o objeto foi criado com base na sua classe e atribuído a uma variável
de objeto.
VB

Dim secondForm As New System.Windows.Forms.Form

2. Na instrução que acessa o membro, siga o nome de variável de objeto com o


operador de acesso de membro ( . ) e, em seguida, o nome do membro.

VB

secondForm.Show()

Acessando membros compartilhados

Siga o nome da classe com o operador de acesso de membro ( . ) e, em seguida, o


nome do membro. Você sempre deve acessar um membro do objeto Shared
diretamente pelo nome da classe.

VB

Console.WriteLine("This computer is called " & Environment.MachineName)

Se já tiver criado um objeto da classe, você também poderá acessar um membro


Shared pela variável do objeto.

Diferenças entre classes e módulos


A principal diferença entre classes e módulos é que as classes podem ser instanciadas
como objetos enquanto os módulos padrão não podem. Como há apenas uma cópia
dos dados de um módulo padrão, quando uma parte do seu programa altera uma
variável pública em um módulo padrão, qualquer outra parte do programa obtém o
mesmo valor se ler essa variável. Em contraste, os dados do objeto existem
separadamente para cada objeto instanciado. Outra diferença é que, diferentemente
dos módulos padrão, as classes podem implementar interfaces. Se uma classe for
marcada com o modificador MustInherit, ela não poderá ser instanciada diretamente.
No entanto, ele ainda é diferente de um módulo, pois pode ser herdado enquanto os
módulos não podem ser herdados.

7 Observação
Quando o modificador Shared é aplicado a um membro de classe, ele é associado
à classe em si em vez de uma determinada instância da classe. O membro é
acessado diretamente usando o nome de classe, do mesmo que os membros do
módulo são acessados.

Classes e módulos também usam escopos diferentes para seus membros. Membros
definidos em uma classe têm escopo em uma instância específica da classe e existem
somente para o tempo de vida do objeto. Para acessar membros de classe de fora de
uma classe, você deve usar nomes totalmente qualificados no formato de
Objeto.Membro.

Por outro lado, os membros declarados dentro de um módulo são acessíveis


publicamente por padrão e podem ser acessados por qualquer código que pode
acessar o módulo. Isso significa que variáveis em um módulo padrão são variáveis
globais efetivamente porque elas são visíveis de qualquer lugar em seu projeto e
existem durante a vida útil do programa.

Reutilização de classes e objetos


Os objetos permitem que você declare variáveis e procedimentos uma vez e reutilize-os
quando necessário. Por exemplo, se desejar adicionar um verificador ortográfico a um
aplicativo, defina todas as variáveis e funções de suporte para fornecer a funcionalidade
de verificação ortográfica. Se criar o verificador de ortografia como uma classe, você
poderá reutilizá-lo em outros aplicativos adicionando uma referência ao assembly
compilado. Melhor ainda, você poderá diminuir seu trabalho usando uma classe de
verificador ortográfico que alguém já desenvolveu.

O .NET fornece vários exemplos de componentes que estão disponíveis para uso. O
exemplo a seguir usa a classe TimeZone no namespace System. TimeZone fornece
membros que permitem que você recupere informações sobre o fuso horário do
sistema atual do computador.

VB

Public Sub ExamineTimeZone()

Dim tz As System.TimeZone = System.TimeZone.CurrentTimeZone

Dim s As String = "Current time zone is "

s &= CStr(tz.GetUtcOffset(Now).Hours) & " hours and "

s &= CStr(tz.GetUtcOffset(Now).Minutes) & " minutes "

s &= "different from UTC (coordinated universal time)"

s &= vbCrLf & "and is currently "

If tz.IsDaylightSavingTime(Now) = False Then s &= "not "

s &= "on ""summer time""."

Console.WriteLine(s)

End Sub

No exemplo anterior, o primeiro Demonstrativo Esmaecido declara uma variável de


objeto do tipo TimeZone e atribui a ele um objeto TimeZone retornado pela
propriedade CurrentTimeZone.

Relacionamentos entre objetos


Os objetos podem estar relacionados entre si de várias maneiras. Os principais tipos de
relação são hierárquico e confinamento.

Relação hierárquica
Quando classes são derivadas de classes mais fundamentais, elas devem ter um
relacionamento hierárquico. As hierarquias de classe são úteis para descrever itens que
são um subtipo de uma classe mais geral.

No exemplo a seguir, suponha que você deseja definir um tipo especial de Button que
atua como um Button normal, mas também expõe um método que reverte as cores de
primeiro plano e da tela de fundo.

Como definir uma classe derivada de uma classe já existente


1. Use uma instrução Class para definir uma classe da qual criar o objeto que você
precisa.

VB

Public Class ReversibleButton

Certifique-se de que uma instrução End Class segue a última linha de código em
sua classe. Por padrão, o IDE (ambiente de desenvolvimento integrado) gera
automaticamente um End Class quando você insere uma instrução Class .

2. Siga a instrução Class imediatamente com uma instrução Inherits. Especifique a


classe da qual a nova classe deriva.

VB

Inherits System.Windows.Forms.Button

A nova classe herda todos os membros definidos pela classe base.

3. Adicione o código para os membros adicionais que sua classe derivada expõe. Por
exemplo, você pode adicionar um método ReverseColors e sua classe derivada
será semelhante ao seguinte:

VB

Public Class ReversibleButton

Inherits System.Windows.Forms.Button

Public Sub ReverseColors()

Dim saveColor As System.Drawing.Color = Me.BackColor

Me.BackColor = Me.ForeColor

Me.ForeColor = saveColor

End Sub

End Class

Se você criar um objeto da classe ReversibleButton , ele poderá acessar todos os


membros da classe Button, bem como o método ReverseColors e quaisquer
outros novos membros que você definir no ReversibleButton .

As classes derivadas herdam membros da classe que eles se baseiam, permitindo que
você adicione complexidade enquanto progride em uma hierarquia de classe. Para obter
mais informações, consulte Noções básicas de herança.

Compilar o código
Certifique-se de que o compilador pode acessar a classe da qual você pretende derivar
sua nova classe. Isso pode significar qualificar totalmente seu nome, como no exemplo
anterior, ou identificar seu namespace em uma Instrução Imports (Tipo e Namespace
.NET). Se a classe estiver em um projeto diferente, você precisará adicionar uma
referência ao projeto. Para obter mais informações, consulte Gerenciando referências
em um projeto.

Relação de confinamento
Outro modo de relação dos objetos é a relação de confinamento. Os objetos de
contêiner encapsulam logicamente outros objetos. Por exemplo, o objeto
OperatingSystem logicamente contém um objeto Version, que ele retorna por
intermédio de sua propriedade Version. Observe que o objeto de contêiner não contém
fisicamente qualquer outro objeto.

Coleções
Um tipo específico de confinamento de objeto é representado pelas coleções. As
coleções são grupos de objetos semelhantes que podem ser enumerados. O Visual
Basic dá suporte a uma sintaxe específica na instrução For Each...Next que permite que
você itere pelos itens de uma coleção. Além disso, as coleções permitem, com
frequência, que você use um Item[] para recuperar elementos pelo índice ou
associando-os com uma cadeia de caracteres exclusiva. As coleções podem ser mais
fáceis de usar que matrizes porque elas permitem que você adicione ou remova itens
sem usar índices. Devido à facilidade de uso, as coleções geralmente são usadas para
armazenar formulários e controles.

Tópicos relacionados
Instruções passo a passo: definindo classes

Fornece uma descrição passo a passo de como criar uma classe.

Propriedades e métodos sobrecarregados

Propriedades e métodos sobrecarregados

Noções básicas de herança

Aborda modificadores de herança, substituindo métodos e propriedades, MyClass e


MyBase.

Tempo de vida do objeto: como os objetos são criados e destruídos

Aborda a criação e descarte de instâncias de classe.

Tipos anônimos

Descreve como criar e usar tipos anônimos, que permitem que você crie objetos sem
escrever uma definição de classe para o tipo de dados.

Inicializadores de objeto: tipos nomeados e anônimos

Discute inicializadores de objeto, que são usados para criar instâncias de tipos
nomeados e anônimos usando uma única expressão.

Como inferir nomes e tipos de propriedade na declaração de tipo anônimo

Explica como inferir nomes e tipos de propriedade em declarações de tipo anônimo.


Fornece exemplos de inferência de tipos com e sem êxito.
Operadores e expressões no Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um operador é um elemento de código que executa uma operação em um ou mais


elementos de código que retêm valores. Os elementos de valor incluem variáveis,
constantes, literais, propriedades, valores retornados dos procedimentos Function e
Operator , bem como expressões.

Uma expressão é uma série de elementos de valor combinada com operadores, que
gera um novo valor. Os operadores agem em elementos de valor executando cálculos,
comparações ou outras operações.

Tipos de operadores
O Visual Basic fornece os seguintes tipos de operadores:

Os operadores aritméticos executam cálculos familiares em valores numéricos,


incluindo a mudança dos padrões de bit.

Os operadores de comparação comparam duas expressões e retornam um valor


Boolean que representa o resultado da comparação.

Os operadores de concatenação unem várias cadeias de caracteres em uma única


cadeia de caracteres.

Os operadores lógicos e bit a bit no Visual Basic combinam valores numéricos ou


Boolean e retornam um resultado do mesmo tipo de dados que os valores.

Os elementos de valor combinados com um operador são chamados operandos desse


operador. Os operadores combinados com elementos de valor formam expressões,
exceto para o operador de atribuição, que forma uma instrução. Para obter mais
informações, consulte Instruções.

Avaliação de expressões
O resultado final de uma expressão representa um valor, que normalmente é um tipo de
dados familiar, como Boolean , String ou um tipo numérico.

Veja a seguir dois exemplos de expressões.

5 + 4
' The preceding expression evaluates to 9.

15 * System.Math.Sqrt(9) + x

' The preceding expression evaluates to 45 plus the value of x.

"Concat" & "ena" & "tion"

' The preceding expression evaluates to "Concatenation".

763 < 23

' The preceding expression evaluates to False.

Vários operadores podem executar ações em uma única expressão ou instrução, como
mostra o exemplo a seguir.

VB

x = 45 + y * z ^ 2

No exemplo anterior, o Visual Basic executa as operações na expressão à direita do


operador de atribuição ( = ) e, em seguida, atribui o valor resultante à variável x à
esquerda. Não há nenhum limite prático para o número de operadores que podem ser
combinados em uma expressão, mas é necessário entender a Precedência do operador
no Visual Basic para assegurar que você obtenha os resultados esperados.

Confira também
Operadores
Combinação eficiente de operadores
Instruções
Procedimentos no Visual Basic
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Um procedimento é um bloco de demonstrativos do Visual Basic incluídos por uma


instrução de declaração ( Function , Sub , Operator , Get , Set ) e por uma declaração End
de correspondência. Todos os demonstrativos executáveis no Visual Basic precisam estar
incluídos em algum procedimento.

Chamar um procedimento
Você invoca um procedimento de algum outro lugar no código. Isso é conhecido como
uma chamada de procedimento. Quando a execução do procedimento termina, ele
retorna o controle para o código que o invocou, que é conhecido como o código de
chamada. O código de chamada é um demonstrativo, ou uma expressão incluída em um
demonstrativo, que especifica o procedimento pelo nome e transfere o controle a ele.

Retorno de um procedimento
Um procedimento retorna o controle ao código de chamada quando termina a
execução. Para fazer isso, ele pode usar uma Instrução Return, o Instrução Exit
apropriado para o procedimento ou a instruçãoInstrução <Palavra-chave> Final do
procedimento. O controle, então, é transmitido para o código de chamada, seguindo o
ponto da chamada de procedimento.

Com um demonstrativo Return , o controle retorna imediatamente para o código


de chamada. Os demonstrativos que seguem o demonstrativo Return não são
executados. Você pode ter mais de um demonstrativo Return no mesmo
procedimento.

Com um demonstrativo Exit Sub ou Exit Function , o controle retorna


imediatamente para o código de chamada. Os demonstrativos que seguem o
demonstrativo Exit não são executados. Você pode ter mais de um demonstrativo
Exit no mesmo procedimento e mesclar os demonstrativos Return e Exit no

mesmo procedimento.

Se um procedimento não tiver nenhum demonstrativo Return ou Exit , ele será


concluído com um demonstrativo End Sub ou End Function , End Get ou End Set
após o último demonstrativo do corpo do procedimento. O demonstrativo End
retorna o controle imediatamente para o código de chamada. Você pode ter
apenas um demonstrativo End em um procedimento.

Parâmetros e argumentos
Na maioria dos casos, um procedimento precisa operar em diferentes dados cada vez
que é chamado. Você pode transmitir essas informações para o procedimento como
parte da chamada de procedimento. O procedimento define zero ou mais parâmetros e
cada um deles representa um valor que se espera que seja transmitido. A
correspondência com cada parâmetro na definição do procedimento é um argumento
na chamada de procedimento. Um argumento representa o valor que você transmite ao
parâmetro correspondente em uma determinada chamada de procedimento.

Tipos de procedimentos
O Visual Basic usa vários tipos de procedimentos:

Os procedimentos Sub executam ações, mas não retornam um valor para o código
de chamada.

Os procedimentos de manipulação de eventos são procedimentos Sub que são


executados em resposta a um evento gerado por uma ação do usuário ou por uma
ocorrência em um programa.

Os procedimentos Function retornam um valor para o código de chamada. Eles


podem executar outras ações antes de retornar.

Algumas funções escritas em C# devolvem um valor retornado de referência. Os


chamadores da função podem modificar o valor retornado, e essa modificação é
refletida no estado do objeto de chamada. Começando com o Visual Basic 2017, o
código do Visual Basic pode consumir valores retornados de referência, embora
não possa retornar um valor por referência. Para obter mais informações, consulte
Reference return values (Valores retornados de referência).

Os procedimentos de propriedade retornam e atribuem valores de propriedades


em objetos ou módulos.

Os procedimentos de operador definem o comportamento de um operador


padrão quando um ou ambos os operandos são uma classe ou estrutura definida
recentemente.
Os procedimentos genéricos no Visual Basic definem um ou mais parâmetros de
tipo, além de seus parâmetros normais, para que o código de chamada possa
transmitir tipos de dados específicos cada vez que faz uma chamada.

Procedimentos e código estruturado


Cada linha de código executável em seu aplicativo deve estar em algum procedimento,
como Main , calculate ou Button1_Click . Se você subdividir procedimentos grandes em
menores, seu aplicativo ficará mais legível.

Os procedimentos são úteis para executar tarefas repetidas ou compartilhadas, como


cálculos frequentemente usados, manipulação e controle de texto e operações de banco
de dados. Você pode chamar um procedimento de vários locais diferentes em seu
código. Desse modo, você pode usar procedimentos como blocos de construção para
seu aplicativo.

Estruturar seu código com procedimentos lhe oferece os seguintes benefícios:

Os procedimentos permitem que você divida seus programas em unidades lógicas


distintas. Você pode depurar unidades separadas mais facilmente do que depurar
um programa inteiro sem procedimentos.

Depois de desenvolver procedimentos para uso em um programa, você pode usá-


los em outros programas, geralmente com pouca ou nenhuma modificação. Isso
ajuda a evitar a duplicação de código.

Confira também
Como criar um procedimento
Subprocedimentos
Procedimentos de função
Procedimentos de propriedade
Procedimentos do operador
Parâmetros e Argumentos de Procedimento
Procedimentos recursivos
Sobrecarga de procedimento
Procedimentos genéricos no Visual Basic
Objetos e Classes
Instruções no Visual Basic
Artigo • 07/04/2023 • 13 minutos para o fim da leitura

Uma instrução no Visual Basic é completa. Ela pode conter palavras-chave, operadores,
variáveis, constantes e expressões. Cada instrução pertence a uma das seguintes
categorias:

Instruções de declaração, que nomeia uma variável, constante ou procedimento, e


também podem especificar um tipo de dados.

Instruções executáveis, que iniciam ações. Essas instruções podem chamar um


método ou função e podem fazer loop ou ramificar por meio de blocos de código.
As instruções executáveis incluem Instruções de Atribuição, que atribuem um
valor ou uma expressão a uma variável ou constante.

Este tópico descreve cada categoria. Além disso, este tópico descreve como combinar
várias instruções em uma única linha e como continuar uma instrução em várias linhas.

Instruções de declaração
Você usa instruções de declaração para nomear e definir procedimentos, variáveis,
propriedades, matrizes e constantes. Ao declarar um elemento de programação, você
também pode definir seu tipo de dados, nível de acesso e escopo. Para obter mais
informações, consulte Características do Elemento Declarado.

O exemplo a seguir contém três classes, , e .

VB

Public Sub ApplyFormat()

Const limit As Integer = 33

Dim thisWidget As New widget

' Insert code to implement the procedure.

End Sub

A primeira declaração é a instrução Sub . Juntamente com a instrução correspondente


End Sub , ele declara um procedimento chamado applyFormat . Ele também especifica

que applyFormat é Public , o que significa que qualquer código que possa se referir a
ele pode chamá-lo.

A segunda declaração é a instrução Const , que declara a constante limit ,


especificando o tipo de dados Integer e um valor de 33.
A terceira declaração é a Dim instrução, que declara a variável thisWidget . O tipo de
dados é um objeto específico, ou seja, um objeto criado com base na classe Widget .
Você pode declarar uma variável como de qualquer tipo de dados elementar ou de
qualquer tipo de objeto exposto no aplicativo que você está usando.

Valores iniciais
Quando o código que contém uma instrução de declaração é executado, o Visual Basic
reserva a memória necessária para o elemento declarado. Se o elemento tiver um valor,
o Visual Basic o inicializará para o valor padrão de seu tipo de dados. Para obter mais
informações, consulte "Comportamento" na Instrução Dim.

Você pode atribuir um valor inicial a uma variável como parte de sua declaração, como
ilustra o exemplo a seguir.

VB

Dim m As Integer = 45

' The preceding declaration creates m and assigns the value 45 to it.

Se uma variável for uma variável de objeto, você poderá criar explicitamente uma
instância de sua classe ao declará-la usando a palavra-chave Novo Operador, como
ilustra o exemplo a seguir.

VB

Dim f As New FileInfo("filename")

Observe que o valor inicial especificado em uma instrução de declaração não é atribuído
a uma variável até que a execução atinja sua instrução de declaração. Até esse
momento, a variável contém o valor padrão para seu tipo de dados.

Instruções executáveis
Uma instrução executável executa uma ação. Ele pode chamar um procedimento,
ramificar para outro lugar no código, fazer loop por várias instruções ou avaliar uma
expressão. Uma instrução de atribuição é um caso especial de uma instrução executável.

O exemplo a seguir usa uma estrutura If...Then...Else de controle para executar


diferentes blocos de código com base no valor de uma variável. Em cada bloco de
código, um loop For...Next executa um número especificado de vezes.
VB

Public Sub StartWidget(ByVal aWidget As widget,

ByVal clockwise As Boolean, ByVal revolutions As Integer)

Dim counter As Integer

If clockwise = True Then

For counter = 1 To revolutions

aWidget.SpinClockwise()

Next counter

Else

For counter = 1 To revolutions

aWidget.SpinCounterClockwise()

Next counter

End If

End Sub

A instrução If no exemplo anterior verifica o valor do parâmetro clockwise . Se o valor


for True , ele chamará o método spinClockwise de aWidget . Se o valor for False , ele
chamará o método spinCounterClockwise de aWidget . A estrutura If...Then...Else de
controle termina com End If .

O loop For...Next em cada bloco chama o método apropriado várias vezes igual ao
valor do revolutions parâmetro.

Instruções de atribuição
As instruções de atribuição executam operações de atribuição, que consistem em pegar
o valor no lado direito do operador de atribuição ( = ) e armazená-lo no elemento à
esquerda, como no exemplo a seguir.

VB

v = 42

No exemplo anterior, a instrução de atribuição armazena o valor literal 42 na variável v .

Elementos de programação qualificados


O elemento de programação no lado esquerdo do operador de atribuição deve ser
capaz de aceitar e armazenar um valor. Isso significa que ele deve ser uma variável ou
propriedade que não seja ReadOnly ou deve ser um elemento de matriz. No contexto
de uma instrução de atribuição, esse elemento às vezes é chamado de lvalue, para
"valor esquerdo".
O valor no lado direito do operador de atribuição é gerado por uma expressão, que
pode consistir em qualquer combinação de literais, constantes, variáveis, propriedades,
elementos de matriz, outras expressões ou chamadas de função. O exemplo a seguir
ilustra essa situação.

VB

x = y + z + FindResult(3)

O exemplo anterior adiciona o valor mantido na variável y ao valor mantido na variável


z e, em seguida, adiciona o valor retornado pela chamada à função findResult . O valor

total dessa expressão é armazenado em variável x .

Tipos de dados em instruções de atribuição


Além dos valores numéricos, o operador de atribuição também pode atribuir valores
String , como ilustra o exemplo a seguir.

VB

Dim a, b As String

a = "String variable assignment"

b = "Con" & "cat" & "enation"

' The preceding statement assigns the value "Concatenation" to b.

Você também pode atribuir valores Boolean , usando um literal Boolean ou uma
expressão Boolean , como ilustra o exemplo a seguir.

VB

Dim r, s, t As Boolean

r = True

s = 45 > 1003

t = 45 > 1003 Or 45 > 17

' The preceding statements assign False to s and True to t.

Da mesma forma, você pode atribuir valores apropriados a elementos de programação


do tipo de dados Char , Date ou Object . Você também pode atribuir uma instância de
objeto a um elemento declarado como sendo da classe da qual essa instância é criada.

Instruções de atribuição composta


As instruções de atribuição composta primeiro executam uma operação em uma
expressão antes de atribuí-la a um elemento de programação. O exemplo a seguir
ilustra um desses operadores, += , que incrementa o valor da variável no lado esquerdo
do operador pelo valor da expressão à direita.

VB

n += 1

O exemplo anterior adiciona 1 ao valor de n , e armazena esse novo valor em n . É um


equivalente abreviado da seguinte instrução:

VB

n = n + 1

Uma variedade de operações de atribuição composta pode ser executada usando


operadores desse tipo. Para obter uma lista desses operadores e mais informações
sobre eles, consulte Operadores de Atribuição.

O operador de atribuição de concatenação ( &= ) é útil para adicionar uma cadeia de


caracteres ao final de cadeias de caracteres já existentes, como ilustra o exemplo a
seguir.

VB

Dim q As String = "Sample "

q &= "String"

' q now contains "Sample String".

Conversões de tipo em instruções de atribuição


O valor atribuído a uma variável, propriedade ou elemento de matriz deve ser de um
tipo de dados apropriado para esse elemento de destino. Em geral, você deve tentar
gerar um valor do mesmo tipo de dados que o do elemento de destino. No entanto,
alguns tipos podem ser convertidos em outros tipos durante a atribuição.

Para obter informações sobre como converter entre tipos de dados, consulte
Conversões de tipo no Visual Basic. Resumidamente, o Visual Basic converte
automaticamente um valor de um determinado tipo em qualquer outro tipo no qual ele
é expandido. Uma conversão de expansão é aquela em que sempre é bem-sucedida no
tempo de execução e não perde nenhum dado. Por exemplo, o Visual Basic converte um
valor Integer para Double , quando apropriado, porque Integer é expandido para
Double . Para obter mais informações, consulte Ampliando e restringindo conversões.

As conversões de restrição (aquelas que não estão expandido) correm o risco de ter
falhas em tempo de execução ou perda de dados. Você pode executar uma conversão
de estreitamento explicitamente usando uma função de conversão de tipo ou direcionar
o compilador para executar todas as conversões implicitamente definindo Option
Strict Off . Para obter mais informações, consulte Conversões implícitas e explícitas.

Colocando várias instruções em uma linha


Você pode ter várias instruções em uma única linha separadas pelo caractere dois-
pontos ( : ). O exemplo a seguir ilustra essa situação.

VB

Dim sampleString As String = "Hello World" : MsgBox(sampleString)

Embora ocasionalmente conveniente, essa forma de sintaxe torna seu código difícil de
ler e manter. Portanto, é recomendável manter uma instrução em uma linha.

Continuando uma instrução em várias linhas


Uma instrução geralmente se encaixa em uma linha, mas quando é muito longa, você
pode continuar na próxima linha usando uma sequência de continuação de linha, que
consiste em um espaço seguido por um caractere sublinhado ( _ ) seguido por um
retorno de carro. No exemplo a seguir, a instrução MsgBox executável é continuada em
duas linhas.

VB

Public Sub DemoBox()

Dim nameVar As String

nameVar = "John"

MsgBox("Hello " & nameVar _

& ". How are you?")

End Sub

Continuação de linha implícita


Em muitos casos, você pode continuar uma instrução na próxima linha consecutiva sem
usar o caractere de sublinhado ( _ ). Os elementos de sintaxe a seguir continuam
implicitamente a instrução na próxima linha de código.

Após uma vírgula ( , ). Por exemplo:

VB

Public Function GetUsername(ByVal username As String,

ByVal delimiter As Char,

ByVal position As Integer) As String

Return username.Split(delimiter)(position)

End Function

Após um parêntese aberto ( ( ) ou antes de um parêntese de fechamento ( ) ). Por


exemplo:

VB

Dim username = GetUsername(

Security.Principal.WindowsIdentity.GetCurrent().Name,

CChar("\"),

Depois de uma chave aberta ( { ) ou antes de uma chave } de fechamento (). Por
exemplo:

VB

Dim customer = New Customer With {

.Name = "Terry Adams",

.Company = "Adventure Works",

.Email = "terry@www.adventure-works.com"

Para obter mais informações, consulte Inicializadores de Objeto: Tipos Nomeados


e Anônimos ou Inicializadores de Coleção.

Após uma expressão inserida aberta ( <%= ) ou antes do fechamento de uma


expressão inserida ( %> ) dentro de um literal XML. Por exemplo:

VB
Dim customerXml = <Customer>

<Name>

<%=

customer.Name

%>

</Name>

<Email>

<%=

customer.Email

%>

</Email>

</Customer>

Para obter mais informações, consulte Expressões Inseridas em XML.

Após o operador de concatenação ( & ). Por exemplo:

VB

cmd.CommandText =

"SELECT * FROM Titles JOIN Publishers " &

"ON Publishers.PubId = Titles.PubID " &

"WHERE Publishers.State = 'CA'"

Para obter mais informações, consulte Operadores Listados pela Funcionalidade.

Após operadores de atribuição ( = , &= , := , += , -= , *= , /= , \= , ^= , <<= , >>= ). Por


exemplo:

VB

Dim fileStream =

My.Computer.FileSystem.

OpenTextFileReader(filePath)

Para obter mais informações, consulte Operadores Listados pela Funcionalidade.

Após operadores binários ( + , - , / , * , Mod , <> , < , > , <= , >= , ^ , >> , << , And ,
AndAlso , Or , OrElse , Like , Xor ) dentro de uma expressão. Por exemplo:

VB

Dim memoryInUse =

My.Computer.Info.TotalPhysicalMemory +

My.Computer.Info.TotalVirtualMemory -

My.Computer.Info.AvailablePhysicalMemory -

My.Computer.Info.AvailableVirtualMemory

Para obter mais informações, consulte Operadores Listados pela Funcionalidade.

Depois dos operadores Is e IsNot . Por exemplo:

VB

If TypeOf inStream Is

IO.FileStream AndAlso

inStream IsNot

Nothing Then

ReadFile(inStream)

End If

Para obter mais informações, consulte Operadores Listados pela Funcionalidade.

Após um caractere qualificador de membro ( . ) e antes do nome do membro. Por


exemplo:

VB

Dim fileStream =

My.Computer.FileSystem.

OpenTextFileReader(filePath)

No entanto, você deve incluir um caractere de continuação de linha ( _ ) seguindo


um caractere de qualificador de membro quando estiver usando a instrução With
ou fornecendo valores na lista de inicialização para um tipo. Considere quebrar a
linha após o operador de atribuição (por exemplo, = ) quando você estiver usando
instruções With ou listas de inicialização de objeto. Por exemplo:

VB

' Not allowed:

' Dim aType = New With { .

' PropertyName = "Value"

' Allowed:

Dim aType = New With {.PropertyName =

"Value"}

Dim log As New EventLog()

' Not allowed:

' With log

' .

' Source = "Application"

' End With

' Allowed:

With log

.Source =

"Application"

End With

Para obter mais informações, consulte Instrução Com...Terminar Com ou


Inicializadores de Objeto: Tipos Nomeados e Anônimos.

Após um qualificador de propriedade do eixo XML ( . , .@ ou ... ). No entanto,


você deve incluir um caractere de continuação de linha ( _ ) ao especificar um
qualificador de membro quando estiver usando a palavra-chave With . Por
exemplo:

VB

Dim customerName = customerXml.

<Name>.Value

Dim customerEmail = customerXml...

<Email>.Value

Para obter mais informações, consulte Propriedade de Eixo XML.

Depois de um sinal menor que (<) ou antes de um sinal maior que ( > ) quando
você especifica um atributo. Também após um sinal maior que ( > ) quando você
especifica um atributo. No entanto, você deve incluir um caractere de continuação
de linha ( _ ) ao especificar atributos de nível de assembly ou módulo. Por exemplo:

VB

<

Serializable()

>

Public Class Customer

Public Property Name As String

Public Property Company As String

Public Property Email As String

End Class

Para saber mais, confira Visão geral de Atributos.


Operadores de consulta antes e depois ( Aggregate , Distinct , From , Group By ,
Group Join , Join , Let , Order By , Select , Skip , Skip While , Take , Take While ,
Where , In , Into , On , Ascending e Descending ). Não é possível quebrar uma linha

entre as palavras-chave dos operadores de consulta que são compostos por várias
palavras-chave ( Order By , Group Join , Take While e Skip While ). Por exemplo:

VB

Dim vsProcesses = From proc In

Process.GetProcesses

Where proc.MainWindowTitle.Contains("Visual Studio")

Select proc.ProcessName, proc.Id,

proc.MainWindowTitle

Para obter mais informações, confira Consultas.

Após a palavra-chave In em uma instrução For Each . Por exemplo:

VB

For Each p In

vsProcesses

Console.WriteLine("{0}" & vbTab & "{1}" & vbTab & "{2}",

p.ProcessName,

p.Id,

p.MainWindowTitle)

Next

Para obter mais informações, consulte Para cada... Próxima instrução.

Após a palavra-chave From em um inicializador de coleção. Por exemplo:

VB

Dim days = New List(Of String) From

"Mo", "Tu", "We", "Th", "F", "Sa", "Su"

Para obter mais informações, consulte Inicializadores de coleção.

Como adicionar comentários


O código-fonte nem sempre é autoexplicativo, mesmo para o programador que o
escreveu. Para ajudar a documentar seu código, portanto, a maioria dos programadores
faz uso liberal de comentários inseridos. Os comentários no código podem explicar um
procedimento ou uma instrução específica para qualquer pessoa que esteja lendo ou
trabalhando com ele mais tarde. O Visual Basic ignora os comentários durante a
compilação e eles não afetam o código compilado.

As linhas de comentário começam com um apóstrofo ( ' ) ou REM seguido por um


espaço. Elas podem ser adicionadas em qualquer lugar no código, exceto dentro de
uma cadeia de caracteres. Para acrescentar um comentário a uma instrução, insira um
apóstrofo ou REM após a instrução, seguido do comentário. Os comentários também
podem ir em sua própria linha separada. O exemplo a seguir demonstra essas
possibilidades.

VB

' This is a comment on a separate code line.

REM This is another comment on a separate code line.

x += a(i) * b(i) ' Add this amount to total.

MsgBox(statusMessage) REM Inform operator of status.

Verificando erros de compilação


Se, depois de digitar uma linha de código, a linha for exibida com um sublinhado azul
ondulado (uma mensagem de erro também poderá aparecer), haverá um erro de
sintaxe na instrução. Você deve descobrir o que há de errado com a instrução
(examinando na lista de tarefas ou passando o mouse sobre o erro com o ponteiro do
mouse e lendo a mensagem de erro) e corrigi-la. Até que você tenha corrigido todos os
erros de sintaxe em seu código, o programa não será compilado corretamente.

Seções relacionadas
Termo Definição

Operadores de Atribuição Fornece links para páginas de referência de idioma que abrangem
operadores de atribuição, como = , *= e &= .

Operadores e Expressões Mostra como combinar elementos com operadores para gerar
novos valores.

Como: Quebrar e combinar Mostra como dividir uma única instrução em várias linhas e como
instruções no código colocar várias instruções na mesma linha.
Termo Definição

Como: Rotular instruções Mostra como rotular uma linha de código.


Cadeias de caracteres no Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Esta seção descreve os conceitos básicos do uso de cadeias de caracteres no Visual


Basic.

Nesta seção
Introdução a cadeias de caracteres no Visual Basic

Lista os tópicos que descrevem os conceitos básicos do uso de cadeias de caracteres no


Visual Basic.

Como criar cadeias de caracteres usando StringBuilder no Visual Basic

Demonstra como criar de maneira eficiente uma cadeia de caracteres longa com base
em várias cadeias menores.

Como pesquisar em uma cadeia de caracteres

Demonstra como determinar o índice da primeira ocorrência de uma subcadeia de


caracteres.

Convertendo entre cadeias de caracteres e outros tipos de dados no Visual Basic

Lista os tópicos que descrevem como converter cadeias de caracteres em outros tipos
de dados.

Validando cadeias de caracteres no Visual Basic

Lista os tópicos sobre como validar cadeias de caracteres.

Instruções passo a passo: criptografando e descriptografando cadeias de caracteres no


Visual Basic

Demonstra como criptografar e descriptografar cadeias de caracteres usando a versão


do provedor de serviços de criptografia do algoritmo DES triplo.

Confira também
Recursos da linguagem do Visual Basic
Variáveis no Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você normalmente precisa armazenar valores ao executar cálculos com o Visual Basic.
Por exemplo, talvez você queira calcular vários valores, compará-los e executar
operações diferentes dependendo do resultado da comparação. Você precisará reter os
valores se desejar compará-los.

Uso
O Visual Basic, assim como a maioria das linguagens de programação, usa variáveis para
armazenar valores. Uma variável tem um nome (a palavra que você usa para se referir
ao valor que a variável contém). Uma variável também tem um tipo de dados (que
determina o tipo de dados que a variável pode armazenar). Se precisar armazenar um
conjunto indexado de itens de dados estritamente relacionados, uma variável poderá
representar uma matriz.

A inferência de tipo de variável local permite que você declare variáveis sem especificar
de maneira explícita um tipo de dados. Em vez disso, o compilador infere o tipo da
variável com base no tipo da expressão de inicialização. Para obter mais informações,
consulte Inferência de tipo de variável local e Instrução Option Infer.

Atribuindo valores
Você pode usar instruções de atribuição para executar cálculos e atribuir o resultado a
uma variável, conforme mostra o exemplo a seguir.

VB

' The following statement assigns the value 10 to the variable.

applesSold = 10

' The following statement increments the variable.

applesSold = applesSold + 1

' The variable now holds the value 11.

7 Observação

O sinal de igual ( = ) no exemplo é um operador de atribuição e não um operador


de igualdade. O valor é atribuído à variável applesSold .
Para obter mais informações, consulte Como inserir e remover dados de uma variável.

Variáveis e propriedades
Como uma variável, uma propriedade representa um valor que você pode acessar. No
entanto, ela é mais complexa que uma variável. Uma propriedade usa blocos de código
que controlam como definir e recuperar seu valor. Para obter mais informações,
consulte Diferenças entre propriedades e variáveis no Visual Basic.

Confira também
Declaração de Variável
Variáveis de Objeto
Solução de problemas de Variáveis
Como inserir e remover dados de uma variável
Diferenças entre propriedades e variáveis no Visual Basic
Inferência de Tipo de Variável Local
XML no Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O Visual Basic fornece suporte à linguagem integrada que permite que ele interaja com
LINQ to XML.

Nesta seção
Os tópicos nesta seção apresentam o uso do LINQ to XML com o Visual Basic.

Tópico Descrição

Visão geral de LINQ to Descreve como o Visual Basic dá suporte a LINQ to XML.
XML no Visual Basic

Criando XML no Visual Descreve como criar objetos de literal do XML usando o LINQ to
Basic XML.

Manipulando XML no Descreve como carregar e analisar XML usando o Visual Basic.
Visual Basic

Acessando XML no Visual Descreve as propriedades do eixo XML e os métodos do LINQ to


Basic XML para acessar atributos e elementos XML.

Confira também
System.Xml.Linq
Literais XML
Propriedades do eixo XML
LINQ to XML
Interoperabilidade COM (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

O COM (Component Object Model) permite que um objeto exponha sua funcionalidade
a outros componentes e aplicativos host. Atualmente, a maioria dos softwares incluem
objetos COM. Embora os assemblies .NET sejam a melhor opção para novos aplicativos,
algumas vezes será preciso empregar objetos COM. Esta seção aborda alguns dos
problemas associados à criação e ao uso de objetos COM com Visual Basic.

Nesta seção
Introdução à Interoperabilidade COM

Fornece uma visão geral da interoperabilidade COM.

Como referenciar objetos COM no Visual Basic

Aborda como adicionar referências a objetos COM que têm bibliotecas de tipos.

Como: Trabalhar com controles ActiveX

Demonstra como usar controles ActiveX existentes para adicionar funcionalidades à


Caixa de Ferramentas do Visual Studio.

Passo a passo: Fazer chamadas de APIs do Windows

Orienta o processo de chamada às APIs que fazem parte do sistema operacional


Windows.

Como: Chamar APIs do Windows

Demonstra como definir e chamar a função MessageBox em User32.dll.

Como: Chamar uma função do Windows que use tipos não assinados
Demonstra como chamar uma função do Windows que tem um parâmetro de tipo não
assinado.

Instruções passo a passo: criando objetos COM com o Visual Basic

Orienta o processo de criação de objetos COM com e sem o modelo de classe COM.

Solução de problemas de Interoperabilidade

Aborda alguns dos problemas que você pode encontrar ao usar o COM.

Interoperabilidade COM em aplicativos .NET Framework

Fornece uma visão geral de como usar objetos COM e objetos .NET Framework no
mesmo aplicativo.
Passo a passo: Implementação de herança com objetos COM

Descreve como usar objetos COM existentes como base para novos objetos.

Seções relacionadas
Interoperação com código não gerenciado

Descreve os serviços de interoperabilidade fornecidos pelo Common Language


Runtime.

Expondo componentes do COM para o .NET Framework

Descreve o processo de chamada de tipos COM por meio da interoperabilidade COM.

Expondo componentes do .NET Framework para COM

Descreve a preparação e o uso de tipos gerenciados do COM.

Aplicando atributos de interoperabilidade

Aborda os atributos que você pode usar ao trabalhar com código não gerenciado.
Introdução à interoperabilidade COM
(Visual Basic)
Artigo • 22/02/2023 • 3 minutos para o fim da leitura

O COM (Component Object Model) permite que um objeto exponha a funcionalidade


dele a outros componentes e aplicativos host. Embora os objetos COM tenham sido
fundamentais para a programação do Windows por muitos anos, os aplicativos
projetados para o CLR (Common Language Runtime) oferecem muitas vantagens.

Os aplicativos do .NET Framework eventualmente substituirão os desenvolvidos com


COM. Até lá, talvez seja necessário usar ou criar objetos COM usando o Visual Studio. A
interoperabilidade com COM ou a interoperabilidade COM permite que você use objetos
COM existentes durante a transição para o .NET Framework no seu próprio ritmo.

Usando o .NET Framework para criar componentes COM, você pode usar a
interoperabilidade COM sem registro. Isso permite controlar qual versão de DLL está
habilitada quando mais de uma versão está instalada em um computador e permite que
os usuários finais usem XCOPY ou FTP para copiar seu aplicativo para um diretório
apropriado nos computadores deles onde ele pode ser executado. Para obter mais
informações, consulte Interoperabilidade COM sem Registro.

Código e Dados Gerenciados


O código desenvolvido para o .NET Framework é chamado de código gerenciado e
contém metadados usados pelo CLR. Os dados usados por aplicativos .NET Framework
são chamados de dados gerenciados porque o runtime gerencia tarefas relacionadas a
dados, como alocar e recuperar memória e executar verificação de tipo. Por padrão, o
.NET do Visual Basic usa código e dados gerenciados, mas você pode acessar o código
não gerenciado e os dados de objetos COM usando assemblies de interoperabilidade
(descritos posteriormente nesta página).

Assemblies
Um assembly é o bloco de construção principal de um aplicativo .NET Framework. É
uma coleção de funcionalidades que é criada, com versão e implantada como uma
única unidade de implementação que contém um ou mais arquivos. Cada assembly
contém um manifesto do assembly.
Bibliotecas de Tipos e Manifestos de Assembly
As bibliotecas de tipos descrevem características de objetos COM, como nomes de
membros e tipos de dados. Os manifestos de assembly executam a mesma função para
aplicativos .NET Framework. Eles contêm informações sobre:

Identidade, versão, cultura e assinatura digital do assembly.

Arquivos que compõem a implementação do assembly.

Tipos e recursos que compõem o assembly. Isso inclui aqueles que são exportados
dele.

Dependências de tempo de compilação em outros assemblies.

Permissões necessárias para que o assembly seja executado corretamente.

Para obter mais informações sobre assemblies e manifestos do assembly, consulte


Assemblies no .NET.

Importando e Exportando Bibliotecas de Tipos


O Visual Studio contém um utilitário, o Tlbimp, que permite importar informações de
uma biblioteca de tipos para um aplicativo .NET Framework. Você pode gerar bibliotecas
de tipos de assemblies usando o utilitário Tlbexp.

Para obter informações sobre Tlbimp e Tlbexp, consulte Tlbimp.exe (Importador de


Biblioteca de Tipos) e Tlbexp.exe (Exportador de Biblioteca de Tipos).

Assemblies de Interoperabilidade
Os assemblies de interoperabilidade são assemblies do .NET Framework que fazem a
ponte entre o código gerenciado e não gerenciado, mapeando membros de objeto
COM para membros .NET Framework gerenciados equivalentes. Os assemblies de
interoperabilidade criados pelo .NET do Visual Basic lidam com muitos dos detalhes de
trabalhar com objetos COM, como o marshalling de interoperabilidade.

Marshalling de Interoperabilidade
Todos os aplicativos .NET Framework compartilham um conjunto de tipos comuns que
permitem a interoperabilidade de objetos, independentemente da linguagem de
programação usada. Os parâmetros e os valores retornados de objetos COM às vezes
usam tipos de dados que diferem daqueles usados no código gerenciado. O
marshalling de interoperabilidade é o processo de empacotamento de parâmetros e
retornar valores em tipos de dados equivalentes à medida que eles se movem de e para
objetos COM. Para obter mais informações, consulte Marshaling de Interoperabilidade.

Confira também
Interoperabilidade COM
Passo a passo: Implementação de herança com objetos COM
Interoperação com código não gerenciado
Solução de problemas de Interoperabilidade
Assemblies no .NET
Tlbimp.exe (Importador de Biblioteca de Tipos)
Tlbexp.exe (Exportador de Biblioteca de Tipos)
Realizando marshaling de interoperabilidade
Interoperabilidade COM sem registro
Como fazer referência a objetos COM a
partir do Visual Basic
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

No Visual Basic, adicionar referências a objetos COM que têm bibliotecas de tipos
requer a criação de um assembly de interoperabilidade para a biblioteca COM. As
referências aos membros do objeto COM são roteadas para o assembly de
interoperabilidade e, em seguida, encaminhadas para o objeto COM real. As respostas
do objeto COM são roteadas para o assembly de interoperabilidade e encaminhadas
para o aplicativo .NET Framework.

Você pode fazer referência a um objeto COM sem usar um assembly de


interoperabilidade inserindo as informações de tipo para o objeto COM em um
assembly .NET. Para inserir informações de tipo, defina a propriedade Embed Interop
Types para True para a referência ao objeto COM. Se você estiver compilando usando o

compilador de linha de comando, use a opção /link para fazer referência à biblioteca
COM. Para saber mais, consulte -link (Visual Basic).

O Visual Basic cria automaticamente assemblies de interoperabilidade quando você


adiciona uma referência a uma biblioteca de tipos do IDE (ambiente de
desenvolvimento integrado). Ao trabalhar na linha de comando, você pode usar o
utilitário Tlbimp para criar assemblies de interoperabilidade manualmente.

Para adicionar referências a objetos COM


1. No menu Projeto, escolha Adicionar Referência e clique na guia COM na caixa de
diálogo.

2. Selecione o componente que você deseja usar na lista de objetos COM.

3. Para simplificar o acesso ao assembly de interoperabilidade, adicione uma


instrução Imports à parte superior da classe ou módulo no qual você usará o
objeto COM. Por exemplo, o exemplo de código a seguir importa o namespace
INKEDLib para objetos referenciados na biblioteca Microsoft InkEdit Control 1.0 .

VB

Imports INKEDLib

Class Sample

Private s As IInkCursor

End Class

Para criar um assembly de interoperabilidade usando o


Tlbimp
1. Adicione o local do Tlbimp ao caminho de pesquisa, se ele ainda não fizer parte do
caminho de pesquisa e você não estiver atualmente no diretório no qual ele está
localizado.

2. Chame o Tlbimp de um prompt de comando, fornecendo as seguintes


informações:

Nome e local da DLL que contém a biblioteca de tipos

Nome e local do namespace no qual as informações devem ser colocadas

Nome e local do assembly de interoperabilidade de destino

O código a seguir mostra um exemplo:

Console

Tlbimp test3.dll /out:NameSpace1 /out:Interop1.dll

Você pode usar o Tlbimp para criar assemblies de interoperabilidade para


bibliotecas de tipos, mesmo para objetos COM não registrados. No entanto, os
objetos COM referenciados por assemblies de interoperabilidade precisam ser
registrados corretamente no computador no qual devem ser usados. Você pode
registrar um objeto COM usando o utilitário Regsvr32 incluído no sistema
operacional Windows.

Confira também
Interoperabilidade COM
Tlbimp.exe (Importador de Biblioteca de Tipos)
Tlbexp.exe (Exportador de Biblioteca de Tipos)
Passo a passo: Implementação de herança com objetos COM
Solução de problemas de Interoperabilidade
Instrução Imports (tipo e namespace .NET)
Como trabalhar com controles ActiveX
(Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os controles ActiveX são componentes COM ou objetos que você pode inserir em uma
página da Web ou em outro aplicativo para reutilizar a funcionalidade empacotada que
outra pessoa programou. Você pode usar controles ActiveX desenvolvidos para o Visual
Basic 6.0 e versões anteriores para adicionar recursos à Caixa de Ferramentas do Visual
Studio.

Para adicionar controles ActiveX à caixa de ferramentas


1. No menu Ferramentas , clique em Escolher Itens da Caixa de Ferramentas.

A caixa de diálogo Escolher Caixa de Ferramentas é exibida.

2. Clique na guia Componentes COM.

3. Marque a caixa de seleção ao lado do controle ActiveX que você deseja usar e
clique em OK.

O novo controle é exibido com as outras ferramentas na Caixa de Ferramentas.

7 Observação

Você pode usar o utilitário Aximp para criar manualmente um assembly de


interoperabilidade para controles ActiveX. Para obter mais informações,
confira Aximp.exe (Importador de Controle ActiveX do Windows Forms).

Confira também
Interoperabilidade COM
Como adicionar controles do ActiveX ao Windows Forms
Aximp.exe (Importador de Controle ActiveX do Windows Forms)
Considerações sobre quando hospedar um controle ActiveX em um Windows
Form
Solução de problemas de Interoperabilidade
Instruções passo a passo: chamando
APIs do Windows (Visual Basic)
Artigo • 22/02/2023 • 9 minutos para o fim da leitura

As APIs do Windows são DLLs (bibliotecas de vínculo dinâmico) que fazem parte do
sistema operacional Windows. Você as usa para executar tarefas quando for difícil
escrever procedimentos equivalentes por conta própria. Por exemplo, o Windows
fornece uma função nomeada FlashWindowEx que permite que a barra de título de um
aplicativo alterne entre tons claros e escuros.

A vantagem de usar as APIs do Windows em seu código é que elas podem economizar
tempo de desenvolvimento porque contêm dezenas de funções úteis que já foram
gravadas e estão aguardando para serem usadas. A desvantagem é que pode ser difícil
trabalhar com as APIs do Windows e elas são desfavoráveis quando as coisas dão
errado.

As APIs do Windows representam uma categoria especial de interoperabilidade. As APIs


do Windows não usam código gerenciado, não têm bibliotecas de tipos internos e usam
tipos de dados diferentes daqueles usados com o Visual Studio. Devido a essas
diferenças e como as APIs do Windows não são objetos COM, a interoperabilidade com
APIs do Windows e o .NET Framework é executada usando a invocação de plataforma
ou PInvoke. A invocação de plataforma é um serviço que permite que um código
gerenciado chame funções não gerenciadas implementadas em DLLs. Para saber mais,
veja Consumo de funções de DLL não gerenciadas. Você pode usar o PInvoke no Visual
Basic usando a instrução Declare ou aplicando o atributo DllImport a um
procedimento vazio.

As chamadas à API do Windows eram uma parte importante da programação do Visual


Basic no passado, mas raramente são necessárias com o .NET do Visual Basic. Sempre
que possível, você deve usar o código gerenciado do .NET Framework para executar
tarefas, em vez de chamadas à API do Windows. Este passo a passo fornece informações
para as situações em que o uso de APIs do Windows é necessário.

7 Observação

Seu computador pode mostrar diferentes nomes ou locais para alguns dos
elementos de interface do usuário do Visual Studio nas instruções a seguir. A
edição do Visual Studio que você possui e as configurações que você usa
determinam esses elementos. Para obter mais informações, consulte
Personalizando o IDE.
Chamadas à API usando Declare
A maneira mais comum de chamar APIs do Windows é usando a instrução Declare .

Para declarar um procedimento DLL


1. Determine o nome da função que deseja chamar, além de seus argumentos, tipos
de argumento e valor retornado, bem como o nome e o local da DLL que a
contém.

7 Observação

Para obter informações completas sobre as APIs do Windows, consulte a


documentação do SDK do Win32 na API do Windows do SDK da Plataforma.
Para obter mais informações sobre as constantes que as APIs do Windows
usam, examine os arquivos de cabeçalho, como o Windows.h incluído no SDK
da Plataforma.

2. Abra um novo projeto de Aplicativo do Windows clicando em Novo no menu


Arquivo e, em seguida, clicando em Projeto. A caixa de diálogo Novo Projeto
aparecerá.

3. Selecione Aplicativo do Windows na lista de modelos de projeto do Visual Basic.


O novo projeto é exibido.

4. Adicione a seguinte função Declare à classe ou ao módulo no qual você deseja


usar a DLL:

VB

Declare Auto Function MBox Lib "user32.dll" Alias "MessageBox" (

ByVal hWnd As Integer,

ByVal txt As String,

ByVal caption As String,

ByVal Typ As Integer) As Integer

Partes da instrução Declare


A instrução Declare inclui os seguintes elementos.
Modificador automático
O modificador Auto instrui o runtime a converter a cadeia de caracteres com base no
nome do método de acordo com as regras de Common Language Runtime (ou nome
do alias, se especificado).

Palavras-chave Lib e Alias

O nome que segue a palavra-chave Function é o nome que seu programa usa para
acessar a função importada. Ele pode ser o mesmo que o nome real da função que você
está chamando ou você pode usar qualquer nome de procedimento válido e, em
seguida, empregar a palavra-chave Alias para especificar o nome real da função que
você está chamando.

Especifique a palavra-chave Lib , seguida pelo nome e local da DLL que contém a
função que você está chamando. Não é necessário especificar o caminho para arquivos
localizados nos diretórios do sistema Windows.

Use a palavra-chave Alias se o nome da função que você está chamando não for um
nome de procedimento válido do Visual Basic ou entrar em conflito com o nome de
outros itens em seu aplicativo. Alias indica o nome verdadeiro da função que está
sendo chamada.

Declarações de tipo de dados e argumentos


Declare os argumentos e seus tipos de dados. Essa parte pode ser desafiadora porque
os tipos de dados usados pelo Windows não correspondem aos tipos de dados do
Visual Studio. O Visual Basic faz muito trabalho para você convertendo argumentos em
tipos de dados compatíveis, um processo chamado marshaling. Você pode controlar
explicitamente como os argumentos realizam marshaling usando o MarshalAsAttribute
atributo definido no namespace System.Runtime.InteropServices.

7 Observação

As versões anteriores do Visual Basic permitiram que você declarasse parâmetros


As Any , o que significa que os dados de qualquer tipo de dados poderiam ser

usados. O Visual Basic exige que você use um tipo de dados específico para todas
as instruções Declare .

Constantes de API do Windows


Alguns argumentos são combinações de constantes. Por exemplo, a API MessageBox
mostrada neste passo a passo aceita um argumento inteiro chamado Typ que controla
como a caixa de mensagem é exibida. Você pode determinar o valor numérico dessas
constantes examinando as instruções #define no arquivo WinUser.h. Os valores
numéricos geralmente são mostrados em hexadecimal, portanto, talvez seja necessário
usar uma calculadora para adicioná-los e convertê-los em decimais. Por exemplo, se
você quiser combinar as constantes para o estilo de exclamação MB_ICONEXCLAMATION
0x00000030 e o estilo Sim/Não MB_YESNO 0x00000004, você poderá adicionar os
números e obter um resultado de 0x00000034 ou 52 decimais. Embora você possa usar
o resultado decimal diretamente, é melhor declarar esses valores como constantes em
seu aplicativo e combiná-los usando o operador Or .

Para declarar constantes para chamadas à API do Windows

1. Consulte a documentação da função do Windows que você está chamando.


Determine o nome das constantes que ele usa e o nome do arquivo .h que contém
os valores numéricos dessas constantes.

2. Use um editor de texto, como o Bloco de Notas, para exibir o conteúdo do arquivo
de cabeçalho (.h) e localizar os valores associados às constantes sendo usadas. Por
exemplo, a API MessageBox usa a constante MB_ICONQUESTION para mostrar um
ponto de interrogação na caixa de mensagem. A definição de MB_ICONQUESTION
está em WinUser.h e aparece da seguinte maneira:

#define MB_ICONQUESTION 0x00000020L

3. Adicione instruções Const equivalentes à sua classe ou módulo para disponibilizar


essas constantes ao seu aplicativo. Por exemplo:

VB

Const MB_ICONQUESTION As Integer = &H20

Const MB_YESNO As Integer = &H4

Const IDYES As Integer = 6

Const IDNO As Integer = 7

Para chamar o procedimento DLL

1. Adicione um botão nomeado Button1 ao formulário de inicialização do projeto e


clique duas vezes nele para exibir o código. O manipulador de eventos para o
botão é exibido.
2. Adicione código ao manipulador de eventos Click para o botão que você
adicionou, para chamar o procedimento e fornecer os argumentos apropriados:

VB

Private Sub Button1_Click(ByVal sender As System.Object,

ByVal e As System.EventArgs) Handles Button1.Click

' Stores the return value.

Dim RetVal As Integer

RetVal = MBox(0, "Declare DLL Test", "Windows API MessageBox",

MB_ICONQUESTION Or MB_YESNO)

' Check the return value.

If RetVal = IDYES Then

MsgBox("You chose Yes")

Else

MsgBox("You chose No")

End If

End Sub

3. Execute o projeto pressionando F5. A caixa de mensagem é exibida com botões de


resposta Sim e Não. Clique em qualquer um deles.

Marshalling de dados

O Visual Basic converte automaticamente os tipos de dados de parâmetros e os valores


retornados para chamadas à API do Windows, mas você pode usar o atributo MarshalAs
para especificar explicitamente os tipos de dados não gerenciados esperados por uma
API. Para obter mais informações sobre o marshalling de interoperabilidade, consulte
Marshaling de interoperabilidade.

Para usar Declare e MarshalAs em uma chamada à API

1. Determine o nome da função que deseja chamar, além de seus argumentos, tipos
de dados e valor retornado.

2. Para simplificar o acesso ao atributo MarshalAs , adicione uma instrução Imports à


parte superior do código para a classe ou módulo, como no exemplo a seguir:

VB

Imports System.Runtime.InteropServices

3. Adicione um protótipo de função para a função importada à classe ou módulo que


você está usando e aplique o atributo MarshalAs aos parâmetros ou valor
retornado. No exemplo a seguir, uma chamada à API que espera que o tipo void*
tenha realizado marshaling como AsAny :

VB

Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" (

ByVal x As Short,

<MarshalAsAttribute(UnmanagedType.AsAny)>

ByVal o As Object)

Chamadas à API usando DllImport


O atributo DllImport fornece uma segunda maneira de chamar funções em DLLs sem
bibliotecas de tipos. DllImport é aproximadamente equivalente ao uso de uma
instrução Declare , mas fornece mais controle sobre como as funções são chamadas.

Você pode usar DllImport com a maioria das chamadas à API do Windows, desde que a
chamada se refira a um método compartilhado (às vezes chamado de estático). Você
não pode usar métodos que exigem uma instância de uma classe. Ao contrário das
instruções Declare , DllImport as chamadas não podem usar o atributo MarshalAs .

Para chamar uma API do Windows usando o atributo


DllImport
1. Abra um novo projeto de Aplicativo do Windows clicando em Novo no menu
Arquivo e, em seguida, clicando em Projeto. A caixa de diálogo Novo Projeto
aparecerá.

2. Selecione Aplicativo do Windows na lista de modelos de projeto do Visual Basic.


O novo projeto é exibido.

3. Adicione um botão nomeado Button2 ao formulário de inicialização.

4. Clique duas vezes em Button2 para abrir o modo de exibição de código do


formulário.

5. Para simplificar o acesso DllImport , adicione uma instrução Imports à parte


superior do código para a classe do formulário de inicialização:

VB
Imports System.Runtime.InteropServices

6. Declare uma função vazia antes da instrução End Class do formulário e nomeie a
função MoveFile .

7. Aplique os modificadores Public e Shared à declaração de função e defina os


parâmetros para MoveFile com base nos argumentos usados pela função de API
do Windows:

VB

Public Shared Function MoveFile(

ByVal src As String,

ByVal dst As String) As Boolean

' Leave the body of the function empty.

End Function

Sua função pode ter qualquer nome de procedimento válido; o atributo DllImport
especifica o nome na DLL. Ele também identifica o marshalling de
interoperabilidade para os parâmetros e valores retornados, para que você possa
escolher tipos de dados do Visual Studio semelhantes aos tipos de dados que a
API usa.

8. Aplique o atributo DllImport à função vazia. O primeiro parâmetro é o nome e o


local da DLL que contém a função que você está chamando. Não é necessário
especificar o caminho para arquivos localizados nos diretórios do sistema
Windows. O segundo parâmetro é um argumento nomeado que especifica o
nome da função na API do Windows. Neste exemplo, o atributo DllImport força as
chamadas a MoveFile a serem encaminhadas para MoveFileW no KERNEL32.DLL. O
método MoveFileW copia um arquivo do caminho src para o caminho dst .

VB

<DllImport("KERNEL32.DLL", EntryPoint:="MoveFileW", SetLastError:=True,

CharSet:=CharSet.Unicode, ExactSpelling:=True,

CallingConvention:=CallingConvention.StdCall)>

Public Shared Function MoveFile(

ByVal src As String,

ByVal dst As String) As Boolean

' Leave the body of the function empty.

End Function

9. Adicione código ao manipulador de eventos Button2_Click para chamar a função:


VB

Private Sub Button2_Click(ByVal sender As System.Object,

ByVal e As System.EventArgs) Handles Button2.Click

Dim RetVal As Boolean = MoveFile("c:\tmp\Test.txt", "c:\Test.txt")

If RetVal = True Then

MsgBox("The file was moved successfully.")

Else

MsgBox("The file could not be moved.")

End If

End Sub

10. Crie um arquivo chamado Test.txt e coloque-o no diretório C:\Tmp no disco rígido.
Crie o diretório Tmp, se necessário.

11. Pressione F5 para iniciar o aplicativo. O formulário principal é exibido.

12. Clique em Button2. A mensagem "O arquivo foi movido com êxito" será exibida se
o arquivo puder ser movido.

Confira também
DllImportAttribute
MarshalAsAttribute
Instrução Declare
Auto
Alias
Interoperabilidade COM
Criando protótipos em código gerenciado
Realizando marshaling de um delegado como um método de retorno de chamada
Como chamar APIs do Windows (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Este exemplo define e chama a função MessageBox em user32.dll e, em seguida, passa


uma cadeia de caracteres para ela.

Exemplo
VB

' Defines the MessageBox function.

Public Class Win32

Declare Auto Function MessageBox Lib "user32.dll" (

ByVal hWnd As Integer, ByVal txt As String,

ByVal caption As String, ByVal Type As Integer

) As Integer

End Class

' Calls the MessageBox function.

Public Class DemoMessageBox

Public Shared Sub Main()

Win32.MessageBox(0, "Here's a MessageBox", "Platform Invoke Sample",


0)

End Sub

End Class

Compilar o código
Este exemplo requer:

Uma referência ao namespace System.

Programação robusta
As seguintes condições podem causar uma exceção:

O método não é estático, é abstrato ou foi definido anteriormente. O tipo pai é


uma interface ou o tamanho de name ou dllName é zero. (ArgumentException)

O name ou dllName é Nothing . (ArgumentNullException)


O tipo recipiente foi criado anteriormente usando CreateType .
(InvalidOperationException)

Confira também
Um olhar detalhado sobre invocação de plataforma
Exemplos de invocação de plataforma
Consumindo funções de DLL não gerenciadas
Definindo um método com a emissão de reflexão
Passo a passo: Fazer chamadas de APIs do Windows
Interoperabilidade COM
Como chamar uma função do Windows
que use tipos não assinados (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Se você estiver consumindo uma classe, módulo ou estrutura que tenha membros de
tipos inteiros não assinados, você poderá acessar esses membros com o Visual Basic.

Para chamar uma função do Windows que use


um tipo não assinado
1. Use uma Instrução Declare para informar ao Visual Basic qual biblioteca contém a
função, qual é o nome dela nessa biblioteca, qual é a sequência de chamadas e
como converter cadeias de caracteres ao chamá-la.

2. Na instrução Declare , use UInteger , ULong , UShort ou Byte conforme apropriado


para cada parâmetro com um tipo não assinado.

3. Consulte a documentação da função do Windows que você está chamando para


encontrar os nomes e valores das constantes que ela usa. Muitos deles são
definidos no arquivo WinUser.h.

4. Declare as constantes necessárias no seu código. Muitas constantes do Windows


são valores não assinados de 32 bits e você deve declará-los As UInteger .

5. Chame a função da maneira normal. O exemplo a seguir chama a função


MessageBox do Windows, que usa um argumento inteiro sem sinal.

VB

Public Class windowsMessage

Private Declare Auto Function mb Lib "user32.dll" Alias


"MessageBox" (

ByVal hWnd As Integer,

ByVal lpText As String,

ByVal lpCaption As String,

ByVal uType As UInteger) As Integer

Private Const MB_OK As UInteger = 0

Private Const MB_ICONEXCLAMATION As UInteger = &H30

Private Const IDOK As UInteger = 1

Private Const IDCLOSE As UInteger = 8

Private Const c As UInteger = MB_OK Or MB_ICONEXCLAMATION

Public Function messageThroughWindows() As String

Dim r As Integer = mb(0, "Click OK if you see this!",

"Windows API call", c)

Dim s As String = "Windows API MessageBox returned " &

CStr(r)& vbCrLf & "(IDOK = " & CStr(IDOK) &


", IDCLOSE = " & CStr(IDCLOSE) & ")"

Return s

End Function

End Class

Você pode testar a função messageThroughWindows com o código a seguir.

VB

Public Sub consumeWindowsMessage()

Dim w As New windowsMessage

w.messageThroughWindows()

End Sub

U Cuidado

Os tipos de dados UInteger , ULong , UShort e SByte não fazem parte do CLS
(Independência de Linguagem e Componentes Independentes de
Linguagem), portanto, o código compatível com CLS não pode consumir um
componente que os usa.

) Importante

Fazer uma chamada para código não gerenciado, como a API (interface de
programação de aplicativo) do Windows, expõe seu código a possíveis riscos
de segurança.

) Importante

Chamar a API do Windows requer permissão de código não gerenciada, o que


pode afetar a execução dela em situações de confiança parcial. Para obter
mais informações, consulte SecurityPermission e Permissões de Acesso de
Código.

Confira também
Data Types
Tipo de Dados Integer
Tipo de Dados UInteger
Instrução Declare
Passo a passo: Fazer chamadas de APIs do Windows
Instruções passo a passo: criando
objetos COM com o Visual Basic
Artigo • 22/02/2023 • 4 minutos para o fim da leitura

Ao criar novos aplicativos ou componentes, é melhor criar .NET Framework assemblies.


No entanto, o Visual Basic também facilita a exposição de um componente .NET
Framework ao COM. Isso permite que você forneça novos componentes para conjuntos
de aplicativos anteriores que exigem componentes COM. Este passo a passo demonstra
como usar o Visual Basic para expor objetos .NET Framework como objetos COM, com e
sem o modelo de classe COM.

A maneira mais fácil de expor objetos COM é usando o modelo de classe COM. Esse
modelo cria uma nova classe e configura seu projeto para gerar a classe com uma
camada de interoperabilidade como um objeto COM e registrá-la no sistema
operacional.

7 Observação

Embora você também possa expor uma classe criada no Visual Basic como um
objeto COM para uso de código não gerenciado, ele não é um objeto COM
verdadeiro e não pode ser usado pelo Visual Basic. Para obter mais informações,
consulte Interoperabilidade COM em aplicativos .NET Framework.

7 Observação

Seu computador pode mostrar diferentes nomes ou locais para alguns dos
elementos de interface do usuário do Visual Studio nas instruções a seguir. A
edição do Visual Studio que você possui e as configurações que você usa
determinam esses elementos. Para obter mais informações, consulte
Personalizando o IDE.

Para criar um objeto COM usando o modelo de classe


COM
1. Abra um novo projeto de aplicativo do Windows no menu Arquivo clicando em
Novo Projeto.
2. Na caixa de diálogo Novo Projeto, no campo Tipos de Projeto, verifique se o
Windows está selecionado. Selecione a Biblioteca de Classes na lista Modelos e
clique em OK. O novo projeto é exibido.

3. Selecione Adicionar Novo Item no menu Projeto. A caixa de diálogo Adicionar


novo item é exibida.

4. Selecione a Classe COM na lista Modelos e clique em Adicionar. O Visual Basic


adiciona uma nova classe e configura o novo projeto para interoperabilidade COM.

5. Adicione código como propriedades, métodos e eventos à classe COM.

6. Selecione Compilação ClassLibrary1 no menu Compilação. O Visual Basic cria o


assembly e registra o objeto COM com o sistema operacional.

Criando objetos COM sem o modelo de classe


COM
Você também pode criar uma classe COM manualmente em vez de usar o modelo de
classe COM. Esse procedimento é útil quando você está trabalhando na linha de
comando ou quando deseja ter mais controle sobre como os objetos COM são
definidos.

Para configurar seu projeto para gerar um objeto COM

1. Abra um novo projeto de aplicativo do Windows no menu Arquivo clicando em


NewProject.

2. Na caixa de diálogo Novo Projeto, no campo Tipos de Projeto, verifique se o


Windows está selecionado. Selecione a Biblioteca de Classes na lista Modelos e
clique em OK. O novo projeto é exibido.

3. No Gerenciador de Soluções, clique com o botão direito do mouse no nó do seu


projeto e clique em Propriedades. O Designer de Projeto é exibido.

4. Clique na guia Compilar.

5. Marque a caixa de seleção Registrar para interoperabilidade COM.

Para configurar o código em sua classe para criar um objeto COM

1. Em Gerenciador de Soluções, clique duas vezes em Class1.vb para exibir seu


código.
2. Renomeie a classe para ComClass1 .

3. Adicione as seguintes constantes a ComClass1 . Eles armazenarão as constantes


GUID (Identificador Global Exclusivo) que os objetos COM precisam ter.

VB

Public Const ClassId As String = ""

Public Const InterfaceId As String = ""

Public Const EventsId As String = ""

4. No menu Ferramentas, clique em Criar GUID. Na caixa de diálogo Criar GUID,


clique em Formato do Registro e clique em Copiar. Clique em Sair.

5. Substitua a cadeia de caracteres vazia pelo ClassId GUID, removendo as chaves à


esquerda e à direita. Por exemplo, se o GUID fornecido por Guidgen for "
{2C8B0AEE-02C9-486e-B809-C780A11530FE}" , o código deverá aparecer da seguinte

maneira.

VB

Public Const ClassId As String = "2C8B0AEE-02C9-486e-B809-C780A11530FE"

6. Repita as etapas anteriores para as constantes e InterfaceId as EventsId


constantes, como no exemplo a seguir.

VB

Public Const InterfaceId As String = "3D8B5BA4-FB8C-5ff8-8468-


11BF6BD5CF91"

Public Const EventsId As String = "2B691787-6ED7-401e-90A4-


B3B9C0360E31"

7 Observação

Verifique se os GUIDs são novos e exclusivos; caso contrário, seu componente


COM pode entrar em conflito com outros componentes COM.

7. Adicione o ComClass atributo a ComClass1 , especificando os GUIDs para a ID de


classe, a ID da interface e a ID de eventos, como no exemplo a seguir:

VB
<ComClass(ComClass1.ClassId, ComClass1.InterfaceId,
ComClass1.EventsId)>

Public Class ComClass1

8. As classes COM devem ter um construtor sem Public Sub New() parâmetros ou a
classe não será registrada corretamente. Adicione um construtor sem parâmetros à
classe:

VB

Public Sub New()

MyBase.New()

End Sub

9. Adicione propriedades, métodos e eventos à classe, terminando-a com uma


instrução End Class . Selecione Solução de compilação no menu Compilação. O
Visual Basic cria o assembly e registra o objeto COM com o sistema operacional.

7 Observação

Os objetos COM gerados com o Visual Basic não podem ser usados por
outros aplicativos do Visual Basic porque não são objetos COM verdadeiros.
As tentativas de adicionar referências a esses objetos COM gerarão um erro.
Para obter detalhes, consulte Interoperabilidade COM em aplicativos .NET
Framework.

Confira também
ComClassAttribute
Interoperabilidade COM
Passo a passo: Implementação de herança com objetos COM
Diretiva #Region
Interoperabilidade COM em aplicativos .NET Framework
Solução de problemas de Interoperabilidade
Solucionando problemas de
interoperabilidade (Visual Basic)
Artigo • 22/02/2023 • 10 minutos para o fim da leitura

Ao interoperar entre COM e o código gerenciado do .NET Framework, você poderá


encontrar um ou mais dos seguintes problemas comuns.

Marshalling de interoperação
Às vezes, talvez seja necessário usar tipos de dados que não fazem parte do .NET
Framework. Os assemblies de interoperabilidade lidam com a maior parte do trabalho
para objetos COM, mas talvez seja necessário controlar os tipos de dados usados
quando objetos gerenciados são expostos ao COM. Por exemplo, estruturas em
bibliotecas de classes devem especificar o tipo BStr não gerenciado em cadeias de
caracteres enviadas a objetos COM criados pelo Visual Basic 6.0 e versões anteriores.
Nesses casos, você pode usar o atributo MarshalAsAttribute para fazer com que os tipos
gerenciados sejam expostos como tipos não gerenciados.

Exportando cadeias de caracteres de


comprimento fixo para código não gerenciado
No Visual Basic 6.0 e versões anteriores, as cadeias de caracteres são exportadas para
objetos COM como sequências de bytes sem um caractere de encerramento nulo. Para
compatibilidade com outras linguagens, o .NET do Visual Basic inclui um caractere de
encerramento ao exportar cadeias de caracteres. A melhor maneira de resolver essa
incompatibilidade é exportar cadeias de caracteres que não têm o caractere de
encerramento como matrizes de Byte ou Char .

Exportar hierarquias de herança


Hierarquias de classe gerenciada se nivelam quando expostas como objetos COM. Por
exemplo, se você definir uma classe base com um membro e herdar a classe base em
uma classe derivada exposta como um objeto COM, os clientes que usam a classe
derivada no objeto COM não poderão usar os membros herdados. Os membros da
classe base podem ser acessados de objetos COM apenas como instâncias de uma
classe base e, em seguida, somente se a classe base também for criada como um objeto
COM.
Métodos sobrecarregados
Embora você possa criar métodos sobrecarregados com o Visual Basic, eles não têm
suporte do COM. Quando uma classe que contém métodos sobrecarregados é exposta
como um objeto COM, novos nomes de método são gerados para os métodos
sobrecarregados.

Por exemplo, considere uma classe que tenha duas sobrecargas do método Synch .
Quando a classe é exposta como um objeto COM, os novos nomes de método gerados
podem ser Synch e Synch_2 .

A renomeação pode causar dois problemas para os consumidores do objeto COM.

1. Talvez os clientes não esperem os nomes de método gerados.

2. Os nomes de método gerados na classe exposta como um objeto COM podem ser
alterados quando novas sobrecargas são adicionadas à classe ou à classe base.
Isso pode causar problemas de versão.

Para resolver ambos os problemas, dê a cada método um nome exclusivo, em vez de


usar sobrecarga, quando você desenvolver objetos que serão expostos como objetos
COM.

Uso de objetos COM por meio de assemblies


de interoperabilidade
Você usa assemblies de interoperabilidade quase como se fossem substituições de
código gerenciado para os objetos COM que eles representam. No entanto, como eles
são wrappers e não objetos COM reais, há algumas diferenças entre o uso de assemblies
de interoperabilidade e assemblies padrão. Essas áreas de diferença incluem a exposição
de classes e tipos de dados para parâmetros e valores retornados.

Classes expostas como interfaces e classes


Ao contrário das classes em assemblies padrão, as classes COM são expostas em
assemblies de interoperabilidade como uma interface e uma classe que representa a
classe COM. O nome da interface é idêntico ao da classe COM. O nome da classe de
interoperabilidade é o mesmo da classe COM original, mas com a palavra "Classe"
acrescentada. Por exemplo, suponha que você tenha um projeto com uma referência a
um assembly de interoperabilidade para um objeto COM. Se a classe COM for nomeada
MyComClass , o IntelliSense e o Pesquisador de Objetos mostrarão uma interface

nomeada MyComClass e uma classe chamada MyComClassClass .

Criando instâncias de uma classe .NET


Framework
Geralmente, você cria uma instância de uma classe .NET Framework usando a instrução
New com um nome de classe. Ter uma classe COM representada por um assembly de
interoperabilidade é o único caso em que você pode usar a instrução New com uma
interface. A menos que você esteja usando a classe COM com uma instrução Inherits ,
você pode usar a interface exatamente como faria com uma classe. O código a seguir
demonstra como criar um objeto Command em um projeto que tenha uma referência ao
objeto MICROSOFT ActiveX Data Objects 2.8 Library COM:

VB

Dim cmd As New ADODB.Command

No entanto, se você estiver usando a classe COM como base para uma classe derivada,
deverá usar a classe de interoperabilidade que representa a classe COM, como no
seguinte código:

VB

Class DerivedCommand

Inherits ADODB.CommandClass

End Class

7 Observação

Assemblies de interoperabilidade implementam de modo implícito as interfaces


que representam classes COM. Você não deve tentar usar a instrução Implements
para implementar essas interfaces ou um erro resultará.

Tipos de dados para parâmetros e valores


retornados
Ao contrário dos membros de assemblies padrão, os membros do assembly de
interoperabilidade podem ter tipos de dados diferentes daqueles usados na declaração
de objeto original. Embora os assemblies de interoperabilidade convertam
implicitamente tipos COM em tipos de runtime de linguagem comuns compatíveis, você
deve prestar atenção aos tipos de dados usados por ambos os lados para evitar erros de
runtime. Por exemplo, em objetos COM criados no Visual Basic 6.0 e versões anteriores,
os valores do tipo Integer assumem o tipo equivalente de .NET Framework, Short . É
recomendável que você use o Pesquisador de Objetos para examinar as características
dos membros importados antes de usá-los.

Métodos COM de nível de módulo


A maioria dos objetos COM é usada criando uma instância de uma classe COM usando
a palavra-chave New e chamando métodos do objeto. Uma exceção a essa regra envolve
objetos COM que contêm classes COM AppObj ou GlobalMultiUse . Essas classes se
assemelham a métodos de nível de módulo em classes .NET do Visual Basic. O Visual
Basic 6.0 e versões anteriores criam implicitamente instâncias desses objetos para você
na primeira vez que você chama um de seus métodos. Por exemplo, no Visual Basic 6.0,
você pode adicionar uma referência à Biblioteca de Objetos do Microsoft DAO 3.6 e
chamar o método DBEngine sem primeiro criar uma instância:

VB

Dim db As DAO.Database

' Open the database.

Set db = DBEngine.OpenDatabase("C:\nwind.mdb")

' Use the database object.

O .NET do Visual Basic requer que você sempre crie instâncias de objetos COM antes de
poder usar seus métodos. Para usar esses métodos no Visual Basic, declare uma variável
da classe desejada e use a nova palavra-chave para atribuir o objeto à variável de
objeto. A palavra-chave Shared pode ser usada quando você quiser garantir que apenas
uma instância da classe seja criada.

VB

' Class level variable.

Shared DBEngine As New DAO.DBEngine

Sub DAOOpenRecordset()

Dim db As DAO.Database

Dim rst As DAO.Recordset

Dim fld As DAO.Field

' Open the database.

db = DBEngine.OpenDatabase("C:\nwind.mdb")

' Open the Recordset.

rst = db.OpenRecordset(

"SELECT * FROM Customers WHERE Region = 'WA'",

DAO.RecordsetTypeEnum.dbOpenForwardOnly,

DAO.RecordsetOptionEnum.dbReadOnly)

' Print the values for the fields in the debug window.

For Each fld In rst.Fields

Debug.WriteLine(fld.Value.ToString & ";")

Next

Debug.WriteLine("")

' Close the Recordset.

rst.Close()

End Sub

Erros sem tratamento em manipuladores de


eventos
Um problema de interoperabilidade comum envolve erros em manipuladores de
eventos que lidam com eventos gerados por objetos COM. Esses erros são ignorados, a
menos que você verifique especificamente se há erros usando instruções On Error ou
Try...Catch...Finally . Por exemplo, o exemplo a seguir é de um projeto .NET do
Visual Basic que tem uma referência ao objeto COM da Biblioteca Microsoft ActiveX
Data Objects 2.8.

VB

' To use this example, add a reference to the

' Microsoft ActiveX Data Objects 2.8 Library

' from the COM tab of the project references page.

Dim WithEvents cn As New ADODB.Connection

Sub ADODBConnect()

cn.ConnectionString =

"Provider=Microsoft.Jet.OLEDB.4.0;" &

"Data Source=C:\NWIND.MDB"

cn.Open()

MsgBox(cn.ConnectionString)

End Sub

Private Sub Form1_Load(ByVal sender As System.Object,

ByVal e As System.EventArgs) Handles MyBase.Load

ADODBConnect()

End Sub

Private Sub cn_ConnectComplete(

ByVal pError As ADODB.Error,

ByRef adStatus As ADODB.EventStatusEnum,

ByVal pConnection As ADODB.Connection) Handles cn.ConnectComplete

' This is the event handler for the cn_ConnectComplete event raised

' by the ADODB.Connection object when a database is opened.

Dim x As Integer = 6

Dim y As Integer = 0

Try

x = CInt(x / y) ' Attempt to divide by zero.

' This procedure would fail silently without exception handling.

Catch ex As Exception

MsgBox("There was an error: " & ex.Message)

End Try

End Sub

Este exemplo gera um erro conforme o esperado. No entanto, se você tentar o mesmo
exemplo sem o bloco Try...Catch...Finally , o erro será ignorado como se você tivesse
usado a instrução OnError Resume Next . Sem tratamento de erros, a divisão por zero
falha silenciosamente. Como esses erros nunca geram erros de exceção sem tratamento,
é importante que você use alguma forma de tratamento de exceção em manipuladores
de eventos que lidam com eventos de objetos COM.

Noções básicas sobre erros de interoperabilidade COM


Sem tratamento de erros, as chamadas de interoperabilidade geralmente geram erros
que fornecem poucas informações. Sempre que possível, use o tratamento de erros
estruturados para fornecer mais informações sobre problemas quando ocorrerem. Isso
pode ser especialmente útil quando você depura aplicativos. Por exemplo:

VB

Try

' Place call to COM object here.

Catch ex As Exception

' Display information about the failed call.

End Try

Você pode encontrar informações como a descrição do erro, HRESULT e a origem de


erros COM examinando o conteúdo do objeto de exceção.

Problemas de controle ActiveX


A maioria dos controles ActiveX que funcionam com o Visual Basic 6.0 funcionam com o
.NET do Visual Basic sem problemas. As principais exceções são controles de contêiner
ou controles que contêm visualmente outros controles. Alguns exemplos de controles
mais antigos que não funcionam corretamente com o Visual Studio são os seguintes:
Controle de quadro 2.0 do Microsoft Forms 2.0

Controle de baixo para cima, também conhecido como controle de giro

Controle da guia Sheridan

Há apenas algumas soluções alternativas para problemas de controle ActiveX sem


suporte. Você pode migrar controles existentes para o Visual Studio se tiver o código-
fonte original. Caso contrário, você pode verificar com fornecedores de software se há
atualizações. Versões compatíveis com NET de controles para substituir controles
ActiveX sem suporte.

Passando propriedades ReadOnly de Controles


ByRef
O .NET do Visual Basic às vezes gera erros COM, como "Erro 0x800A017F
CTL_E_SETNOTSUPPORTED", quando você passa propriedades ReadOnly de alguns
controles ActiveX mais antigos como parâmetros ByRef para outros procedimentos.
Chamadas de procedimento semelhantes do Visual Basic 6.0 não geram um erro e os
parâmetros são tratados como se você as tivesse passado por valor. A mensagem de
erro do .NET do Visual Basic indica que você está tentando alterar uma propriedade que
não tem um procedimento de propriedade Set .

Se você tiver acesso ao procedimento que está sendo chamado, poderá evitar esse erro
usando a palavra-chave ByVal para declarar parâmetros que aceitam propriedades
ReadOnly . Por exemplo:

VB

Sub ProcessParams(ByVal c As Object)

'Use the arguments here.

End Sub

Se você não tiver acesso ao código-fonte do procedimento que está sendo chamado,
poderá forçar a propriedade a ser passada pelo valor adicionando um conjunto extra de
colchetes ao redor do procedimento de chamada. Por exemplo, em um projeto que tem
uma referência ao objeto COM da Biblioteca de Microsoft ActiveX Data Objects 2.8, você
pode usar:

VB

Sub PassByVal(ByVal pError As ADODB.Error)

' The extra set of parentheses around the arguments

' forces them to be passed by value.

ProcessParams((pError.Description))

End Sub

Implantando assemblies que expõem


interoperabilidade
A implantação de assemblies que expõem interfaces COM apresenta alguns desafios
exclusivos. Por exemplo, um problema potencial ocorre quando aplicativos separados
fazem referência ao mesmo assembly COM. Essa situação é comum quando uma nova
versão de um assembly é instalada e outro aplicativo ainda está usando a versão antiga
do assembly. Se você desinstalar um assembly que compartilha uma DLL, poderá torná-
lo indisponível sem querer para os outros assemblies.

Para evitar esse problema, você deve instalar assemblies compartilhados no GAC (Cache
de Assembly Global) e usar um MergeModule para o componente. Se você não puder
instalar o aplicativo no GAC, ele deverá ser instalado no CommonFilesFolder em um
subdiretório específico da versão.

Os assemblies que não são compartilhados devem estar localizados lado a lado no
diretório com o aplicativo de chamada.

Confira também
MarshalAsAttribute
Interoperabilidade COM
Tlbimp.exe (Importador de Biblioteca de Tipos)
Tlbexp.exe (Exportador de Biblioteca de Tipos)
Passo a passo: Implementação de herança com objetos COM
Instrução Inherits
Cache de assemblies global
Interoperabilidade COM em aplicativos
.NET Framework (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Quando você deseja usar objetos COM e objetos .NET Framework no mesmo aplicativo,
é necessário resolver as diferenças em como os objetos existem na memória. Um objeto
.NET Framework está localizado na memória gerenciada, a memória controlada pelo
Common Language Runtime, e pode ser movido pelo runtime conforme necessário. Um
objeto COM está localizado na memória não gerenciada e não é esperado que se mova
para outro local de memória. O Visual Studio e o .NET Framework fornecem ferramentas
para controlar a interação desses componentes gerenciados e não gerenciados. Para
obter mais informações sobre o código gerenciado, confira Common Language
Runtime.

Além de usar objetos COM em aplicativos .NET, talvez você também queira usar o Visual
Basic para desenvolver objetos acessíveis de código não gerenciado por meio de COM.

Os links nesta página fornecem detalhes sobre as interações entre objetos COM e .NET
Framework.

Seções relacionadas
Artigo Descrição

Interoperabilidade Fornece links para tópicos que abrangem a interoperabilidade COM no


COM Visual Basic, incluindo objetos COM, controles ActiveX, DLLs Win32, objetos
gerenciados e herança de objetos COM.

Interoperação Descreve brevemente alguns dos problemas de interação entre código


com código não gerenciado e não gerenciado e fornece links para mais estudos.
gerenciado

Wrappers COM Discute RCWs (Runtime Callable Wrappers), que permitem que o código
gerenciado chame métodos COM Callable Wrappers, que permitem que
clientes COM chamem métodos de objeto .NET.

Interoperabilidade Fornece links para tópicos que abrangem a interoperabilidade COM em


COM avançada relação a wrappers, exceções, herança, threading, eventos, conversões e
marshalling.
Artigo Descrição

Tlbimp.exe Discute a ferramenta que você pode usar para converter as definições de
(Importador de tipo encontradas dentro de uma biblioteca de tipos COM em definições
Biblioteca de equivalentes em um assembly do Common Language Runtime.
Tipos)
Instruções passo a passo:
implementando a herança com objetos
COM (Visual Basic)
Artigo • 22/02/2023 • 6 minutos para o fim da leitura

Você pode derivar classes do Visual Basic de classes Public em objetos COM, mesmo
aquelas criadas em versões anteriores do Visual Basic. As propriedades e os métodos de
classes herdados de objetos COM podem ser substituídos ou sobrecarregados assim
como propriedades e métodos de qualquer outra classe base podem ser substituídos
ou sobrecarregados. A herança de objetos COM é útil quando você tem uma biblioteca
de classes existente que não deseja recompilar.

O procedimento a seguir mostra como usar o Visual Basic 6.0 para criar um objeto COM
que contém uma classe e, em seguida, usá-la como uma classe base.

7 Observação

Seu computador pode mostrar diferentes nomes ou locais para alguns dos
elementos de interface do usuário do Visual Studio nas instruções a seguir. A
edição do Visual Studio que você possui e as configurações que você usa
determinam esses elementos. Para obter mais informações, consulte
Personalizando o IDE.

Para criar o objeto COM usado neste passo a


passo
1. No Visual Basic 6.0, abra um novo projeto de DLL do ActiveX. Um projeto chamado
Project1 é criado. Ele tem uma classe denominada Class1 .

2. No Explorador de Projeto, clique com o botão direito do mouse em Project1 e


clique em Propriedades do Project1. A caixa de diálogo Propriedades do Projeto é
exibida.

3. Na guia Geral da caixa de diálogo Propriedades do Projeto, altere o nome do


projeto ao digitar ComObject1 no campo Nome do Projeto.

4. No Explorador de Projeto, clique com o botão direito do mouse em Class1 e, em


seguida, clique em Propriedades. A janela Propriedades para a classe é exibida.
5. Altere a propriedade Name para MathFunctions .

6. No Explorador de Projeto, clique com o botão direito do mouse em


MathFunctions e, em seguida, clique em Exibir Código. O Editor de Código é

exibido.

7. Adicione uma variável local para manter o valor da propriedade:

VB

' Local variable to hold property value

Private mvarProp1 As Integer

8. Adicione os procedimentos de propriedade Property Let e Property Get s:

VB

Public Property Let Prop1(ByVal vData As Integer)

'Used when assigning a value to the property.

mvarProp1 = vData

End Property

Public Property Get Prop1() As Integer

'Used when retrieving a property's value.

Prop1 = mvarProp1

End Property

9. Adicione uma função:

VB

Function AddNumbers(

ByVal SomeNumber As Integer,

ByVal AnotherNumber As Integer) As Integer

AddNumbers = SomeNumber + AnotherNumber

End Function

10. Crie e registre o objeto COM clicando em Criar ComObject1.dll no menu Arquivo.

7 Observação

Embora você também possa expor uma classe criada com o Visual Basic como
um objeto COM, ele não é um objeto COM verdadeiro e não pode ser usado
neste passo a passo. Para obter detalhes, consulte Interoperabilidade COM
em aplicativos .NET Framework.
Assemblies de Interoperabilidade
No procedimento a seguir, você criará um assembly de interoperabilidade, que atua
como uma ponte entre código não gerenciado (como um objeto COM) e o código
gerenciado que o Visual Studio usa. O assembly de interoperabilidade que o Visual Basic
cria manipula muitos dos detalhes de trabalhar com objetos COM, como o agrupamento
de interoperabilidade, o processo de empacotamento de parâmetros e os valores
retornados em tipos de dados equivalentes à medida que eles se movem de e para
objetos COM. A referência no aplicativo Visual Basic aponta para o assembly de
interoperabilidade, não o objeto COM real.

Para usar um objeto COM com o Visual Basic 2005 e


versões posteriores
1. Abra um novo projeto de aplicativo do Windows Visual Basic.

2. No menu Projeto, clique em Adicionar Referência.

A caixa de diálogo Adicionar Referência é exibida.

3. Na guia COM, clique duas vezes em ComObject1 na lista Nome do Componente e


clique em OK.

4. No menu Projeto , clique em Adicionar Novo Item.

A caixa de diálogo Adicionar novo item é exibida.

5. No painel Modelos, clique em Classe.

O nome do arquivo padrão, Class1.vb , aparece no campo Nome. Altere esse


campo para MathClass.vb e clique em Adicionar. Isso cria uma classe chamada
MathClass e exibe seu código.

6. Adicione o código a seguir à parte superior de MathClass para herdar da classe


COM.

VB

' The inherited class is called MathFunctions in the base class,

' but the interop assembly appends the word Class to the name.

Inherits ComObject1.MathFunctionsClass

7. Sobrecarregue o método público da classe base adicionando o código a seguir a


MathClass :
VB

' This method overloads the method AddNumbers from the base class.

Overloads Function AddNumbers(

ByVal SomeNumber As Integer,

ByVal AnotherNumber As Integer) As Integer

Return SomeNumber + AnotherNumber

End Function

8. Estenda a classe herdada adicionando o código a seguir a MathClass :

VB

' The following function extends the inherited class.

Function SubtractNumbers(

ByVal SomeNumber As Integer,

ByVal AnotherNumber As Integer) As Integer

Return AnotherNumber - SomeNumber

End Function

A nova classe herda as propriedades da classe base no objeto COM, sobrecarrega um


método e define um novo método para estender a classe.

Para testar a classe herdada


1. Adicione um botão ao formulário de inicialização e clique duas vezes nele para
exibir seu código.

2. No procedimento do manipulador de eventos Click do botão, adicione o código


a seguir para criar uma instância de MathClass e chamar os métodos
sobrecarregados:

VB

Dim Result1 As Short

Dim Result2 As Integer

Dim Result3 As Integer

Dim MathObject As New MathClass

Result1 = MathObject.AddNumbers(4S, 2S) ' Add two Shorts.

Result2 = MathObject.AddNumbers(4, 2) 'Add two Integers.

Result3 = MathObject.SubtractNumbers(2, 4) ' Subtract 2 from 4.

MathObject.Prop1 = 6 ' Set an inherited property.

MsgBox("Calling the AddNumbers method in the base class " &

"using Short type numbers 4 and 2 = " & Result1)

MsgBox("Calling the overloaded AddNumbers method using " &

"Integer type numbers 4 and 2 = " & Result2)

MsgBox("Calling the SubtractNumbers method " &

"subtracting 2 from 4 = " & Result3)

MsgBox("The value of the inherited property is " &

MathObject.Prop1)

3. Execute o projeto pressionando F5.

Quando você clica no botão no formulário, o método AddNumbers é chamado pela


primeira vez com números de tipo de dados Short e o Visual Basic escolhe o método
apropriado na classe base. A segunda chamada a AddNumbers é direcionada para o
método de sobrecarga de MathClass . A terceira chamada chama o método
SubtractNumbers , que estende a classe. A propriedade na classe base é definida e o
valor é exibido.

Próximas etapas
Você deve ter notado que a função AddNumbers sobrecarregada parece ter o mesmo tipo
de dados que o método herdado da classe base do objeto COM. Isso ocorre porque os
argumentos e parâmetros do método de classe base são definidos como inteiros de 16
bits no Visual Basic 6.0, mas são expostos como inteiros de 16 bits do tipo Short em
versões posteriores do Visual Basic. A nova função aceita inteiros de 32 bits e
sobrecarrega a função de classe base.

Ao trabalhar com objetos COM, verifique o tamanho e os tipos de dados dos


parâmetros. Por exemplo, quando você está usando um objeto COM que aceita um
objeto de coleção do Visual Basic 6.0 como argumento, não é possível fornecer uma
coleção de uma versão posterior do Visual Basic.

As propriedades e os métodos herdados de classes COM podem ser substituídos, o que


significa que você pode declarar uma propriedade ou método local que substitui uma
propriedade ou método herdado de uma classe COM base. As regras para substituir as
propriedades COM herdadas são semelhantes às regras para substituir outras
propriedades e métodos com as seguintes exceções:

Se você substituir qualquer propriedade ou método herdado de uma classe COM,


deverá substituir todas as outras propriedades e métodos herdados.

As propriedades que usam parâmetros ByRef não podem ser substituídas.

Confira também
Interoperabilidade COM em aplicativos .NET Framework
Instrução Inherits
Tipo de Dados Short
Referência da linguagem Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Esta seção fornece informações de referência para vários aspectos da linguagem Visual
Basic.

Nesta seção
Convenções tipográficas e de código

Resume a forma como palavras-chave, espaços reservados e outros elementos da


linguagem são formatados na documentação do Visual Basic.

Membros da Biblioteca de Runtime do Visual Basic

Lista as classes e os módulos do namespace Microsoft.VisualBasic, com links para as


funções, os métodos, as propriedades, as constantes e as enumerações dos seus
membros.

Palavras-chave

Lista todas as palavras-chave do Visual Basic e fornece links para mais informações.

Atributos (Visual Basic)

Documenta os atributos disponíveis no Visual Basic.

Constantes e Enumerações

Documenta as constantes e enumerações disponíveis no Visual Basic.

Data Types

Documenta os tipos de dados disponíveis no Visual Basic.

Diretivas

Documenta as diretivas de compilador disponíveis no Visual Basic.

Funções

Documenta as funções de tempo de execução disponíveis no Visual Basic.

Modificadores

Lista os modificadores de tempo de execução do Visual Basic e fornece links para mais
informações.

Módulos

Documenta os módulos disponíveis no Visual Basic e seus membros.


Nothing

Descreve o valor padrão de qualquer tipo de dados.

Objetos

Documenta os objetos disponíveis no Visual Basic e seus membros.

Operadores

Documenta os operadores disponíveis no Visual Basic.

Propriedades

Documenta as propriedades disponíveis no Visual Basic.

Consultas

Fornece informações de referência sobre como usar expressões LINQ (Consulta


Integrada à Linguagem) no código.

Instruções

Documenta as instruções de declaração e executáveis disponíveis no Visual Basic.

Marcações de Comentário XML

Descreve os comentários da documentação para os quais o IntelliSense é fornecido no


Editor de Códigos do Visual Basic.

Propriedades do eixo XML

Fornece links para informações sobre como usar propriedades do eixo XML para acessar
XML diretamente no código.

Literais XML

Fornece links para informações sobre como usar literais do XML para incorporar XML
diretamente ao código.

Mensagens de Erro

Fornece uma lista de mensagens de erro em tempo de execução e do compilador do


Visual Basic e ajuda sobre como lidar com elas.

Seções relacionadas
Compilador de linha de comando do Visual Basic

Descreve como usar o compilador de linha de comando como alternativa para compilar
programas no IDE (ambiente de desenvolvimento integrado) do Visual Studio.
Selecionar a versão da linguagem do
Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O compilador Visual Basic usa como padrão a última versão principal da linguagem que
foi liberada. Você pode optar por compilar qualquer projeto usando uma nova versão
de ponto da linguagem. A escolha de uma versão mais recente da linguagem permite
que o projeto use as últimas funcionalidades da linguagem. Em outros cenários, talvez
você precise validar se um projeto é compilado por completo ao usar uma versão mais
antiga da linguagem.

Essa funcionalidade separa a decisão de instalar novas versões do SDK e das


ferramentas no ambiente de desenvolvimento da decisão de incorporar novas
funcionalidades da linguagem em um projeto. Instale o último SDK e as últimas
ferramentas no computador de build. Cada projeto pode ser configurado para usar uma
versão específica da linguagem de seu build.

Há várias maneiras de definir a versão da linguagem:

Editar manualmente o arquivo .vbproj


Definir a versão da linguagem para vários projetos em um subdiretório
Configurar a opção -langversion do compilador

Editar o arquivo vbproj


Você pode definir a versão da linguagem no arquivo .vbproj. Adicione o seguinte
elemento:

XML

<PropertyGroup>

<LangVersion>latest</LangVersion>

</PropertyGroup>

O valor latest usa a última versão secundária da linguagem Visual Basic. Os valores
válidos são:

Valor Significado

padrão O compilador aceita toda a sintaxe de linguagem válida da versão principal mais
recente à qual dá suporte.
Valor Significado

9 O compilador aceita somente a sintaxe incluída no Visual Basic 9.0 ou inferior.

10 O compilador aceita somente a sintaxe incluída no Visual Basic 10.0 ou inferior.

11 O compilador aceita somente a sintaxe incluída no Visual Basic 11.0 ou inferior.

12 O compilador aceita somente a sintaxe incluída no Visual Basic 12.0 ou inferior.

14 O compilador aceita somente a sintaxe incluída no Visual Basic 14.0 ou inferior.

15 O compilador aceita somente a sintaxe incluída no Visual Basic 15.0 ou inferior.

15.3 O compilador aceita somente a sintaxe incluída no Visual Basic 15.3 ou inferior.

15.5 O compilador aceita somente a sintaxe incluída no Visual Basic 15.5 ou inferior.

16 O compilador aceita somente a sintaxe incluída no Visual Basic 16 ou inferior.

16,9 O compilador aceita somente a sintaxe incluída no Visual Basic 16.9 ou inferior.

mais O compilador aceita toda a sintaxe de linguagem à qual dá suporte.


recente

As cadeias de caracteres especiais default e latest são resolvidas nas últimas versões
da linguagem principal e secundária instaladas no computador de build,
respectivamente.

Configurar vários projetos


Crie um arquivo Directory.build.props que contém o elemento <LangVersion> para
configurar vários diretórios. Normalmente, você faz isso no diretório da solução.
Adicione o seguinte a um arquivo Directory.build.props no diretório de solução:

XML

<Project>

<PropertyGroup>

<LangVersion>15.5</LangVersion>

</PropertyGroup>

</Project>

Agora, os builds de cada subdiretório do diretório que contém esse arquivo usarão a
sintaxe Visual Basic versão 15.5. Para obter mais informações, confira o artigo sobre
como personalizar o build.
Definir a opção langversion do compilador
Você pode usar a opção -langversion da linha de comando. Para obter mais
informações, confira o artigo sobre a opção -langversion do compilador. Veja uma lista
dos valores válidos digitando vbc -langversion:? .
Convenções tipográficas e de código
(Visual Basic)
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

A documentação do Visual Basic usa as convenções tipográficas e de código a seguir.

Convenções tipográficas
Exemplo Descrição

Sub , If , ChDir , As palavras-chave e os membros de runtime específicos da linguagem têm


Print , True , letras maiúsculas iniciais e são formatados conforme mostrado neste
Debug exemplo.

SmallProject, Palavras e frases que você recebe instrução para digitar são formatadas
ButtonCollection conforme mostrado neste exemplo.

Instrução Os links que você pode clicar para ir para outra página de Ajuda são
Module formatados conforme mostrado neste exemplo.

object, Espaços reservados para informações fornecidas são formatados conforme


variableName, mostrado neste exemplo.
argumentList

[ Shadows ], [ Na sintaxe, os itens opcionais são colocados entre colchetes.


expressionList ]

{ Public | Na sintaxe, quando você precisa fazer uma escolha entre dois ou mais itens,
Friend | Private os itens são colocados entre chaves e separados por barras verticais.

}
Você precisa selecionar apenas um dos itens.

[ Protected | Na sintaxe, quando você tem a opção de selecionar entre dois ou mais itens,
Friend ] os itens são colocados entre colchetes e separados por barras verticais.

Você pode selecionar qualquer combinação dos itens ou nenhum item.

[{ ByVal | ByRef Na sintaxe, quando você pode selecionar não mais do que um item, mas
}] também pode omitir completamente os itens, os itens são colocados entre
colchetes cercados por chaves e separados por barras verticais.

memberName1, Várias instâncias do mesmo espaço reservado são diferenciadas por


memberName2, subscritos, conforme mostrado no exemplo.
memberName3
Exemplo Descrição

memberName1
Na sintaxe, reticências (...) são usadas para indicar um número indefinido de
itens do tipo imediatamente na frente das reticências.

...

No código, as reticências significam o código omitido para fins de clareza.


memberNameN

ESC, ENTER Os nomes de teclas e as sequências de teclas no teclado aparecem com todas
as letras maiúsculas.

ALT+F1 Quando sinais de adição (+) aparecem entre nomes de teclas, você precisa
manter uma tecla pressionada enquanto pressiona a outra. Por exemplo,
ALT+F1 significa manter pressionada a tecla ALT enquanto pressiona a tecla
F1.

Convenções de código
Exemplo Descrição

sampleString = "Hello, world!" Exemplos de código aparecem em uma fonte de densidade


fixa e são formatados conforme mostrado neste exemplo.

A instrução anterior define o valor Elementos de código em texto explicativo aparecem em


de sampleString como "Olá, uma fonte de densidade fixa, conforme mostrado neste
mundo!" exemplo.

' This is a comment.


Os comentários de código são introduzidos por um
apóstrofo (') ou pela palavra-chave REM.
REM This is also a comment.

sampleVar = "This is an " _


Um espaço seguido por um sublinhado (_) no final de uma
linha indica que a instrução continua na linha a seguir.
& "example" _

& " of how to continue code."

Confira também
Referência da linguagem Visual Basic
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Convenções de nomenclatura do Visual Basic
Como: Quebrar e combinar instruções no código
Comentários no código
Membros da Biblioteca de Runtime do
Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O namespace Microsoft.VisualBasic contém as classes, módulos, constantes e


enumerações que constituem a biblioteca de runtime do Visual Basic. Esses membros da
biblioteca fornecem procedimentos, propriedades e valores constantes que você pode
usar no código. Cada módulo e classe representa uma categoria específica de
funcionalidade.

Classe Microsoft.VisualBasic.Collection
Add
Clear
Contains
Count
GetEnumerator
Item[]
Remove

Classe Microsoft.VisualBasic.ComClassAttribute
ClassID
EventID
InterfaceID
InterfaceShadows

Classe Microsoft.VisualBasic.ControlChars
Back
Cr
CrLf
FormFeed
Lf
NewLine
NullChar
Quote
Tab
VerticalTab

Classe Microsoft.VisualBasic.Constants
vbAbort

vbAbortRetryIgnore

vbApplicationModal

vbArchive

vbArray

vbBack

vbBinaryCompare

vbBoolean

vbByte

vbCancel

vbCr

vbCritical

vbCrLf

vbCurrency

vbDate

vbDecimal

vbDefaultButton1

vbDefaultButton2

vbDefaultButton3

vbDirectory

vbDouble
vbEmpty

vbExclamation

vbFalse

vbFirstFourDays

vbFirstFullWeek

vbFirstJan1

vbFormFeed

vbFriday

vbGeneralDate

vbGet

vbHidden

vbHide

vbHiragana

vbIgnore

vbInformation

vbInteger

vbKatakana

vbLet

vbLf

vbLinguisticCasing

vbLong

vbLongDate

vbLongTime
vbLowerCase

vbMaximizedFocus

vbMethod

vbMinimizedFocus

vbMinimizedNoFocus

vbMonday

vbMsgBoxHelp

vbMsgBoxRight

vbMsgBoxRtlReading

vbMsgBoxSetForeground

vbNarrow

vbNewLine

vbNo

vbNormal

vbNormalFocus

vbNormalNoFocus

vbNull

vbNullChar

vbNullString

vbObject

vbObjectError

vbOK

vbOKCancel

vbOKOnly
vbProperCase

vbQuestion

vbReadOnly

vbRetry

vbRetryCancel

vbSaturday

vbSet

vbShortDate

vbShortTime

vbSimplifiedChinese

vbSingle

vbString

vbSunday

vbSystem

vbSystemModal

vbTab

vbTextCompare

vbThursday

vbTraditionalChinese

vbTrue

vbTuesday

vbUpperCase

vbUseDefault

vbUserDefinedType
vbUseSystem

vbUseSystemDayOfWeek

vbVariant

vbVerticalTab

vbVolume

vbWednesday

vbWide

vbYes

vbYesNo

vbYesNoCancel

Módulo Microsoft.VisualBasic.Conversion
ErrorToString
Fix
Hex
Int
Oct
Str
Val

Módulo Microsoft.VisualBasic.DateAndTime
DateAdd

DateDiff

DatePart

DateSerial

DateString

DateValue
Day

Hour

Minute

Month

MonthName

Now

Second

TimeOfDay

Timer

TimeSerial

TimeString

TimeValue

Today

Weekday

WeekdayName

Year

Classe Microsoft.VisualBasic.ErrObject
Clear
Description
Erl
GetException
HelpContext
HelpFile
LastDllError
Number
Raise
Raise
Módulo Microsoft.VisualBasic.FileSystem
ChDir

ChDrive

CurDir

Dir

EOF

FileAttr

FileClose

FileCopy

FileDateTime

FileGet

FileGetObject

FileLen

FileOpen

FilePut

FilePutObject

FileWidth

FreeFile

GetAttr

Input

InputString

Kill

LineInput
Loc

Lock

LOF

MkDir

Print

PrintLine

Rename

Reset

RmDir

Seek

SetAttr

SPC

TAB

Unlock

Write

WriteLine

Módulo Microsoft.VisualBasic.Financial
DDB
FV
IPmt
IRR
MIRR
NPer
NPV
Pmt
PPmt
PV
Rate
SLN
SYD

Módulo Microsoft.VisualBasic.Globals
ScriptEngine
ScriptEngineBuildVersion
ScriptEngineMajorVersion
ScriptEngineMinorVersion

Classe
Microsoft.VisualBasic.HideModuleNameAttribute
HideModuleNameAttribute

Módulo Microsoft.VisualBasic.Information
Erl

Err

IsArray

IsDate

IsDBNull

IsError

IsNothing

IsNumeric

IsReference

LBound

QBColor

RGB
SystemTypeName

TypeName

UBound

VarType

VbTypeName

Módulo Microsoft.VisualBasic.Interaction
AppActivate

Beep

CallByName

Choose

Command

CreateObject

DeleteSetting

Environ

GetAllSettings

GetObject

GetSetting

IIf

InputBox

MsgBox

Partition

SaveSetting

Shell
Switch

Classe
Microsoft.VisualBasic.MyGroupCollectionAttribute
CreateMethod
DefaultInstanceAlias
DisposeMethod
MyGroupName

Módulo Microsoft.VisualBasic.Strings
Asc

Asc

Chr

ChrW

Filter

Format

FormatCurrency

FormatDateTime

FormatNumber

FormatPercent

GetChar

InStr

InStrRev

Join

LCase

Left
Len

LSet

LTrim

Mid

Replace

Right

RSet

RTrim

Space

Split

StrComp

StrConv

StrDup

StrReverse

Trim

UCase

Classe
Microsoft.VisualBasic.VBFixedArrayAttribute
Bounds
Length

Classe
Microsoft.VisualBasic.VBFixedStringAttribute
Length
Módulo Microsoft.VisualBasic.VbMath
Randomize
Rnd

Constantes e Enumerações
Microsoft.VisualBasic
O namespace Microsoft.VisualBasic fornece constantes e enumerações como parte da
biblioteca de tempo de execução do Visual Basic. Você pode usar esses valores
constantes no código. Cada enumeração representa uma categoria específica de
funcionalidade. Para obter mais informações, confira Constantes e Enumerações.

Confira também
Constantes e Enumerações
Palavras-chave
Palavras-chave (Visual Basic)
Artigo • 22/02/2023 • 4 minutos para o fim da leitura

As tabelas seguintes listam todas as palavras-chave do Visual Basic.

Palavras-chave reservadas
As seguintes palavras-chave são reservadas, o que significa que elas não podem ser
usadas como nomes para elementos de programação, como variáveis ou
procedimentos. Você pode evitar essa restrição colocando o nome entre colchetes ( [] ).
Para obter mais informações, consulte "Nomes de escape" em Nomes de elemento
declarado.

7 Observação

Não recomendamos que você use nomes de escape, porque isso pode tornar o
código difícil de ler e pode levar a erros sutis que podem ser difíceis de encontrar.

AddHandler

AddressOf

Alias

And

AndAlso

As

Boolean

ByRef

Byte

ByVal

Call

Case
Catch

CBool

CByte

CChar

CDate

CDbl

CDec

Char

CInt

Class Restrição

Class Instrução

CLng

CObj

Const

Continue

CSByte

CShort

CSng

CStr

CType

CUInt

CULng

CUShort

Date
Decimal

Declare

Default

Delegate

Dim

DirectCast

Do

Double

Each

Else

ElseIf

End Instrução

End<Palavra-chave>

EndIf

Enum

Erase

Error

Event

Exit

False

Finally

For (em For…Next)

For Each…Next

Friend
Function

Get

GetType

GetXMLNamespace

Global

GoSub

GoTo

Handles

If

If()

Implements

Implements Instrução

Imports (Namespace e Tipo do .NET)

Imports (Namespace de XML)

In

In (Modificador Genérico)

Inherits

Integer

Interface

Is

IsNot

Let

Lib

Like
Long

Loop

Me

Mod

Module

Module Instrução

MustInherit

MustOverride

MyBase

MyClass

NameOf

Namespace

Narrowing

New Restrição

New Operador

Next

Next (em Resume)

Not

Nothing

NotInheritable

NotOverridable

Object

Of

On
Operator

Option

Optional

Or

OrElse

Out (Modificador Genérico)

Overloads

Overridable

Overrides

ParamArray

Partial

Private

Property

Protected

Public

RaiseEvent

ReadOnly

ReDim

REM

RemoveHandler

Resume

Return

SByte

Select
Set

Shadows

Shared

Short

Single

Static

Step

Stop

String

Structure Restrição

Structure Instrução

Sub

SyncLock

Then

Throw

To

True

Try

TryCast

TypeOf…Is

UInteger

ULong

UShort

Using
Variant

Wend

When

While

Widening

With

WithEvents

WriteOnly

Xor

#Const

#Else

#ElseIf

#End

#If

&

&=

*=

/=

\=

^
^=

+=

-=

>> Operador

>>= Operador

<<

<<=

7 Observação

EndIf , GoSub , Variant e Wend são mantidos como palavras-chave reservadas,

embora não sejam mais usados no Visual Basic. O significado da palavra-chave Let
foi alterada. Let agora é usado em consultas LINQ. Para obter mais informações,
consulte Cláusula Let.

Palavras-chave não reservadas


As seguintes palavras-chave não são reservadas, o que significa que elas podem ser
usadas como nomes de elementos de programação. No entanto, isso não é
recomendado, pois pode tornar o código difícil de ler e pode levar a erros sutis que
podem ser difíceis de encontrar.

Aggregate

Auto

Custom

From

IsFalse

Key

Preserve

Take

Until

#Region

Ansi

Await
Distinct

Group By

IsTrue

Mid

Skip

Take While

Where

Assembly

Binary

Equals

Group Join

Iterator

Off

Skip While

Text

Yield

Async

Compare

Explicit

Into

Join

Order By

Strict

Unicode

#ExternalSource

Artigos relacionados
Título Descrição

Resumo de Lista os elementos de linguagem que são usados para criar, definir e usar
Matrizes matrizes.
Título Descrição

Resumo do Lista os elementos de linguagem que são usados para coleções.


Objeto de
Coleção

Resumo do Lista as instruções que são usadas para o loop e para controlar o fluxo do
Fluxo de procedimento.
Controle

Resumo da Lista as funções que são usadas para converter números, datas, horas e cadeias
Conversão de caracteres.

Resumo de Lista os tipos de dados. Também lista as funções que são usadas para converter
Tipos de entre tipos de dados e verificar os tipos de dados.
Dados

Resumo de Lista os elementos de linguagem que são usados para datas e horas.
datas e horas

Resumo de Lista as instruções que são usadas para declarar variáveis, constantes, classes,
Declarações módulos e outros elementos de programação. Também lista elementos de
e Constantes linguagem que são usados para obter informações de objeto, manipular eventos
e implementar herança.

Resumo de Lista as funções que são usadas para controlar o sistema de arquivos e processar
diretórios e os arquivos.
arquivos

Resumo de Lista os elementos de linguagem que são usados para capturar e retornar valores
Erros de erro em tempo de execução.

Resumo Lista as funções que são usadas para executar cálculos financeiros.
Financeiro

Resumo de Lista as funções que são usadas para ler e gravar arquivos, gerenciar arquivos e
entrada e imprimir resultados.
saída

Informações Lista as funções que são usadas para executar outros programas, obter os
e resumo da argumentos de linha de comando, manipular objetos COM, recuperar
interação informações de cores e usar as caixas de diálogo de controle.

Resumo de Lista as funções que são usadas para executar cálculos trigonométricos e outros
matemática cálculos matemáticos.

Minha Lista os objetos contidos no My , um recurso que fornece acesso aos métodos
Referência usados com frequência, propriedades e eventos do computador no qual o
aplicativo está em execução, o aplicativo atual, os recursos do aplicativo, as
configurações do aplicativo e etc.
Título Descrição

Resumo de Lista as atribuições e expressões de comparação e outros operadores.


Operadores

Resumo do Lista as funções que são usadas para ler, salvar e excluir configurações de
Registro programa.

Resumo de Lista as funções que são usadas para manipular cadeias de caracteres.
manipulação
da cadeia de
caracteres

Confira também
Membros da Biblioteca de Runtime do Visual Basic
Resumo de matrizes (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave de linguagem do Visual Basic e os membros da biblioteca de runtime


são organizados por finalidade e uso.

Ação Elemento de linguagem

Verifique uma matriz. IsArray

Declare e inicialize uma matriz. Dim, Private, Public, ReDim

Localize os limites de uma matriz. LBound, UBound

Reinicializar uma matriz Erase, ReDim

Confira também
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Resumo do objeto de coleção (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave de linguagem do Visual Basic e os membros da biblioteca de runtime


são organizados por finalidade e uso.

Ação Elemento de linguagem

Crie um objeto Collection . Collection

Adicionar um item a uma coleção. Add

Remover um objeto de uma coleção. Remove

Referenciar um item em uma coleção. Item[]

Retornar uma referência a uma interface IEnumerator. IEnumerable.GetEnumerator

Confira também
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Resumo do fluxo de controle (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave de linguagem do Visual Basic e os membros da biblioteca de runtime


são organizados por finalidade e uso.

Ação Elemento de linguagem

Ramificação. GoTo, On Error

Saia ou pause o programa. End, Exit, Stop

Loop. Do...Loop, For...Next, For Each...Next, While...End While, With

Toma decisões. Choose, If...Then...Else, Select Case, Switch

Usa procedimentos. Call, Function, Property, Sub

Confira também
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Resumo da conversão (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave de linguagem do Visual Basic e os membros da biblioteca de runtime


são organizados por finalidade e uso.

Ação Elemento de linguagem

Converter o valor ANSI em cadeia de Chr, ChrW


caracteres.

Converter a cadeia de caracteres em letras Format, LCase,UCase


minúsculas ou maiúsculas.

Converter data em número de série. DateSerial, DateValue

Converter o número decimal em outras Hex, Oct


bases.

Converter número em cadeia de caracteres. Format, Str

Converte um tipo de dados em outro. CBool, CByte, CDate, CDbl, CDec, CInt, CLng, CSng,
CShort, CStr, CType, Fix, Int

Converter data em dia, mês, dia da semana Day, Month, Weekday, Year
ou ano.

Converter tempo em hora, minuto ou Hour, Minute, Second


segundo.

Converter cadeia de caracteres em valor Asc, AscW


ASCII.

Converter cadeia de caracteres em número. Val

Converter tempo em número de série. TimeSerial, TimeValue

Confira também
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Resumo de tipos de dados (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave de linguagem do Visual Basic e os membros da biblioteca de runtime


são organizados por finalidade e uso.

Ação Elemento de linguagem

Converter entre tipos de CBool, CByte, CChar, CDate, CDbl, CDec, CInt, CLng, CObj, CShort,
dados CSng, CStr, Fix, Int

Definir tipos de dados Boolean, Byte, Char, Date, Decimal, Double, Integer, Long, Object,
intrínsecos Short, Single, String

Verificar tipos de dados IsArray, IsDate, IsDBNull, IsError, IsNothing, IsNumeric, IsReference

Confira também
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Resumo de datas e horas (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave de linguagem do Visual Basic e os membros da biblioteca de runtime


são organizados por finalidade e uso.

Ação Elemento de linguagem

Obter a data ou hora atual. Now, Today, TimeOfDay

Executar cálculos de data. DateAdd, DateDiff, DatePart

Retornar uma data. DateSerial, DateValue, MonthName, WeekdayName

Retornar uma hora. TimeSerial, TimeValue

Definir a data ou hora. DateString, TimeOfDay, TimeString, Today

Cronometrar um processo. Timer

Confira também
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Resumo de declarações e constantes
(Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave de linguagem do Visual Basic e os membros da biblioteca de runtime


são organizados por finalidade e uso.

Ação Elemento de linguagem

Atribuir um valor. Get, Property

Declarar variáveis e constantes. Const, Dim, Private, Protected, Public, Shadows, Shared, Static

Declarar classe, delegado, Class, Delegate, Enum, Module, Namespace, Structure


enumeração, módulo, namespace
ou estrutura.

Criar objetos. CreateObject, GetObject, New

Obter informações sobre um GetType, IsArray, IsDate, IsDBNull, IsError, IsNothing,


objeto. IsNumeric, IsReference, SystemTypeName, TypeName,
VarType, VbTypeName

Fazer referência ao objeto atual. Eu

Exigir declarações de variáveis Option Explicit, Option Strict


explícitas.

Identificar eventos. AddHandler, Event, RaiseEvent, RemoveHandler

Implementar herança. Inherits, MustInherit, MustOverride, MyBase, MyClass, New,


NotInheritable, NotOverridable, Overloads, Overridable,
Overrides

Confira também
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Resumo de diretórios e arquivos (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave de linguagem do Visual Basic e os membros da biblioteca de runtime


são organizados por finalidade e uso.

O uso do recurso My permite melhorar a produtividade e o desempenho em operações


de E/S de arquivo em relação ao módulo . Para obter mais informações, consulte
FileSystem.

Ação Elemento de linguagem

Alterar um diretório ou uma pasta. ChDir

Alterar a letra da unidade. ChDrive

Copia um arquivo. FileCopy

Alterar um diretório ou uma pasta. MkDir

Alterar um diretório ou uma pasta. RmDir

Renomear um arquivo, diretório ou uma pasta. Rename

Retornar o caminho atual. CurDir

Retornar o carimbo de data/hora de um arquivo. FileDateTime

Retornar atributos de arquivo, diretório ou rótulo. GetAttr

Retornar o comprimento de um arquivo. FileLen

Retornar o nome ou rótulo de volume de um arquivo. Dir

Definir informações de atributo de um arquivo. SetAttr

Confira também
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Ler arquivos
Gravar em arquivos
Criar, excluir e mover arquivos e diretórios
Analisando arquivos de texto com o objeto TextFieldParser
Resumo de erros (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave de linguagem do Visual Basic e os membros da biblioteca de runtime


são organizados por finalidade e uso.

Ação Elemento de linguagem

Gerar erros em tempo de execução. Clear, Erro, Raise

Obter exceções. GetException

Fornecer informações de erro. Err

Capturar erros durante o tempo de execução. Em Erro, Retomar, Try...Catch...Finally

Fornecer o número de linha do erro. Erl

Fornecer o código de erro do sistema. LastDllError

Confira também
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Resumo financeiro (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave de linguagem do Visual Basic e os membros da biblioteca de runtime


são organizados por finalidade e uso.

Ação Elemento de linguagem

Calcular depreciação. DDB, SLN, SYD

Calcular valor futuro. FV

Calcular a taxa de juros. Rate

Calcular a taxa interna de retorno. IRR, MIRR

Calcular o número de períodos. NPer

Calcular pagamentos. IPmt, Pmt, PPmt

Calcular o valor presente. NPV, PV

Confira também
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Informações e resumo da interação
(Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave de linguagem do Visual Basic e os membros da biblioteca de runtime


são organizados por finalidade e uso.

Ação Elemento de linguagem

Execute outros programas. AppActivate, Shell

Chame um método ou propriedade. CallByName

Soe um sinal sonoro no computador. Beep

Forneça uma cadeia de caracteres de linha de comando. Command

Manipule objetos COM. CreateObject, GetObject

Recupere informações de cor. QBColor, RGB

Controle caixas de diálogo InputBox, MsgBox

Confira também
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Resumo de entrada e saída (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave de linguagem do Visual Basic e os membros da biblioteca de runtime


são organizados por finalidade e uso.

Ação Elemento de linguagem

Acessa ou cria um arquivo. FileOpen

Fecha arquivos. FileClose, Reset

Controla a aparência da saída. Format, Print, SPC, TAB, FileWidth

Copia um arquivo. FileCopy

Obtêm Informações sobre um arquivo. EOF, FileAttr, FileDateTime, FileLen,


FreeFile, GetAttr, Loc, LOF, Seek

Obtém ou fornece informações de/para o usuário por InputBox, MsgBox


meio de uma caixa de diálogo de controle.

Gerencia arquivos. Dir, Kill, Lock, Unlock

Lê de um arquivo. FileGet, FileGetObject, Input,


InputString, LineInput

Retorna o comprimento de um arquivo. FileLen

Define ou obtém atributos de arquivo. FileAttr, GetAttr, SetAttr

Define a posição de leitura-gravação em um arquivo. Seek

Grava em um arquivo. FilePut, FilePutObject, Print, Write,


WriteLine

Confira também
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Resumo de matemática (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave de linguagem do Visual Basic e os membros da biblioteca de runtime


são organizados por finalidade e uso.

Ação Elemento de linguagem

Derivar funções trigonométricas. Atan, Cos, Sin, Tan

Cálculos gerais. Exp, Log, Sqrt

Gerar números aleatórios. Randomize, Rnd

Obter valor absoluto. Abs

Obter o sinal de uma expressão. Sign

Realizar conversões numéricas. Fix, Int

Confira também
Funções Matemáticas Derivadas
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Funções matemáticas derivadas (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A tabela a seguir mostra funções matemáticas não intrínsecas que podem ser derivadas
das funções matemáticas intrínsecas do objeto System.Math. Você pode acessar as
funções matemáticas intrínsecas adicionando Imports System.Math ao seu arquivo ou
projeto.

Função Equivalentes derivados

Secant (s(x)) 1 / Cos(x)

Cossecant (Csc(x)) 1 / Sin(x)

Cotangent (Ctan(x)) 1 / Tan(x)

Inverse sine (Asin(x)) Atan(x / Sqrt(-x * x + 1))

Inverse cosine (Acos(x)) Atan(-x / Sqrt(-x * x + 1)) + 2 * Atan(1)

Inverse secant (Asec(x)) 2 * Atan(1) – Atan(Sign(x) / Sqrt(x * x – 1))

Inverse cosecant (Acsc(x)) Atan(Sign(x) / Sqrt(x * x – 1))

Inverse cotangent (Acot(x)) 2 * Atan(1) - Atan(x)

Hyperbolic sine (Sinh(x)) (Exp(x) – Exp(-x)) / 2

Hyperbolic cosine (Cosh(x)) (Exp(x) + Exp(-x)) / 2

Hyperbolic tangent (Tanh(x)) (Exp(x) – Exp(-x)) / (Exp(x) + Exp(-x))

Hyperbolic secant (Sech(x)) 2 / (Exp(x) + Exp(-x))

Hyperbolic cosecant (Csch(x)) 2 / (Exp(x) – Exp(-x))

Hyperbolic cotangent (Coth(x)) (Exp(x) + Exp(-x)) / (Exp(x) – Exp(-x))

Inverse hyperbolic sine (Asinh(x)) Log(x + Sqrt(x * x + 1))

Inverse hyperbolic cosine (Acosh(x)) Log(x + Sqrt(x * x – 1))

Inverse hyperbolic tangent (Atanh(x)) Log((1 + x) / (1 – x)) / 2

Inverse hyperbolic secant (AsecH(x)) Log((Sqrt(-x * x + 1) + 1) / x)

Inverse hyperbolic cosecant (Acsch(x)) Log((Sign(x) * Sqrt(x * x + 1) + 1) / x)


Função Equivalentes derivados

Inverse hyperbolic cotangent (Acoth(x)) Log((x + 1) / (x – 1)) / 2

Confira também
Funções Matemáticas
Minha referência (Visual Basic)
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

O recurso My torna a programação mais rápida e fácil, dando a você acesso intuitivo a
métodos, propriedades e eventos usados regularmente. Esta tabela lista os objetos
contidos em My e as ações que podem ser executadas com cada um deles.

Ação Objeto

Acessar informações e serviços do O objeto My.Application consiste nas seguintes


aplicativo. classes:

ApplicationBase fornece membros disponíveis em


todos os projetos.

WindowsFormsApplicationBase fornece membros


disponíveis nos aplicativos do Windows Forms.

ConsoleApplicationBase fornece membros disponíveis


nos aplicativos de console.

Acessar o computador host e os My.Computer (Computer)


respectivos recursos, serviços e dados.

Acessar os formulários no projeto atual. Objeto My.Forms

Acessar o log do aplicativo. My.Application.Log (Log)

Acessar a solicitação da Web atual. Objeto My.Request

Acessar elementos de recurso. Objeto My.Resources

Acessar a resposta da Web atual. Objeto My.Response

Acessar as configurações de nível de Objeto My.Settings


usuário e de aplicativo.

Acessar o contexto de segurança do My.User (User)


usuário atual.

Acessar serviços Web XML Objeto My.WebServices


referenciados pelo projeto atual.

Confira também
Visão geral do modelo de aplicativo do Visual Basic
Desenvolvimento com My
Resumo de operadores (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave de linguagem do Visual Basic e os membros da biblioteca de runtime


são organizados por finalidade e uso.

Ação Elemento de linguagem

Aritmético ^, –, *, /, \, Mod, +, =

Atribuição =, ^=, *=, /=, \=, +=, -=, &=

Comparação =, <>, <, >, <=, >=, Like, Is

Concatenação &, +

Operações lógicas/bit a bit Not, And, Or, Xor, AndAlso, OrElse

Operações diversas AddressOf, Await, GetType

Confira também
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Resumo do registro (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave de linguagem do Visual Studio e os membros da biblioteca de


runtime são organizados por finalidade e uso.

O uso do recurso My oferece melhor produtividade e desempenho em operações do


Registro do que esses elementos. Para obter mais informações, consulte RegistryProxy.

Ação Elemento de linguagem

Excluir configurações do programa. DeleteSetting

Ler as configurações do programa. GetSetting, GetAllSettings

Salvar as configurações do programa. SaveSetting

Confira também
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Ler e gravar no Registro
Resumo de manipulação da cadeia de
caracteres (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave de linguagem do Visual Basic e os membros da biblioteca de runtime


são organizados por finalidade e uso.

Ação Elemento de linguagem

Comparar duas cadeias de caracteres. StrComp

Converter cadeias de caracteres. StrConv

Inverter uma cadeia de caracteres. InStrRev, StrReverse

Converter em letras minúsculas ou Format, LCase, UCase


maiúsculas.

Criar uma cadeia de caracteres de Space, StrDup


repetição.

Encontrar o comprimento de uma cadeia Len


de caracteres.

Formatar uma cadeia de caracteres. Format, FormatCurrency, FormatDateTime,


FormatNumber, FormatPercent

Manipular cadeias de caracteres. InStr, Left, LTrim, Mid, Right, RTrim, Trim

Definir regras de comparação de cadeia de Opção Comparar


caracteres.

Trabalhar com valores ASCII e ANSI. Asc, AscW, Chr, ChrW

Substituir uma substring especificada. Replace

Retornar uma matriz de cadeia de Filter


caracteres baseada em filtro.

Retornar um número especificado de Split, Join


substrings.

Confira também
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Atributos (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O Visual Basic fornece vários atributos que permitem que os objetos interoperem com
código não gerenciado e um atributo que permite que os membros do módulo sejam
acessados sem o respectivo nome. A tabela a seguir indica os atributos usados pelo
Visual Basic.

Atributo Descrição

ComClassAttribute Instrui o compilador a adicionar metadados que permitem que uma


classe seja exposta como um objeto COM.

HideModuleNameAttribute Permite que os membros de módulo sejam acessados usando


somente a qualificação necessária para o módulo.

VBFixedArrayAttribute Indica que uma matriz em uma estrutura ou variável não local deve
ser tratada como uma matriz de tamanho fixo.

VBFixedStringAttribute Indica que uma cadeia de caracteres deve ser tratada como se fosse
de comprimento fixo.

Confira também
Visão geral de atributos
Constantes e enumerações (Visual Basic)
Artigo • 28/11/2022 • 3 minutos para o fim da leitura

O Visual Basic fornece várias constantes e enumerações predefinidas para


desenvolvedores. Constantes armazenam valores que permanecem constantes durante
a execução de uma aplicação. Enumerações fornecem uma maneira conveniente para
trabalhar com conjuntos de constantes relacionadas e para associar valores de
constante a nomes.

Constantes

Constantes de compilação condicional


A tabela a seguir lista as constantes predefinidas disponíveis para compilação
condicional.

Constante Descrição

CONFIG Uma cadeia de caracteres que corresponde à configuração atual da caixa


Configuração de Solução Ativa no Gerenciador de Configuração.

DEBUG Um valor Boolean que pode ser definido na caixa de diálogo Propriedades do
Projeto. Por padrão, a configuração de depuração de um projeto define DEBUG .
Quando DEBUG é definido, os métodos de classe Debug geram saída para a janela
Saída. Quando não está definido, os métodos de classe Debug não são compilados e
nenhuma saída de depuração é gerada.

TARGET Uma cadeia de caracteres que representa o tipo de saída para o projeto ou a
configuração da opção de linha de comando -target. Os valores possíveis de TARGET
são:

- "winexe" para um aplicativo do Windows.

- "exe" para um aplicativo de console.

- "biblioteca" para uma biblioteca de classes.

- "módulo" para um módulo.

- A opção -target pode ser definida no ambiente de desenvolvimento integrado do


Visual Studio. Para saber mais, confira -target (Visual Basic).

TRACE Um valor Boolean que pode ser definido na caixa de diálogo Propriedades do
Projeto. Por padrão, todas as configurações de um projeto definem TRACE . Quando
TRACE é definido, os métodos de classe Trace geram saída para a janela Saída.
Quando não está definido, os métodos de classe Trace não são compilados e
nenhuma saída Trace é gerada.
Constante Descrição

VBC_VER Um número que representa a versão do Visual Basic, no formato major.minor.

Imprimir e exibir constantes


Ao chamar funções de impressão e exibição, você pode usar as seguintes constantes no
código no lugar dos valores reais.

Constante Descrição

vbCrLf Combinação de caracteres de retorno de carro/avanço de linha.

vbCr Caractere de retorno de carro.

vbLf Caractere de avanço de linha.

vbNewLine Caractere de nova linha.

vbNullChar Caractere nulo.

vbNullString Não é igual a uma cadeia de caracteres de comprimento zero (""); usado para
chamar procedimentos externos.

vbObjectError Número de erro. Os números de erro definidos pelo usuário devem ser maiores
que esse valor. Por exemplo:

Err.Raise(Number) = vbObjectError + 1000

vbTab Caractere de tabulação.

vbBack Caractere de backspace.

vbFormFeed Não usado no Microsoft Windows.

vbVerticalTab Não é útil no Microsoft Windows.

Enumerações
A tabela a seguir lista e descreve as enumerações fornecidas pelo Visual Basic.

Enumeração Descrição

AppWinStyle Indica o estilo da janela a ser usado para o programa invocado ao


chamar a função Shell.

AudioPlayMode Indica como tocar sons ao chamar métodos de áudio.


Enumeração Descrição

BuiltInRole Indica o tipo de função a ser verificada ao chamar o método IsInRole.

CallType Indica o tipo de procedimento que está sendo invocado ao chamar a


função CallByName.

CompareMethod Indica como comparar cadeias de caracteres ao chamar funções de


comparação.

DateFormat Indica como exibir datas ao chamar a função FormatDateTime.

DateInterval Indica como determinar e formatar intervalos de datas ao chamar


funções relacionadas a datas.

DeleteDirectoryOption Especifica o que deve ser feito quando um diretório que deve ser
excluído contém arquivos ou diretórios.

DueDate Indica quando os pagamentos vencem ao chamar métodos financeiros.

FieldType Indica se os campos de texto são delimitado ou têm largura fixa.

FileAttribute Indica os atributos de arquivo a usar ao chamar funções de acesso a


arquivos.

FirstDayOfWeek Indica o primeiro dia da semana a ser usado ao chamar funções


relacionadas a datas.

FirstWeekOfYear Indica a primeira semana do ano a ser usada ao chamar funções


relacionadas a datas.

MsgBoxResult Indica qual botão foi pressionado em uma caixa de mensagem,


retornado pela função MsgBox.

MsgBoxStyle Indica quais botões exibir quando ao chamar a função MsgBox.

OpenAccess Indica como abrir um arquivo ao chamar funções de acesso a arquivos.

OpenMode Indica como abrir um arquivo ao chamar funções de acesso a arquivos.

OpenShare Indica como abrir um arquivo ao chamar funções de acesso a arquivos.

RecycleOption Especifica se um arquivo deve ser excluído permanentemente ou


colocado na Lixeira.

SearchOption Especifica se deve pesquisar todos ou somente diretórios de alto nível.

TriState Indica um valor Boolean ou se o padrão deve ser usado ao chamar


funções de formatação numérica.

UICancelOption Especifica o que deverá ser feito, se o usuário clicar em Cancelar durante
a operação.
Enumeração Descrição

UIOption Especifica se deve ou não mostrar uma caixa de diálogo de progresso ao


copiar, excluir ou mover arquivos ou diretórios.

VariantType Indica o tipo de um objeto variante, retornado pela função VarType.

VbStrConv Indica qual tipo de conversão executar ao chamar a função StrConv.

Confira também
Referência da linguagem Visual Basic
Visão geral de constantes
Visão geral de enumerações
Resumo do tipo de dados (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

A tabela a seguir mostra os tipos de dados do Visual Basic, os tipos de common


language runtime com suporte, a alocação de armazenamento nominal e os intervalos
de valores.

Tipo de Estrutura de Alocação de Intervalo de valor


Visual Basic tipo de armazenamento
common nominal
language
runtime

Booliano Boolean Depende da True ou False


implementação
da plataforma

Byte Byte 1 byte 0 a 255 (sem sinal)

Char Char 2 bytes 0 a 65535 (sem sinal)


(caractere
único)

Data DateTime 8 bytes 0:00:00 (meia-noite) em 1º de janeiro, 0001


a 23:59:59 de 31 de dezembro de 9999

Decimal Decimal 16 bytes 0a


+/-79.228.162.514.264.337.593.543.950.335
(+/-7.9...E+/-28) † sem ponto decimal; 0 a
+/-7,9228162514264337593543950335 com
28 casas à direita do decimal;

o menor número diferente de zero é


+/-0,0000000000000000000000000001
(+/-1E-28) †

Duplo (um Double 8 bytes -1,79769313486231570E+308 a


ponto -4,94065645841246544E-324 † para valores
flutuante de negativos;

precisão
dupla) 4,94065645841246544E-324 a
1,79769313486231570E+308 † para valores
positivos

Inteiro Int32 4 bytes -2.147.483.648 a 2.147.483.647 (assinado)


Tipo de Estrutura de Alocação de Intervalo de valor
Visual Basic tipo de armazenamento
common nominal
language
runtime

Longo (um Int64 8 bytes -9.223.372.036.854.775.808 a


inteiro longo) 9.223.372.036.854.775.807 (9.2...E+18 †)
(assinado)

Objeto Object 4 bytes em É possível armazenar qualquer tipo em uma


(classe) plataforma de 32 variável do tipo Object
bits

8 bytes em
plataforma de 64
bits

SByte SByte 1 byte -128 a 127 (assinado)

Curto (um Int16 2 bytes -32.768 a 32.767 (assinado)


inteiro curto)

Simples Single 4 bytes -3.4028235E+38 a -1.401298E-45 † para


(ponto valores negativos;

flutuante de
precisão 1,401298E-45 a 3.4028235E+38 † para
simples) valores positivos

Cadeia de String (classe) Depende da 0 a aproximadamente 2 bilhões de


caracteres implementação caracteres Unicode
(comprimento da plataforma
variável)

UInteger UInt32 4 bytes 0 a 4.294.967.295 (sem sinal)

ULong UInt64 8 bytes 0 a 18,446,744,073,709,551,615 (1.8...E+19 †)


(sem sinal)

Definida pelo (herda de Depende da Cada membro da estrutura tem um


usuário ValueType) implementação intervalo determinado pelo tipo de dados e
(estrutura) da plataforma independente dos intervalos dos outros
membros

UShort UInt16 2 bytes 0 a 65.535 (sem sinal)


Na notação científica, "E" refere-se a uma potência de 10. Portanto, 3.56E+2 significa
3.56 x 102 ou 356 e 3.56E-2 significa 3.56 /102 ou 0,0356.
7 Observação

Nas cadeias de caracteres que contêm texto, use a função StrConv para converter
de um formato de texto para outro.

Além de especificar um tipo de dados em uma instrução de declaração, você pode


forçar o tipo de dados de alguns elementos de programação usando um caractere de
tipo. Ver Caracteres de tipo.

Consumo de memória
Quando você declara um tipo de dados elementar, não é garantido supor que seu
consumo de memória seja o mesmo da sua alocação de armazenamento nominal. Isso
ocorre devido às seguintes considerações:

Atribuição de armazenamento. O common language runtime pode atribuir


armazenamento com base nas características atuais da plataforma na qual seu
aplicativo está sendo executado. Se a memória estiver quase cheia, ela poderá
empacotar seus elementos declarados o mais próximo possível. Em outros casos,
ela pode alinhar seus endereços de memória aos limites naturais de hardware para
otimizar o desempenho.

Largura da plataforma. A atribuição de armazenamento em uma plataforma de 64


bits é diferente da atribuição em uma plataforma de 32 bits.

Tipos de dados compostos


As mesmas considerações se aplicam a cada membro de um tipo de dados composto,
como uma estrutura ou uma matriz. Você não pode confiar em simplesmente adicionar
as alocações de armazenamento nominais dos membros do tipo. Além disso, há outras
considerações, como a seguinte:

Sobrecarga. Alguns tipos compostos têm requisitos de memória adicionais. Por


exemplo, uma matriz usa memória extra para a própria matriz e também para cada
dimensão. Em uma plataforma de 32 bits, essa sobrecarga atualmente é de 12
bytes, mais 8 bytes para cada dimensão. Em uma plataforma de 64 bits, esse
requisito é o dobro.

Layout de armazenamento. Você não pode supor com segurança que a ordem de
armazenamento na memória seja a mesma que sua ordem de declaração. Você
não pode sequer fazer suposições sobre o alinhamento de bytes, como um limite
de 2 bytes ou 4 bytes. Se você estiver definindo uma classe ou estrutura e precisar
controlar o layout de armazenamento de seus membros, poderá aplicar o atributo
StructLayoutAttribute à classe ou à estrutura.

Sobrecarga por objeto


Uma referência Object a qualquer tipo de dados elementar ou composto usa 4 bytes a
mais do que os dados contidos no tipo de dados.

Confira também
StrConv
StructLayoutAttribute
Funções de conversão do tipo
Resumo da Conversão
Caracteres de tipo
Uso eficiente de tipos de dados
Tipo de dados booliano (Visual Basic)
Artigo • 21/02/2023 • 2 minutos para o fim da leitura

Contém valores que podem ser apenas True ou False . As palavras-chave True e False
correspondem aos dois estados de Boolean variáveis.

Comentários
Use o tipo de dados booliano (Visual Basic) para conter valores de dois estados, como
verdadeiro/falso, sim/não, ativar/desativar.

O valor padrão de Boolean é False .

Os valores Boolean não são armazenados como números e os valores armazenados não
devem ser equivalentes a números. Você nunca deve gravar um código que dependa de
valores numéricos equivalentes para True e False . Sempre que possível, você deve
restringir o uso de variáveis Boolean aos valores lógicos para os quais elas são
projetadas.

Conversões de tipo
Quando o Visual Basic converte valores de tipo de dados numéricos em Boolean , 0 se
torna False e todos os outros valores se tornam True . Quando o Visual Basic converte
valores Boolean em tipos numéricos, False se torna 0 e True se torna -1.

Ao converter entre valores Boolean e tipos de dados numéricos, lembre-se de que os


métodos de conversão do .NET Framework nem sempre produzem os mesmos
resultados que as palavras-chave de conversão do Visual Basic. Isso ocorre porque a
conversão do Visual Basic retém o comportamento compatível com versões anteriores.
Para obter mais informações, confira "O tipo booleano não é convertido em tipo
numérico com precisão" em Solução de problemas de tipos de dados.

Dicas de programação
Números Negativos. Boolean não é um tipo numérico e não pode representar um
valor negativo. De qualquer forma, você não deve usar Boolean para manter
valores numéricos.
Caracteres de tipo. Boolean não tem nenhum caractere de tipo literal nem
caractere de identificação de tipo.

Tipo do Framework. O tipo correspondente no .NET Framework é a estrutura


System.Boolean.

Exemplo
No exemplo a seguir, runningVB é uma variável Boolean , que armazena uma
configuração simples de sim/não.

VB

Dim runningVB As Boolean

' Check to see if program is running on Visual Basic engine.

If scriptEngine = "VB" Then

runningVB = True

End If

Confira também
System.Boolean
Data Types
Funções de conversão do tipo
Resumo da Conversão
Uso eficiente de tipos de dados
Solução de problemas de tipos de dados
Função CType
Tipo de dados byte (Visual Basic)
Artigo • 21/02/2023 • 3 minutos para o fim da leitura

Armazena inteiros de 8 bits (1 bytes) sem sinal que variam em valor de 0 a 255.

Comentários
Use o tipo de dados Byte para conter dados binários.

O valor padrão de Byte é 0.

Atribuições literais
Você pode declarar e inicializar uma variável Byte atribuindo a ela um literal decimal,
hexadecimal, octal ou (a partir do Visual Basic 2017) binário. Se o literal integral estiver
fora do intervalo de Byte (ou seja, se for menor que Byte.MinValue ou maior que
Byte.MaxValue), ocorrerá um erro de compilação.

No exemplo a seguir, inteiros iguais a 201 representados como literais decimais,


hexadecimais e binários são implicitamente convertidos de valores Integer para byte .

VB

Dim byteValue1 As Byte = 201

Console.WriteLine(byteValue1)

Dim byteValue2 As Byte = &H00C9

Console.WriteLine(byteValue2)

Dim byteValue3 As Byte = &B1100_1001

Console.WriteLine(byteValue3)

' The example displays the following output:

' 201

' 201

' 201

7 Observação

Use o prefixo &h ou &H para indicar um literal hexadecimal, &b ou &B para indicar
um literal binário e &o ou &O para indicar um literal octal. Literais decimais não têm
nenhum prefixo.
A partir do Visual Basic 2017, você também pode usar o caractere de sublinhado, _ ,
como separador de dígitos para melhorar a legibilidade, como no exemplo a seguir.

VB

Dim byteValue3 As Byte = &B1100_1001

Console.WriteLine(byteValue3)

' The example displays the following output:

' 201

A partir do Visual Basic 15.5, você também pode usar o caractere de sublinhado ( _ )
como separador à esquerda entre o prefixo e os dígitos hexadecimais, binários ou
octais. Por exemplo:

VB

Dim number As Byte = &H_6A

Para usar o caractere de sublinhado como separador à esquerda, você deve adicionar o
seguinte elemento ao arquivo de projeto do Visual Basic (*.vbproj):

XML

<PropertyGroup>

<LangVersion>15.5</LangVersion>

</PropertyGroup>

Para obter mais informações, consulte Selecionar a versão da linguagem Visual Basic.

Dicas de programação
Números Negativos. Como Byte é um tipo sem sinal, não pode representar um
número negativo. Se você usar o operador unário menos ( - ) em uma expressão
avaliada como tipo Byte , o Visual Basic primeiro converterá a expressão em Short .

Conversões de formato. Quando o Visual Basic lê ou grava arquivos, ou quando


chama DLLs, métodos e propriedades, ele pode fazer a conversão automática
entre formatos de dados. Os dados binários armazenados em variáveis Byte e
matrizes são preservados durante essas conversões de formato. Você não deve
usar uma variável String para dados binários, pois o conteúdo pode ser
corrompido durante a conversão entre formatos ANSI e Unicode.
Ampliação. O tipo de dados Byte é ampliado para Short , UShort , Integer ,
UInteger , Long , ULong , Decimal , Single ou Double . Isso significa que você pode
converter Byte em qualquer um desses tipos sem a ocorrência de um erro
System.OverflowException.

Caracteres de tipo. Byte não tem nenhum caractere de tipo literal nem caractere
de identificação de tipo.

Tipo do Framework. O tipo correspondente no .NET Framework é a estrutura


System.Byte.

Exemplo
No exemplo a seguir, b é uma variável Byte . As instruções demonstram o intervalo da
variável e a aplicação de operadores de turno de bit para ela.

VB

' The valid range of a Byte variable is 0 through 255.

Dim b As Byte

b = 30

' The following statement causes an error because the value is too large.

'b = 256

' The following statement causes an error because the value is negative.

'b = -5

' The following statement sets b to 6.

b = CByte(5.7)

' The following statements apply bit-shift operators to b.

' The initial value of b is 6.

Console.WriteLine(b)

' Bit shift to the right divides the number in half. In this

' example, binary 110 becomes 11.


b >>= 1

' The following statement displays 3.

Console.WriteLine(b)

' Now shift back to the original position, and then one more bit

' to the left. Each shift to the left doubles the value. In this

' example, binary 11 becomes 1100.

b <<= 2

' The following statement displays 12.

Console.WriteLine(b)

Confira também
System.Byte
Data Types
Funções de conversão do tipo
Resumo da Conversão
Uso eficiente de tipos de dados
Tipo de dados Char (Visual Basic)
Artigo • 21/02/2023 • 2 minutos para o fim da leitura

Contém pontos de código sem sinal de 16 bits (2 bytes) que variam no valor de 0 a
65535. Cada ponto de código, ou código de caractere, representa um caractere Unicode
único.

Comentários
Use o tipo de dados Char quando precisar manter apenas um caractere único e não
precisar da sobrecarga de String . Em alguns casos, você pode usar Char() , uma matriz
de elementos Char , para conter vários caracteres.

O valor padrão Char é o caractere com um ponto de código de 0.

Caracteres Unicode
Os primeiros 128 pontos de código (0 a 127) do Unicode correspondem às letras e
símbolos em um teclado padrão dos EUA. Esses primeiros 128 pontos de código são os
mesmos definidos pelo conjunto de caracteres ASCII. Os segundos 128 pontos de
código (128-255) representam caracteres especiais, como letras alfabéticas de base
latina, acentos, símbolos de moeda e frações. A Unicode usa os pontos de código
restantes (256-65535) para uma ampla variedade de símbolos, incluindo caracteres
textuais mundiais, diacríticos e símbolos matemáticos e técnicos.

Você pode usar métodos como IsDigit e IsPunctuation em uma variável Char para
determinar a classificação Unicode.

Conversões de tipo
O Visual Basic não converte diretamente entre Char e os tipos numéricos. Você pode
usar a função Asc ou AscW para converter um valor Char em Integer , que representa o
ponto de código. Você pode usar a função Chr ou ChrW para converter um valor
Integer em Char , que tem esse ponto de código.

Se a opção de verificação de tipo (a Instrução Option Strict) estiver ativada, você deverá
acrescentar o caractere de tipo literal a um literal de cadeia de caracteres único para
identificá-lo como o tipo de dados Char . O exemplo a seguir ilustra essa situação. A
primeira atribuição à variável charVar gera um erro de compilador BC30512 porque
Option Strict está ativado. O segundo compila com sucesso porque o caractere de

tipo literal c identifica o literal como um valor Char .

VB

Option Strict On

Module CharType

Public Sub Main()

Dim charVar As Char

' This statement generates compiler error BC30512 because Option


Strict is On.

charVar = "Z"

' The following statement succeeds because it specifies a Char


literal.

charVar = "Z"c

End Sub

End Module

Dicas de programação
Números Negativos. Char é um tipo sem sinal e não pode representar um valor
negativo. De qualquer forma, você não deve usar Char para manter valores
numéricos.

Considerações sobre interoperabilidade. Se você fizer interface com componentes


não escritos para o .NET Framework, por exemplo, objetos de Automação ou COM,
lembre-se de que os tipos de caracteres têm uma largura de dados diferente (8
bits) em outros ambientes. Se você passar um argumento de 8 bits para esse
componente, declare-o como Byte em vez de Char no novo código do Visual
Basic.

Ampliação. O tipo de dados Char é ampliado para String . Isso significa que você
pode converter Char para String e não encontrará System.OverflowException.

Caracteres de tipo. Anexar o caractere de tipo literal C a um literal de cadeia de


caracteres único o força para o tipo de dados Char . Char não tem caractere de
identificação de tipo.

Tipo do Framework. O tipo correspondente no .NET Framework é a estrutura


System.Char.
Confira também
System.Char
Asc
AscW
Chr
ChrW
Data Types
Tipo de Dados String
Funções de conversão do tipo
Resumo da Conversão
Como: Chamar uma função do Windows que use tipos não assinados
Uso eficiente de tipos de dados
Tipo de dados Data (Visual Basic)
Artigo • 21/02/2023 • 3 minutos para o fim da leitura

Contém valores IEEE de 64 bits (8 bytes) que representam datas e variam de 1º de


janeiro do ano 0001 a 31 de dezembro do ano 9999 e horários das 12:00:00 AM (meia-
noite) às 11:59:59.9999999 PM. Cada incremento representa 100 nanossegundos de
tempo decorrido desde o início de 1º de janeiro do ano 1 no calendário gregoriano. O
valor máximo representa 100 nanossegundos antes do início de 1º de janeiro do ano
10000.

Comentários
Use o tipo de dados Date para conter valores de data, de hora ou de data e hora.

O valor padrão de é Date 0:00:00 (meia-noite) em 1º de janeiro de 0001.

Você pode obter a data e a hora atuais da classe DateAndTime.

Requisitos de formato
Você deve colocar um literal Date dentro de sinais numéricos ( # # ). Você deve
especificar o valor de data no formato d/M/aaaa, por exemplo #5/31/1993# , ou
dd/MM/aaaa, por exemplo #1993-5-31# . Você pode usar barras ao especificar o ano
primeiro. Esse requisito é independente das configurações de formato de data e hora
do computador e da localidade.

O motivo dessa restrição é que o significado do código nunca deve mudar dependendo
da localidade em que o aplicativo está em execução. Suponha que você codifique um
literal Date de #3/4/1998# pretenda que isso signifique 4 de março de 1998. Em uma
localidade que usa mm/dd/aaaa, 3/4/1998 compila conforme você deseja. Mas suponha
que você implante o aplicativo em muitos países/regiões. Em uma localidade que usa
dd/mm/aaaa, o literal codificado seria compilado para 3 de abril de 1998. Em uma
localidade que usa aaaa/mm/dd, o literal seria inválido (abril de 1998, 0003) e causaria
um erro do compilador.

Soluções Alternativas
Para converter um literal Date no formato da localidade ou em um formato
personalizado, forneça o literal para a função Format, especificando um formato de data
predefinido ou definido pelo usuário. O exemplo a seguir demonstra isso.

VB

MsgBox("The formatted date is " & Format(#5/31/1993#, "dddd, d MMM yyyy"))

Como alternativa, você pode usar um dos construtores sobrecarregados da estrutura


DateTime para montar um valor de data e hora. O exemplo a seguir cria um valor para
representar 31 de maio de 1993 às 12h14.

VB

Dim dateInMay As New System.DateTime(1993, 5, 31, 12, 14, 0)

Formato de hora
Você pode especificar o valor de tempo no formato de 12 horas ou 24 horas, por
exemplo #1:15:30 PM# ou #13:15:30# . No entanto, se você não especificar os minutos
ou os segundos, deverá especificar AM ou PM.

Padrões de data e hora


Se você não incluir uma data em um literal de data/hora, o Visual Basic definirá a parte
de data do valor como 1º de janeiro de 0001. Se você não incluir uma hora em um
literal de data/hora, o Visual Basic definirá a parte de hora do valor para o início do dia,
ou seja, meia-noite (0:00:00).

Conversões de tipo
Se você converter um valor Date para o tipo String , o Visual Basic renderizará a data
de acordo com o formato de data curto especificado pela localidade em tempo de
execução e renderizará a hora de acordo com o formato de hora (12 horas ou 24 horas)
especificado pela localidade em tempo de execução.

Dicas de programação
Considerações sobre interoperabilidade. Se você estiver estabelecendo interface
com componentes não gravados para o .NET Framework, por exemplo, objetos de
Automação ou COM, tenha em mente que os tipos de data/hora em outros
ambientes não são compatíveis com o tipo Date do Visual Basic. Se você estiver
passando um argumento de data/hora para tal componente, declare-o como
Double em vez de Date no novo código Visual Basic e use os métodos de

conversão DateTime.FromOADate e DateTime.ToOADate.

Caracteres de tipo. Date não tem nenhum caractere de tipo literal nem caractere
de identificação de tipo. No entanto, o compilador trata literais entre sinais
numéricos ( # # ) como Date .

Tipo do Framework. O tipo correspondente no .NET Framework é a estrutura


System.DateTime.

Exemplo
Uma variável ou constante do tipo de dados Date contém a data e a hora. O exemplo a
seguir ilustra essa situação.

VB

Dim someDateAndTime As Date = #8/13/2002 12:14 PM#

Confira também
System.DateTime
Data Types
Cadeias de caracteres de formato de data e hora padrão
Cadeias de caracteres de formato de data e hora personalizado
Funções de conversão do tipo
Resumo da Conversão
Uso eficiente de tipos de dados
Tipo de dados decimal (Visual Basic)
Artigo • 21/02/2023 • 3 minutos para o fim da leitura

Mantém valores de 128 bits (16 bytes) assinados que representam números inteiros de
96 bits (12 bytes) elevados a uma potência variável de 10. O fator de colocação em
escala especifica o número de dígitos à direita do ponto decimal; varia de 0 a 28. Com
uma escala de 0 (sem casas decimais), o maior valor possível é
+/-79.228.162.514.264.337.593,543.950.335
(+/-7.9228162514264337593543950335E+28). Com 28 casas decimais, o maior valor é
+/-7,9228162514264337593543950335, e o menor valor diferente de zero é
+/-0,0000000000000000000000000001 (+/-1E-28).

Comentários
O tipo de dados Decimal fornece o maior número de dígitos significativos para um
número. Ele suporta até 29 dígitos significativos e pode representar valores superiores a
7,9228 x 10^28. Ele é particularmente adequado para cálculos, como financeiros, que
exigem um grande número de dígitos, mas não toleram erros de arredondamento.

O valor padrão de Decimal é 0.

Dicas de programação
Precisão. Decimal não é um tipo de dados de ponto flutuante. A estrutura Decimal
contém um valor inteiro binário, junto com um bit de sinal e um fator de escala
inteiro que especifica qual parte do valor é uma fração decimal. Por isso, os
números Decimal têm uma representação mais precisa na memória do que tipos
de ponto flutuante ( Single e Double ).

Desempenho. O tipo de dados Decimal é o mais lento de todos os tipos


numéricos. Você deve avaliar a importância da precisão em relação ao
desempenho antes de escolher um tipo de dados.

Ampliação. O tipo de dados Decimal é ampliado para Single ou Double . Isso


significa que você pode converter Decimal para qualquer um desses tipos sem
encontrar um erro System.OverflowException.

Zeros à direita. O Visual Basic não armazena zeros à direita em um literal Decimal .
No entanto, uma variável Decimal preserva todos os zeros à direita adquiridos
computacionalmente. O exemplo a seguir ilustra essa situação.
VB

Dim d1, d2, d3, d4 As Decimal

d1 = 2.375D

d2 = 1.625D

d3 = d1 + d2

d4 = 4.000D

MsgBox("d1 = " & CStr(d1) & ", d2 = " & CStr(d2) &

", d3 = " & CStr(d3) & ", d4 = " & CStr(d4))

A saída de MsgBox no exemplo anterior é a seguinte:

Console

d1 = 2.375, d2 = 1.625, d3 = 4.000, d4 = 4

Caracteres de tipo. Acrescentar o caractere de tipo literal D a um literal o força ao


tipo de dados Decimal . Acrescentar o caractere de tipo identificador @ a qualquer
identificador o força ao tipo Decimal .

Tipo do Framework. O tipo correspondente no .NET Framework é a estrutura


System.Decimal.

Intervalo
Talvez seja necessário usar o caractere do tipo D para atribuir um valor grande a uma
variável ou constante Decimal . Esse requisito ocorre porque o compilador interpreta um
literal como Long , a menos que um caractere de tipo literal siga o literal, como mostra o
exemplo a seguir.

VB

Dim bigDec1 As Decimal = 9223372036854775807 ' No overflow.

Dim bigDec2 As Decimal = 9223372036854775808 ' Overflow.

Dim bigDec3 As Decimal = 9223372036854775808D ' No overflow.

A declaração de bigDec1 não produz um estouro porque o valor atribuído a ela está
dentro do intervalo de Long . O valor Long pode ser atribuído à variável Decimal .

A declaração para bigDec2 gera um erro de estouro porque o valor atribuído a ela é
muito grande para Long . Como o literal numérico não pode ser interpretado primeiro
como um Long , ele não pode ser atribuído à variável Decimal .
Para bigDec3 , o caractere de tipo literal D resolve o problema forçando o compilador a
interpretar o literal como Decimal em vez de Long .

Confira também
System.Decimal
Decimal
Math.Round
Data Types
Tipo de Dados Simples
Tipo de Dados Duplo
Funções de conversão do tipo
Resumo da Conversão
Uso eficiente de tipos de dados
Tipo de dados double (Visual Basic)
Artigo • 21/02/2023 • 2 minutos para o fim da leitura

Contém números de ponto flutuante de precisão dupla IEEE de 64 bits (8 bytes) com
sinal que variam em valor de -1,79769313486231570E+308 a -4,94065645841246544E-
324 para valores negativos e de 4,94065645841246544E-324 a
1,79769313486231570E+308 para valores positivos. Os números de precisão dupla
armazenam uma aproximação de um número real.

Comentários
O tipo de dados Double fornece as maiores e menores magnitudes possíveis para um
número.

O valor padrão de Double é 0.

Dicas de programação
Precisão. Quando você trabalha com números de ponto flutuante, tenha em
mente que eles nem sempre têm uma representação precisa na memória. Isso
pode levar a resultados inesperados de determinadas operações, como a
comparação de valores e o operador Mod . Para obter mais informações, consulte
Tipos de dados de solução de problemas.

Zeros à direita. Os tipos de dados de ponto flutuante não têm nenhuma


representação interna de zero caracteres à direita. Por exemplo, eles não
distinguem entre 4,2000 e 4,2. Consequentemente, zero caracteres à direita não
aparecem quando você exibe ou imprime valores de ponto flutuante.

Caracteres de tipo. Acrescentar o caractere de tipo literal R a um literal o força ao


tipo de dados Double . Por exemplo, se um valor inteiro for seguido de R , o valor
será alterado para Double .

VB

' Visual Basic expands the 4 in the statement Dim dub As Double = 4R to
4.0:

Dim dub As Double = 4.0R

Acrescentar o caractere de tipo identificador # a qualquer identificador o força ao


tipo Double . No exemplo a seguir, a variável num é digitada como Double :

VB

Dim num# = 3

Tipo do Framework. O tipo correspondente no .NET Framework é a estrutura


System.Double.

Confira também
System.Double
Data Types
Tipo de Dados Decimal
Tipo de Dados Simples
Funções de conversão do tipo
Resumo da Conversão
Uso eficiente de tipos de dados
Solução de problemas de tipos de dados
Caracteres de tipo
Tipo de dados Integer (Visual Basic)
Artigo • 21/02/2023 • 3 minutos para o fim da leitura

Armazena inteiros de 32 bits (4 bytes) com sinal que variam em valor de -2.147.483.648
a 2.147.483.647.

Comentários
O tipo de dados Integer proporciona um desempenho ideal em um processador de 32
bits. Os outros tipos integrais são mais lentos para carregar e armazenar na memória.

O valor padrão de Integer é 0.

Atribuições literais
Você pode declarar e inicializar uma variável Integer atribuindo a ela um literal decimal,
hexadecimal, octal ou (a partir do Visual Basic 2017) binário. Se o literal inteiro estiver
fora do intervalo de Integer (ou seja, se for menor que Int32.MinValue ou maior que
Int32.MaxValue, ocorrerá um erro de compilação.

No exemplo a seguir, inteiros iguais a 90.946 representados como literais decimais,


hexadecimais e binários são atribuídos a valores Integer .

VB

Dim intValue1 As Integer = 90946

Console.WriteLine(intValue1)

Dim intValue2 As Integer = &H16342

Console.WriteLine(intValue2)

Dim intValue3 As Integer = &B0001_0110_0011_0100_0010

Console.WriteLine(intValue3)

' The example displays the following output:

' 90946

' 90946

' 90946

7 Observação

Use o prefixo &h ou &H para indicar um literal hexadecimal, &b ou &B para indicar
um literal binário e &o ou &O para indicar um literal octal. Literais decimais não têm
nenhum prefixo.
A partir do Visual Basic 2017, você também pode usar o caractere de sublinhado, _ ,
como separador de dígitos para melhorar a legibilidade, como no exemplo a seguir.

VB

Dim intValue1 As Integer = 90_946

Console.WriteLine(intValue1)

Dim intValue2 As Integer = &H0001_6342

Console.WriteLine(intValue2)

Dim intValue3 As Integer = &B0001_0110_0011_0100_0010

Console.WriteLine(intValue3)

' The example displays the following output:

' 90946

' 90946

' 90946

A partir do Visual Basic 15.5, você também pode usar o caractere de sublinhado ( _ )
como separador à esquerda entre o prefixo e os dígitos hexadecimais, binários ou
octais. Por exemplo:

VB

Dim number As Integer = &H_C305_F860

Para usar o caractere de sublinhado como separador à esquerda, você deve adicionar o
seguinte elemento ao arquivo de projeto do Visual Basic (*.vbproj):

XML

<PropertyGroup>

<LangVersion>15.5</LangVersion>

</PropertyGroup>

Para obter mais informações, consulte Selecionar a versão da linguagem Visual Basic.

Literais numéricos também podem incluir o I caractere de tipo para indicar o tipo de
dados Integer , como mostra o exemplo a seguir.

VB

Dim number = &H_035826I

Dicas de programação
Considerações sobre interoperabilidade. Se você estiver fazendo interface com
componentes não escritos para o .NET Framework, como objetos Automation ou
COM, lembre-se de que Integer possui uma largura de dados diferente (16 bits)
em outros ambientes. Se você estiver passando um argumento de 16 bits para
esse componente, declare-o como Short em vez de Integer no seu novo código
do Visual Basic.

Ampliação. O tipo de dados Integer é ampliado para Long , Decimal , Single ou


Double . Isso significa que você pode converter Integer em qualquer um desses
tipos sem a ocorrência de um erro System.OverflowException.

Caracteres de Tipo. Acrescentar o caractere de tipo literal I a um literal o força ao


tipo de dados Integer . Acrescentar o caractere de tipo identificador % a qualquer
identificador o força ao tipo Integer .

Tipo do Framework. O tipo correspondente no .NET Framework é a estrutura


System.Int32.

Intervalo
Se você tentar definir uma variável de um tipo integral para um número fora do
intervalo para esse tipo, ocorrerá um erro. Se você tentar defini-lo como uma fração, o
número será arredondado para cima ou para baixo para o valor inteiro mais próximo. Se
o número for igualmente próximo de dois valores inteiros, o valor será arredondado
para o inteiro par mais próximo. Esse comportamento minimiza erros de
arredondamento gerados ao arredondar consistentemente um valor de ponto médio
em uma única direção. O código a seguir mostra exemplos de arredondamento.

VB

' The valid range of an Integer variable is -2147483648 through +2147483647.

Dim k As Integer

' The following statement causes an error because the value is too large.

k = 2147483648

' The following statement sets k to 6.

k = 5.9

' The following statement sets k to 4

k = 4.5

' The following statement sets k to 6

' Note, Visual Basic uses banker’s rounding (toward nearest even number)

k = 5.5

Confira também
System.Int32
Data Types
Tipo de Dados Long
Tipo de Dados Short
Funções de conversão do tipo
Resumo da Conversão
Uso eficiente de tipos de dados
Tipo de dados Long (Visual Basic)
Artigo • 21/02/2023 • 2 minutos para o fim da leitura

Contém inteiros de 64 bits (8 bytes) com sinal, que variam de


-9.223.372.036.854.775.808 a 9.223.372.036.854.775.807 (9.2...E+18).

Comentários
Use o tipo de dados Long para conter números inteiros que são muito grandes para
caber no tipo de dados Integer .

O valor padrão de Long é 0.

Atribuições literais
Você pode declarar e inicializar uma variável Long atribuindo a ela um literal decimal,
hexadecimal, octal ou (a partir do Visual Basic 2017) binário. Se o literal inteiro estiver
fora do intervalo de Long (ou seja, se for menor que Int64.MinValue ou maior que
Int64.MaxValue, ocorrerá um erro de compilação.

No exemplo a seguir, inteiros iguais a 4.294.967.296 representados como literais


decimais, hexadecimais e binários são atribuídos a valores Long .

VB

Dim longValue1 As Long = 4294967296

Console.WriteLine(longValue1)

Dim longValue2 As Long = &H100000000

Console.WriteLine(longValue2)

Dim longValue3 As Long = &B1_0000_0000_0000_0000_0000_0000_0000_0000

Console.WriteLine(longValue3)

' The example displays the following output:

' 4294967296

' 4294967296

' 4294967296

7 Observação

Use o prefixo &h ou &H para indicar um literal hexadecimal, &b ou &B para indicar
um literal binário e &o ou &O para indicar um literal octal. Literais decimais não têm
nenhum prefixo.

A partir do Visual Basic 2017, você também pode usar o caractere de sublinhado, _ ,
como separador de dígitos para melhorar a legibilidade, como no exemplo a seguir.

VB

Dim longValue1 As Long = 4_294_967_296

Console.WriteLine(longValue1)

Dim longValue2 As Long = &H1_0000_0000

Console.WriteLine(longValue2)

Dim longValue3 As Long = &B1_0000_0000_0000_0000_0000_0000_0000_0000

Console.WriteLine(longValue3)

' The example displays the following output:

' 4294967296

' 4294967296

' 4294967296

A partir do Visual Basic 15.5, você também pode usar o caractere de sublinhado ( _ )
como separador à esquerda entre o prefixo e os dígitos hexadecimais, binários ou
octais. Por exemplo:

VB

Dim number As Long = &H_0FAC_0326_1489_D68C

Para usar o caractere de sublinhado como separador à esquerda, você deve adicionar o
seguinte elemento ao arquivo de projeto do Visual Basic (*.vbproj):

XML

<PropertyGroup>

<LangVersion>15.5</LangVersion>

</PropertyGroup>

Para obter mais informações, consulte Selecionar a versão da linguagem Visual Basic.

Literais numéricos também podem incluir o L caractere de tipo para indicar o tipo de
dados Long , como mostra o exemplo a seguir.

VB

Dim number = &H_0FAC_0326_1489_D68CL

Dicas de programação
Considerações sobre interoperabilidade. Se você estiver fazendo interface com
componentes não escritos para o .NET Framework, como objetos COM ou
Automação, lembre-se de que Long possui uma largura de dados diferente (32
bits) em outros ambientes. Se você estiver passando um argumento de 32 bits
para esse componente, declare-o como Integer em vez de Long no seu novo
código do Visual Basic.

Ampliação. O tipo de dados Long é ampliado para Decimal , Single ou Double .


Isso significa que você pode converter Long em qualquer um desses tipos sem a
ocorrência de um erro System.OverflowException.

Caracteres de Tipo. Acrescentar o caractere de tipo literal L a um literal o força ao


tipo de dados Long . Acrescentar o caractere de tipo identificador & a qualquer
identificador o força ao tipo Long .

Tipo do Framework. O tipo correspondente no .NET Framework é a estrutura


System.Int64.

Confira também
Int64
Data Types
Tipo de Dados Integer
Tipo de Dados Short
Funções de conversão do tipo
Resumo da Conversão
Uso eficiente de tipos de dados
Tipo de dados Object
Artigo • 21/02/2023 • 3 minutos para o fim da leitura

Contém endereços que se referem a objetos. Você pode atribuir qualquer tipo de
referência (cadeia de caracteres, matriz, classe ou interface) a uma variável Object . Uma
variável Object também pode se referir a dados de qualquer tipo de valor (numérico,
Boolean , Char , Date , estrutura ou enumeração).

Comentários
O tipo de dados Object pode apontar para dados de qualquer tipo de dados, incluindo
qualquer instância de objeto que seu aplicativo reconheça. Use Object quando você
não souber em tempo de compilação para qual tipo de dados a variável pode apontar.

O valor padrão de Object é Nothing (uma referência nula).

Tipos de dados
Você pode atribuir uma variável, constante ou expressão de qualquer tipo de dados a
uma variável Object . Para determinar o tipo de dados ao qual uma variável Object se
refere atualmente, você pode usar o método GetTypeCode da classe System.Type. O
exemplo a seguir ilustra essa situação.

VB

Dim myObject As Object

' Suppose myObject has now had something assigned to it.

Dim datTyp As Integer

datTyp = Type.GetTypeCode(myObject.GetType())

O tipo de dados Object também é um tipo de referência. No entanto, o Visual Basic


trata uma variável Object como um tipo de valor quando ela se refere a dados de um
tipo de valor.

Armazenamento
Seja qual for o tipo de dados ao qual ela se refere, a variável Object não contém o valor
de dados em si, mas sim um ponteiro para o valor. Ela sempre usa quatro bytes na
memória do computador, mas isso não inclui o armazenamento dos dados que
representam o valor da variável. Devido ao código que usa o ponteiro para localizar os
dados, variáveis Object que contêm tipos de valor são ligeiramente mais lentas de
acessar do que as variáveis com tipos explícitos.

Dicas de programação
Considerações sobre interoperabilidade. Se você estiver estabelecendo interface
com componentes não gravados para o .NET Framework, por exemplo, automação
ou objetos COM, tenha em mente que os tipos de ponteiro em outros ambientes
não são compatíveis com o tipo Object do Visual Basic.

Desempenho. Uma variável que você declara com o tipo Object é flexível o
suficiente para conter uma referência a qualquer objeto. No entanto, quando você
invoca um método ou propriedade em uma variável como essa, sempre acarreta
associação tardia (em tempo de execução). Para forçar a associação antecipada (em
tempo de compilação) e um melhor desempenho, declare a variável com um nome
de classe específico ou converta-a para o tipo de dados específico.

Ao declarar uma variável de objeto, tente usar um tipo de classe específico, por
exemplo OperatingSystem, em vez do tipo generalizado Object . Você também
deve usar a classe mais específica disponível, como TextBox em vez de Control,
para que possa acessar as propriedades e métodos. Normalmente, você pode usar
a lista Classes no Pesquisador de Objetos para localizar nomes de classe
disponíveis.

Ampliação. Todos os tipos de dados e todos os tipos de referência são ampliados


para o tipo de dados Object . Isso significa que você pode converter qualquer tipo
para Object sem que ocorra um erro System.OverflowException.

No entanto, quando você converte entre tipos de valor e Object , o Visual Basic
executa operações chamadas boxing e unboxing, o que tornará a execução mais
lenta.

Caracteres de tipo. Object não tem nenhum caractere de tipo literal nem
caractere de identificação de tipo.

Tipo do Framework. O tipo correspondente no .NET Framework é a classe


System.Object.

Exemplo
O exemplo a seguir ilustra uma variável Object apontando para uma instância de
objeto.

VB

Dim objDb As Object

Dim myCollection As New Collection()

' Suppose myCollection has now been populated.

objDb = myCollection.Item(1)

Confira também
Object
Data Types
Funções de conversão do tipo
Resumo da Conversão
Uso eficiente de tipos de dados
Como determinar se dois objetos estão relacionados
Como determinar se dois objetos são idênticos
Tipo de dados SByte (Visual Basic)
Artigo • 28/11/2022 • 3 minutos para o fim da leitura

Armazena inteiros de 8 bits (1 byte) com sinal que variam de -128 a 127.

Comentários
Use o tipo de dados SByte para conter valores inteiros que não exigem a largura
completa dos dados de Integer ou mesmo a metade da largura de dados de Short . Em
alguns casos, o Common Language Runtime pode ser capaz de agrupar as variáveis
SByte e economizar o consumo de memória.

O valor padrão de SByte é 0.

Atribuições literais
Você pode declarar e inicializar uma variável SByte atribuindo a ela um literal decimal,
hexadecimal, octal ou (a partir do Visual Basic 2017) binário.

No exemplo a seguir, inteiros iguais a -102 representados como literais decimais,


hexadecimais e binários são atribuídos a valores SByte . Este exemplo requer que você
compile com a opção do compilador /removeintchecks .

VB

Dim sbyteValue1 As SByte = -102

Console.WriteLine(sbyteValue1)

Dim sbyteValue4 As SByte = &H9A

Console.WriteLine(sbyteValue4)

Dim sbyteValue5 As SByte = &B1001_1010

Console.WriteLine(sbyteValue5)

' The example displays the following output:

' -102

' -102

' -102

7 Observação

Use o prefixo &h ou &H para indicar um literal hexadecimal, &b ou &B para indicar
um literal binário e &o ou &O para indicar um literal octal. Literais decimais não têm
nenhum prefixo.

A partir do Visual Basic 2017, você também pode usar o caractere de sublinhado, _ ,
como separador de dígitos para melhorar a legibilidade, como no exemplo a seguir.

VB

Dim sbyteValue3 As SByte = &B1001_1010

Console.WriteLine(sbyteValue3)

' The example displays the following output:

' -102

A partir do Visual Basic 15.5, você também pode usar o caractere de sublinhado ( _ )
como separador à esquerda entre o prefixo e os dígitos hexadecimais, binários ou
octais. Por exemplo:

VB

Dim number As SByte = &H_F9

Para usar o caractere de sublinhado como separador à esquerda, você deve adicionar o
seguinte elemento ao arquivo de projeto do Visual Basic (*.vbproj):

XML

<PropertyGroup>

<LangVersion>15.5</LangVersion>

</PropertyGroup>

Para obter mais informações, consulte Selecionar a versão da linguagem Visual Basic.

Se o literal inteiro estiver fora do intervalo de SByte (ou seja, se for menor que
SByte.MinValue ou maior que SByte.MaxValue, ocorrerá um erro de compilação. Quando
um literal inteiro não tem sufixo, um inteiro é inferido. Se o literal inteiro estiver fora do
intervalo do tipo Integer , um Long será inferido. Isso significa que, nos exemplos
anteriores, os literais numéricos 0x9A e 0b10011010 são interpretados como inteiros com
sinal de 32 bits com um valor de 156, que excede SByte.MaxValue. Para compilar com
êxito um código como este que atribui um inteiro não decimal a um SByte , você pode
fazer qualquer um dos seguintes procedimentos:

Desabilite verificações de limites de inteiro compilando com o comutador do


compilador /removeintchecks .
Use um caractere de tipo para definir explicitamente o valor literal que você deseja
atribuir ao SByte . O exemplo a seguir atribui um valor literal negativo Short a um
SByte . Observe que, para números negativos, o bit de ordem superior da palavra

de ordem superior do literal numérico deve ser definido. No caso do nosso


exemplo, este é o bit 15 do valor literal Short .

VB

Dim sByteValue1 As SByte = &HFF_9As

Dim sByteValue2 As SByte = &B1111_1111_1001_1010s

Console.WriteLine(sByteValue1)

Console.WriteLine(sByteValue2)

Dicas de programação
Compatível com CLS. O tipo de dados SByte não faz parte da CLS (Common
Language Specification ), portanto, o código compatível com CLS não pode
consumir um componente que o utilize.

Ampliação. O tipo de dados SByte é ampliado para Short , Integer , Long ,


Decimal , Single e Double . Isso significa que você pode converter SByte em
qualquer um desses tipos sem a ocorrência de um erro System.OverflowException.

Caracteres de tipo. SByte não tem nenhum caractere de tipo literal nem caractere
de identificação de tipo.

Tipo do Framework. O tipo correspondente no .NET Framework é a estrutura


System.SByte.

Confira também
System.SByte
Data Types
Funções de conversão do tipo
Resumo da Conversão
Tipo de Dados Short
Tipo de Dados Integer
Tipo de Dados Long
Uso eficiente de tipos de dados
Tipo de dados Short (Visual Basic)
Artigo • 21/02/2023 • 2 minutos para o fim da leitura

Contém inteiros de 16 bits (2 bytes) com sinal, que variam de no valor de -32.768 a
32.767.

Comentários
Use o tipo de dados Short para conter valores inteiros que não exigem a largura
completa dos dados de Integer . Em alguns casos, o Common Language Runtime pode
agrupar as variáveis Short e economizar o consumo de memória.

O valor padrão de Short é 0.

Atribuições literais
Você pode declarar e inicializar uma variável Short atribuindo a ela um literal decimal,
hexadecimal, octal ou (a partir do Visual Basic 2017) binário. Se o literal inteiro estiver
fora do intervalo de Short (ou seja, se for menor que Int16.MinValue ou maior que
Int16.MaxValue, ocorrerá um erro de compilação.

No exemplo a seguir, inteiros iguais a 1.034 representados como literais decimais,


hexadecimais e binários são implicitamente convertidos de valores Integer para Short .

VB

Dim shortValue1 As Short = 1034

Console.WriteLine(shortValue1)

Dim shortValue2 As Short = &H040A

Console.WriteLine(shortValue2)

Dim shortValue3 As Short = &B0100_00001010

Console.WriteLine(shortValue3)

' The example displays the following output:

' 1034

' 1034

' 1034

7 Observação
Use o prefixo &h ou &H para indicar um literal hexadecimal, &b ou &B para indicar
um literal binário e &o ou &O para indicar um literal octal. Literais decimais não têm
nenhum prefixo.

A partir do Visual Basic 2017, você também pode usar o caractere de sublinhado, _ ,
como separador de dígitos para melhorar a legibilidade, como no exemplo a seguir.

VB

Dim shortValue1 As Short = 1_034

Console.WriteLine(shortValue1)

Dim shortValue3 As Short = &B00000100_00001010

Console.WriteLine(shortValue3)

' The example displays the following output:

' 1034

' 1034

A partir do Visual Basic 15.5, você também pode usar o caractere de sublinhado ( _ )
como separador à esquerda entre o prefixo e os dígitos hexadecimais, binários ou
octais. Por exemplo:

VB

Dim number As Short = &H_3264

Para usar o caractere de sublinhado como separador à esquerda, você deve adicionar o
seguinte elemento ao arquivo de projeto do Visual Basic (*.vbproj):

XML

<PropertyGroup>

<LangVersion>15.5</LangVersion>

</PropertyGroup>

Para obter mais informações, consulte Selecionar a versão da linguagem Visual Basic.

Literais numéricos também podem incluir o S caractere de tipo para indicar o tipo de
dados Short , como mostra o exemplo a seguir.

VB

Dim number = &H_3264S

Dicas de programação
Ampliação. O tipo de dados Short é ampliado para Integer , Long , Decimal ,
Single ou Double . Isso significa que você pode converter Short em qualquer um

desses tipos sem a ocorrência de um erro System.OverflowException.

Caracteres de Tipo. Acrescentar o caractere de tipo literal S a um literal o força ao


tipo de dados Short . Short não tem caractere de identificação de tipo.

Tipo do Framework. O tipo correspondente no .NET Framework é a estrutura


System.Int16.

Confira também
System.Int16
Data Types
Funções de conversão do tipo
Resumo da Conversão
Tipo de Dados Integer
Tipo de Dados Long
Uso eficiente de tipos de dados
Tipo de dados único (Visual Basic)
Artigo • 21/02/2023 • 2 minutos para o fim da leitura

Contém números de ponto flutuante de precisão simples com sinal do IEEE de 32 bits (4
bytes) variando em valor de -3,4028235E+38 a -1,401298E-45 para valores negativos e
de 1,401298E-45 a 3,4028235E+38 para valores positivos. Os números de precisão
simples armazenam uma aproximação de um número real.

Comentários
Use o tipo de dados Single para conter valores de ponto flutuante que não exigem a
largura completa dos dados de Double . Em alguns casos, o Common Language Runtime
pode ser capaz de agrupar as variáveis Single e economizar o consumo de memória.

O valor padrão de Single é 0.

Dicas de programação
Precisão. Quando você trabalha com números de ponto flutuante, tenha em
mente que eles nem sempre têm uma representação precisa na memória. Isso
pode levar a resultados inesperados de determinadas operações, como a
comparação de valores e o operador Mod . Para obter mais informações, consulte
Tipos de dados de solução de problemas.

Ampliação. O tipo de dados Single é ampliado para Double . Isso significa que
você pode converter Single para Double sem que ocorra um erro
System.OverflowException.

Zeros à direita. Os tipos de dados de ponto flutuante não têm nenhuma


representação interna de 0 caracteres à direita. Por exemplo, eles não distinguem
entre 4,2000 e 4,2. Consequentemente, 0 caracteres à direita não aparecem
quando você exibe ou imprime valores de ponto flutuante.

Caracteres de tipo. Acrescentar o caractere de tipo literal F a um literal o força ao


tipo de dados Single . Acrescentar o caractere de tipo identificador ! a qualquer
identificador o força ao tipo Single .

Tipo do Framework. O tipo correspondente no .NET Framework é a estrutura


System.Single.
Confira também
System.Single
Data Types
Tipo de Dados Decimal
Tipo de Dados Duplo
Funções de conversão do tipo
Resumo da Conversão
Uso eficiente de tipos de dados
Solução de problemas de tipos de dados
Tipo de dados da cadeia de caracteres
(Visual Basic)
Artigo • 21/02/2023 • 3 minutos para o fim da leitura

Contém sequências de pontos de código sem sinal de 16 bits (2 bytes) que variam no
valor de 0 a 65535. Cada ponto de código, ou código de caractere, representa um
caractere Unicode único. Uma cadeia de caracteres pode conter de 0 a
aproximadamente dois bilhões (2 ^ 31) caracteres Unicode.

Comentários
Use o tipo de dados String para armazenar vários caracteres sem a sobrecarga de
gerenciamento de matriz de Char() , uma matriz de elementos Char .

O valor padrão de String é Nothing (uma referência nula). Observe que isso não é o
mesmo que a cadeia de caracteres vazia (valor "" ).

Caracteres Unicode
Os primeiros 128 pontos de código (0 a 127) do Unicode correspondem às letras e
símbolos em um teclado padrão dos EUA. Esses primeiros 128 pontos de código são os
mesmos definidos pelo conjunto de caracteres ASCII. Os segundos 128 pontos de
código (128-255) representam caracteres especiais, como letras alfabéticas de base
latina, acentos, símbolos de moeda e frações. O Unicode usa os pontos de código
restantes (256-65535) para uma ampla variedade de símbolos. Isso inclui caracteres
textuais, diacríticos e símbolos matemáticos e técnicos em todo o mundo.

Você pode usar métodos como IsDigit e IsPunctuation em um caractere individual em


uma variável String para determinar a classificação Unicode.

Requisitos de formato
Você deve colocar um literal String entre aspas ( " " ). Se você precisar incluir uma aspa
como um dos caracteres na cadeia de caracteres, use duas aspas contíguas ( "" ). O
exemplo a seguir ilustra essa situação.

VB
Dim j As String = "Joe said ""Hello"" to me."

Dim h As String = "Hello"

' The following messages all display the same thing:

' "Joe said "Hello" to me."

MsgBox(j)

MsgBox("Joe said " & """" & h & """" & " to me.")

MsgBox("Joe said """ & h & """ to me.")

Observe que as aspas contíguas que representam uma aspa na cadeia de caracteres são
independentes das aspas que começam e terminam o literal String .

Manipulações de cadeia de caracteres


Depois de atribuir uma cadeia de caracteres a uma variável String , essa cadeia de
caracteres é imutável, o que significa que você não pode alterar o comprimento ou o
conteúdo. Quando você altera uma cadeia de caracteres de alguma forma, o Visual
Basic cria uma nova cadeia de caracteres e abandona a anterior. Em seguida, a variável
String aponta para a nova cadeia de caracteres.

Você pode manipular o conteúdo de uma variável String usando uma variedade de
funções de cadeia de caracteres. O exemplo a seguir ilustra a função Left

VB

Dim S As String = "Database"

' The following statement sets S to a new string containing "Data".

S = Microsoft.VisualBasic.Left(S, 4)

Uma cadeia de caracteres criada por outro componente pode ser preenchida com
espaços à esquerda ou à direita. Se você receber essa cadeia de caracteres, poderá usar
as funções Trim, LTrim e RTrim para remover esses espaços.

Para obter mais informações sobre manipulações de cadeia de caracteres, confira


Cadeia de caracteres.

Dicas de programação
Números Negativos. Lembre-se de que os caracteres mantidos por String não
têm sinal e não podem representar valores negativos. De qualquer forma, você
não deve usar String para manter valores numéricos.
Considerações sobre interoperabilidade. Se você estiver fazendo interface com
componentes não escritos para o .NET Framework, por exemplo, objetos de
Automação ou COM, lembre-se de que os caracteres de sua cadeia têm uma
largura de dados diferente (8 bits) em outros ambientes. Se você estiver passando
um argumento de cadeia de caracteres de 8 bits para tal componente, declare-o
como Byte() , uma matriz de elementos Byte , em vez de String no novo código
do Visual Basic.

Caracteres de tipo. Acrescentar o caractere de tipo identificador $ a qualquer


identificador o força ao tipo de dados String . String não tem nenhum caractere
de tipo literal. No entanto, o compilador trata literais entre aspas ( " " ) como
String .

Tipo do Framework. O tipo correspondente no .NET Framework é a classe


System.String.

Confira também
System.String
Data Types
Tipo de Dados de Caractere
Funções de conversão do tipo
Resumo da Conversão
Como: Chamar uma função do Windows que use tipos não assinados
Uso eficiente de tipos de dados
tipo de dados UInteger
Artigo • 28/11/2022 • 3 minutos para o fim da leitura

Contém inteiros sem sinal de 32 bits (4 bytes) variando no valor de zero a 4.294.967.295.

Comentários
O tipo de dados UInteger fornece o maior valor não assinado na largura de dados mais
eficiente.

O valor padrão de UInteger é 0.

Atribuições
Você pode declarar e inicializar uma variável UInteger atribuindo a ela um literal
decimal, hexadecimal, octal ou (a partir do Visual Basic 2017) binário. Se o literal inteiro
estiver fora do intervalo de UInteger (ou seja, se for menor que UInt32.MinValue ou
maior que UInt32.MaxValue, ocorrerá um erro de compilação.

No exemplo a seguir, inteiros iguais a 3.000.000.000 representados como literais


decimais, hexadecimais e binários são atribuídos a valores UInteger .

VB

Dim uintValue1 As UInteger = 3000000000ui

Console.WriteLine(uintValue1)

Dim uintValue2 As UInteger = &HB2D05E00ui

Console.WriteLine(uintValue2)

Dim uintValue3 As UInteger = &B1011_0010_1101_0000_0101_1110_0000_0000ui

Console.WriteLine(uintValue3)

' The example displays the following output:

' 3000000000

' 3000000000

' 3000000000

7 Observação

Use o prefixo &h ou &H para indicar um literal hexadecimal, &b ou &B para indicar
um literal binário e &o ou &O para indicar um literal octal. Literais decimais não têm
nenhum prefixo.
A partir do Visual Basic 2017, você também pode usar o caractere de sublinhado, _ ,
como separador de dígitos para melhorar a legibilidade, como no exemplo a seguir.

VB

Dim uintValue1 As UInteger = 3_000_000_000ui

Console.WriteLine(uintValue1)

Dim uintValue2 As UInteger = &HB2D0_5E00ui

Console.WriteLine(uintValue2)

Dim uintValue3 As UInteger = &B1011_0010_1101_0000_0101_1110_0000_0000ui

Console.WriteLine(uintValue3)

' The example displays the following output:

' 3000000000

' 3000000000

' 3000000000

A partir do Visual Basic 15.5, você também pode usar o caractere de sublinhado ( _ )
como separador à esquerda entre o prefixo e os dígitos hexadecimais, binários ou
octais. Por exemplo:

VB

Dim number As UInteger = &H_0F8C_0326

Para usar o caractere de sublinhado como separador à esquerda, você deve adicionar o
seguinte elemento ao arquivo de projeto do Visual Basic (*.vbproj):

XML

<PropertyGroup>

<LangVersion>15.5</LangVersion>

</PropertyGroup>

Para obter mais informações, consulte Selecionar a versão da linguagem Visual Basic.

Literais numéricos também podem incluir UI ou ui caractere do tipo para indicar o tipo
de dados UInteger , como mostra o exemplo a seguir.

VB

Dim number = &H_0FAC_14D7ui

Dicas de programação
Os tipos de dados UInteger e Integer fornecem desempenho ideal em um processador
de 32 bits, pois os tipos inteiros menores ( UShort , Short , Byte e SByte ), embora usem
menos bits, levam mais tempo para carregar, armazenar e buscar.

Números Negativos. Como UInteger é um tipo sem sinal, não pode representar
um número negativo. Se você usar o operador unário menos ( - ) em uma
expressão avaliada como tipo UInteger , o Visual Basic primeiro converterá a
expressão em Long .

Compatível com CLS. O tipo de dados UInteger não faz parte da CLS ( Common
Language Specification ), portanto, o código em conformidade com CLS não
pode consumir um componente que o utilize.

Considerações sobre interoperabilidade. Se você estiver fazendo interface com


componentes não escritos para o .NET Framework, como objetos Automation ou
COM, tenha em mente que tipos como uint podem ter largura de dados diferente
(16 bits) em outros ambientes. Se você estiver transmitindo um argumento de 16
bits para um componente desse tipo, declare-o como UShort em vez de UInteger
no seu novo código gerenciado do Visual Basic.

Ampliação. O tipo de dados UInteger é ampliado para Long , ULong , Decimal ,


Single e Double . Isso significa que você pode converter UInteger em qualquer um
desses tipos sem a ocorrência de um erro System.OverflowException.

Caracteres de Tipo. Acrescentar os caracteres do tipo literal UI a um literal o força


ao tipo de dados UInteger . UInteger não tem caractere de tipo identificador.

Tipo do Framework. O tipo correspondente no .NET Framework é a estrutura


System.UInt32.

Confira também
UInt32
Data Types
Funções de conversão do tipo
Resumo da Conversão
Como: Chamar uma função do Windows que use tipos não assinados
Uso eficiente de tipos de dados
Tipo de Dados ULong (Visual Basic)
Artigo • 28/11/2022 • 3 minutos para o fim da leitura

Contém inteiros sem sinal de 64 bits (8 bytes) variando no valor de 0 a


18.446.744.073.709.551.615 (mais de 1,84 vezes 10 ^ 19).

Comentários
Use o tipo de dados ULong para conter dados binários muito grandes para UInteger ou
os maiores valores inteiros sem sinal possíveis.

O valor padrão de ULong é 0.

Atribuições literais
Você pode declarar e inicializar uma variável ULong atribuindo a ela um literal decimal,
hexadecimal, octal ou (a partir do Visual Basic 2017) binário. Se o literal inteiro estiver
fora do intervalo de ULong (ou seja, se for menor que UInt64.MinValue ou maior que
UInt64.MaxValue, ocorrerá um erro de compilação.

No exemplo a seguir, inteiros iguais a 7.934.076.125 representados como literais


decimais, hexadecimais e binários são atribuídos a valores ULong .

VB

Dim ulongValue1 As ULong = 7934076125

Console.WriteLine(ulongValue1)

Dim ulongValue2 As ULong = &H0001D8e864DD

Console.WriteLine(ulongValue2)

Dim ulongValue3 As ULong = &B0001_1101_1000_1110_1000_0110_0100_1101_1101

Console.WriteLine(ulongValue3)

' The example displays the following output:

' 7934076125

' 7934076125

' 7934076125

7 Observação

Use o prefixo &h ou &H para indicar um literal hexadecimal, &b ou &B para indicar
um literal binário e &o ou &O para indicar um literal octal. Literais decimais não têm
nenhum prefixo.

A partir do Visual Basic 2017, você também pode usar o caractere de sublinhado, _ ,
como separador de dígitos para melhorar a legibilidade, como no exemplo a seguir.

VB

Dim longValue1 As Long = 4_294_967_296

Console.WriteLine(longValue1)

Dim longValue2 As Long = &H1_0000_0000

Console.WriteLine(longValue2)

Dim longValue3 As Long = &B1_0000_0000_0000_0000_0000_0000_0000_0000

Console.WriteLine(longValue3)

' The example displays the following output:

' 4294967296

' 4294967296

' 4294967296

A partir do Visual Basic 15.5, você também pode usar o caractere de sublinhado ( _ )
como separador à esquerda entre o prefixo e os dígitos hexadecimais, binários ou
octais. Por exemplo:

VB

Dim number As ULong = &H_F9AC_0326_1489_D68C

Para usar o caractere de sublinhado como separador à esquerda, você deve adicionar o
seguinte elemento ao arquivo de projeto do Visual Basic (*.vbproj):

XML

<PropertyGroup>

<LangVersion>15.5</LangVersion>

</PropertyGroup>

Para obter mais informações, consulte Selecionar a versão da linguagem Visual Basic.

Literais numéricos também podem incluir caractere do tipo UL ou ul para indicar o tipo
de dados ULong , como mostra o exemplo a seguir.

VB

Dim number = &H_00_00_0A_96_2F_AC_14_D7ul

Dicas de programação
Números Negativos. Como ULong é um tipo sem sinal, não pode representar um
número negativo. Se você usar o operador unário menos ( - ) em uma expressão
avaliada como tipo ULong , o Visual Basic primeiro converterá a expressão em
Decimal .

Compatível com CLS. O tipo de dados ULong não faz parte da CLS ( Common
Language Specification ), portanto, o código em conformidade com CLS não
pode consumir um componente que o utilize.

Considerações sobre interoperabilidade. Se você estiver fazendo interface com


componentes não escritos para o .NET Framework, como objetos de Automação
ou COM, tenha em mente que tipos como ulong podem ter largura de dados
diferente (32 bits) em outros ambientes. Se você estiver transmitindo um
argumento de 32 bits para um componente desse tipo, declare-o como UInteger
em vez de ULong no novo código gerenciado do Visual Basic.

Ampliação. O tipo de dados ULong é ampliado para Decimal , Single e Double .


Isso significa que você pode converter ULong em qualquer um desses tipos sem a
ocorrência de um erro System.OverflowException.

Caracteres de tipo. Acrescentar os caracteres do tipo literal UL a um literal o força


ao tipo de dados ULong . ULong não tem caractere de identificação de tipo.

Tipo do Framework. O tipo correspondente no .NET Framework é a estrutura


System.UInt64.

Confira também
UInt64
Data Types
Funções de conversão do tipo
Resumo da Conversão
Como: Chamar uma função do Windows que use tipos não assinados
Uso eficiente de tipos de dados
Tipo de dados definido pelo usuário
Artigo • 21/02/2023 • 2 minutos para o fim da leitura

Contém dados em um formato que você define. A instrução Structure define o


formato.

As versões anteriores do Visual Basic dão suporte ao UDT (tipo definido pelo usuário). A
versão atual expande o UDT para uma estrutura. Uma estrutura é uma concatenação de
um ou mais membros de vários tipos de dados. O Visual Basic trata uma estrutura como
uma unidade única, embora você também possa acessar os respectivos membros
individualmente.

Comentários
Defina e use um tipo de dados de estrutura quando precisar combinar vários tipos de
dados em uma unidade única ou quando nenhum dos tipos de dados elementares
atender às necessidades.

O valor padrão de um tipo de dados de estrutura consiste na combinação dos valores


padrão de cada um dos respectivos membros.

Formato de declaração
Uma declaração de estrutura começa com a Instrução Structure e termina com a
instrução End Structure . A instrução Structure fornece o nome da estrutura, que
também é o identificador do tipo de dados que a estrutura está definindo. Outras partes
do código podem usar esse identificador para declarar variáveis, parâmetros e valores
de retorno de função como sendo do tipo de dados dessa estrutura.

As declarações entre as instruções Structure e End Structure definem os membros da


estrutura.

Níveis de acesso de membro


Você deve declarar cada membro usando uma Instrução Dim ou uma instrução que
especifique o nível de acesso, como Público, Amigo ou Privado. Se você usar uma
instrução Dim , o nível de acesso padrão será público.

Dicas de programação
Consumo de memória. Assim como acontece com todos os tipos de dados
compostos, você não pode calcular com segurança o consumo total de memória
de uma estrutura adicionando as alocações de armazenamento nominais de seus
membros. Além disso, você não pode supor com segurança que a ordem de
armazenamento na memória seja a mesma que sua ordem de declaração. Se você
precisar controlar o layout de armazenamento de uma estrutura, poderá aplicar o
atributo StructLayoutAttribute à instrução Structure .

Considerações sobre interoperabilidade. Se você estiver estabelecendo interface


com componentes não gravados para o .NET Framework, por exemplo, objetos de
Automação ou COM, tenha em mente que os tipos definidos pelo usuário em
outros ambientes não são compatíveis com os tipos de estrutura do Visual Basic.

Ampliação. Não há conversão automática para ou de qualquer tipo de dados de


estrutura. Você pode definir operadores de conversão na estrutura usando a
Instrução Operator e declarar que cada operador de conversão é Widening ou
Narrowing .

Caracteres de tipo. Os tipos de dados de estrutura não têm caractere de tipo


literal ou caractere de tipo de identificador.

Tipo do Framework. Não há nenhum tipo correspondente no .NET Framework.


Todas as estruturas herdam da classe System.ValueType.NET Framework, mas
nenhuma estrutura individual corresponde a System.ValueType.

Exemplo
O paradigma a seguir mostra o contorno da declaração de uma estrutura.

VB

[Public | Protected | Friend | Protected Friend | Private] Structure


structname

{Dim | Public | Friend | Private} member1 As datatype1

' ...

{Dim | Public | Friend | Private} memberN As datatypeN

End Structure

Confira também
ValueType
StructLayoutAttribute
Data Types
Funções de conversão do tipo
Resumo da Conversão
Instrução Structure
Widening
Narrowing
Estruturas
Uso eficiente de tipos de dados
Tipo de dados UShort (Visual Basic)
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Contém inteiros sem sinal de 16 bits (2 bytes) variando no valor de zero a 65.535.

Comentários
Use o tipo de dados UShort para conter dados binários muito grandes para Byte .

O valor padrão de UShort é 0.

Atribuições de literal
Você pode declarar e inicializar uma variável UShort atribuindo a ela um literal decimal,
hexadecimal, octal ou (a partir do Visual Basic 2017) binário. Se o literal inteiro estiver
fora do intervalo de UShort (ou seja, se for menor que UInt16.MinValue ou maior que
UInt16.MaxValue, ocorrerá um erro de compilação.

No exemplo a seguir, inteiros iguais a 65.034 representados como literais decimais,


hexadecimais e binários são atribuídos a valores UShort .

VB

Dim ushortValue1 As UShort = 65034

Console.WriteLine(ushortValue1)

Dim ushortValue2 As UShort = &HFE0A

Console.WriteLine(ushortValue2)

Dim ushortValue3 As UShort = &B1111_1110_0000_1010

Console.WriteLine(ushortValue3)

' The example displays the following output:

' 65034

' 65034

' 65034

7 Observação

Use o prefixo &h ou &H para indicar um literal hexadecimal, &b ou &B para indicar
um literal binário e &o ou &O para indicar um literal octal. Literais decimais não têm
nenhum prefixo.
A partir do Visual Basic 2017, você também pode usar o caractere de sublinhado, _ ,
como separador de dígitos para melhorar a legibilidade, como no exemplo a seguir.

VB

Dim ushortValue1 As UShort = 65_034

Console.WriteLine(ushortValue1)

Dim ushortValue3 As UShort = &B11111110_00001010

Console.WriteLine(ushortValue3)

' The example displays the following output:

' 65034

' 65034

A partir do Visual Basic 15.5, você também pode usar o caractere de sublinhado ( _ )
como separador à esquerda entre o prefixo e os dígitos hexadecimais, binários ou
octais. Por exemplo:

VB

Dim number As UShort = &H_FF8C

Para usar o caractere de sublinhado como separador à esquerda, você deve adicionar o
seguinte elemento ao arquivo de projeto do Visual Basic (*.vbproj):

XML

<PropertyGroup>

<LangVersion>15.5</LangVersion>

</PropertyGroup>

Para obter mais informações, consulte Selecionar a versão da linguagem Visual Basic.

Literais numéricos também podem incluir caractere do tipo US ou us para indicar o tipo
de dados UShort , como mostra o exemplo a seguir.

VB

Dim number = &H_5826us

Dicas de programação
Números Negativos. Como UShort é um tipo sem sinal, não pode representar um
número negativo. Se você usar o operador unário menos ( - ) em uma expressão
avaliada como tipo UShort , o Visual Basic primeiro converterá a expressão em
Integer .

Compatível com CLS. O tipo de dados UShort não faz parte da CLS (Common
Language Specification ), portanto, o código compatível com CLS não pode
consumir um componente que o utilize.

Ampliação. O tipo de dados UShort é ampliado para Integer , UInteger , Long ,


ULong , Decimal , Single e Double . Isso significa que você pode converter UShort
em qualquer um desses tipos sem a ocorrência de um erro
System.OverflowException.

Caracteres de tipo. Acrescentar os caracteres do tipo literal US a um literal o força


ao tipo de dados UShort . UShort não tem caractere de identificação de tipo.

Tipo do Framework. O tipo correspondente no .NET Framework é a estrutura


System.UInt16.

Confira também
UInt16
Data Types
Funções de conversão do tipo
Resumo da Conversão
Como: Chamar uma função do Windows que use tipos não assinados
Uso eficiente de tipos de dados
Diretiva #Const
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Define constantes do compilador condicional para o Visual Basic.

Sintaxe
VB

#Const constname = expression

Partes
constname

Obrigatórios. Nome da constante que está sendo definida.

expression

Obrigatórios. Literal, outra constante de compilador condicional ou qualquer


combinação que inclua qualquer operador aritmético ou lógico, exceto Is .

Comentários
Constantes de compilador condicional são sempre privadas para o arquivo no qual elas
aparecem. Você não pode criar constantes de compilador público usando a diretiva
#Const ; é possível criá-las apenas na interface do usuário ou com a opção do
compilador /define .

Você pode usar apenas constantes de compilador condicional e literais em expression .


Usar uma constante padrão definida com Const causa um erro. Por outro lado, você
pode usar constantes definidas com a palavra-chave #Const somente para compilação
condicional. As constantes também podem ser indefinidas, caso em que elas têm um
valor de Nothing .

Exemplo
Este exemplo usa a diretiva #Const .

VB
#Const MyLocation = "USA"

#Const Version = "8.0.0012"

#Const CustomerNumber = 36

Confira também
-define (Visual Basic)
Diretivas #If...Then...#Else
Instrução Const
Compilação Condicional
Instrução If...Then...Else
Diretiva #ExternalSource
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Indica um mapeamento entre linhas específicas do código-fonte e texto externo à


origem.

Sintaxe
VB

#ExternalSource( StringLiteral , IntLiteral )

[ LogicalLine+ ]

#End ExternalSource

Partes
StringLiteral

O caminho para a fonte externa.

IntLiteral

O número de linha da primeira linha da origem externa.

LogicalLine

A linha em que o erro ocorre na origem externa.

#End ExternalSource

Termina o bloco #ExternalSource .

Comentários
Essa diretiva é usada apenas pelo compilador e pelo depurador.

Um arquivo de origem pode incluir diretivas de origem externas, que indicam um


mapeamento entre linhas de código específicas no arquivo de origem e texto externo à
origem, como um arquivo .aspx. Se erros forem encontrados no código-fonte designado
durante a compilação, eles serão identificados como provenientes da origem externa.

As diretivas de origem externa não têm efeito na compilação e não podem ser
aninhadas. Elas destinam-se apenas ao uso interno pelo aplicativo.
Confira também
Compilação Condicional
Diretivas #If...Then...#Else
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Compila condicionalmente blocos selecionados do código do Visual Basic.

Sintaxe
VB

#If expression Then

statements

[ #ElseIf expression Then

[ statements ]

...

#ElseIf expression Then

[ statements ] ]

[ #Else

[ statements ] ]

#End If

Partes
expression

Necessário para as instruções #If e #ElseIf , opcional em outros lugares. Qualquer


expressão que consista exclusivamente em uma ou mais constantes condicionais do
compilador, literais e operadores, que sejam avaliadas como True ou False .

statements

Necessário para o bloco de instruções #If , opcional em outros lugares. Linhas de


programa ou diretivas do compilador do Visual Basic que são compiladas se a expressão
associada for avaliada como True .

#End If

Encerra o bloco de instruções #If .

Comentários
Na superfície, o comportamento das diretivas #If...Then...#Else aparece o mesmo
que o das instruções If...Then...Else . No entanto, as diretivas #If...Then...#Else
avaliam o que é compilado pelo compilador, enquanto as instruções If...Then...Else
avaliam as condições em tempo de execução.

A compilação condicional normalmente é usada para compilar o mesmo programa para


diferentes plataformas. Ela também é usada para impedir que o código de depuração
apareça em um arquivo executável. O código excluído durante a compilação condicional
é completamente omitido do arquivo executável final, portanto, ele não tem efeito
sobre o tamanho ou o desempenho.

Independentemente do resultado de qualquer avaliação, todas as expressões são


avaliadas usando Option Compare Binary . A instrução Option Compare não afeta
expressões nas instruções #If e #ElseIf .

7 Observação

Não existe nenhuma forma de linha única das diretivas #If , #Else , #ElseIf e #End
If . Nenhum outro código pode aparecer na mesma linha que qualquer uma das

diretivas.

As instruções dentro de um bloco de compilação condicional devem ser instruções


lógicas completas. Por exemplo, você não pode compilar condicionalmente apenas os
atributos de uma função, mas pode declarar condicionalmente a função junto com seus
atributos:

VB

#If DEBUG Then

<WebMethod()>

Public Function SomeFunction() As String

#Else

<WebMethod(CacheDuration:=86400)>
Public Function SomeFunction() As String

#End If

Exemplo
Este exemplo usa o constructo #If...Then...#Else para determinar se é necessário
compilar determinadas instruções.

VB

#Const CustomerNumber = 36

#If CustomerNumber = 35 Then

' Insert code to be compiled for customer # 35.

#ElseIf CustomerNumber = 36 Then

' Insert code to be compiled for customer # 36.

#Else

' Insert code to be compiled for all other customers.

#End If

Confira também
Diretiva #Const
Instrução If...Then...Else
Compilação Condicional
System.Diagnostics.ConditionalAttribute
Diretiva #Region
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Recolhe e oculta seções de código em arquivos do Visual Basic.

Sintaxe
VB

#Region string_literal

' 0 or more statements

#End Region

Partes
Termo Definição

#Region Obrigatórios. Especifique o início de uma região.

string_literal Obrigatórios. Cadeia de caracteres (entre aspas duplas) que atua como o título
de uma região quando ela é recolhida. As regiões são recolhidas por padrão.

#End Region Obrigatórios. Termina o bloco #Region .

Comentários
Use a diretiva #Region para especificar um bloco de código que pode ser expandido ou
recolhido ao usar o recurso de estrutura de tópicos do IDE do Visual Studio. Você pode
colocar ou aninhar regiões em outras delas para agrupar regiões semelhantes.

Exemplo
Este exemplo usa a diretiva #Region .

VB

#Region "MathFunctions"

' Insert code for the Math functions here.

#End Region

Confira também
Diretivas #If...Then...#Else
Estrutura de tópicos
Como: Recolher e ocultar seções do código
Diretivas #Disable e #Enable (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As diretivas #Disable e #Enable são diretivas do compilador de código-fonte do Visual


Basic. São usadas para desabilitar e reabilitar todos os avisos ou específicos para regiões
de código.

VB

Dim variable1 'warning BC42024: Unused local variable: 'variable1'.

#Disable Warning

Dim variable2 'no warning

#Enable Warning

Dim variable3 'warning BC42024: Unused local variable: 'variable3'.

VB

' Suppress warning about no awaits in this method.

#Disable Warning BC42356

Async Function TestAsync() As Task

Console.WriteLine("testing")

End Function

#Enable Warning BC42356

Você também pode desabilitar e habilitar uma lista separada por vírgulas de códigos de
aviso.

Confira também
Referência da linguagem Visual Basic
Como suprimir os avisos da análise de código
Funções (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os tópicos nesta seção contêm tabelas das funções de membro de tempo de execução
do Visual Basic.

7 Observação

Você também pode criar funções e chamá-las. Para obter mais informações,
consulte instrução Function e Como criar um procedimento que retorna um
valor.

Nesta seção
Funções de conversão

Funções Matemáticas

Funções de cadeia de caracteres

Funções de conversão do tipo

Função CType

Seções relacionadas
Referência da linguagem Visual Basic
Funções de conversão (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Asc
AscW
Função CBool
Função CByte
Função CChar
Função CDate
Função CDbl
Função CDec
Chr
ChrW
Função CInt
Função CLng
Função CObj
Função CSByte
Função CShort
Função CSng
Função CStr
Função CType
Função CUInt
Função CULng
Função CUShort
Format
Hex
Oct
Str
Val

Confira também
Funções de conversão do tipo
Convertendo tipos de dados
Funções matemáticas (Visual Basic)
Artigo • 22/02/2023 • 5 minutos para o fim da leitura

Os métodos da classe System.Math fornecem trigonométrico, logarítmico e outras


funções matemáticas comuns.

Comentários
A tabela a seguir lista métodos da classe System.Math. Você pode usá-los em um
programa do Visual Basic:

Método .NET Descrição

Abs Retorna o valor absoluto de um número.

Acos Retorna o ângulo cujo cosseno é o número especificado.

Asin Retorna o ângulo cujo seno é o número especificado.

Atan Retorna o ângulo cuja tangente é o número especificado.

Atan2 Retorna o ângulo cuja tangente é o quociente de dois números especificados.

BigMul Retorna o produto completo de dois números de 32 bits.

Ceiling Retorna o menor valor integral maior ou igual ao Decimal ou Double


especificado.

Cos Retorna o cosseno do ângulo especificado.

Cosh Retorna o cosseno hiperbólico do ângulo especificado.

DivRem Retorna o quociente de dois inteiros com sinal de 32 bits ou 64 bits e também
retorna o restante em um parâmetro de saída.

Exp Retorna e (a base dos logaritmos naturais) elevado à potência especificada.

Floor Retorna o maior inteiro menor ou igual ao número Decimal ou Double


especificado.

IEEERemainder Retorna o resto que resulta da divisão de um número especificado por outro
número especificado.

Log Retorna o logaritmo natural (base e) de um número especificado ou o logaritmo


de um número especificado em uma base especificada.

Log10 Retorna o logaritmo de base 10 de um número especificado.


Método .NET Descrição

Max Retorna o maior dos dois números.

Min Retorna o menor de dois números.

Pow Retorna um número especificado elevado à potência especificada.

Round Retorna um valor Decimal ou Double arredondado para o valor integral mais
próximo ou para um número especificado de dígitos fracionários.

Sign Retorna um valor Integer indicando o sinal de um número.

Sin Retorna o seno do ângulo especificado.

Sinh Retorna o seno hiperbólico do ângulo especificado.

Sqrt Retorna a raiz quadrada de um número especificado.

Tan Retorna a tangente do ângulo especificado.

Tanh Retorna a tangente hiperbólica do ângulo especificado.

Truncate Calcula a parte integral de um número Decimal ou Double especificado.

A tabela a seguir lista os métodos da classe System.Math que não existem em .NET
Framework, mas são adicionados no .NET Standard ou no .NET Core:

Método .NET Descrição Disponível em

Acosh Retorna o ângulo cujo cosseno hiperbólico é o Do .NET Core 2.1 e do .NET
número especificado. Standard 2.1 em diante

Asinh Retorna o ângulo cujo seno hiperbólico é o Do .NET Core 2.1 e do .NET
número especificado. Standard 2.1 em diante

Atanh Retorna o ângulo cuja tangente hiperbólica é Do .NET Core 2.1 e do .NET
o número especificado. Standard 2.1 em diante

BitDecrement Retorna o próximo valor menor que é Do SDK do .NET Core 3.0
comparado como menor que x . em diante

BitIncrement Retorna o próximo valor maior que é Do SDK do .NET Core 3.0
comparado como maior que x . em diante

Cbrt Retorna a raiz cúbica de um número Do .NET Core 2.1 e do .NET


especificado. Standard 2.1 em diante

Clamp Retorna value fixado no intervalo inclusivo de Do .NET Core 2.0 e do .NET
min e max . Standard 2.1 em diante
Método .NET Descrição Disponível em

CopySign Retorna um valor com magnitude de x e o Do SDK do .NET Core 3.0


sinal de y . em diante

FusedMultiplyAdd Retorna (x * y) + z, arredondado como uma Do SDK do .NET Core 3.0


operação ternária. em diante

ILogB Retorna o logaritmo inteiro de base 2 de um Do SDK do .NET Core 3.0


número especificado. em diante

Log2 Retorna o logaritmo de base 2 de um número Do SDK do .NET Core 3.0


especificado. em diante

MaxMagnitude Retorna a maior magnitude de dois números Do SDK do .NET Core 3.0
de ponto flutuante de precisão dupla. em diante

MinMagnitude Retorna a menor magnitude de dois números Do SDK do .NET Core 3.0
de ponto flutuante de precisão dupla. em diante

ScaleB Retorna x * 2^n computado com eficiência. Do SDK do .NET Core 3.0
em diante

Para usar essas funções sem qualificação, importe o namespace System.Math para o
projeto adicionando o seguinte código à parte superior do arquivo de origem:

VB

Imports System.Math

Exemplo – Abs
Este exemplo usa o método Abs da classe Math para calcular o valor absoluto de um
número.

VB

Dim x As Double = Math.Abs(50.3)

Dim y As Double = Math.Abs(-50.3)

Console.WriteLine(x)

Console.WriteLine(y)

' This example produces the following output:

' 50.3

' 50.3

Exemplo – Atan
Este exemplo usa o método Atan da classe Math para calcular o valor de pi.

VB

Public Function GetPi() As Double

' Calculate the value of pi.

Return 4.0 * Math.Atan(1.0)

End Function

7 Observação

A classe System.Math contém o campo Math.PI constante. Você pode usá-lo em


vez de calculá-lo.

Exemplo – Cos
Este exemplo usa o método Cos da classe Math para retornar o cosseno de um ângulo.

VB

Public Function Sec(angle As Double) As Double

' Calculate the secant of angle, in radians.

Return 1.0 / Math.Cos(angle)

End Function

Exemplo – Exp
Este exemplo usa o método Exp da classe Math para retornar o valor elevado a uma
potência.

VB

Public Function Sinh(angle As Double) As Double

' Calculate hyperbolic sine of an angle, in radians.

Return (Math.Exp(angle) - Math.Exp(-angle)) / 2.0

End Function

Exemplo – Log
Este exemplo usa o método Log da classe Math para retornar o logaritmo natural de um
número.
VB

Public Function Asinh(value As Double) As Double

' Calculate inverse hyperbolic sine, in radians.

Return Math.Log(value + Math.Sqrt(value * value + 1.0))

End Function

Exemplo – Round
Este exemplo usa o método Round da classe Math para arredondar um número para o
inteiro mais próximo.

VB

Dim myVar2 As Double = Math.Round(2.8)

Console.WriteLine(myVar2)

' The code produces the following output:

' 3

Exemplo – Sign
Este exemplo usa o método Sign da classe Math para determinar o sinal de um número.

VB

Dim mySign1 As Integer = Math.Sign(12)

Dim mySign2 As Integer = Math.Sign(-2.4)

Dim mySign3 As Integer = Math.Sign(0)

Console.WriteLine(mySign1)

Console.WriteLine(mySign2)

Console.WriteLine(mySign3)

' The code produces the following output:

' 1

' -1

' 0

Exemplo – Sin
Este exemplo usa o método Sin da classe Math para retornar o seno de um ângulo.

VB

Public Function Csc(angle As Double) As Double

' Calculate cosecant of an angle, in radians.

Return 1.0 / Math.Sin(angle)

End Function

Exemplo – Sqrt
Este exemplo usa o método Sqrt da classe Math para calcular a raiz quadrada de um
número.

VB

Dim mySqrt1 As Double = Math.Sqrt(4)

Dim mySqrt2 As Double = Math.Sqrt(23)

Dim mySqrt3 As Double = Math.Sqrt(0)

Dim mySqrt4 As Double = Math.Sqrt(-4)

Console.WriteLine(mySqrt1)

Console.WriteLine(mySqrt2)

Console.WriteLine(mySqrt3)

Console.WriteLine(mySqrt4)

' The code produces the following output:

' 2

' 4.79583152331272

' 0

' NaN

Exemplo – Tan
Este exemplo usa o método Tan da classe Math para retornar a tangente de um ângulo.

VB

Public Function Ctan(angle As Double) As Double

' Calculate cotangent of an angle, in radians.

Return 1.0 / Math.Tan(angle)

End Function

Confira também
Rnd
Randomize
NaN
Funções Matemáticas Derivadas
Operadores aritméticos
Funções da cadeia de caracteres (Visual
Basic)
Artigo • 22/02/2023 • 6 minutos para o fim da leitura

A tabela a seguir lista as funções que o Visual Basic fornece na classe


Microsoft.VisualBasic.Strings para pesquisar e manipular cadeias de caracteres. Elas
podem ser consideradas funções intrínsecas do Visual Basic; ou seja, você não precisa
chamá-las como membros explícitos de uma classe, como mostram os exemplos abaixo.
Métodos adicionais e, em alguns casos, métodos complementares, estão disponíveis na
classe System.String.

Método .NET Descrição


Framework

Asc, AscW Retorna um valor de Integer que representa o código de caractere


correspondente a um caractere.

Chr, ChrW Retorna o caractere associado ao código de caractere especificado.

Filter Retorna uma matriz baseada em zero contendo um subconjunto de uma


matriz String com base em critérios de filtro especificados.

Format Retorna uma cadeia de caracteres formatada de acordo com as instruções


contidas em uma expressão String de formato.

FormatCurrency Retorna uma expressão formatada como um valor de moeda usando o


símbolo da moeda definido no painel de controle do sistema.

FormatDateTime Retorna uma expressão de cadeia de caracteres que representa um valor de


data/hora.

FormatNumber Retorna uma expressão formatada como um número.

FormatPercent Retorna uma expressão formatada como um percentual (isto é, multiplicada


por 100) com um caractere % à direita.

InStr Retorna um inteiro que especifica a posição inicial da primeira ocorrência de


uma cadeia de caracteres dentro de outra.

InStrRev Retorna a posição da primeira ocorrência de uma cadeia de caracteres em


outra, começando do lado direito da cadeia de caracteres.

Join Retorna uma cadeia de caracteres criada unindo um número de subcadeias


contidas em uma matriz.

LCase Retorna uma cadeia de caracteres ou um caractere convertido em minúsculas.


Método .NET Descrição
Framework

Left Retorna uma cadeia de caracteres que contém um número especificado de


caracteres do lado esquerdo de uma cadeia de caracteres.

Len Retorna um inteiro que contém o número de caracteres em uma cadeia de


caracteres.

LSet Retorna uma cadeia de caracteres alinhada à esquerda que contém a cadeia
especificada ajustada no tamanho especificado.

LTrim Retorna uma cadeia de caracteres contendo uma cópia de uma cadeia de
caracteres especificada sem espaços à esquerda.

Mid Retorna uma cadeia de caracteres contendo um número específico de


caracteres de uma cadeia.

Replace Retorna uma cadeia de caracteres na qual uma subcadeia de caracteres


especificada foi substituída por outra subcadeia de caracteres um número
especificado de vezes.

Right Retorna uma cadeia de caracteres que contém um número especificado de


caracteres do lado direito de uma cadeia de caracteres.

RSet Retorna uma cadeia de caracteres alinhada à direita que contém a cadeia
especificada ajustada no tamanho especificado.

RTrim Retorna uma cadeia de caracteres contendo uma cópia de uma cadeia de
caracteres especificada sem espaços à direita.

Space Retorna uma cadeia de caracteres que consiste no número especificado de


espaços.

Split Retorna uma matriz unidimensional baseada em zero que contém um número
especificado de subcadeias de caracteres.

StrComp Retorna -1, 0 ou 1, com base no resultado de uma comparação de cadeia de


caracteres.

StrConv Retorna uma cadeia de caracteres convertida, conforme especificado.

StrDup Retorna uma cadeia de caracteres ou um objeto que consiste no caractere


especificado repetido no número de vezes especificado.

StrReverse Retorna uma cadeia de caracteres na qual a ordem dos caracteres de uma
cadeia de caracteres especificada é invertida.

Trim Retorna uma cadeia de caracteres contendo uma cópia de uma cadeia de
caracteres especificada sem espaços à direita ou à esquerda.
Método .NET Descrição
Framework

UCase Retorna uma cadeia de caracteres ou um caractere que contém a cadeia de


caracteres especificada, convertida em maiúsculas.

Você pode usar a instrução Option Compare para definir se as cadeias de caracteres são
comparadas usando uma ordem de classificação de texto que não diferencia maiúsculas
de minúsculas determinada pela localidade do sistema ( Text ) ou pelas representações
binárias internas dos caracteres ( Binary ). O método de comparação de texto padrão é
Binary .

Exemplo: UCase
Este exemplo usa a função UCase para retornar uma versão de uma cadeia de caracteres
em letras minúsculas.

VB

' String to convert.

Dim lowerCase As String = "Hello World 1234"

' Returns "HELLO WORLD 1234".

Dim upperCase As String = UCase(lowerCase)

Exemplo: LTrim
Este exemplo usa a função LTrim para retirar espaços à esquerda e a função RTrim para
retirar espaços à direita de um variável de cadeia de caracteres. Usa a função de Trim
para retirar ambos os tipos de espaços.

VB

' Initializes string.

Dim testString As String = " <-Trim-> "

Dim trimString As String

' Returns "<-Trim-> ".

trimString = LTrim(testString)

' Returns " <-Trim->".

trimString = RTrim(testString)

' Returns "<-Trim->".

trimString = LTrim(RTrim(testString))

' Using the Trim function alone achieves the same result.

' Returns "<-Trim->".

trimString = Trim(testString)

Exemplo: Mid
Este exemplo usa a função Mid para retornar um número especificado de caracteres de
uma cadeia de caracteres.

VB

' Creates text string.

Dim testString As String = "Mid Function Demo"


' Returns "Mid".

Dim firstWord As String = Mid(testString, 1, 3)

' Returns "Demo".

Dim lastWord As String = Mid(testString, 14, 4)

' Returns "Function Demo".

Dim midWords As String = Mid(testString, 5)

Exemplo: Len
Este exemplo usa Len para retornar o número especificado de caracteres em uma
cadeia de caracteres.

VB

' Initializes variable.

Dim testString As String = "Hello World"

' Returns 11.

Dim testLen As Integer = Len(testString)

Exemplo: InStr
Este exemplo usa a função InStr para retornar a posição da primeira ocorrência de uma
cadeia de caracteres dentro da outra.

VB

' String to search in.

Dim searchString As String = "XXpXXpXXPXXP"

' Search for "P".

Dim searchChar As String = "P"

Dim testPos As Integer

' A textual comparison starting at position 4. Returns 6.

testPos = InStr(4, searchString, searchChar, CompareMethod.Text)

' A binary comparison starting at position 1. Returns 9.

testPos = InStr(1, SearchString, SearchChar, CompareMethod.Binary)

' If Option Compare is not set, or set to Binary, return 9.

' If Option Compare is set to Text, returns 3.

testPos = InStr(searchString, searchChar)

' Returns 0.

testPos = InStr(1, searchString, "W")

Exemplo: Format
Este exemplo mostra vários usos da função Format para formatar valores usando os
formatos String e os formatos definidos pelo usuário. Para o separador de data ( / ),
separador de hora ( : ) e indicadores AM/PM ( t e tt ), a saída formatada real exibida
pelo seu sistema depende das configurações de localidade que o código está usando.
Quando horas e datas são exibidas no ambiente de desenvolvimento, o formato
abreviado de tempo e o formato abreviado de data do local do código são usados.

7 Observação

Para localidades que usam um relógio de 24 horas, os indicadores AM/PM ( t e tt )


não exibem nada.

VB

Dim testDateTime As Date = #1/27/2001 5:04:23 PM#

Dim testStr As String

' Returns current system time in the system-defined long time format.

testStr = Format(Now(), "Long Time")

' Returns current system date in the system-defined long date format.

testStr = Format(Now(), "Long Date")

' Also returns current system date in the system-defined long date

' format, using the single letter code for the format.

testStr = Format(Now(), "D")

' Returns the value of testDateTime in user-defined date/time formats.

' Returns "5:4:23".

testStr = Format(testDateTime, "h:m:s")

' Returns "05:04:23 PM".

testStr = Format(testDateTime, "hh:mm:ss tt")

' Returns "Saturday, Jan 27 2001".

testStr = Format(testDateTime, "dddd, MMM d yyyy")

' Returns "17:04:23".

testStr = Format(testDateTime, "HH:mm:ss")

' Returns "23".

testStr = Format(23)

' User-defined numeric formats.

' Returns "5,459.40".

testStr = Format(5459.4, "##,##0.00")

' Returns "334.90".

testStr = Format(334.9, "###0.00")

' Returns "500.00%".

testStr = Format(5, "0.00%")

Confira também
Palavras-chave
Membros da Biblioteca de Runtime do Visual Basic
Resumo de manipulação da cadeia de caracteres
Métodos de classe System.String
Funções de conversão do tipo (Visual
Basic)
Artigo • 12/12/2022 • 13 minutos para o fim da leitura

Essas funções são compiladas embutidas, o que significa que o código de conversão faz
parte do código que avalia a expressão. Às vezes, não há chamada para um
procedimento para realizar a conversão, o que melhora o desempenho. Cada função
força uma expressão a um tipo de dados específico.

Sintaxe
VB

CBool(expression)

CByte(expression)

CChar(expression)

CDate(expression)

CDbl(expression)

CDec(expression)

CInt(expression)

CLng(expression)

CObj(expression)

CSByte(expression)

CShort(expression)

CSng(expression)

CStr(expression)

CUInt(expression)

CULng(expression)

CUShort(expression)

Parte
expression

Obrigatórios. Qualquer expressão do tipo de dados de origem.

Tipo de dados do valor retornado


O nome da função determina o tipo de dados do valor retornado, conforme mostrado
na tabela a seguir.
Nome Tipo de Intervalo para argumento expression
da dados
função de
retorno

CBool Tipo de Um Char ou String válido ou expressão numérica.


dados
booliano

CByte Tipo de Byte.MinValue (0) a Byte.MaxValue (255) (sem sinal); as partes fracionárias
Dados são arredondadas.1

Byte
A partir do Visual Basic 15.8, o desempenho da conversão de ponto
flutuante para byte com a função CByte é otimizado; consulte a seção
Comentários para obter mais informações. Consulte a seção Exemplo de
CInt para obter um exemplo.

CChar Tipo de Qualquer expressão Char ou String válida; somente o primeiro caractere
Dados de de um String é convertido; o valor pode ser de 0 a 65535 (sem sinal).
Caractere

CDate Tipo de Qualquer representação válida de uma data e hora.


Dados de
Data

CDbl Tipo de -1,79769313486231570E+308 a -4,94065645841246544E-324 para valores


Dados negativos; 4,94065645841246544E-324 a 1,79769313486231570E+308
Duplo para valores positivos.

CDec Tipo de +/-79.228.162.514.264.337.593.543.950.335 para números em escala zero,


Dados ou seja, números sem casas decimais. Para números com 28 casas
Decimal decimais, o intervalo é +/-7,9228162514264337593543950335. O menor
número diferente de zero possível é 0,0000000000000000000000000001
(+/-1E-28).

CInt Tipo de Int32.MinValue (-2.147.483.648) a Int32.MaxValue (2.147.483.647); as partes


Dados fracionárias são arredondadas.1

Integer
A partir do Visual Basic 15.8, o desempenho da conversão de ponto
flutuante em inteiro com a função CInt é otimizado; consulte a seção
Comentários para obter mais informações. Consulte a seção Exemplo de
CInt para obter um exemplo.

CLng Tipo de Int64.MinValue (-9.223.372.036.854.775.808) a Int64.MaxValue


Dados (9.223.372.036.854.775.807); as partes fracionárias são arredondadas.1

Long
A partir do Visual Basic 15.8, o desempenho da conversão de ponto
flutuante em inteiro de 64 bits com a função CLng é otimizado; consulte a
seção Comentários para obter mais informações. Consulte a seção
Exemplo de CInt para obter um exemplo.
Nome Tipo de Intervalo para argumento expression
da dados
função de
retorno

CObj Tipo de Qualquer expressão válida.


dados
Object

CSByte Tipo de SByte.MinValue (-128) a SByte.MaxValue (127); as partes fracionárias são


Dados arredondadas.1

SByte
A partir do Visual Basic 15.8, o desempenho da conversão de ponto
flutuante em byte com sinal com a função CSByte é otimizado; consulte a
seção Comentários para obter mais informações. Consulte a seção
Exemplo de CInt para obter um exemplo.

CShort Tipo de Int16.MinValue (-32.768) a Int16.MaxValue (32.767); as partes fracionárias


Dados são arredondadas.1

Short
A partir do Visual Basic 15.8, o desempenho da conversão de ponto
flutuante em inteiro de 16 bits com a função CShort é otimizado; consulte
a seção Comentários para obter mais informações. Consulte a seção
Exemplo de CInt para obter um exemplo.

CSng Tipo de -3,402823E+38 a -1,401298E-45 para valores negativos, 1,401298E-45 a


Dados 3,402823E+38 para valores positivos.
Simples

CStr Tipo de O retorno para CStr depende do argumento expression . Consulte


Dados Retornar valores para a função CStr.
String

CUInt Tipo de UInt32.MinValue (0) a UInt32.MaxValue (4.294.967.295) (sem sinal); as


Dados partes fracionárias são arredondadas.1

UInteger
A partir do Visual Basic 15.8, o desempenho da conversão de ponto
flutuante em inteiro sem sinal com a função CUInt é otimizado; consulte a
seção Comentários para obter mais informações. Consulte a seção
Exemplo de CInt para obter um exemplo.

CULng Tipo de UInt64.MinValue (0) a UInt64.MaxValue (18.446.744.073.709.551.615) (sem


Dados sinal); as partes fracionárias são arredondadas.1

ULong
A partir do Visual Basic 15.8, o desempenho da conversão de ponto
flutuante em inteiro longo sem sinal com a função CULng é otimizado;
consulte a seção Comentários para obter mais informações. Consulte a
seção Exemplo de CInt para obter um exemplo.
Nome Tipo de Intervalo para argumento expression
da dados
função de
retorno

CUShort Tipo de UInt16.MinValue (0) a UInt16.MaxValue (65.535) (sem sinal); as partes


Dados fracionárias são arredondadas.1

UShort
A partir do Visual Basic 15.8, o desempenho da conversão de ponto
flutuante em inteiro de 16 bits sem sinal com a função CUShort é
otimizado; consulte a seção Comentários para obter mais informações.
Consulte a seção Exemplo de CInt para obter um exemplo.

1 Partes fracionárias podem estar sujeitas a um tipo especial de arredondamento


chamado arredondamento bancário. Confira "Comentários" para obter mais
informações.

Comentários
Como regra, você deve usar as funções de conversão de tipo do Visual Basic ao invés
dos métodos .NET Framework, como ToString() , na classe Convert ou em uma
estrutura ou classe de tipo individual. As funções do Visual Basic foram projetadas para
uma interação ideal com o código do Visual Basic e também tornam o código-fonte
mais curto e fácil de ler. Além disso, os métodos de conversão do .NET Framework nem
sempre produzem os mesmos resultados que as funções do Visual Basic, por exemplo,
ao converter Boolean em Integer . Para obter mais informações, consulte Tipos de
dados de solução de problemas.

A partir do Visual Basic 15.8, o desempenho da conversão de ponto flutuante em inteiro


é otimizado quando você passa o valor Single ou Double retornado pelos métodos a
seguir para uma das funções de conversão de inteiro ( CByte , CShort , CInt , CLng ,
CSByte , CUShort , CUInt , CULng ):

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 que faz um grande número de conversões de
inteiro seja executado duas vezes mais rápido. O exemplo a seguir ilustra estas
conversões otimizadas de ponto flutuante em inteiro:

VB

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

Comportamento
Coerção. Em geral, você pode usar as funções de conversão de tipo de dados para
forçar o resultado de uma operação a um tipo de dados específico em vez do tipo
de dados padrão. Por exemplo, use CDec para forçar a aritmética decimal nos
casos em que a aritmética de precisão única, precisão dupla ou inteiro
normalmente ocorreria.

Conversões com falha. Se expression passado para a função estiver fora do


intervalo do tipo de dados ao qual ele deve ser convertido, ocorrerá uma
OverflowException.

Partes fracionárias. Quando você converte um valor não integral em um tipo


integral, as funções de conversão de inteiro ( CByte , CInt , CLng , CSByte , CShort ,
CUInt , CULng e CUShort ) removem a parte fracionária e arredondam o valor para o
inteiro mais próximo.

Se a parte fracionária for exatamente 0,5, as funções de conversão de inteiro


arredondarão para o inteiro par mais próximo. Por exemplo, 0,5 é arredondado
para 0 e 1,5 e 2,5 para 2. Isso às vezes é chamado de arredondamento bancário, e
seu propósito é compensar um desvio que poderia ser acumulado ao somar
muitos desses números.

CInt e CLng diferem das funções Int e Fix, que truncam, em vez de arredondar, a
parte fracionária de um número. Além disso, Fix e Int sempre retorna um valor
do mesmo tipo de dados que você passa.
Conversões de data/hora. Use a função IsDate para determinar se um valor pode
ser convertido em uma data e hora. CDate reconhece literais de data e literais de
hora, mas não valores numéricos. Para converter um valor Date do Visual Basic 6.0
em um valor Date no Visual Basic 2005 ou versões posteriores, você pode usar o
método DateTime.FromOADate.

Valores de data/hora neutros. O Tipo de Dados de Data sempre contém


informações de data e hora. Para fins de conversão de tipo, o Visual Basic
considera 1/1/0001 (1º de janeiro do ano 1) como um valor neutro da data e
00:00:00 (meia-noite) como um valor neutro da hora. Se você converter um valor
Date em uma cadeia de caracteres, CStr não inclui valores neutros na cadeia de

caracteres resultante. Por exemplo, se você converter #January 1, 0001 9:30:00#


em uma cadeia de caracteres, o resultado será "9:30:00 AM"; as informações de
data serão suprimidas. No entanto, as informações de data ainda estão presentes
no valor original Date e podem ser recuperadas com funções como função
DatePart.

Sensibilidade à cultura. As funções de conversão de tipo que envolvem cadeias de


caracteres executam conversões com base nas configurações de cultura atuais do
aplicativo. Por exemplo, CDate reconhece formatos de data de acordo com a
configuração de localidade do sistema. Você deve fornecer o dia, mês e ano na
ordem correta para sua localidade ou a data pode não ser interpretada
corretamente. Um formato de data longa não será reconhecido se ele contiver
uma cadeia de caracteres de um dia da semana, como "quarta-feira".

Se for necessário converter para ou de uma representação de cadeia de caracteres


de um valor em um formato diferente do especificado pela sua localidade, não
será possível usar as funções de conversão de tipo do Visual Basic. Para fazer isso,
use os métodos ToString(IFormatProvider) e Parse(String, IFormatProvider)
desse tipo de valor. Por exemplo, use Double.Parse ao converter uma cadeia de
caracteres em Double e use Double.ToString ao converter um valor de tipo Double
em uma cadeia de caracteres.

Função CType
A Função CType usa um segundo argumento typename , e força expression a typename ,
onde typename pode ser qualquer tipo de dados, estrutura, classe ou interface para o
qual existe uma conversão válida.

Para obter uma comparação de CType com as outras palavras-chave de conversão de


tipo, consulte Operador DirectCast e Operador TryCast.
Exemplo de CBool
O seguinte exemplo usa a função CBool para converter expressões em valores Boolean .
Se uma expressão for avaliada como um valor diferente de zero, CBool retornará True ;
caso contrário, retornará False .

VB

Dim a, b, c As Integer

Dim check As Boolean

a = 5

b = 5

' The following line of code sets check to True.

check = CBool(a = b)

c = 0

' The following line of code sets check to False.

check = CBool(c)

Exemplo de CByte
O exemplo a seguir usa a função CByte para converter uma expressão em Byte .

VB

Dim aDouble As Double

Dim aByte As Byte

aDouble = 125.5678

' The following line of code sets aByte to 126.

aByte = CByte(aDouble)

Exemplo de CChar
O exemplo a seguir usa a função CChar para converter o primeiro caractere de uma
expressão String em um tipo Char .

VB

Dim aString As String

Dim aChar As Char

' CChar converts only the first character of the string.

aString = "BCD"

' The following line of code sets aChar to "B".

aChar = CChar(aString)

O argumento de entrada de CChar deve ser do tipo de dados Char ou String . Você não
pode usar CChar para converter um número em um caractere, porque CChar não pode
aceitar um tipo de dados numérico. O exemplo a seguir obtém um número que
representa um ponto de código (código de caractere) e o converte no caractere
correspondente. Ele usa a função InputBox para obter a cadeia de caracteres de dígitos,
CInt para converter a cadeia de caracteres no tipo Integer e ChrW converter o número

no tipo Char .

VB

Dim someDigits As String

Dim codePoint As Integer

Dim thisChar As Char

someDigits = InputBox("Enter code point of character:")

codePoint = CInt(someDigits)

' The following line of code sets thisChar to the Char value of codePoint.

thisChar = ChrW(codePoint)

Exemplo de CDate
O seguinte exemplo usa a função CDate para converter cadeias de caracteres em valores
Date . Em geral, não é recomendável codificar datas e horas como cadeias de caracteres

(conforme mostrado neste exemplo). Use literais de data e de hora, como #Feb 12,
1969# e #4:45:23 PM#

VB

Dim aDateString, aTimeString As String

Dim aDate, aTime As Date

aDateString = "February 12, 1969"

aTimeString = "4:35:47 PM"

' The following line of code sets aDate to a Date value.

aDate = CDate(aDateString)

' The following line of code sets aTime to Date value.

aTime = CDate(aTimeString)

Exemplo de CDbl
VB

Dim aDec As Decimal

Dim aDbl As Double

' The following line of code uses the literal type character D to make aDec
a Decimal.

aDec = 234.456784D

' The following line of code sets aDbl to 1.9225456288E+1.

aDbl = CDbl(aDec * 8.2D * 0.01D)

Exemplo de CDec
O seguinte exemplo usa a função CDec para converter um valor numérico em Decimal .

VB

Dim aDouble As Double

Dim aDecimal As Decimal


aDouble = 10000000.0587

' The following line of code sets aDecimal to 10000000.0587.

aDecimal = CDec(aDouble)

Exemplo de CInt
O seguinte exemplo usa a função CInt para converter um valor em Integer .

VB

Dim aDbl As Double

Dim anInt As Integer

aDbl = 2345.5678

' The following line of code sets anInt to 2346.

anInt = CInt(aDbl)

Exemplo de CLng
O seguinte exemplo usa a função CLng para converter valores em Long .

VB

Dim aDbl1, aDbl2 As Double

Dim aLng1, aLng2 As Long

aDbl1 = 25427.45

aDbl2 = 25427.55

' The following line of code sets aLng1 to 25427.

aLng1 = CLng(aDbl1)

' The following line of code sets aLng2 to 25428.

aLng2 = CLng(aDbl2)

Exemplo de CObj
O seguinte exemplo usa a função CObj para converter um valor numérico em Object . A
variável Object em si contém apenas um ponteiro de quatro bytes, que aponta para o
valor Double atribuído a ela.

VB

Dim aDouble As Double

Dim anObject As Object

aDouble = 2.7182818284

' The following line of code sets anObject to a pointer to aDouble.

anObject = CObj(aDouble)

Exemplo de CSByte
O seguinte exemplo usa a função CSByte para converter um valor numérico em SByte .

VB

Dim aDouble As Double

Dim anSByte As SByte

aDouble = 39.501

' The following line of code sets anSByte to 40.

anSByte = CSByte(aDouble)

Exemplo de CShort
O seguinte exemplo usa a função CShort para converter um valor numérico em Short .

VB

Dim aByte As Byte

Dim aShort As Short

aByte = 100

' The following line of code sets aShort to 100.

aShort = CShort(aByte)

Exemplo de CSng
O seguinte exemplo usa a função CSng para converter valores em Single .

VB
Dim aDouble1, aDouble2 As Double

Dim aSingle1, aSingle2 As Single

aDouble1 = 75.3421105

aDouble2 = 75.3421567

' The following line of code sets aSingle1 to 75.34211.

aSingle1 = CSng(aDouble1)

' The following line of code sets aSingle2 to 75.34216.

aSingle2 = CSng(aDouble2)

Exemplo de CStr
O seguinte exemplo usa a função CStr para converter um valor numérico em String .

VB

Dim aDouble As Double

Dim aString As String

aDouble = 437.324

' The following line of code sets aString to "437.324".

aString = CStr(aDouble)

O seguinte exemplo usa a função CStr para converter valores Date em valores String .

VB

Dim aDate As Date

Dim aString As String

' The following line of code generates a COMPILER ERROR because of invalid
format.

' aDate = #February 12, 1969 00:00:00#

' Date literals must be in the format #m/d/yyyy# or they are invalid.

' The following line of code sets the time component of aDate to midnight.

aDate = #2/12/1969#

' The following conversion suppresses the neutral time value of 00:00:00.

' The following line of code sets aString to "2/12/1969".

aString = CStr(aDate)

' The following line of code sets the time component of aDate to one second
past midnight.

aDate = #2/12/1969 12:00:01 AM#

' The time component becomes part of the converted value.

' The following line of code sets aString to "2/12/1969 12:00:01 AM".

aString = CStr(aDate)

CStr sempre renderiza um valor Date no formato curto padrão da localidade atual, por

exemplo, "15/6/2003 4:35:47 PM". No entanto, CStr suprime os valores neutros de


1/1/0001 na data e 00:00:00 na hora.
Para obter mais detalhes sobre os valores retornados por CStr , consulte Valores de
Retorno para a Função CStr.

Exemplo de CUInt
O seguinte exemplo usa a função CUInt para converter um valor numérico em
UInteger .

VB

Dim aDouble As Double

Dim aUInteger As UInteger

aDouble = 39.501

' The following line of code sets aUInteger to 40.

aUInteger = CUInt(aDouble)

Exemplo de CULng
O seguinte exemplo usa a função CULng para converter um valor numérico em ULong .

VB

Dim aDouble As Double

Dim aULong As ULong

aDouble = 39.501

' The following line of code sets aULong to 40.

aULong = CULng(aDouble)

Exemplo de CUShort
O seguinte exemplo usa a função CUShort para converter um valor numérico em
UShort .

VB

Dim aDouble As Double

Dim aUShort As UShort

aDouble = 39.501

' The following line of code sets aUShort to 40.

aUShort = CUShort(aDouble)

Confira também
Asc
AscW
Chr
ChrW
Int
Fix
Format
Hex
Oct
Str
Val
Funções de conversão
Conversões de tipo no Visual Basic
Retornar valores para a função CStr
(Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A tabela a seguir descreve os valores retornados para CStr para diferentes tipos de
dados de expression .

Se o tipo Retornos de CStr


expression for

Tipo de dados Uma cadeia de caracteres que contém "Verdadeiro" ou "Falso".


booliano

Tipo de Dados de Uma cadeia de caracteres que contém um valor Date (data e hora) no
Data formato de data curta do sistema.

Tipos de Dados Uma cadeia de caracteres que representa o numero.


Numéricos

CStr e Data
O tipo Date sempre contém informações de data e hora. Para fins de conversão de tipo,
o Visual Basic considera 1/1/0001 (1º de janeiro do ano 1) como um valor neutro da
data e 00:00:00 (meia-noite) como um valor neutro da hora. CStr não inclui valores
neutros na cadeia de caracteres resultante. Por exemplo, se você converter #January 1,
0001 9:30:00# em uma cadeia de caracteres, o resultado será "9:30:00 AM"; as
informações de data serão suprimidas. No entanto, as informações de data ainda estão
presentes no valor original Date e podem ser recuperadas com funções como DatePart.

7 Observação

A função CStr executa sua conversão com base nas configurações de cultura atuais
do aplicativo. Para obter a representação de cadeia de caracteres de um número
em uma cultura específica, use o método ToString(IFormatProvider) do número.
Por exemplo, use Double.ToString ao converter um valor de tipo Double em
String .

Confira também
DatePart
Funções de conversão do tipo
Tipo de dados booliano
Tipo de Dados de Data
Função CType (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Retorna o resultado da conversão explícita de uma expressão em um tipo de dados,


objeto, estrutura, classe ou interface especificados.

Sintaxe
VB

CType(expression, typename)

Partes
expression Qualquer expressão válida. Se o valor de expression estiver fora do
intervalo permitido por typename , o Visual Basic lançará uma exceção.

typename Qualquer expressão que seja legal dentro de uma cláusula As em uma

instrução Dim , ou seja, o nome de qualquer tipo de dados, objeto, estrutura, classe ou
interface.

Comentários

 Dica

Você também pode usar as seguintes funções para executar uma conversão de
tipo:

Funções de conversão de tipo, como CByte , CDbl e CInt que executam uma
conversão em um tipo de dados específico. Para obter mais informações,
consulte Funções de conversão de tipo.
Operador DirectCast ou Operador TryCast. Esses operadores exigem que um
tipo herde ou implemente o outro tipo. Eles podem fornecer um desempenho
um pouco melhor do que CType ao converter de e para o tipo de dados
Object .
CType é compilado embutido, o que significa que o código de conversão faz parte do

código que avalia a expressão. Em alguns casos, o código é executado mais


rapidamente porque nenhum procedimento é chamado para executar a conversão.

Se nenhuma conversão for definida de expression para typename (por exemplo, de


Integer para Date ), o Visual Basic exibirá uma mensagem de erro em tempo de

compilação.

Se uma conversão falhar em tempo de execução, a exceção apropriada será gerada. Se


uma conversão de restrição falhar, o resultado mais comum é OverflowException. Se a
conversão for indefinida, é lançado um InvalidCastException. Por exemplo, isso pode
acontecer se expression for do tipo Object e o respectivo tipo de tempo de execução
não tiver conversão para typename .

Se o tipo de dados de expression ou typename for uma classe ou estrutura que você
definiu, você poderá definir CType nessa classe ou estrutura como um operador de
conversão. Isso faz com que CType atue como um operador sobrecarregado. Se você
fizer isso, poderá controlar o comportamento de conversões de e para sua classe ou
estrutura, incluindo as exceções que podem ser geradas.

Palavras-chave de conversão
Uma comparação das palavras-chave de conversão de tipo é a seguinte.

Palavra- Tipos de Relação de argumento Falha em tempo de


chave dados execução

CType Qualquer A conversão de expansão ou de restrição Gera


tipo de deve ser definida entre os dois tipos de InvalidCastException
dados dados

Operador Qualquer Um tipo deve herdar ou implementar o outro Gera


DirectCast tipo de tipo InvalidCastException
dados

TryCast Apenas tipos Um tipo deve herdar ou implementar o outro Retorna Nada
de referência tipo

Sobrecarga
O operador CType também pode ser sobrecarregado em uma classe ou estrutura
definida fora do código. Se o código for convertido para ou de uma tal classe ou
estrutura, certifique-se de entender o comportamento de seu operador CType . Para
obter mais informações, consulte Procedimentos de operador.

Converter objetos dinâmicos


As conversões de tipo de objetos dinâmicos são executadas por conversões dinâmicas
definidas pelo usuário que usam os métodos TryConvert ou BindConvert. Se você estiver
trabalhando com objetos dinâmicos, use o método CTypeDynamic para converter o
objeto dinâmico.

Exemplo
O exemplo a seguir usa a função CType para converter uma expressão no tipo de dados
Single .

VB

Dim testNumber As Long = 1000

' The following line of code sets testNewType to 1000.0.

Dim testNewType As Single = CType(testNumber, Single)

Para obter exemplos adicionais, consulte Conversões implícitas e explícitas.

Confira também
OverflowException
InvalidCastException
Funções de conversão do tipo
Funções de conversão
Instrução Operator
Como definir um operador de conversão
Conversão de tipos no .NET Framework
Modificadores (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os tópicos nesta seção documentam modificadores de tempo de execução do Visual


Basic.

Nesta seção
Ansi

Assembly

Async

Auto

ByRef

ByVal

Default

Friend

In

Iterador

Chave

Palavra-chave <Module>

MustInherit

MustOverride

Narrowing

NotInheritable

NotOverridable

Opcional

Saída
Sobrecargas

Substituível

Substituições

ParamArray

Parcial

Privado

Particular Protegido

Protegido

Amigo Protegido

Público

ReadOnly (somente-leitura)

Sombras

Compartilhado

Estático

Unicode

Widening

WithEvents

WriteOnly

Seções relacionadas
Referência da linguagem Visual Basic
Ansi (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que o Visual Basic deve realizar marshal de todas as cadeias de caracteres
para valores ANSI (American National Standards Institute), independentemente do
nome do procedimento externo que está sendo declarado.

Quando você chama um procedimento definido fora do projeto, o compilador do Visual


Basic não tem acesso às informações de que ele precisa para chamar o procedimento
corretamente. Essas informações incluem onde o procedimento está localizado, como
ele é identificado, a sequência de chamadas, o tipo de retorno e o conjunto de
caracteres da cadeia de caracteres que ele usa. A Instrução Declare cria uma referência a
um procedimento externo e fornece essas informações necessárias.

A parte charsetmodifier na instrução Declare fornece as informações do conjunto de


caracteres para realizar marshaling das cadeias de caracteres durante uma chamada ao
procedimento externo. Isso também afeta a forma como o Visual Basic pesquisa o
arquivo externo pelo nome do procedimento externo. O modificador Ansi especifica
que o Visual Basic deve realizar marshal de todas as cadeias de caracteres para valores
ANSI e deve pesquisar o procedimento sem modificar seu nome durante a pesquisa.

Se nenhum modificador do conjunto de caracteres for especificado, Ansi será o padrão.

Comentários
O modificador Ansi pode ser usado neste contexto:

Instrução Declare

Anotações do desenvolvedor de dispositivo


inteligente
Não há suporte para essa palavra-chave.

Confira também
Auto
Unicode
Palavras-chave
Assembly (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que um atributo no início de um arquivo de origem é aplicável a todo o


assembly.

Comentários
Muitos atributos pertencem a um elemento de programação individual, como uma
classe ou propriedade. Você aplica esse atributo anexando o bloco de atributo, entre
colchetes angulares ( < > ), diretamente à instrução de declaração.

Se um atributo pertencer não apenas ao elemento a seguir, mas a todo o assembly,


você coloca o bloco de atributo no início do arquivo de origem e identifica o atributo
com a palavra-chave Assembly . Se ele se aplicar ao módulo de assembly atual, você
usará a palavra-chave Módulo.

Você também pode aplicar um atributo a um assembly no arquivo AssemblyInfo.vb.


Nesse caso, você não precisa usar um bloco de atributo no arquivo de código-fonte
principal.

Confira também
Palavra-chave <Module>
Visão geral de atributos
Async (Visual Basic)
Artigo • 22/02/2023 • 3 minutos para o fim da leitura

O modificador Async indica que o método ou expressão lambda que ele modifica é
assíncrono. Esses métodos são chamados de métodos assíncronos.

Um método assíncrono fornece uma forma conveniente de fazer um trabalho


potencialmente de longa duração sem bloquear o encadeamento do chamador. O
chamador de um método assíncrono pode retomar o trabalho sem aguardar a
conclusão do método assíncrono.

7 Observação

As palavras-chave Async e Await foram introduzidas no Visual Studio 2012. Para


uma introdução à programação assíncrona, consulte Programação assíncrona com
Async e Await.

O exemplo a seguir mostra a estrutura de um método assíncrono. Por convenção, os


nomes de métodos assíncronos terminam em "Async".

VB

Public Async Function ExampleMethodAsync() As Task(Of Integer)

' . . .

' At the Await expression, execution in this method is suspended and,

' if AwaitedProcessAsync has not already finished, control returns

' to the caller of ExampleMethodAsync. When the awaited task is

' completed, this method resumes execution.

Dim exampleInt As Integer = Await AwaitedProcessAsync()

' . . .

' The return statement completes the task. Any method that is

' awaiting ExampleMethodAsync can now get the integer result.

Return exampleInt

End Function

Normalmente, um método modificado pela palavra-chave Async contém pelo menos


uma expressão ou instrução Await. O método é executado de forma síncrona até atingir
o primeiro Await , ponto em que é suspenso até que a tarefa esperada seja concluída.
Enquanto isso, o controle é retornado ao chamador do método. Se o método não
contiver uma expressão ou instrução Await , ele não será suspenso e será executado
como um método síncrono. Um aviso do compilador alerta você sobre quaisquer
métodos assíncronos que não contenham Await porque essa situação pode indicar um
erro. Para obter mais informações, confira o erro do compilador.

Async é uma palavra-chave não reservada. Ela é uma palavra-chave quando modifica
um método ou uma expressão lambda. Em todos os outros contextos, ela será
interpretada como um identificador.

Tipos de retorno
Um método assíncrono é um procedimento Sub ou um procedimento Function que tem
um tipo de retorno de Task ou Task<TResult>. O método não pode declarar nenhum
parâmetro ByRef.

Você especifica Task(Of TResult) para o tipo de retorno de um método assíncrono se a


instrução Return do método tiver um operando do tipo TResult. Você usará Task se
nenhum valor significativo for retornado quando o método for concluído. Ou seja, uma
chamada para o método retorna um Task , mas quando o Task é concluído, qualquer
instrução Await que esteja aguardando o Task não produz um valor de resultado.

As sub-rotinas assíncronas são usadas principalmente para definir manipuladores de


eventos onde um procedimento Sub é necessário. O chamador de uma sub-rotina
assíncrona não pode aguardá-lo e capturar exceções acionadas pelo método.

Para obter mais informações e exemplos, consulte Tipos de retorno assíncronos.

Exemplo
Os exemplos a seguir mostram um manipulador de eventos assíncrono, uma expressão
lambda assíncrona e um método assíncrono. Para obter um exemplo completo que usa
esses elementos, confira o Passo a passo: acessando a Web usando Async e Await. Você
pode baixar o exemplo do Navegador de Exemplo do .NET. O código de exemplo está
no projeto SerialAsyncExample.

VB

' An event handler must be a Sub procedure.

Async Sub button1_Click(sender As Object, e As RoutedEventArgs) Handles


button1.Click

textBox1.Clear()

' SumPageSizesAsync is a method that returns a Task.

Await SumPageSizesAsync()

textBox1.Text = vbCrLf & "Control returned to button1_Click."

End Sub

' The following async lambda expression creates an equivalent anonymous

' event handler.

AddHandler button1.Click, Async Sub(sender, e)

textBox1.Clear()

' SumPageSizesAsync is a method that returns a


Task.

Await SumPageSizesAsync()

textBox1.Text = vbCrLf & "Control returned to


button1_Click."

End Sub

' The following async method returns a Task(Of T).

' A typical call awaits the Byte array result:

' Dim result As Byte() = Await GetURLContents("https://msdn.com")

Private Async Function GetURLContentsAsync(url As String) As Task(Of Byte())

' The downloaded resource ends up in the variable named content.

Dim content = New MemoryStream()

' Initialize an HttpWebRequest for the current URL.

Dim webReq = CType(WebRequest.Create(url), HttpWebRequest)

' Send the request to the Internet resource and wait for

' the response.

Using response As WebResponse = Await webReq.GetResponseAsync()

' Get the data stream that is associated with the specified URL.

Using responseStream As Stream = response.GetResponseStream()

' Read the bytes in responseStream and copy them to content.

' CopyToAsync returns a Task, not a Task<T>.

Await responseStream.CopyToAsync(content)

End Using

End Using

' Return the result as a byte array.

Return content.ToArray()

End Function

Confira também
AsyncStateMachineAttribute
Operador Await
Programação assíncrona com Async e Await
Instruções passo a passo: acessando a Web e usando Async e Await
Auto (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Especifica que o Visual Basic deve realizar marshaling de cadeias de caracteres de


acordo com regras do .NET Framework com base no nome externo do procedimento
externo que está sendo declarado.

Quando você chama um procedimento definido fora do projeto, o compilador do Visual


Basic não tem acesso às informações que ele deve ter para chamar o procedimento
corretamente. Essas informações incluem onde o procedimento está localizado, como
ele é identificado, a sequência de chamadas, o tipo de retorno e o conjunto de
caracteres de cadeia de caracteres que ele usa. A Instrução Declare cria uma referência a
um procedimento externo e fornece essas informações necessárias.

A parte charsetmodifier na instrução Declare fornece as informações do conjunto de


caracteres para realizar marshaling das cadeias de caracteres durante uma chamada ao
procedimento externo. Isso também afeta a forma como o Visual Basic pesquisa o
arquivo externo pelo nome do procedimento externo. O modificador Auto especifica
que o Visual Basic deve realizar marshaling de cadeias de caracteres de acordo com as
regras do .NET Framework e deve determinar o conjunto de caracteres base da
plataforma de tempo de execução e possivelmente modificar o nome do procedimento
externo se a pesquisa inicial falhar. Para obter mais informações, confira "Conjuntos de
caracteres" na Instrução Declare.

Se nenhum modificador de conjunto de caracteres for especificado, Ansi será o padrão.

Comentários
O modificador Auto pode ser usado neste contexto:

Instrução Declare

Anotações do desenvolvedor de dispositivo


inteligente
Não há suporte para essa palavra-chave.

Confira também
Ansi
Unicode
Palavras-chave
ByRef (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica se um argumento é passado de tal forma que o procedimento chamado pode


alterar o valor de uma variável subjacente ao argumento no código de chamada.

Comentários
O modificador ByRef pode ser usado nestes contextos:

Instrução Declare

Instrução Function

Instrução Sub

Confira também
Palavras-chave
Passar argumentos por valor e por referência
ByVal (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica se um argumento é passado by value de modo que o procedimento ou a


propriedade chamado não pode alterar o valor de uma variável subjacente ao
argumento no código de chamada. Se nenhum modificador for especificado, ByVal será
o padrão.

7 Observação

Como ele é o padrão, você não precisa especificar explicitamente a palavra-chave


ByVal em assinaturas de método. Ele tende a produzir um código barulhento e

muitas vezes faz com que a palavra-chave ByRef não padrão seja negligenciada.

Comentários
O modificador ByVal pode ser usado nestes contextos:

Instrução Declare

Instrução Function

Instrução Operator

Instrução Property

Instrução Sub

Exemplo
O exemplo a seguir demonstra o uso do mecanismo para passar argumentos do
parâmetro ByVal com um argumento de tipo de referência. No exemplo, o argumento é
c1 , uma instância da classe Class1 . ByVal impede que o código nos procedimentos

altere o valor subjacente do argumento de referência, c1 , mas não protege os campos e


as propriedades acessíveis de c1 .

VB

Module Module1

Sub Main()

' Declare an instance of the class and assign a value to its field.

Dim c1 As New Class1()

c1.Field = 5

Console.WriteLine(c1.Field)

' Output: 5

' ByVal does not prevent changing the value of a field or property.

ChangeFieldValue(c1)

Console.WriteLine(c1.Field)

' Output: 500

' ByVal does prevent changing the value of c1 itself.

ChangeClassReference(c1)

Console.WriteLine(c1.Field)

' Output: 500

Console.ReadKey()

End Sub

Public Sub ChangeFieldValue(ByVal cls As Class1)

cls.Field = 500

End Sub

Public Sub ChangeClassReference(ByVal cls As Class1)

cls = New Class1()

cls.Field = 1000

End Sub

Public Class Class1


Public Field As Integer

End Class

End Module

Confira também
Remover ByVal (regra de estilo IDE0081)
Palavras-chave
Passar argumentos por valor e por referência
Padrão (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Identifica uma propriedade como a propriedade padrão da classe, da estrutura ou da


interface.

Comentários
Uma classe, estrutura ou interface pode designar no máximo uma das respectivas
propriedades como a propriedade padrão, desde que ela tenha pelo menos um
parâmetro. Se o código fizer uma referência a uma classe ou estrutura sem especificar
um membro, o Visual Basic resolverá essa referência à propriedade padrão.

As propriedades padrão podem resultar em uma pequena redução nos caracteres de


código-fonte, mas podem tornar seu código mais difícil de ler. Se o código de chamada
não estiver familiarizado com sua classe ou estrutura, quando ele fizer uma referência
ao nome de classe ou estrutura, ele não poderá ter certeza se essa referência acessa a
própria classe ou estrutura ou se acessa uma propriedade padrão. Isso pode levar a
erros de compilador ou erros de lógica de tempo de execução sutis.

Você pode reduzir um pouco a chance de erros de propriedade padrão usando sempre
a Instrução Option Strict para definir a verificação de tipo do compilador como On .

Se você estiver planejando usar uma classe ou estrutura predefinida em seu código,
deverá determinar se ela tem uma propriedade padrão e, se for o caso, qual é o nome
dela.

Devido a essas desvantagens, você deveria considerar não definir propriedades padrão.
Para legibilidade de código, você também deve considerar sempre se referir a todas as
propriedades explicitamente, até mesmo propriedades padrão.

O modificador Default pode ser usado neste contexto:

Instrução Property

Confira também
Como declarar e chamar uma propriedade padrão no Visual Basic
Palavras-chave
Friend (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que um ou mais elementos de programação declarados são acessíveis


somente a partir de dentro do assembly que contém sua declaração.

Comentários
Em muitos casos, você deseja que elementos de programação, como classes e
estruturas, sejam usados por todo o assembly, e não apenas pelo componente que os
declara. No entanto, talvez você não queira que eles fiquem acessíveis por código fora
do assembly (por exemplo, se o aplicativo for proprietário). Se você quiser limitar o
acesso a um elemento dessa forma, poderá declará-lo usando o modificador Friend .

O código em outras classes, estruturas e módulos compilados para o mesmo assembly


pode acessar todos os elementos Friend nesse assembly.

O acesso Friend geralmente é o nível preferencial para os elementos de programação


de um aplicativo e Friend é o nível de acesso padrão de uma interface, um módulo,
uma classe ou uma estrutura.

Você só pode usar Friend em nível de módulo, interface ou namespace. Portanto, o


contexto de declaração de um elemento Friend deve ser um arquivo de origem, um
namespace, uma interface, um módulo, uma classe ou uma estrutura. Ele não pode ser
um procedimento.

7 Observação

Você também pode usar o modificador de acesso Protected Friend, que torna um
membro de classe acessível de dentro dessa classe, de classes derivadas e do
mesmo assembly no qual a classe é definida. Para restringir o acesso a um membro
de dentro de sua classe e de classes derivadas no mesmo assembly, use o
modificador de acesso Private Protected.

Para obter uma comparação entre Friend e os demais modificadores de acesso,


consulte os Níveis de acesso no Visual Basic.

7 Observação
Você pode especificar que outro assembly é um assembly amigável, o que permite
que ele acesse todos os tipos e membros marcados como Friend . Para obter mais
informações, consulte Assemblies amigáveis.

Exemplo
A classe a seguir usa o modificador Friend para permitir que outros elementos de
programação dentro do mesmo assembly acessem determinados membros.

VB

Class CustomerInfo

Private p_CustomerID As Integer

Public ReadOnly Property CustomerID() As Integer

Get

Return p_CustomerID

End Get

End Property

' Allow friend access to the empty constructor.

Friend Sub New()

End Sub

' Require that a customer identifier be specified for the public


constructor.

Public Sub New(ByVal customerID As Integer)

p_CustomerID = customerID
End Sub

' Allow friend programming elements to set the customer identifier.

Friend Sub SetCustomerID(ByVal customerID As Integer)

p_CustomerID = customerID
End Sub

End Class

Uso
Você pode usar o modificador Friend nestes contextos:

Instrução Class

Instrução Const

Instrução Declare
Instrução Delegate

Instrução Dim

Instrução Enum

Instrução Event

Instrução Function

Instrução Interface

Instrução Module

Instrução Property

Instrução Structure

Instrução Sub

Confira também
InternalsVisibleToAttribute
Público
Protegido
Privado
Particular Protegido
Amigo Protegido
Níveis de acesso no Visual Basic
Procedimentos
Estruturas
Objetos e Classes
In (modificador genérico) (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Para parâmetros de tipo genérico, a palavra-chave In especifica que o parâmetro de


tipo é contravariante.

Comentários
A contravariância permite que você use um tipo menos derivado do que aquele
especificado pelo parâmetro genérico. Isso permite a conversão implícita de classes que
implementam interfaces variantes e a conversão implícita de tipos delegados.

Para obter mais informações, consulte Covariância e contravariância.

Regras
Você pode usar a palavra-chave In em delegados e interfaces genéricas.

Um parâmetro de tipo pode ser declarado contravariante em uma interface genérica ou


delegado se ele for usado apenas como um tipo de argumentos de método e não como
um tipo de retorno do método. Os parâmetros ByRef não podem ser covariantes ou
contravariantes.

A covariância e a contravariância têm suporte para tipos de referência, mas não para
tipos de valor.

No Visual Basic, não é possível declarar eventos em interfaces contravariantes sem


especificar o tipo delegado. Além disso, as interfaces contravariantes não podem ter
classes, enumerações ou estruturas aninhadas, mas podem ter interfaces aninhadas.

Comportamento
Uma interface que tem um parâmetro de tipo contravariante permite que os seus
métodos aceitem argumentos de tipos menos derivados que aqueles especificados pelo
parâmetro de tipo de interface. Por exemplo, como no .NET Framework 4, na interface
IComparer<T>, o tipo T é contravariante, você poderá atribuir um objeto do tipo
IComparer(Of Person) a um objeto do tipo IComparer(Of Employee) , sem usar qualquer

método de conversão especial se o Employee herdar de Person .


Um delegado contravariante pode ser atribuído a outro delegado do mesmo tipo, mas
com um parâmetro de tipo genérico menos derivado.

Exemplo – interface genérica contravariante


O exemplo a seguir mostra como declarar, estender e implementar uma interface
genérica contravariante. Ele também mostra como você pode usar a conversão implícita
para classes que implementam essa interface.

VB

' Contravariant interface.

Interface IContravariant(Of In A)

End Interface

' Extending contravariant interface.

Interface IExtContravariant(Of In A)

Inherits IContravariant(Of A)

End Interface

' Implementing contravariant interface.

Class Sample(Of A)

Implements IContravariant(Of A)

End Class

Sub Main()

Dim iobj As IContravariant(Of Object) = New Sample(Of Object)()

Dim istr As IContravariant(Of String) = New Sample(Of String)()

' You can assign iobj to istr, because

' the IContravariant interface is contravariant.

istr = iobj

End Sub

Exemplo – delegado genérico contravariante


O exemplo a seguir mostra como declarar, instanciar e invocar um delegado genérico
contravariante. Ele também mostra como você pode converter implicitamente um tipo
delegado.

VB

' Contravariant delegate.

Public Delegate Sub DContravariant(Of In A)(ByVal argument As A)

' Methods that match the delegate signature.

Public Shared Sub SampleControl(ByVal control As Control)

End Sub

Public Shared Sub SampleButton(ByVal control As Button)

End Sub

Private Sub Test()

' Instantiating the delegates with the methods.

Dim dControl As DContravariant(Of Control) =

AddressOf SampleControl

Dim dButton As DContravariant(Of Button) =

AddressOf SampleButton

' You can assign dControl to dButton

' because the DContravariant delegate is contravariant.

dButton = dControl

' Invoke the delegate.

dButton(New Button())

End Sub

Confira também
Variação em interfaces genéricas
Saída
Iterador (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que uma função ou acessador Get é um iterador.

Comentários
Um método iterador executa uma iteração personalizada em uma coleção. Um iterador
usa a instrução Yield para retornar um elemento da coleção por vez. Quando uma
instrução Yield for atingida, o local atual no código será retido. A execução será
reiniciada desse local na próxima vez que a função iteradora for chamada.

Um iterador pode ser implementado como função ou acessador Get de uma definição
de propriedade. O modificador Iterator aparece na declaração da função de iterador
ou do acessador Get .

Chame um iterador de um código de cliente usando uma Instrução For Each...Next.

O tipo de retorno de uma função de iterador ou acessador Get pode ser IEnumerable,
IEnumerable<T>, IEnumerator ou IEnumerator<T>.

Um iterador não pode ter parâmetros ByRef .

Um iterador não pode ocorrer em um evento, um construtor de instância, um construtor


estático ou um destruidor estático.

Um iterador pode ser função anônima. Para obter mais informações, consulte
Iteradores.

Uso
O modificador Iterator pode ser usado nestes contextos:

Instrução Function

Instrução Property

Exemplo 1
O exemplo a seguir demonstra o uso de uma função de iterador. A função de iterador
tem uma instrução Yield que está em um loop For…Next. Cada iteração do corpo da
instrução For Each em Main cria uma chamada para a Power função de iterador. Cada
chamada à função iteradora prossegue para a próxima execução da instrução Yield
que ocorre durante a próxima iteração do loop For…Next .

VB

Sub Main()

For Each number In Power(2, 8)

Console.Write(number & " ")

Next

' Output: 2 4 8 16 32 64 128 256

Console.ReadKey()

End Sub

Private Iterator Function Power(

ByVal base As Integer, ByVal highExponent As Integer) _

As System.Collections.Generic.IEnumerable(Of Integer)

Dim result = 1

For counter = 1 To highExponent

result = result * base

Yield result

Next

End Function

Exemplo 2
O exemplo a seguir demonstra um acessador Get que é um iterador. O modificador
Iterator está na declaração de propriedade.

VB

Sub Main()

Dim theGalaxies As New Galaxies

For Each theGalaxy In theGalaxies.NextGalaxy

With theGalaxy

Console.WriteLine(.Name & " " & .MegaLightYears)

End With

Next

Console.ReadKey()

End Sub

Public Class Galaxies

Public ReadOnly Iterator Property NextGalaxy _

As System.Collections.Generic.IEnumerable(Of Galaxy)

Get

Yield New Galaxy With {.Name = "Tadpole", .MegaLightYears = 400}

Yield New Galaxy With {.Name = "Pinwheel", .MegaLightYears = 25}

Yield New Galaxy With {.Name = "Milky Way", .MegaLightYears = 0}

Yield New Galaxy With {.Name = "Andromeda", .MegaLightYears = 3}

End Get

End Property

End Class

Public Class Galaxy

Public Property Name As String

Public Property MegaLightYears As Integer

End Class

Para obter mais exemplos adicionais, consulte Iteradores.

Confira também
IteratorStateMachineAttribute
Iteradores
Instrução Yield
Chave (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

A palavra-chave Key permite que você especifique o comportamento de propriedades


de tipos anônimos. Somente as propriedades designadas como propriedades-chave
participam de testes de igualdade entre instâncias de tipo anônimo ou de cálculo de
valores de código hash. Os valores das propriedades chave não podem ser alterados.

Você designa uma propriedade de um tipo anônimo como uma propriedade-chave


colocando a palavra-chave Key na frente de sua declaração na lista de inicialização. No
exemplo a seguir, Airline e FlightNo são propriedades-chave, mas Gate , não.

VB

Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",

Key .FlightNo = 3554, .Gate = "C33"}

Quando um novo tipo anônimo é criado, ele herda diretamente de Object. O


compilador substitui três membros herdados: Equals, GetHashCode e ToString. O código
de substituição que é produzido para Equals e GetHashCode se baseia nas
propriedades-chave. Se não houver propriedades-chave no tipo, GetHashCode e Equals
não serão substituídas.

Igualitário
Duas instâncias de tipo anônimo são iguais se são instâncias do mesmo tipo e se os
valores de suas propriedades-chave são iguais. Nos exemplos a seguir, flight2 é igual
ao flight1 do exemplo anterior porque são instâncias do mesmo tipo anônimo e têm
valores correspondentes para suas propriedades-chave. No entanto, flight3 não é
igual a flight1 porque tem um valor diferente para uma propriedade-chave, FlightNo .
A instância flight4 não é do mesmo tipo de flight1 porque designam propriedades
diferentes como propriedades-chave.

VB

Dim flight2 = New With {Key .Airline = "Blue Yonder Airlines",

Key .FlightNo = 3554, .Gate = "D14"}

' The following statement displays True. The values of the non-key

' property, Gate, do not have to be equal.

Console.WriteLine(flight1.Equals(flight2))

Dim flight3 = New With {Key .Airline = "Blue Yonder Airlines",

Key .FlightNo = 431, .Gate = "C33"}

' The following statement displays False, because flight3 has a

' different value for key property FlightNo.

Console.WriteLine(flight1.Equals(flight3))

Dim flight4 = New With {Key .Airline = "Blue Yonder Airlines",

.FlightNo = 3554, .Gate = "C33"}

' The following statement displays False. Instance flight4 is not the

' same type as flight1 because they have different key properties.

' FlightNo is a key property of flight1 but not of flight4.

Console.WriteLine(flight1.Equals(flight4))

Se duas instâncias forem declaradas apenas com propriedades não chave, idênticas em
nome, tipo, ordem e valor, elas não serão iguais. Uma instância sem propriedades-chave
é igual apenas a si mesma.

Para saber mais sobre as condições nas quais duas instâncias de tipo anônimo são
instâncias do mesmo tipo anônimo, confira Tipos anônimos.

Cálculo do código de hash


Assim como Equals, a função de hash definida em GetHashCode para um tipo anônimo
baseia-se nas propriedades-chave do tipo. Os exemplos a seguir mostram a interação
entre propriedades-chave e valores de código hash.

As instâncias de um tipo anônimo que têm os mesmos valores para todas as


propriedades-chave têm o mesmo valor de código hash, mesmo que as propriedades
não chave não tenham valores correspondentes. A instrução a seguir retorna True .

VB

Console.WriteLine(flight1.GetHashCode = flight2.GetHashCode)

As instâncias de um tipo anônimo que tenham valores diferentes para uma ou mais
propriedades-chave têm valores de código hash diferentes. A instrução a seguir retorna
False .

VB

Console.WriteLine(flight1.GetHashCode = flight3.GetHashCode)

As instâncias de tipos anônimos que designam propriedades diferentes como


propriedades-chave não são instâncias do mesmo tipo. Elas têm valores de código hash
diferentes mesmo quando os nomes e valores de todas as propriedades são iguais. A
instrução a seguir retorna False .

VB

Console.WriteLine(flight1.GetHashCode = flight4.GetHashCode)

Valores somente leitura


Os valores das propriedades chave não podem ser alterados. Por exemplo, em flight1
nos exemplos anteriores, os campos Airline e FlightNo são somente leitura, mas Gate
pode ser alterado.

VB

' The following statement will not compile, because FlightNo is a key

' property and cannot be changed.


' flight1.FlightNo = 1234

'

' Gate is not a key property. Its value can be changed.

flight1.Gate = "C5"

Confira também
Definição do Tipo Anônimo
Como inferir nomes e tipos de propriedade na declaração de tipo anônimo
Tipos anônimos
Módulo <keyword> (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que um atributo no início de um arquivo de origem é aplicável ao módulo de


assembly atual.

Comentários
Muitos atributos pertencem a um elemento de programação individual, como uma
classe ou propriedade. Você aplica esse atributo anexando o bloco de atributo, entre
colchetes angulares ( < > ), diretamente à instrução de declaração.

Se um atributo pertencer não apenas ao elemento a seguir, mas ao módulo de assembly


atual, você coloca o bloco de atributo no início do arquivo de origem e identifica o
atributo com a palavra-chave Module . Se ele se aplicar a todo o assembly, você usará a
palavra-chave Assembly.

O modificador Module não é o mesmo que a Instrução Module.

Confira também
Assembly
Instrução Module
Visão geral de atributos
MustInherit (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Especifica que uma classe só pode ser usada como classe base e que você não pode
criar um objeto diretamente dela.

Comentários
A finalidade de uma classe base (também conhecida como classe abstrata) é definir a
funcionalidade que é comum a todas as classes derivadas dela. Isso evita que as classes
derivadas tenham de redefinir os elementos comuns. Em alguns casos, essa
funcionalidade comum não é completa o suficiente para tornar um objeto utilizável e
cada classe derivada define a funcionalidade ausente. Nesse caso, você deseja que o
código de consumo crie objetos somente das classes derivadas. Você usa MustInherit
na classe base para impor isso.

Outro uso de uma classe MustInherit é restringir uma variável a um conjunto de classes
relacionadas. Você pode definir uma classe base e derivar todas essas classes dela. A
classe base não precisa fornecer nenhuma funcionalidade comum a todas as classes
derivadas, mas pode servir como um filtro para atribuir valores a variáveis. Se o código
de consumo declarar uma variável como a classe base, o Visual Basic permitirá que você
atribua apenas um objeto de uma das classes derivadas a essa variável.

O .NET Framework define várias classes MustInherit , entre elas Array, Enum e
ValueType. ValueType é um exemplo de uma classe base que restringe uma variável.
Todos os tipos de valor derivam de ValueType. Se você declarar uma variável como
ValueType, poderá atribuir apenas tipos de valor a essa variável.

Regras
Contexto da declaração. Você só pode usar MustInherit em uma instrução Class .

Modificadores combinados. Você não pode especificar MustInherit junto com


NotInheritable na mesma declaração.

Exemplo
O exemplo a seguir ilustra a herança forçada e a substituição forçada. A classe base
shape define uma variável acrossLine . As classes circle e square derivam de shape .
Elas herdam a definição de acrossLine , mas devem definir a função area porque esse
cálculo é diferente para cada tipo de forma.

VB

Public MustInherit Class shape

Public acrossLine As Double

Public MustOverride Function area() As Double

End Class

Public Class circle : Inherits shape

Public Overrides Function area() As Double


Return Math.PI * acrossLine

End Function

End Class

Public Class square : Inherits shape

Public Overrides Function area() As Double


Return acrossLine * acrossLine

End Function

End Class

Public Class consumeShapes

Public Sub makeShapes()

Dim shape1, shape2 As shape

shape1 = New circle

shape2 = New square

End Sub

End Class

Você pode declarar shape1 e shape2 como sendo do tipo shape . No entanto, não é
possível criar um objeto de shape porque ele não tem a funcionalidade da função area
e está marcado como MustInherit .

Como elas são declaradas como shape , as variáveis shape1 e shape2 são restritas a
objetos das classes derivadas circle e square . O Visual Basic não permite que você
atribua nenhum outro objeto a essas variáveis, o que oferece um alto nível de segurança
de tipos.

Uso
O modificador MustInherit pode ser usado neste contexto:

Instrução Class

Confira também
Instrução Inherits
NotInheritable
Palavras-chave
Noções básicas de herança
MustOverride (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que uma propriedade ou um procedimento não está implementado nessa


classe e deve ser substituído em uma classe derivada para poder ser usado.

Comentários
Você só pode usar MustOverride em uma instrução de declaração de propriedade ou
procedimento. A propriedade ou o procedimento que especifica MustOverride deve ser
membro de uma classe, que deve ser marcada como MustInherit.

Regras
Declaração Incompleta. Ao especificar MustOverride , você não fornece nenhuma
linha de código adicional para a propriedade ou o procedimento, nem mesmo a
instrução End Function , End Property ou End Sub .

Modificadores Combinados. Você não pode especificar MustOverride junto com


NotOverridable , Overridable ou Shared na mesma declaração.

Sombreamento e Substituição. O sombreamento e a substituição redefinem um


elemento herdado, mas há diferenças significativas entre as duas abordagens. Para
saber mais, consulte Sombreamento no Visual Basic.

Termos Alternativos. Um elemento que não pode ser usado, exceto em uma
substituição, às vezes é chamado de virtual puro.

O modificador MustOverride pode ser usado nestes contextos:

Instrução Function

Instrução Property

Instrução Sub

Confira também
NotOverridable
Substituível
Substituições
MustInherit
Palavras-chave
Sombreamento no Visual Basic
Narrowing (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Indica que um operador de conversão ( CType ) converte uma classe ou estrutura em um


tipo que pode não ser capaz de conter alguns dos valores possíveis da classe ou
estrutura original.

Conversão com a palavra-chave Narrowing


O procedimento de conversão deve especificar Public Shared além de Narrowing .

As conversões de restrição nem sempre são bem-sucedidas em tempo de execução e


podem falhar ou incorrer em perda de dados. Exemplos são Long para Integer , String
para Date , e um tipo base para um tipo derivado. Essa última conversão é de restrição
porque o tipo base pode não conter todos os membros do tipo derivado e, portanto,
não é uma instância do tipo derivado.

Se Option Strict for On , o código de consumo deve ser usar CType para todas as
conversões de restrição.

A palavra-chave Narrowing pode ser usada neste contexto:

Instrução Operator

Confira também
Instrução Operator
Widening
Conversões de Widening e Narrowing
Como definir um operador
Função CType
Instrução Option Strict
NotInheritable (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica se uma classe não pode ser usada como um classe base.

Comentários
Termos alternativos. Uma classe que não pode ser herdada às vezes é chamada de
classe sealed.

O modificador NotInheritable pode ser usado neste contexto:

Instrução Class

Confira também
Instrução Inherits
MustInherit
Palavras-chave
NotOverridable (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que não é possível substituir um procedimento ou uma propriedade em uma


classe derivada.

Comentários
O modificador NotOverridable impede a substituição de um método ou propriedade
em uma classe derivada. O modificador Overridable permite substituir um método ou
propriedade em uma classe em uma classe derivada. Para obter mais informações,
consulte Noções básicas de herança.

Se o modificador Overridable ou NotOverridable não for especificado, a configuração


padrão dependerá de a propriedade ou o método substituir um método ou
propriedade de classe base. Se a isso ocorrer, a configuração padrão será Overridable ;
caso contrário, será NotOverridable .

Um elemento que não pode ser substituído às vezes é chamado de elemento selado.

Você só pode usar NotOverridable em uma instrução de declaração de propriedade ou


procedimento. Você pode especificar NotOverridable apenas em uma propriedade ou
um procedimento que substitua outra propriedade ou outro procedimento, ou seja,
apenas em combinação com Overrides .

Modificadores Combinados
Você não pode especificar Overridable ou NotOverridable para um método Private .

Você não pode especificar NotOverridable junto com MustOverride , Overridable ou


Shared na mesma declaração.

Uso
O modificador NotOverridable pode ser usado nestes contextos:

Instrução Function

Instrução Property
Instrução Sub

Confira também
Modificadores
Noções básicas de herança
MustOverride
Substituível
Substituições
Palavras-chave
Sombreamento no Visual Basic
Opcional (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que um argumento de procedimento pode ser omitido quando o


procedimento é chamado.

Comentários
Para cada parâmetro opcional, você deve especificar uma expressão constante como o
valor padrão desse parâmetro. Se a expressão for avaliada como Nothing, o valor
padrão do tipo de dados de valor será usado como o valor padrão do parâmetro.

Se a lista de parâmetros contiver um parâmetro opcional, todos os parâmetros a seguir


também deverão ser opcionais.

O modificador Optional pode ser usado nestes contextos:

Instrução Declare

Instrução Function

Instrução Property

Instrução Sub

7 Observação

Ao chamar um procedimento com ou sem parâmetros opcionais, você pode passar


argumentos por posição ou por nome. Para obter mais informações, consulte
Passar argumentos por posição e por nome.

7 Observação

Você também pode definir um procedimento com parâmetros opcionais usando


sobrecarga. Se você tiver um parâmetro opcional, poderá definir duas versões
sobrecarregadas do procedimento, uma que aceita o parâmetro e outra que não o
aceita. Para obter mais informações, consulte Sobrecarga de Procedimento.

Exemplo 1
O exemplo a seguir define um procedimento que tem um parâmetro opcional.

VB

Public Function FindMatches(ByRef values As List(Of String),

ByVal searchString As String,

Optional ByVal matchCase As Boolean = False) As


List(Of String)

Dim results As IEnumerable(Of String)

If matchCase Then

results = From v In values

Where v.Contains(searchString)

Else

results = From v In values

Where UCase(v).Contains(UCase(searchString))

End If

Return results.ToList()

End Function

Exemplo 2
O exemplo a seguir demonstra como chamar um procedimento com argumentos
passados por posição e com argumentos passados pelo nome. O procedimento tem
dois parâmetros opcionais.

VB

Private Sub TestParameters()

' Call the procedure with its arguments passed by position,

studentInfo("Mary", 19, #9/21/1981#)

' Omit one optional argument by holding its place with a comma.

studentInfo("Mary", , #9/21/1981#)

' Call the procedure with its arguments passed by name.

studentInfo(age:=19, birth:=#9/21/1981#, name:="Mary")

' Supply an argument by position and an argument by name.

studentInfo("Mary", birth:=#9/21/1981#)

End Sub

Private Sub studentInfo(ByVal name As String,

Optional ByVal age As Short = 0,

Optional ByVal birth As Date = #1/1/2000#)

Console.WriteLine("name: " & name)

Console.WriteLine("age: " & age)

Console.WriteLine("birth date: " & birth)

Console.WriteLine()

End Sub

Confira também
Lista de parâmetros
Parâmetros Opcionais
Palavras-chave
Out (modificador genérico) (Visual
Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Para parâmetros de tipo genérico, a palavra-chave Out especifica que o tipo é


covariante.

Comentários
A covariância permite que você use um tipo mais derivado do que aquele especificado
pelo parâmetro genérico. Isso permite a conversão implícita de classes que
implementam interfaces variantes e a conversão implícita de tipos delegados.

Para obter mais informações, consulte Covariância e contravariância.

Regras
Você pode usar a palavra-chave Out em delegados e interfaces genéricas.

Em uma interface genérica, um parâmetro de tipo pode ser declarado covariante se ele
satisfizer as condições a seguir:

O parâmetro de tipo é usado apenas como um tipo de retorno dos métodos de


interface e não é usado como um tipo de argumentos de método.

7 Observação

Há uma exceção a essa regra. Se, em uma interface covariante, você tiver um
delegado genérico contravariante como um parâmetro de método, você
poderá usar o tipo covariante como um parâmetro de tipo genérico para o
delegado. Para obter mais informações sobre delegados genéricos
covariantes e contravariantes, consulte Variância em delegados e Usando
variância para delegados genéricos Func e Action.

O parâmetro de tipo não é usado como uma restrição genérica para os métodos
de interface.

Em um delegado genérico, um tipo pode ser declarado covariante se for usado apenas
como tipo de retorno do método e não usado para argumentos de método.
A covariância e a contravariância têm suporte para tipos de referência, mas não para
tipos de valor.

No Visual Basic, não é possível declarar eventos em interfaces covariantes sem


especificar o tipo delegado. Além disso, as interfaces covariantes não podem ter classes,
enumerações ou estruturas aninhadas, mas podem ter interfaces aninhadas.

Comportamento
Uma interface que tem um parâmetro de tipo covariante permite que seus métodos
retornem tipos mais derivados do que aqueles especificados pelo parâmetro de tipo.
Por exemplo, já que no .NET Framework 4, em IEnumerable<T>, o tipo T é covariante,
você pode atribuir um objeto do tipo IEnumerable(Of String) a um objeto do tipo
IEnumerable(Of Object) sem usar nenhum método de conversão especial.

Pode ser atribuído a um delegado covariante outro delegado do mesmo tipo, mas com
um parâmetro de tipo genérico mais derivado.

Exemplo 1
O exemplo a seguir mostra como declarar, estender e implementar uma interface
genérica covariante. Ele também mostra como usar a conversão implícita para classes
que implementam uma interface covariante.

VB

' Covariant interface.

Interface ICovariant(Of Out R)

End Interface

' Extending covariant interface.

Interface IExtCovariant(Of Out R)

Inherits ICovariant(Of R)

End Interface

' Implementing covariant interface.

Class Sample(Of R)

Implements ICovariant(Of R)

End Class

Sub Main()

Dim iobj As ICovariant(Of Object) = New Sample(Of Object)()

Dim istr As ICovariant(Of String) = New Sample(Of String)()

' You can assign istr to iobj because

' the ICovariant interface is covariant.

iobj = istr

End Sub

Exemplo 2
O exemplo a seguir mostra como declarar, instanciar e invocar um delegado genérico
covariante. Ele também mostra como você pode usar a conversão implícita para tipos
delegados.

VB

' Covariant delegate.

Public Delegate Function DCovariant(Of Out R)() As R

' Methods that match the delegate signature.

Public Shared Function SampleControl() As Control

Return New Control()

End Function

Public Shared Function SampleButton() As Button

Return New Button()

End Function

Private Sub Test()

' Instantiating the delegates with the methods.

Dim dControl As DCovariant(Of Control) =

AddressOf SampleControl

Dim dButton As DCovariant(Of Button) =

AddressOf SampleButton

' You can assign dButton to dControl

' because the DCovariant delegate is covariant.

dControl = dButton

' Invoke the delegate.

dControl()

End Sub

Confira também
Variação em interfaces genéricas
In
Sobrecargas (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que uma propriedade ou procedimento redeclara uma ou mais propriedades


ou procedimentos existentes com o mesmo nome.

Comentários
Sobrecarga é a prática de fornecer mais de uma definição para uma determinada
propriedade ou nome de procedimento no mesmo escopo. O ato de redeclarar uma
propriedade ou procedimento com uma assinatura diferente às vezes é chamado de
ocultação por assinatura.

Regras
Contexto da declaração. Você só pode usar Overloads em uma instrução de
declaração de propriedade ou procedimento.

Modificadores combinados. Você não pode especificar Overloads junto com


Sombras na mesma declaração de procedimento.

Diferenças necessárias. A assinatura nesta declaração deve ser diferente da


assinatura de cada propriedade ou procedimento que ela sobrecarrega. A
assinatura é composta pelo nome da propriedade ou do procedimento junto com
o seguinte:

o número de parâmetros

a ordem dos parâmetros

os tipos de dados dos parâmetros

o número de parâmetros de tipo (para um procedimento genérico)

o tipo de retorno (somente para um procedimento de operador de conversão)

Todas as sobrecargas devem ter o mesmo nome, mas cada uma deve ser diferente
de todas as outras em um ou mais dos aspectos anteriores. Isso permite que o
compilador distingue qual versão usar quando o código chama a propriedade ou
o procedimento.
Diferenças não permitidas. A alteração de uma ou mais das seguintes opções não
é válida para sobrecarregar uma propriedade ou procedimento, pois elas não
fazem parte da assinatura:

se ele retorna ou não um valor (para um procedimento)

o tipo de dados do valor retornado (exceto para um operador de conversão)

os nomes dos parâmetros ou dos parâmetros de tipo

as restrições nos parâmetros de tipo (para um procedimento genérico)

palavras-chave do modificador de parâmetro (como ByRef ou Optional )

palavras-chave do modificador de propriedade ou de procedimento (como


Public ou Shared )

Modificador opcional. Você não precisa usar o modificador Overloads quando


estiver definindo várias propriedades ou procedimentos sobrecarregados na
mesma classe. No entanto, se você usar Overloads em uma das declarações,
deverá usá-la em todas elas.

Sombreamento e Sobrecarga. Overloads também pode ser usado para sombrear


um membro existente ou conjunto de membros sobrecarregados em uma classe
base. Ao usar Overloads dessa maneira, você declara a propriedade ou método
com o mesmo nome e a mesma lista de parâmetros do membro da classe base e
não fornece a palavra-chave Shadows .

Se você usar Overrides , o compilador adicionará Overloads implicitamente para que as


APIs de biblioteca trabalhem com o C# com mais facilidade.

O modificador Overloads pode ser usado nestes contextos:

Instrução Function

Instrução Operator

Instrução Property

Instrução Sub

Confira também
Sombras
Sobrecarga de procedimento
Tipos genéricos no Visual Basic
Procedimentos do operador
Como definir um operador de conversão
Substituível (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica se uma propriedade ou procedimento pode ser substituído por uma


propriedade nomeada de forma idêntica ou procedimento derivado de uma classe base.

Comentários
O modificador Overridable permite substituir um método ou propriedade em uma
classe em uma classe derivada. O modificador NotOverridable impede a substituição de
um método ou propriedade em uma classe derivada. Para obter mais informações,
consulte Noções básicas de herança.

Se o modificador Overridable ou NotOverridable não for especificado, a configuração


padrão dependerá de a propriedade ou o método substituir um método ou
propriedade de classe base. Se a isso ocorrer, a configuração padrão será Overridable ;
caso contrário, será NotOverridable .

Você pode fazer o sombreamento ou a substituição para redefinir um elemento


herdado, mas há diferenças significativas entre as duas abordagens. Para obter mais
informações, confira Sombreamento no Visual Basic.

Um elemento que pode ser substituído às vezes é chamado de elemento virtual. Se ele
pode ser substituído, mas não precisa ser, às vezes também é chamado de elemento
concreto.

Você só pode usar Overridable em uma instrução de declaração de propriedade ou


procedimento.

Modificadores Combinados
Você não pode especificar Overridable ou NotOverridable para um método Private .

Você não pode especificar Overridable junto com MustOverride , NotOverridable ou


Shared na mesma declaração.

Como um elemento de substituição é implicitamente substituível, você não pode


combinar Overridable com Overrides .

Uso
O modificador Overridable pode ser usado nestes contextos:

Instrução Function

Instrução Property

Instrução Sub

Confira também
Modificadores
Noções básicas de herança
MustOverride
NotOverridable
Substituições
Palavras-chave
Sombreamento no Visual Basic
Substituições (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que uma propriedade ou procedimento substitui uma propriedade nomeada


de forma idêntica ou procedimento herdado de uma classe base.

Regras
Contexto da declaração. Você só pode usar Overrides em uma instrução de
declaração de propriedade ou procedimento.

Modificadores combinados. Você não pode especificar Overrides junto com


Shadows ou Shared na mesma declaração. Como um elemento de substituição é

implicitamente substituível, você não pode combinar Overridable com Overrides .

Assinaturas correspondentes. A assinatura dessa declaração deve corresponder


exatamente à assinatura da propriedade ou procedimento que ela substitui. Isso
significa que as listas de parâmetros devem ter o mesmo número de parâmetros,
na mesma ordem e com os mesmos tipos de dados.

Além da assinatura, a declaração de substituição também deve corresponder


exatamente ao seguinte:

O nível de acesso

O tipo de retorno, se houver

Assinaturas genéricas. Para um procedimento genérico, a assinatura inclui o


número de parâmetros de tipo. Portanto, a declaração de substituição também
deve corresponder à versão da classe base nesse aspecto.

Correspondência adicional. Além de corresponder à assinatura da versão da classe


base, essa declaração também deve corresponder a ela nos seguintes aspectos:

Modificador de nível de acesso (como Público)

Mecanismo de passagem de cada parâmetro (ByVal ou ByRef)

Listas de restrições em cada parâmetro de tipo de um procedimento genérico

Sombreamento e Substituição. O sombreamento e a substituição redefinem um


elemento herdado, mas há diferenças significativas entre as duas abordagens. Para
obter mais informações, confira Sombreamento no Visual Basic.
Se você usar Overrides , o compilador adicionará Overloads implicitamente para que as
APIs de biblioteca trabalhem com o C# com mais facilidade.

O modificador Overrides pode ser usado nestes contextos:

Instrução Function

Instrução Property

Instrução Sub

Confira também
MustOverride
NotOverridable
Substituível
Palavras-chave
Sombreamento no Visual Basic
Tipos genéricos no Visual Basic
Lista de Tipos
ParamArray (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que um parâmetro de procedimento leva uma matriz opcional de elementos


do tipo especificado. ParamArray pode ser usado apenas no último parâmetro de uma
lista de parâmetros.

Comentários
ParamArray permite que você passe um número arbitrário de argumentos para o

procedimento. Um parâmetro ParamArray é sempre declarado usando ByVal.

Você pode fornecer um ou mais argumentos a um parâmetro ParamArray passando uma


matriz do tipo de dados apropriado, uma lista de valores separada por vírgula ou nada.
Para obter detalhes, confira "Chamando um ParamArray" em Matrizes de Parâmetros.

) Importante

Sempre que você lida com uma matriz que pode ser indefinidamente grande, há o
risco de ultrapassar alguma capacidade interna do aplicativo. Se você aceitar uma
matriz de parâmetros do código de chamada, deverá testar seu comprimento e
tomar as etapas apropriadas se ela for muito grande para seu aplicativo.

O modificador ParamArray pode ser usado nestes contextos:

Instrução Declare

Instrução Function

Instrução Property

Instrução Sub

Confira também
Palavras-chave
Matrizes de parâmetros
Parcial (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Indica que uma declaração de tipo é uma definição parcial do tipo.

É possível dividir a definição de um tipo entre diversas declarações usando a palavra-


chave Partial . É possível usar quantas declarações parciais você desejar, em quantos
arquivos de origem diferentes desejar. No entanto, todas as declarações devem estar no
mesmo assembly e no mesmo namespace.

7 Observação

O Visual Basic dá suporte a métodos parciais, que normalmente são implementados


em classes parciais. Para obter mais informações, consulte Métodos Parciais e Sub
instrução.

Sintaxe
VB

[ <attrlist> ] [ accessmodifier ] [ Shadows ] [ MustInherit | NotInheritable


] _

Partial { Class | Structure | Interface | Module } name [ (Of typelist) ]

[ Inherits classname ]

[ Implements interfacenames ]

[ variabledeclarations ]

[ proceduredeclarations ]

{ End Class | End Structure }

Partes
Termo Definição

attrlist Opcional. Lista de atributos que se aplicam a esse tipo. Você deve
colocar a Lista de Atributos entre colchetes angulares ( < > ).

accessmodifier Opcional. Especifica qual código pode acessar esse tipo. Confira Níveis
de acesso no Visual Basic.

Shadows Opcional. Confira Sombras.

MustInherit Opcional. Confira MustInherit.


Termo Definição

NotInheritable Opcional. Confira NotInheritable.

name Obrigatórios. Nome desse tipo. Deve corresponder ao nome definido


em todas as outras declarações parciais do mesmo tipo.

Of Opcional. Especifica que esse é um tipo genérico. Confira Tipos


genéricos no Visual Basic.

typelist Obrigatório se você usar Of. Confira Lista de tipos.

Inherits Opcional. Confira Instrução Inherits.

classname Obrigatório se você usar Inherits . O nome da classe ou interface da


qual essa classe deriva.

Implements Opcional. Consulte Instrução implementa.

interfacenames Obrigatório se você usar Implements . Os nomes das interfaces que esse
tipo implementa.

variabledeclarations Opcional. Instruções que declaram variáveis e eventos adicionais para o


tipo.

proceduredeclarations Opcional. Instruções que declaram e definem procedimentos adicionais


para o tipo.

End Class ou End Termina essa definição parcial Class ou Structure .


Structure

Comentários
O Visual Basic usa definições de classe parcial para separar o código gerado do código
criado pelo usuário em arquivos de origem separados. Por exemplo, o Windows Form
Designer define classes parciais para controles, como Form. Você não deve modificar o
código gerado nesses controles.

Todas as regras para criação de classe, estrutura, interface e módulo, bem como as que
são para uso e herança do modificador, se aplicam ao criar um tipo parcial.

Práticas Recomendadas
Em circunstâncias normais, você não deve dividir o desenvolvimento de um tipo
simples em duas ou mais declarações. Portanto, na maioria dos casos, você não
precisa da palavra-chave Partial .
Para legibilidade, cada declaração parcial de um tipo deve incluir a palavra-chave
Partial . O compilador permite, no máximo, uma declaração parcial omitir a
palavra-chave; se dois ou mais omitirem, o compilador sinalizará um erro.

Comportamento
União de Declarações. O compilador trata o tipo como a união de todas as suas
declarações parciais. Cada modificador de cada definição parcial se aplica ao tipo
inteiro e cada membro de cada definição parcial está disponível para o tipo inteiro.

Promoção de tipo não permitida para tipos parciais em módulos. Se uma


definição parcial estiver dentro de um módulo, a promoção de tipo desse tipo será
derrotada automaticamente. Nesse caso, um conjunto de definições parciais pode
causar resultados inesperados e até erros do compilador. Para obter mais
informações, confira Promoção de tipos.

O compilador mescla definições parciais somente quando seus caminhos


totalmente qualificados são idênticos.

A palavra-chave Partial pode ser usada nestes dois contextos:

Instrução Class

Instrução Structure

Exemplo
O exemplo a seguir divide a definição da classe sampleClass em duas declarações, cada
uma das quais define um procedimento Sub diferente.

VB

Partial Public Class sampleClass

Public Sub sub1()

End Sub

End Class

Partial Public Class sampleClass

Public Sub sub2()

End Sub

End Class

As duas definições parciais no exemplo anterior podem estar no mesmo arquivo de


origem ou em dois arquivos de origem diferentes.
Confira também
Instrução Class
Instrução Structure
Tipo de promoção
Sombras
Tipos genéricos no Visual Basic
Métodos Parciais
Particular (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que um ou mais elementos de programação declarados são acessíveis apenas


de seu contexto de declaração, inclusive de qualquer tipo contido.

Comentários
Se um elemento de programação representa a funcionalidade proprietária ou contém
dados confidenciais, você geralmente deseja limitar o acesso a ele o mais estritamente
possível. Você atinge a limitação máxima permitindo que apenas o módulo, a classe ou
a estrutura que o define possa acessá-lo. Para limitar o acesso a um elemento dessa
forma, você pode declará-lo com Private .

7 Observação

Você também pode usar o modificador de acesso Particular Protegido, que torna
um membro acessível de dentro dessa classe e de classes derivadas localizadas no
assembly que o contém.

Regras
Contexto da declaração. Você só pode usar Private no nível do módulo. Isso
significa que o contexto de declaração de um elemento Private deve ser um
módulo, classe ou estrutura e não pode ser um arquivo de origem, namespace,
interface ou procedimento.

Comportamento
Nível de acesso. Todo o código dentro de um contexto de declaração pode
acessar os respectivos elementos Private . Isso inclui código dentro de um tipo
contido, como uma classe aninhada ou uma expressão de atribuição em uma
enumeração. Nenhum código fora do contexto de declaração pode acessar os
respectivos elementos Private .

Modificadores de acesso. As palavras-chave que especificam o nível de acesso são


chamadas de modificadores de acesso. Para obter uma comparação dos
modificadores de acesso, consulte Níveis de acesso no Visual Basic.
O modificador Private pode ser usado nestes contextos:

Instrução Class

Instrução Const

Instrução Declare

Instrução Delegate

Instrução Dim

Instrução Enum

Instrução Event

Instrução Function

Instrução Interface

Instrução Property

Instrução Structure

Instrução Sub

Confira também
Público
Protegido
Friend
Particular Protegido
Amigo Protegido
Níveis de acesso no Visual Basic
Procedimentos
Estruturas
Objetos e Classes
Protegido de forma particular (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A combinação de palavras-chave Private Protected é um modificador de acesso de


membro. Um membro Private Protected é acessível por todos os membros na classe
recipiente, bem como por tipos derivados da classe recipiente, mas somente se eles
forem encontrados no assembly recipiente.

Você pode especificar Private Protected apenas em membros de classes; não é


possível aplicar Private Protected a membros de uma estrutura, pois elas não podem
ser herdadas.

Há suporte para o modificador de acesso Private Protected no Visual Basic 15.5 e


posterior. Para usá-lo, você pode adicionar o elemento a seguir ao arquivo de projeto
do Visual Basic (*.vbproj). Contanto que o Visual Basic 15.5 ou posterior esteja instalado
no sistema, ele permite aproveitar todos os recursos de linguagem compatíveis com a
versão mais recente do compilador do Visual Basic:

XML

<PropertyGroup>

<LangVersion>latest</LangVersion>

</PropertyGroup>

Para obter mais informações, confira Configuração da versão de linguagem do Visual


Basic.

7 Observação

No Visual Studio, selecionar F1 ajuda em private protected oferece ajuda para


particular ou protegido. O IDE escolhe o token único no cursor em vez da palavra
composta.

Regras
Contexto da declaração. Você só pode usar Private Protected no nível da classe.
Isso significa que o contexto de declaração de um elemento Protected precisa ser
uma classe e não pode ser um arquivo de origem, namespace, interface, módulo,
estrutura ou procedimento.

Comportamento
Nível de acesso. Todo o código em uma classe pode acessar os elementos dela. O
código em qualquer classe que deriva de uma classe base e está contido no
mesmo assembly pode acessar todos os elementos Private Protected da classe
base. No entanto, o código em qualquer classe que deriva de uma classe base e
está contido em um assembly diferente não pode acessar os elementos Private
Protected da classe base.

Modificadores de acesso. As palavras-chave que especificam o nível de acesso são


chamadas de modificadores de acesso. Para obter uma comparação dos
modificadores de acesso, consulte Níveis de acesso no Visual Basic.

O modificador Private Protected pode ser usado nestes contextos:

Instrução Class de uma classe aninhada

Instrução Const

Instrução Declare

Instrução Delegate de um delegado aninhado em uma classe

Instrução Dim

Instrução Enum de uma enumeração aninhada em uma classe

Instrução Event

Instrução Function

Instrução Interface de uma interface aninhada em uma classe

Instrução Property

Instrução Structure de uma estrutura aninhada em uma classe

Instrução Sub

Confira também
Público
Protegido
Friend
Privado
Amigo Protegido
Níveis de acesso no Visual Basic
Procedimentos
Estruturas
Objetos e Classes
Protegido (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um modificador de acesso de membro que especifica que um ou mais elementos de


programação declarados são acessíveis apenas de dentro da própria classe ou de uma
classe derivada.

Comentários
Às vezes, um elemento de programação declarado em uma classe contém dados
confidenciais ou código restrito e você deseja limitar o acesso ao elemento. No entanto,
se a classe for herdável e você esperar uma hierarquia de classes derivadas, talvez seja
necessário que elas acessem os dados ou o código. Nesse caso, você deseja que o
elemento seja acessível tanto da classe base quanto de todas as classes derivadas. Para
limitar o acesso a um elemento dessa forma, você pode declará-lo com Protected .

7 Observação

O modificador de acesso Protected pode ser combinado com dois outros


modificadores:

O modificador de acesso Amigo Protegido torna um membro de classe


acessível de dentro dessa classe, de classes derivadas e do mesmo assembly
no qual a classe é definida.
O modificador Particular Protegido torna um membro de classe acessível por
tipos derivados, mas apenas dentro do assembly que o contém.

Regras
Contexto da declaração. Você só pode usar Protected no nível da classe. Isso significa
que o contexto de declaração de um elemento Protected precisa ser uma classe e não
pode ser um arquivo de origem, namespace, interface, módulo, estrutura ou
procedimento.

Comportamento
Nível de acesso. Todo o código em uma classe pode acessar os elementos dela. O
código em qualquer classe derivada de uma classe base pode acessar todos os
elementos Protected da classe base. Isso é verdade para todas as gerações de
derivação. Isso significa que uma classe pode acessar elementos Protected da
classe base da classe base e assim por diante.

O acesso protegido não é um superconjunto ou subconjunto de acesso amigo.

Modificadores de acesso. As palavras-chave que especificam o nível de acesso são


chamadas de modificadores de acesso. Para obter uma comparação dos
modificadores de acesso, consulte Níveis de acesso no Visual Basic.

O modificador Protected pode ser usado nestes contextos:

Instrução Class

Instrução Const

Instrução Declare

Instrução Delegate

Instrução Dim

Instrução Enum

Instrução Event

Instrução Function

Instrução Interface

Instrução Property

Instrução Structure

Instrução Sub

Confira também
Público
Friend
Privado
Particular Protegido
Amigo Protegido
Níveis de acesso no Visual Basic
Procedimentos
Estruturas
Objetos e Classes
Amigo Protegido (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A combinação de palavras-chave Protected Friend é um modificador de acesso de


membro. Ele confere acesso a Amigo e Protegido nos elementos declarados, portanto,
eles são acessíveis de qualquer lugar no mesmo assembly, da respectiva classe e de
classes derivadas. Você pode especificar Protected Friend apenas em membros de
classes; não é possível aplicar Protected Friend a membros de uma estrutura, pois elas
não podem ser herdadas.

7 Observação

No Visual Studio, selecionar F1 ajuda em Protected Friend oferece ajuda para


Protegido ou Amigo. O IDE escolhe o token único no cursor em vez da palavra
composta.

Confira também
Público
Protegido
Friend
Privado
Particular Protegido
Níveis de acesso no Visual Basic
Procedimentos
Estruturas
Objetos e Classes
Público (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que um ou mais elementos de programação declarados não têm restrições de


acesso.

Comentários
Se for publicar um componente ou conjunto de componentes, como uma biblioteca de
classes, geralmente deseja que os elementos de programação sejam acessíveis por
qualquer código que interopere com o assembly. Para conferir esse acesso ilimitado em
um elemento, você pode declará-lo com Public .

O acesso público é o nível normal para um elemento de programação quando você não
precisa limitar o acesso a ele. Observe que o nível de acesso de um elemento declarado
dentro de uma interface, módulo, classe ou estrutura assume o padrão Public se não o
declarar de outra forma.

Regras
Contexto da declaração. Você só pode usar Public em nível de módulo, interface
ou namespace. Isso significa que o contexto de declaração de um elemento
Public deve ser um arquivo de origem, namespace, interface, módulo, classe ou
estrutura e não pode ser um procedimento.

Comportamento
Nível de acesso. Todo código que pode acessar um módulo, uma classe ou uma
estrutura pode acessar seus elementos Public .

Acesso padrão. Variáveis locais dentro de um procedimento assumem o padrão de


acesso público, e você não pode usar nenhum modificador de acesso nelas.

Modificadores de acesso. As palavras-chave que especificam o nível de acesso são


chamadas de modificadores de acesso. Para obter uma comparação dos
modificadores de acesso, consulte Níveis de acesso no Visual Basic.

O modificador Public pode ser usado nestes contextos:

Instrução Class
Instrução Const

Instrução Declare

Instrução Delegate

Instrução Dim

Instrução Enum

Instrução Event

Instrução Function

Instrução Interface

Instrução Module

Instrução Operator

Instrução Property

Instrução Structure

Instrução Sub

Confira também
Protegido
Friend
Privado
Particular Protegido
Amigo Protegido
Níveis de acesso no Visual Basic
Procedimentos
Estruturas
Objetos e Classes
ReadOnly (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que uma variável ou propriedade pode ser lida, mas não gravada.

Comentários

Regras
Contexto da declaração. Você só pode usar ReadOnly no nível do módulo. Isso
significa que o contexto de declaração de um elemento ReadOnly precisa ser uma
classe, uma estrutura ou um módulo, e não pode ser um arquivo de origem,
namespace ou procedimento.

Modificadores combinados. Você não pode especificar ReadOnly junto com


Static na mesma declaração.

Atribuindo um valor. O código que consome uma propriedade ReadOnly não


pode definir o valor dela. Mas o código que tem acesso ao armazenamento
subjacente pode atribuir ou alterar o valor a qualquer momento.

Você pode atribuir um valor a uma variável ReadOnly somente em sua declaração
ou no construtor de uma classe ou estrutura na qual ela é definida.

Quando usar uma variável ReadOnly


Há situações em que você não pode usar uma Instrução Const para declarar e atribuir
um valor constante. Por exemplo, a instrução Const pode não aceitar o tipo de dados
que você deseja atribuir ou talvez você não consiga calcular o valor em tempo de
compilação com uma expressão constante. Talvez você nem saiba o valor em tempo de
compilação. Nesses casos, você pode usar uma variável ReadOnly para manter um valor
constante.

) Importante

Se o tipo de dados da variável for um tipo de referência, como uma matriz ou uma
instância de classe, seus membros poderão ser alterados mesmo que a variável em
si seja ReadOnly . O exemplo a seguir ilustra essa situação.
VB

ReadOnly characterArray() As Char = {"x"c, "y"c, "z"c}

Sub ChangeArrayElement()

characterArray(1) = "M"c

End Sub

Quando inicializada, a matriz apontada por characterArray() contém "x", "y" e "z".
Como a variável characterArray é ReadOnly , você não pode alterar o valor depois que
ela é inicializada; ou seja, você não pode atribuir uma nova matriz a ela. No entanto,
você pode alterar os valores de um ou mais membros da matriz. Após uma chamada ao
procedimento ChangeArrayElement , a matriz apontada por characterArray() contém "x",
"M" e "z".

Observe que isso é semelhante a declarar um parâmetro de procedimento como ByVal,


o que impede que o procedimento altere o próprio argumento de chamada, mas
permite que ele altere os membros.

Exemplo
O exemplo a seguir define uma propriedade ReadOnly para a data em que um
funcionário foi contratado. A classe armazena o valor da propriedade internamente
como uma variável Private e apenas o código dentro da classe pode alterar esse valor.
No entanto, a propriedade é Public , e qualquer código que possa acessar a classe pode
ler a propriedade.

VB

Class employee

' Only code inside class employee can change the value of hireDateValue.

Private hireDateValue As Date

' Any code that can access class employee can read property dateHired.

Public ReadOnly Property dateHired() As Date

Get

Return hireDateValue

End Get

End Property

End Class

O modificador ReadOnly pode ser usado nestes contextos:

Instrução Dim
Instrução Property
Confira também
WriteOnly
Palavras-chave
Sombras (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que um elemento de programação declarado declara novamente e oculta um


elemento nomeado de maneira idêntica, ou conjunto de elementos sobrecarregados,
em uma classe base.

Comentários
A principal finalidade do sombreamento (que também é conhecido como ocultar por
nome) é preservar a definição de seus membros de classe. A classe base pode sofrer
uma alteração que cria um elemento com o mesmo nome que você já definiu. Se isso
acontecer, o modificador Shadows força as referências por meio de sua classe a serem
resolvidas para o membro que você definiu, em vez de para o novo elemento de classe
base.

O sombreamento e a substituição redefinem um elemento herdado, mas há diferenças


significativas entre as duas abordagens. Para obter mais informações, confira
Sombreamento no Visual Basic.

Regras
Contexto da declaração. Você só pode usar Shadows no nível da classe. Isso
significa que o contexto de declaração de um elemento Shadows precisa ser uma
classe e não pode ser um arquivo de origem, namespace, interface, módulo,
estrutura ou procedimento.

Você pode declarar apenas um elemento de sombreamento em uma única


instrução de declaração.

Modificadores combinados. Você não pode especificar Shadows junto com


Overloads , Overrides ou Static na mesma declaração.

Tipos de elemento. Você pode sombrear qualquer tipo de elemento declarado


com qualquer outro tipo. Se você sombrear uma propriedade ou um
procedimento com outra propriedade ou procedimento, os parâmetros e o tipo de
retorno não precisarão corresponder àqueles na propriedade ou no procedimento
da classe base.
Acesso. O elemento sombreado na classe base normalmente não está disponível
de dentro da classe derivada que o sombreia. No entanto, as considerações a
seguir se aplicam.

Se o elemento de sombreamento não estiver acessível do código que se refere


a ele, a referência será resolvida para o elemento sombreado. Por exemplo, se
um elemento Private sombrear um elemento de classe base, o código que não
tem permissão para acessar o elemento Private acessará o elemento de classe
base.

Se você sombrear um elemento, ainda poderá acessar o elemento sombreado


por meio de um objeto declarado com o tipo da classe base. Você também
pode acessá-lo por meio de MyBase .

O modificador Shadows pode ser usado nestes contextos:

Instrução Class

Instrução Const

Instrução Declare

Instrução Delegate

Instrução Dim

Instrução Enum

Instrução Event

Instrução Function

Instrução Interface

Instrução Property

Instrução Structure

Instrução Sub

Confira também
Compartilhado
Estático
Privado
Me, My, MyBase e MyClass
Noções básicas de herança
MustOverride
NotOverridable
Sobrecargas
Substituível
Substituições
Sombreamento no Visual Basic
Compartilhado (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Especifica que um ou mais elementos de programação declarados estão associados a


uma classe ou estrutura em geral e não a uma instância específica da classe ou
estrutura.

Quando usar compartilhado


Compartilhar um membro de uma classe ou estrutura o disponibiliza para cada
instância, em vez de não compartilhado, em que cada instância mantém a própria cópia.
O compartilhamento será útil, por exemplo, se o valor de uma variável se aplicar a todo
o aplicativo. Se você declarar essa variável como sendo Shared , todas as instâncias
acessarão o mesmo local de armazenamento e, se uma instância alterar o valor da
variável, todas as instâncias acessarão o valor atualizado.

O compartilhamento não altera o nível de acesso de um membro. Por exemplo, um


membro de classe pode ser compartilhado e particular (acessível somente de dentro da
classe) ou não compartilhado e público. Para obter mais informações, consulte Níveis de
acesso no Visual Basic.

Regras
Contexto da declaração. Você só pode usar Shared no nível do módulo. Isso
significa que o contexto de declaração de um elemento Shared precisa ser uma
classe ou uma estrutura, e não pode ser um arquivo de origem, namespace ou
procedimento.

Modificadores combinados. Você não pode especificar Shared junto com


Overrides, Overridable, NotOverridable, MustOverride ou Static na mesma
declaração.

Acesso. Você acessa um elemento compartilhado qualificando-o com a classe ou o


nome de estrutura, não com o nome variável de uma instância específica da classe
ou estrutura. Você nem precisa criar uma instância de uma classe ou estrutura para
acessar os membros compartilhados.

O exemplo a seguir chama o procedimento IsNaN compartilhado exposto pela


estrutura Double.
VB

If Double.IsNaN(result) Then Console.WriteLine("Result is


mathematically undefined.")

Compartilhamento implícito. Você não pode usar o modificador Shared em uma


Instrução Const, mas as constantes são compartilhadas implicitamente. Da mesma
forma, você não pode declarar um membro de um módulo ou uma interface para
ser Shared , mas eles são implicitamente compartilhados.

Comportamento
Armazenamento. Uma variável ou evento compartilhado é armazenado na
memória apenas uma vez, não importa quantas instâncias você crie da classe ou
estrutura. Da mesma forma, um procedimento ou uma propriedade compartilhada
contém apenas um conjunto de variáveis locais.

Acessando por meio de uma variável de instância. É possível acessar um


elemento compartilhado qualificando-o com o nome de uma variável que contém
uma instância específica da classe ou estrutura. Embora isso geralmente funcione
conforme o esperado, o compilador gera uma mensagem de aviso e faz o acesso
por meio da classe ou do nome da estrutura em vez da variável.

Acessando por meio de uma expressão de instância. Se você acessar um


elemento compartilhado por meio de uma expressão que retorna uma instância da
classe ou estrutura dela, o compilador fará o acesso por meio da classe ou do
nome da estrutura em vez de avaliar a expressão. Esse acesso produzirá resultados
inesperados se você pretender que a expressão execute outras ações, bem como
retornar a instância. O exemplo a seguir ilustra essa situação.

VB

Sub Main()

' The following line is the preferred way to access Total.

ShareTotal.Total = 10

' The following line generates a compiler warning message and

' accesses total through class ShareTotal instead of through

' the variable instanceVar. This works as expected and adds

' 100 to Total.

Dim instanceVar As New ShareTotal

instanceVar.Total += 100

' The following line generates a compiler warning message and

' accesses total through class ShareTotal instead of calling

' ReturnClass(). This adds 1000 to total but does not work as

' expected, because the WriteLine in ReturnClass() does not run.

Console.WriteLine("Value of total is " & CStr(ShareTotal.Total))

ReturnClass().Total += 1000

End Sub

Public Function ReturnClass() As ShareTotal

Console.WriteLine("Function ReturnClass() called")

Return New ShareTotal

End Function

Public Class ShareTotal


Public Shared Property Total As Integer

End Class

No exemplo anterior, o compilador gera uma mensagem de aviso nas duas vezes
em que o código acessa a propriedade Total compartilhada por meio de uma
instância. Em cada caso, ele faz o acesso diretamente por meio da classe
ShareTotal e não usa nenhuma instância. No caso da chamada pretendida para o
procedimento ReturnClass , isso significa que ele nem mesmo gera uma chamada
para ReturnClass , portanto, a ação adicional de exibição "Function ReturnClass()
called" não é executada.

O modificador Shared pode ser usado nestes contextos:

Instrução Dim
Instrução Event
Instrução Function
Instrução Operator
Instrução Property
Instrução Sub

Confira também
Sombras
Estático
Tempo de vida no Visual Basic
Procedimentos
Estruturas
Objetos e Classes
Estático (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que uma ou mais variáveis locais declaradas devem continuar existindo e
manter os valores mais recentes após a finalização do procedimento em que elas são
declaradas.

Comentários
Normalmente, uma variável local em um procedimento deixa de existir assim que o
procedimento é interrompido. Uma variável estática continua existindo e mantém o
valor mais recente. Na próxima vez que o código chamar o procedimento, a variável não
será reinicializada e ainda conterá o valor mais recente atribuído a ela. Uma variável
estática continua existindo durante o tempo de vida da classe ou do módulo em que
está definida.

Regras
Contexto da declaração. Você só pode usar Static em variáveis locais. Isso
significa que o contexto de declaração para uma variável Static precisa ser um
procedimento ou um bloco em um procedimento e não pode ser um arquivo de
origem, um namespace, uma classe, uma estrutura ou um módulo.

Você não pode usar Static dentro de um procedimento de estrutura.

Os tipos de dados de vaiáveis locais Static não podem ser inferidos. Para obter
mais informações, confira Inferência de tipo de variável local.

Modificadores combinados. Você não pode especificar Static junto com


ReadOnly , Shadows ou Shared na mesma declaração.

Comportamento
Quando você declara uma variável estática em um procedimento Shared , apenas uma
cópia da variável estática está disponível para todo o aplicativo. Você chama um
procedimento Shared usando o nome da classe, não uma variável que aponta para uma
instância da classe.
Quando você declara uma variável estática em um procedimento que não é Shared ,
apenas uma cópia da variável está disponível para cada instância da classe. Você chama
um procedimento não compartilhado usando uma variável que aponta para uma
instância específica da classe.

Exemplo
O exemplo a seguir demonstra o uso de Static .

VB

Function updateSales(ByVal thisSale As Decimal) As Decimal

Static totalSales As Decimal = 0

totalSales += thisSale

Return totalSales

End Function

A variável Static totalSales é inicializada para 0 apenas uma vez. Cada vez que você
insere updateSales , totalSales ainda tem o valor mais recente que você calculou para
ela.

O modificador Static pode ser usado neste contexto:

Instrução Dim

Confira também
Sombras
Compartilhado
Tempo de vida no Visual Basic
Declaração de Variável
Estruturas
Inferência de Tipo de Variável Local
Objetos e Classes
Unicode (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que o Visual Basic deve realizar marshal de todas as cadeias de caracteres
para valores Unicode, independentemente do nome do procedimento externo que está
sendo declarado.

Quando você chama um procedimento definido fora do projeto, o compilador do Visual


Basic não tem acesso às informações que ele deve ter para chamar o procedimento
corretamente. Essas informações incluem onde o procedimento está localizado, como
ele é identificado, a sequência de chamadas, o tipo de retorno e o conjunto de
caracteres de cadeia de caracteres que ele usa. A Instrução Declare cria uma referência a
um procedimento externo e fornece essas informações necessárias.

A parte charsetmodifier na instrução Declare fornece as informações do conjunto de


caracteres para realizar marshaling das cadeias de caracteres durante uma chamada ao
procedimento externo. Isso também afeta a forma como o Visual Basic pesquisa o
arquivo externo pelo nome do procedimento externo. O modificador Unicode especifica
que o Visual Basic deve realizar marshal de todas as cadeias de caracteres para valores
Unicode e deve pesquisar o procedimento sem modificar seu nome durante a pesquisa.

Se nenhum modificador de conjunto de caracteres for especificado, Ansi será o padrão.

Comentários
O modificador Unicode pode ser usado neste contexto:

Instrução Declare

Anotações do desenvolvedor de dispositivo


inteligente
Não há suporte para essa palavra-chave.

Confira também
Ansi
Auto
Palavras-chave
Widening (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Indica que um operador de conversão ( CType ) converte uma classe ou estrutura em um


tipo que pode conter todos os valores possíveis da estrutura ou classe original.

Conversão com a Palavra-chave Widening


O procedimento de conversão deve especificar Public Shared além de Widening .

As conversões de expansão sempre são bem-sucedidas em tempo de execução e nunca


incorrem em perda de dados. Alguns exemplos são Single em Double , Char em String
e um tipo derivado no seu tipo base. Essa última conversão é de expansão porque o
tipo derivado contém todos os membros do tipo base e, portanto, é uma instância do
tipo base.

O código de consumo não precisa usar CType para conversões de expansão, mesmo
que Option Strict seja On .

A palavra-chave Widening pode ser usada neste contexto:

Instrução Operator

Para obter definições de exemplo de operadores de conversão de expansão e restrição,


consulte Como: Definir um Operador de Conversão.

Confira também
Instrução Operator
Narrowing
Conversões de Widening e Narrowing
Como definir um operador
Função CType
Instrução Option Strict
Como definir um operador de conversão
WithEvents (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que uma ou mais variáveis de membro declaradas referem-se a uma instância
de uma classe que pode gerar eventos.

Comentários
Quando uma variável é definida com o uso de WithEvents , você pode especificar de
forma declarativa que um método manipula os eventos da variável usando a palavra-
chave Handles .

Você só pode usar WithEvents no nível de classe ou módulo. Isso significa que o
contexto de declaração de uma variável WithEvents precisa ser uma classe, estrutura,
um módulo, procedimento ou bloco e não pode ser um arquivo de origem, namespace
ou uma interface.

Você não pode usar WithEvents em um membro de estrutura.

Você pode declarar apenas variáveis individuais, não matrizes, com WithEvents .

Regras
Tipos de Elemento. Você deve declarar variáveis WithEvents como variáveis de objeto
para que elas possam aceitar instâncias de classe. No entanto, você não pode declará-
las como Object . Você deve declará-las como a classe específica que pode gerar os
eventos.

O modificador WithEvents pode ser usado neste contexto: Instrução Dim

Exemplo
VB

Dim WithEvents app As Application

Confira também
Alças
Palavras-chave
Eventos
WriteOnly (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que uma propriedade pode ser escrita, mas não lida.

Comentários

Regras
Contexto da declaração. Você só pode usar WriteOnly no nível do módulo. Isso
significa que o contexto de declaração de uma propriedade WriteOnly precisa ser uma
classe, uma estrutura ou um módulo, e não pode ser um arquivo de origem, namespace
ou procedimento.

Você pode declarar uma propriedade como WriteOnly , mas não como uma variável.

Quando usar WriteOnly


Às vezes, você deseja que o código de consumo seja capaz de definir um valor, mas não
descobrir o que ele é. Por exemplo, dados confidenciais, como um número de registro
social ou uma senha, precisam ser protegidos contra acesso por qualquer componente
que não o tenha definido. Nesses casos, você pode usar uma propriedade WriteOnly
para definir o valor.

) Importante

Ao definir e usar uma propriedade WriteOnly , considere as seguintes medidas de


proteção adicionais:

Substituição. Se a propriedade for membro de uma classe, permita que o padrão


seja NotOverridable e não a declare Overridable ou MustOverride . Isso impede
que uma classe derivada crie acesso indesejado por meio de uma substituição.

Nível de acesso. Se você manter os dados confidenciais da propriedade em uma


ou mais variáveis, declare-os privados para que nenhum outro código possa
acessá-los.

Criptografia. Armazene todos os dados confidenciais em forma criptografada em


vez de em texto sem formatação. Se o código mal-intencionado de alguma forma
obtém acesso a essa área de memória, é mais difícil fazer uso dos dados. A
criptografia também será útil se for necessário serializar os dados confidenciais.

Redefinição. Quando a classe, a estrutura ou o módulo que define a propriedade


estiver sendo encerrado, redefina os dados confidenciais para valores padrão ou
para outros valores sem sentido. Isso fornece proteção extra quando essa área de
memória é liberada para acesso geral.

Persistência. Não persista nenhum dado confidencial, por exemplo, no disco, se


você puder evitá-los. Além disso, não escreva dados confidenciais na Área de
Transferência.

O modificador WriteOnly pode ser usado neste contexto:

Instrução Property

Confira também
ReadOnly (somente-leitura)
Privado
Palavras-chave
Módulos (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O Visual Basic fornece vários módulos que permitem simplificar tarefas comuns no
código, incluindo a manipulação de cadeias de caracteres, a execução de cálculos
matemáticos, a obtenção de informações do sistema, a execução de operações de
arquivo e diretório e assim por diante. A tabela a seguir lista os módulos fornecidos pelo
Visual Basic.

Módulo Descrição

Constants Contém constantes diversas. Essas constantes podem ser usadas em qualquer
lugar no seu código.

ControlChars Contém caracteres de controle constantes para impressão e exibição de texto.

Conversion Contém membros que convertem números decimais em outras bases, números
em cadeias de caracteres, cadeias de caracteres em números e um tipo de dados
para outro.

DateAndTime Contém membros que obtêm a data ou hora atual, executam cálculos de data,
retornam uma data ou hora, definem a data ou hora ou a duração de um
processo.

ErrObject Contém informações sobre erros e métodos em tempo de execução para gerar
ou limpar um erro.

FileSystem Contém membros que executam operações de arquivo, diretório ou pasta e


sistema.

Financial Contém procedimentos que são usados para realizar cálculos financeiros.

Globals Contém informações sobre a versão atual do mecanismo de script.

Information Contém os membros que retornam, testam ou verificam informações como


tamanho da matriz, nomes de tipo e assim por diante.

Interaction Contém membros que interagem com objetos, aplicativos e sistemas.

Strings Contém membros que executam operações de cadeia de caracteres, como


reformatação, pesquisa e obtenção de cadeia de caracteres, e assim por diante.

VBMath Contém membros que executam operações matemáticas.

Confira também
Referência da linguagem Visual Basic
Palavra-chave Nothing (Visual Basic)
Artigo • 07/04/2023 • 4 minutos para o fim da leitura

Representa o valor padrão de qualquer tipo de dados. Para tipos de referência, o valor
padrão é a referência null . Para tipos de valor, o valor padrão depende se o tipo de
valor é anulável.

7 Observação

Para tipos de valor não anuláveis, Nothing no Visual Basic difere de null em C#.
No Visual Basic, se você definir uma variável de um tipo de valor não anulável
como Nothing , a variável será definida como o valor padrão para o tipo declarado.
Em C#, se você atribuir uma variável de um tipo de valor não anulável a null ,
ocorrerá um erro em tempo de compilação.

Comentários
Nothing representa o valor padrão de qualquer tipo de dados. O valor padrão depende
se a variável é de um tipo de valor ou de um tipo de referência.

Uma variável de um tipo de valor contém diretamente seu valor. Os tipos de valor
incluem todos os tipos de dados numéricos, Boolean , Char , Date , todas as estruturas e
todas as enumerações. Uma variável de um tipo de referência armazena uma referência
a uma instância do objeto na memória. Tipos de referência incluem classes, matrizes,
delegados e cadeias de caracteres. Para obter mais informações, consulte Tipos de Valor
e Tipos de Referência.

Se uma variável for de um tipo de valor, o comportamento de Nothing depende se a


variável é de um tipo de dados anulável. Para representar um tipo de valor anulável,
adicione um modificador ? ao nome do tipo. Atribuir Nothing a uma variável anulável
define o valor como null . Para obter mais informações e exemplos, consulte Tipos de
valor anuláveis.

Se uma variável for de um tipo de valor não anulável, atribuir Nothing a ela a definirá
como o valor padrão para seu tipo declarado. Se esse tipo contiver membros variáveis,
todos eles serão definidos como seus valores padrão. O exemplo a seguir ilustra esse
recurso para tipos escalares.

VB
Module Module1

Sub Main()

Dim ts As TestStruct

Dim i As Integer

Dim b As Boolean

' The following statement sets ts.Name to null and ts.Number to 0.

ts = Nothing

' The following statements set i to 0 and b to False.

i = Nothing

b = Nothing

Console.WriteLine($"ts.Name: {ts.Name}")

Console.WriteLine($"ts.Number: {ts.Number}")

Console.WriteLine($"i: {i}")

Console.WriteLine($"b: {b}")

Console.ReadKey()

End Sub

Public Structure TestStruct

Public Name As String

Public Number As Integer

End Structure

End Module

Se uma variável for de um tipo de referência, atribuir Nothing à variável a definirá como
uma referência null do tipo da variável. Uma variável definida como uma referência
null não está associada a nenhum objeto. O exemplo a seguir demonstra este:

VB

Module Module1

Sub Main()

Dim testObject As Object

' The following statement sets testObject so that it does not refer
to

' any instance.

testObject = Nothing

Dim tc As New TestClass

tc = Nothing

' The fields of tc cannot be accessed. The following statement


causes

' a NullReferenceException at run time. (Compare to the assignment


of

' Nothing to structure ts in the previous example.)

'Console.WriteLine(tc.Field1)

End Sub

Class TestClass

Public Field1 As Integer

' . . .

End Class

End Module

Ao verificar se uma variável de referência (ou tipo de valor anulável) é null , não use =
Nothing ou <> Nothing . Sempre use Is Nothing ou IsNot Nothing .

Para cadeias de caracteres no Visual Basic, a cadeia de caracteres vazia é igual a


Nothing . Portanto, "" = Nothing é verdadeiro.

O exemplo a seguir mostra comparações que usam os operadores Is e IsNot :

VB

Module Module1

Sub Main()

Dim testObject As Object

testObject = Nothing

Console.WriteLine(testObject Is Nothing)

' Output: True

Dim tc As New TestClass

tc = Nothing

Console.WriteLine(tc IsNot Nothing)

' Output: False

' Declare a nullable value type.

Dim n? As Integer

Console.WriteLine(n Is Nothing)

' Output: True

n = 4

Console.WriteLine(n Is Nothing)

' Output: False

n = Nothing

Console.WriteLine(n IsNot Nothing)

' Output: False

Console.ReadKey()

End Sub

Class TestClass

Public Field1 As Integer

Private field2 As Boolean

End Class

End Module

Se você declarar uma variável sem usar uma cláusula As e defini-la como Nothing , a
variável terá um tipo de Object . Um exemplo disso é o Dim something = Nothing . Um
erro em tempo de compilação ocorre nesse caso quando Option Strict está ativado e
Option Infer , desativado.

Quando você atribui Nothing a uma variável de objeto, ela não se refere mais a
nenhuma instância de objeto. Se a variável já tiver se referido a uma instância, defini-la
como Nothing não encerra a instância em si. A instância é encerrada e os recursos de
memória e sistema associados a ela são liberados somente depois que o coletor de lixo
(GC) detectar que não há referências ativas restantes.

Nothing difere do objeto DBNull, que representa uma variante não inicializada ou uma

coluna de banco de dados inexistente.

Confira também
Instrução Dim
Tempo de vida do objeto: como os objetos são criados e destruídos
Tempo de vida no Visual Basic
Operador Is
Operador IsNot
Tipos de Valor Anulável
Objetos (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Este artigo fornece links para outros artigos que documentam os objetos de tempo de
execução do Visual Basic e que contêm tabelas dos procedimentos, das propriedades e
dos eventos dos seus membros.

Objetos em tempo de execução do Visual Basic


Objeto em tempo de execução Descrição

Collection Fornece uma maneira conveniente para ver um


grupo relacionado de itens como um único objeto.

Err Contém informações sobre erros de tempo de


execução.

O objeto My.Application consiste nas Fornece dados associados apenas ao aplicativo ou


seguintes classes:
à DLL atual. Nenhuma informação em nível de
sistema pode ser alterada com My.Application .

ApplicationBase fornece membros


disponíveis em todos os projetos.
Alguns membros estão disponíveis apenas para
aplicativos do Windows Forms ou de console.
WindowsFormsApplicationBase fornece
membros disponíveis nos aplicativos do
Windows Forms.

ConsoleApplicationBase fornece membros


disponíveis nos aplicativos de console.

My.Application.Info (Info) Fornece propriedades para obter informações


sobre o aplicativo, como o número de versão, a
descrição, os assemblies carregados e assim por
diante.

My.Application.Log (Log) Fornece uma propriedade e métodos para gravar


informações de evento e de exceção para os
ouvintes de log do aplicativo.

My.Computer (Computer) Fornece propriedades para manipular


componentes do computador, como o áudio, o
relógio, o teclado, o sistema de arquivos e assim
por diante.

My.Computer.Audio (Audio) Fornece métodos para reproduzir sons.


Objeto em tempo de execução Descrição

My.Computer.Clipboard (Clipboard) Fornece métodos para manipular a Área de


Transferência.

My.Computer.Clock (Clock) Fornece propriedades para acessar a hora local


atual e o Tempo Universal Coordenado
(equivalente ao Horário do Meridiano de
Greenwich) no relógio do sistema.

My.Computer.FileSystem (FileSystem) Fornece propriedades e métodos para trabalhar


com unidades, arquivos e diretórios.

My.Computer.FileSystem.SpecialDirectories Fornece propriedades para acessar diretórios


(SpecialDirectories) comumente referenciados.

My.Computer.Info (ComputerInfo) Fornece propriedades para obter informações


sobre memória, assemblies carregados, nome e
sistema operacional do computador.

My.Computer.Keyboard (Keyboard) Fornece propriedades para acessar o estado atual


do teclado, como quais teclas estão pressionadas
no momento e fornece um método para enviar
pressionamentos de teclas para a janela ativa.

My.Computer.Mouse (Mouse) Fornece propriedades para obter informações


sobre o formato e a configuração do mouse
instalado no computador local.

My.Computer.Network (Network) Fornece uma propriedade, um evento e métodos


para interagir com a rede à qual o computador
está conectado.

My.Computer.Ports (Ports) Fornece uma propriedade e um método para


acessar portas seriais do computador.

My.Computer.Registry (RegistryProxy) Fornece propriedades e métodos para manipular o


Registro.

Objeto My.Forms Fornece propriedades para acessar uma instância


de cada Formulário do Windows declarado no
projeto atual.

My.Log (AspLog) Fornece uma propriedade e métodos para gravar


informações de evento e de exceção para os
ouvintes de log dos aplicativos Web.
Objeto em tempo de execução Descrição

Objeto My.Request Obtém o objeto HttpRequest para a página


solicitada. O objeto My.Request contém
informações sobre a solicitação HTTP atual.

O objeto My.Request está disponível somente para


aplicativos do ASP.NET.

Objeto My.Resources Fornece propriedades e classes para acessar


recursos de um aplicativo.

Objeto My.Response Obtém o objeto HttpResponse associado à Page.


Esse objeto permite que você envie dados de
resposta HTTP para um cliente e contém
informações sobre essa resposta.

O objeto My.Response está disponível somente


para aplicativos do ASP.NET.

Objeto My.Settings Fornece propriedades e métodos para acessar as


configurações de um aplicativo.

My.User (User) Fornece acesso às informações sobre o usuário


atual.

Objeto My.WebServices Fornece propriedades para criar e acessar uma


única instância de cada serviço Web referenciado
pelo projeto atual.

TextFieldParser Fornece métodos e propriedades para analisar


arquivos de texto estruturado.

Confira também
Referência da linguagem Visual Basic
Objeto My.Application
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece propriedades, métodos e eventos relacionados ao aplicativo atual.

Comentários
Para obter informações sobre os métodos e propriedades do objeto My.Application ,
confira os seguintes recursos:

ApplicationBase para membros disponíveis em todos os projetos.

WindowsFormsApplicationBase para membros disponíveis nos aplicativos do


Windows Forms.

ConsoleApplicationBase para membros disponíveis nos aplicativos de console.

Requisitos
Namespace:Microsoft.VisualBasic.ApplicationServices

Classe:WindowsFormsApplicationBase (a classe base ConsoleApplicationBase fornece


membros disponíveis em aplicativos de console e a classe base ApplicationBase fornece
os membros que estão disponíveis em todos os projetos)

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Objeto My.Application.Info
Objeto My.Application.Log
Objeto My.Application.Info
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece propriedades para obter informações sobre o aplicativo, como o número de


versão, descrição, assemblies carregados e assim por diante.

Comentários
Para obter informações sobre os métodos e as propriedades do objeto
My.Application.Info , confira AssemblyInfo.

7 Observação

Você pode usar propriedades da classe System.Diagnostics.FileVersionInfo para


obter informações sobre um arquivo em disco.

Requisitos
Namespace:Microsoft.VisualBasic.ApplicationServices

Classe:AssemblyInfo

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Objeto My.Application
Objeto My.Application.Log
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Fornece uma propriedade e métodos para gravar informações de evento e de exceção


para os ouvintes de log do aplicativo.

Comentários
Para obter informações sobre os métodos e as propriedades do objeto
My.Application.Log , confira Log.

Para obter mais informações, consulte informações de log do aplicativo.

7 Observação

Você também pode usar classes no .NET Framework para registrar informações do
aplicativo. Para obter mais informações, confira Aplicativos de rastreamento e
instrumentação.

Requisitos
Namespace:Microsoft.VisualBasic.Logging

Classe:Log

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Objeto My.Application
Objeto My.Computer
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece propriedades para manipular componentes do computador, como o áudio, o


relógio, o teclado, o sistema de arquivos e assim por diante.

Comentários
Para obter informações sobre os métodos e as propriedades do objeto My.Computer ,
confira Computer. A classe base ServerComputer fornece os membros que estão
disponíveis em todos os projetos.

Requisitos
Namespace:Microsoft.VisualBasic.Devices

Classe:Computer (a classe base ServerComputer fornece os membros que estão


disponíveis em todos os projetos).

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Objeto My.Computer.Audio
Objeto My.Computer.Clipboard
Objeto My.Computer.Clock
Objeto My.Computer.FileSystem
Objeto My.Computer.FileSystem.SpecialDirectories
Objeto My.Computer.Info
Objeto My.Computer.Keyboard
Objeto My.Computer.Mouse
Objeto My.Computer.Network
Objeto My.Computer.Ports
Objeto My.Computer.Registry
Objeto My.Computer.Audio
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece métodos para reproduzir sons.

Comentários
Para obter informações sobre os métodos e as propriedades do objeto
My.Computer.Audio , confira Audio.

Para obter mais informações, consulte Como reproduzir sons.

Requisitos
Namespace:Microsoft.VisualBasic.Devices

Classe:Audio

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Objeto My.Computer
Objeto My.Computer.Clipboard
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece métodos para manipular a Área de Transferência.

Comentários
Para obter informações sobre os métodos e as propriedades do objeto
My.Computer.Clipboard , confira ClipboardProxy.

Para obter mais informações, confira Como armazenar dados e ler na área de
transferência.

7 Observação

Você também pode usar métodos da classe System.Windows.Forms.Clipboard


para manipular a Área de Transferência.

Requisitos
Namespace:Microsoft.VisualBasic.MyServices

Classe:ClipboardProxy (fornece acesso a Clipboard)

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Clipboard
Objeto My.Computer
Objeto My.Computer.Clock
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece propriedades para acessar a hora local atual e o Tempo Universal Coordenado
(equivalente ao Horário do Meridiano de Greenwich) no relógio do sistema.

Comentários
Para obter informações sobre os métodos e as propriedades do objeto
My.Computer.Clock , confira Clock.

Requisitos
Namespace:Microsoft.VisualBasic.Devices

Classe:Clock

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Objeto My.Computer
Objeto My.Computer.FileSystem
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece propriedades e métodos para trabalhar com unidades, arquivos e diretórios.

Comentários
Para obter informações sobre os métodos e propriedades do objeto
My.Computer.FileSystem , confira FileSystem.

Para saber mais informações, confira Acesso a Arquivos com o Visual Basic.

7 Observação

Também é possível usar classes no namespace System.IO para trabalhar com


unidades, arquivos e diretórios.

Requisitos
Namespace:Microsoft.VisualBasic.MyServices

Classe:FileSystemProxy (fornece acesso a FileSystem)

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Objeto My.Computer.FileSystem.SpecialDirectories
Objeto My.Computer
Objeto
My.Computer.FileSystem.SpecialDirector
ies
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece propriedades para acessar diretórios comumente referenciados.

Comentários
Para obter informações sobre os métodos e as propriedades do objeto
My.Computer.FileSystem.SpecialDirectories , confira SpecialDirectories.

Para obter mais informações, confira Como recuperar o conteúdo do diretório Meus
Documentos.

Requisitos
Namespace:Microsoft.VisualBasic.MyServices

Classe:SpecialDirectoriesProxy (fornece acesso a SpecialDirectories)

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Objeto My.Computer.FileSystem
Objeto My.Computer
Objeto My.Computer.Info
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece propriedades para obter informações sobre memória, assemblies carregados,


nome e sistema operacional do computador.

Comentários
Para obter informações sobre as propriedades do objeto My.Computer.Info , confira
ComputerInfo.

Requisitos
Namespace:Microsoft.VisualBasic.Devices

Classe:ComputerInfo

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Objeto My.Computer
Objeto My.Computer.Keyboard
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece propriedades para acessar o estado atual do teclado, como quais teclas estão
pressionadas no momento e fornece um método para enviar pressionamentos de teclas
para a janela ativa.

Comentários
Para obter informações sobre os métodos e as propriedades do objeto
My.Computer.Keyword , confira Keyboard.

Para obter mais informações, consulte Acessando o teclado.

Requisitos
Namespace:Microsoft.VisualBasic.Devices

Classe:Keyboard

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Objeto My.Computer
Objeto My.Computer.Mouse
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece propriedades para obter informações sobre o formato e a configuração do


mouse instalado no computador local.

Comentários
Para obter informações sobre os métodos e as propriedades do objeto
My.Computer.Mouse , confira Mouse.

Para obter mais informações, confira Acesso ao mouse.

Requisitos
Namespace:Microsoft.VisualBasic.Devices

Classe:Mouse

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Objeto My.Computer
Objeto My.Computer.Network
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece uma propriedade, um evento e métodos para interagir com a rede à qual o
computador está conectado.

Comentários
Para obter informações sobre os métodos e as propriedades do objeto
My.Computer.Network , confira Network.

Para obter mais informações, confira Executar operações de rede.

Requisitos
Namespace:Microsoft.VisualBasic.Devices

Classe:Network

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Objeto My.Computer
Objeto My.Computer.Ports
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece uma propriedade e um método para acessar portas seriais do computador.

Comentários
Para obter informações sobre os métodos e as propriedades do objeto
My.Computer.Ports , confira Ports.

Para obter mais informações, consulte Acessar as portas do computador.

7 Observação

Você também pode usar propriedades e métodos da classe


System.IO.Ports.SerialPort para acessar as portas seriais do computador.

Requisitos
Namespace:Microsoft.VisualBasic.Devices

Classe:Ports

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Objeto My.Computer
Objeto My.Computer.Registry
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece propriedades e métodos para manipular o Registro.

Comentários
Para obter informações sobre os métodos e as propriedades do objeto
My.Computer.Registry , confira RegistryProxy.

Para obter mais informações, confira Leitura e gravação no Registro.

7 Observação

Você também pode manipular o registro usando métodos da classe


Microsoft.Win32.Registry.

Requisitos
Namespace:Microsoft.VisualBasic.MyServices

Classe:RegistryProxy (fornece acesso a Registry)

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Objeto My.Computer
Objeto My.Forms
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece propriedades para acessar uma instância de cada Formulário do Windows


declarado no projeto atual.

Comentários
O objeto My.Forms fornece uma instância de cada formulário no projeto atual. O nome
da propriedade é igual ao nome do formulário acessado pela propriedade.

Você pode acessar os formulários fornecidos pelo objeto My.Forms usando o nome do
formulário, sem qualificação. Como o nome da propriedade é igual ao nome do tipo do
formulário, isso permite acessar um formulário como se ele tivesse uma instância
padrão. Por exemplo, My.Forms.Form1.Show é equivalente a Form1.Show .

O objeto My.Forms expõe apenas os formulários associados ao projeto atual. Ele não
fornece acesso aos formulários declarados em DLLs referenciadas. Para acessar um
formulário fornecido por uma DLL, você deve usar o nome qualificado do formulário,
escrito como DllName.FormName.

Você pode usar a propriedade OpenForms para obter uma coleção de todos os
formulários abertos do aplicativo.

O objeto e as respectivas propriedades estão disponíveis apenas para aplicativos do


Windows.

Propriedades
Cada propriedade do objeto My.Forms fornece acesso a uma instância de um formulário
no projeto atual. O nome da propriedade é igual ao nome do formulário que a
propriedade acessa e o tipo de propriedade é igual ao tipo do formulário.

7 Observação

Se houver uma colisão de nomes, o nome da propriedade para acessar um


formulário é RootNamespace_Namespace_FormName. Por exemplo, considere dois
formulários denominados Form1. Se um desses formulários estiver no namespace
raiz WindowsApplication1 e no namespace Namespace1 , você acessaria esse
formulário por meio de My.Forms.WindowsApplication1_Namespace1_Form1 .
O objeto My.Forms fornece acesso à instância do formulário principal do aplicativo que
foi criado na inicialização. Para todos os outros formulários, o objeto My.Forms cria uma
nova instância do formulário quando ele é acessado e o armazena. Tentativas
subsequentes de acessar essa propriedade retornam essa instância do formulário.

Você pode descartar um formulário atribuindo Nothing à propriedade para esse


formulário. O setter de propriedade chama o método Close do formulário e, em
seguida, atribui Nothing ao valor armazenado. Se você atribuir qualquer valor diferente
de Nothing à propriedade, o setter gerará uma exceção ArgumentException.

Você pode testar se uma propriedade do objeto My.Forms armazena uma instância do
formulário usando o operador Is ou IsNot . Você pode usar esses operadores para
verificar se o valor da propriedade é Nothing .

7 Observação

Normalmente, o operador Is ou IsNot precisa ler o valor da propriedade para


executar a comparação. No entanto, se a propriedade atualmente armazenar
Nothing , a propriedade criará uma instância do formulário e retornará essa
instância. No entanto, o compilador do Visual Basic trata as propriedades do objeto
My.Forms de maneira diferente e permite que o operador Is ou IsNot verifique o

status da propriedade sem alterar o valor.

Exemplo
Este exemplo altera o título do formulário padrão SidebarMenu .

VB

Sub ShowSidebarMenu(ByVal newTitle As String)

If My.Forms.SidebarMenu IsNot Nothing Then

My.Forms.SidebarMenu.Text = newTitle

End If

End Sub

Para que este exemplo funcione, o projeto deve ter um formulário nomeado
SidebarMenu .

Esse código funcionará apenas em um projeto de Aplicativo do Windows.


Requisitos

Disponibilidade por tipo de projeto

Tipo de projeto Disponível

Aplicativo do Windows Sim

Biblioteca de Classes Não

Aplicativo do Console Não

Biblioteca de Controle do Windows Não

Biblioteca de Controles da Web Não

Serviço do Windows Não

Site Não

Confira também
OpenForms
Form
Close
Objetos
Operador Is
Operador IsNot
Como acessar formulários de aplicativo
Objeto My.Log
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Fornece uma propriedade e métodos para gravar informações de evento e de exceção


para os ouvintes de log do aplicativo.

Comentários
Para obter informações sobre os métodos e as propriedades do objeto My.Log , confira
AspLog.

O objeto My.Log está disponível somente para aplicativos do ASP.NET. Para aplicativos
cliente, use o objeto My.Application.Log.

Requisitos
Namespace:Microsoft.VisualBasic.Logging

Classe:AspLog

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)
Objeto My.Request
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Obtém o objeto HttpRequest para a página solicitada.

Comentários
O objeto My.Request contém informações sobre a solicitação HTTP atual.

O objeto My.Request está disponível somente para aplicativos do ASP.NET.

Exemplo
O exemplo a seguir obtém a coleção de cabeçalho do objeto My.Request e usa o objeto
My.Response para gravá-lo na página ASP.NET.

ASP.NET (VB)

<script runat="server">

Public Sub ShowHeaders()

' Load the header collection from the Request object.

Dim coll As System.Collections.Specialized.NameValueCollection

coll = My.Request.Headers

' Put the names of all keys into a string array.

For Each key As String In coll.AllKeys

My.Response.Write("Key: " & key & "<br>")

' Get all values under this key.

For Each value As String In coll.GetValues(key)

My.Response.Write("Value: " & _

Server.HtmlEncode(value) & "<br>")

Next

Next

End Sub

</script>

Confira também
HttpRequest
Objeto My.Response
Objeto My.Response
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Obtém o objeto HttpResponse associado a Page. Esse objeto permite que você envie
dados de resposta HTTP para um cliente e contém informações sobre essa resposta.

Comentários
O objeto My.Response contém o objeto HttpResponse atual associado à página.

O objeto My.Response está disponível somente para aplicativos do ASP.NET.

Exemplo
O exemplo a seguir obtém a coleção de cabeçalho do objeto My.Request e usa o objeto
My.Response para gravá-lo na página ASP.NET.

ASP.NET (VB)

<script runat="server">

Public Sub ShowHeaders()

' Load the header collection from the Request object.

Dim coll As System.Collections.Specialized.NameValueCollection

coll = My.Request.Headers

' Put the names of all keys into a string array.

For Each key As String In coll.AllKeys

My.Response.Write("Key: " & key & "<br>")

' Get all values under this key.

For Each value As String In coll.GetValues(key)

My.Response.Write("Value: " & _

Server.HtmlEncode(value) & "<br>")

Next

Next

End Sub

</script>

Confira também
HttpResponse
Objeto My.Request
Objeto My.Resources
Artigo • 28/11/2022 • 3 minutos para o fim da leitura

Fornece propriedades e classes para acessar recursos do aplicativo.

Comentários
O objeto My.Resources fornece acesso aos recursos do aplicativo e permite que você
recupere recursos dinamicamente para o aplicativo. Para obter mais informações,
consulte Gerenciando recursos de aplicativo (.NET).

O objeto My.Resources expõe apenas recursos globais. Ele não fornece acesso a
arquivos de recursos associados a formulários. Você deve acessar os respectivos
recursos no formulário.

Você pode acessar os arquivos de recursos específicos da cultura do aplicativo a partir


do objeto My.Resources . Por padrão, o objeto My.Resources procura recursos do arquivo
de recurso que corresponde à cultura na propriedade UICulture. No entanto, você pode
substituir esse comportamento e especificar uma cultura específica a ser usada para os
recursos. Para saber mais, confira Recursos em aplicativos do .NET.

Propriedades
As propriedades do objeto My.Resources fornecem acesso somente leitura aos recursos
do aplicativo. Para adicionar ou remover recursos, use o Designer de Projeto. Você pode
acessar recursos adicionados por meio do Designer de Projeto usando
My.Resources. resourceName.

Você também pode adicionar ou remover arquivos de recursos selecionando o projeto


no Gerenciador de Soluções e clicando em Adicionar novo item ou Adicionar item
existente no menu Projeto. Você pode acessar recursos adicionados dessa maneira
usando My.Resources. resourceFileName . resourceName.

Cada recurso tem um nome, categoria e valor, e essas configurações de recurso


determinam como a propriedade para acessar o recurso aparece no objeto
My.Resources . Para recursos adicionados no Designer de Projeto:

O nome determina o nome da propriedade,

Os dados do recurso são o valor da propriedade,


A categoria determina o tipo da propriedade:

Categoria Tipo de dados de propriedade

Cadeias de Cadeia de caracteres


caracteres

Imagens Bitmap

Ícones Icon

Áudio UnmanagedMemoryStream

A classe UnmanagedMemoryStream deriva de Stream, de modo que pode ser


usada com métodos que fazem fluxos, como o método Play.

Arquivos - Cadeia de caracteres para arquivos de texto.

- Bitmap para arquivos de imagem.

- Icon para arquivos de ícone.

- UnmanagedMemoryStream para arquivos de som.

Outras Determinado pelas informações na coluna Tipo do designer.

Classes
O objeto My.Resources expõe cada arquivo de recurso como uma classe com
propriedades compartilhadas. O nome da classe é igual ao nome do arquivo de recurso.
Conforme descrito na seção anterior, os recursos em um arquivo de recurso são
expostos como propriedades na classe.

Exemplo 1
Este exemplo define o título de um formulário para o recurso de cadeia de caracteres
nomeado Form1Title no arquivo de recurso do aplicativo. Para que o exemplo funcione,
o aplicativo deve ter uma cadeia de caracteres nomeada Form1Title no arquivo de
recurso.

VB

Sub SetFormTitle()

Me.Text = My.Resources.Form1Title

End Sub

Exemplo 2
Este exemplo define o ícone do formulário como aquele nomeado Form1Icon
armazenado no arquivo de recurso do aplicativo. Para que o exemplo funcione, o
aplicativo deve ter um ícone nomeado Form1Icon no arquivo de recurso.

VB

Sub SetFormIcon()

Me.Icon = My.Resources.Form1Icon

End Sub

Exemplo 3
Este exemplo define a imagem em segundo plano de um formulário para o recurso de
imagem nomeado Form1Background , que está no arquivo de recurso do aplicativo. Para
que o exemplo funcione, o aplicativo deve ter um recurso de imagem nomeado
Form1Background no arquivo de recurso.

VB

Sub SetFormBackgroundImage()

Me.BackgroundImage = My.Resources.Form1Background

End Sub

Exemplo 4
Este exemplo reproduz o som armazenado como um recurso de áudio nomeado
Form1Greeting no arquivo de recurso do aplicativo. Para que o exemplo funcione, o
aplicativo deve ter um recurso de áudio nomeado Form1Greeting no arquivo de recurso.
O método My.Computer.Audio.Play está disponível apenas para aplicativos do Windows
Forms.

VB

Sub PlayFormGreeting()

My.Computer.Audio.Play(My.Resources.Form1Greeting,

AudioPlayMode.Background)
End Sub

Exemplo 5
Este exemplo recupera a versão de cultura francesa de um recurso de cadeia de
caracteres do aplicativo. O recurso é nomeado Message . Para alterar a cultura que o
objeto My.Resources usa, o exemplo usa ChangeUICulture.

Para que este exemplo funcione, o aplicativo deve ter uma cadeia de caracteres
nomeada Message no arquivo de recurso e o aplicativo deve ter a versão de cultura
francesa desse arquivo de recurso, Resources.fr-FR.resx. Se o aplicativo não tiver a
versão de cultura francesa do arquivo de recurso, o objeto My.Resource recuperará o
recurso do arquivo de recurso de cultura padrão.

VB

Sub ShowLocalizedMessage()

Dim culture As String = My.Application.UICulture.Name

My.Application.ChangeUICulture("fr-FR")

MsgBox(My.Resources.Message)

My.Application.ChangeUICulture(culture)

End Sub

Confira também
Gerenciando recursos de aplicativo (.NET)
Recursos em aplicativos .NET
Objeto My.Settings
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Fornece propriedades e métodos para acessar as configurações do aplicativo.

Comentários
O objeto My.Settings fornece acesso às configurações do aplicativo e permite
armazenar e recuperar dinamicamente configurações de propriedade e outras
informações sobre o seu aplicativo. Para obter mais informações, consulte Gerenciando
configurações de aplicativo (.NET).

Propriedades
As propriedades do objeto My.Settings fornecem acesso às configurações do seu
aplicativo. Para adicionar ou remover configurações, use o Designer de Configurações.

Cada configuração tem um Name, Type, Scope e Value, que determinam como a
propriedade acessa cada configuração que aparece no objeto My.Settings :

Name determina o nome da propriedade.

Type determina o tipo da propriedade.

Scope indica se a propriedade é somente leitura. Se o valor for Application, a


propriedade será somente leitura; se o valor for User, será leitura/gravação.

Value é o valor padrão da propriedade.

Métodos
Método Descrição

Reload Recarrega as configurações do usuário com base nos últimos valores salvos.

Save Salva as configurações atuais do usuário.

O objeto My.Settings também fornece propriedades e métodos avançados, herdados


da classe ApplicationSettingsBase.
Tarefas
A tabela a seguir lista exemplos de tarefas envolvendo o objeto My.Settings .

Para Consulte

Ler configurações do aplicativo Como ler configurações do aplicativo no Visual Basic

Alterar uma configuração de usuário Como alterar configurações do usuário no Visual


Basic

Manter configurações do usuário Como persistir configurações de usuário no Visual


Basic

Criar uma grade de propriedades para Como criar grades de propriedades para
configurações do usuário configurações de usuário no Visual Basic

Exemplo
Este exemplo exibe o valor da configuração Nickname .

VB

Sub ShowNickname()

MsgBox("Nickname is " & My.Settings.Nickname)

End Sub

Para que esse exemplo funcione, seu aplicativo deve ter uma configuração Nickname , do
tipo String .

Confira também
ApplicationSettingsBase
Como ler configurações do aplicativo no Visual Basic
Como alterar configurações do usuário no Visual Basic
Como persistir configurações de usuário no Visual Basic
Como criar grades de propriedades para configurações de usuário no Visual Basic
Gerenciando configurações de aplicativo (.NET)
Objeto My.User
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece acesso às informações sobre o usuário atual.

Comentários
Para obter informações sobre os métodos e as propriedades do objeto My.User , confira
Microsoft.VisualBasic.ApplicationServices.User.

Para obter mais informações, confira Como acessar dados do usuário.

Requisitos
Assembly: Biblioteca de Tempo de Execução do Visual Basic (em
Microsoft.VisualBasic.dll)

Confira também
IPrincipal
CurrentPrincipal
User
Current
Objeto My.WebServices
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece propriedades para criar e acessar uma única instância de cada serviço Web XML
referenciado pelo projeto atual.

Comentários
O objeto My.WebServices fornece uma instância de cada serviço Web referenciado pelo
projeto atual. Cada instância é instanciada sob demanda. É possível acessar esses
serviços Web por meio das propriedades do objeto My.WebServices . O nome da
propriedade é igual ao nome do serviço Web acessado pela propriedade. Qualquer
classe que herda de SoapHttpClientProtocol é um serviço Web. Para obter informações
sobre como adicionar serviços Web a um projeto, confira Acesso a serviços Web de
aplicativo.

O objeto My.WebServices expõe apenas os serviços Web associados ao projeto atual. Ele
não fornece acesso aos serviços Web declarados em DLLs referenciadas. Para acessar
um serviço Web que uma DLL fornece, você precisa usar o nome qualificado do serviço
Web, no formato DllName.WebServiceName. Para obter mais informações, confira
Acesso a serviços Web de aplicativo.

O objeto e as propriedades não estão disponíveis para aplicativos Web.

Propriedades
Cada propriedade do objeto My.WebServices fornece acesso a uma instância de um
serviço Web referenciado pelo projeto atual. O nome da propriedade é o mesmo que o
nome do serviço Web que a propriedade acessa, e o tipo de propriedade é o mesmo
que o tipo do serviço Web.

7 Observação

Se houver uma colisão de nome, o nome da propriedade para acessar um serviço


Web será RootNamespace_Namespace_ServiceName. Por exemplo, considere dois
serviços Web nomeados Service1 . Se um desses serviços estiver no namespace
WindowsApplication1 raiz e no namespace Namespace1 , você acessará esse serviço

usando My.WebServices.WindowsApplication1_Namespace1_Service1 .
Quando você acessa pela primeira vez uma das propriedades My.WebServices do objeto,
ele cria uma instância do serviço Web e o armazena. Os acessos seguintes dessa
propriedade retornam essa instância do serviço Web.

Você pode descartar um serviço Web atribuindo Nothing à propriedade desse serviço
Web. O setter de propriedade atribui Nothing ao valor armazenado. Se você atribuir
qualquer valor diferente de Nothing à propriedade, o setter gerará uma exceção
ArgumentException.

Você pode testar se uma propriedade do objeto My.WebServices armazena uma


instância do serviço Web usando o operador Is ou IsNot . Você pode usar esses
operadores para verificar se o valor da propriedade é Nothing .

7 Observação

Normalmente, o operador Is ou IsNot precisa ler o valor da propriedade para


executar a comparação. No entanto, se a propriedade atualmente armazenar
Nothing , a propriedade criará uma instância do serviço Web e retornará essa
instância. No entanto, o compilador do Visual Basic trata especialmente as
propriedades do objeto My.WebServices e permite que o operador Is ou IsNot
verifique o status da propriedade sem alterar o valor.

Exemplo
Este exemplo chama o método FahrenheitToCelsius do serviço Web XML
TemperatureConverter e retorna o resultado.

VB

Function ConvertFromFahrenheitToCelsius(

ByVal dFahrenheit As Double) As Double

Return
My.WebServices.TemperatureConverter.FahrenheitToCelsius(dFahrenheit)

End Function

Para que este exemplo funcione, seu projeto precisa fazer referência a um serviço Web
chamado Converter e esse serviço Web precisa expor o método ConvertTemperature .
Para obter mais informações, confira Acesso a serviços Web de aplicativo.

Esse código não funciona em um projeto de aplicativo Web.


Requisitos

Disponibilidade por tipo de projeto

Tipo de projeto Disponível

Aplicativo do Windows Sim

Biblioteca de Classes Sim

Aplicativo do Console Sim

Biblioteca de Controle do Windows Sim

Biblioteca de Controles da Web Sim

Serviço do Windows Sim

Site Não

Confira também
SoapHttpClientProtocol
ArgumentException
Como acessar serviços Web de aplicativo
Objeto TextFieldParser
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece métodos e propriedades para analisar arquivos de texto estruturado.

Sintaxe
VB

Public Class TextFieldParser

Comentários
Para obter informações sobre os métodos e as propriedades do objeto
TextFieldParser , confira TextFieldParser.

Para obter mais informações, confira Leitura de Arquivos.

Requisitos
Namespace:Microsoft.VisualBasic.FileIO

Classe:TextFieldParser

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)
Operadores (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Nesta seção
Precedência do operador no Visual Basic
Operadores listados por funcionalidade
Tipos de dados de resultados do operador
Operador DirectCast
Operador TryCast
Operador NameOf
Novo operador
Operadores condicionais null
Operadores aritméticos
Operadores de atribuição
Operadores Bit Shift
Operadores de comparação
Operadores de concatenação
Operadores lógicos bit a bit
Operadores diversos

Seções relacionadas
Referência da linguagem Visual Basic
Precedência do operador no Visual
Basic
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Quando ocorrem várias operações em uma expressão, cada parte é avaliada e resolvida
em uma ordem predeterminada chamada precedência do operador.

Regras de precedência
Quando as expressões contêm operadores de mais de uma categoria, elas são avaliadas
de acordo com as seguintes regras:

Os operadores aritméticos e de concatenação têm a ordem de precedência


descrita na seção a seguir e todos têm precedência maior do que os operadores
de comparação, lógicos e bit a bit.

Todos os operadores de comparação têm precedência igual e todos têm


precedência maior que os operadores lógicos e bit a bit, mas precedência menor
que os operadores aritméticos e de concatenação.

Os operadores lógicos e bit a bit têm a ordem de precedência descrita na seção a


seguir e todos têm precedência menor do que os operadores aritméticos, de
concatenação e de comparação.

Operadores com igual precedência são avaliados da esquerda para a direita na


ordem em que aparecem na expressão.

Ordem de precedência
Os operadores são avaliados na seguinte ordem de precedência:

Operador Await
Await

Operadores aritméticos e de concatenação


Exponenciação ( ^ )

Identidade unária e negação ( + , – )


Multiplicação e divisão de ponto flutuante ( * , / )

Divisão de inteiros ( \ )

Aritmética modular ( Mod )

Adição e subtração ( + , – )

Concatenação de cadeia de caracteres ( & )

Deslocamento de bit aritmética ( << , >> )

Operadores de comparação
Todos os operadores de comparação ( = , <> , < , <= , > , >= , Is , IsNot , Like ,
TypeOf ... Is )

Operadores lógicos e bit a bit


Negação ( Not )

Conjunção ( And , AndAlso )

Disjunção inclusiva ( Or , OrElse )

Disjunção exclusiva ( Xor )

Comentários
O operador = é apenas o de comparação de igualdade, não o de atribuição.

O operador de concatenação de cadeia de caracteres ( & ) não é aritmético, mas, em


precedência, é agrupado com os operadores aritméticos.

Os operadores Is e IsNot são operadores de comparação de referência de objeto. Eles


não comparam os valores de dois objetos; eles verificam apenas para determinar se
duas variáveis de objeto se referem à mesma instância dele.

Capacidade de associação
Quando operadores de igual precedência aparecem juntos em uma expressão, como
multiplicação e divisão, o compilador avalia cada operação conforme a encontra da
esquerda para a direita. O exemplo a seguir ilustra essa situação.

VB

Dim n1 As Integer = 96 / 8 / 4

Dim n2 As Integer = (96 / 8) / 4

Dim n3 As Integer = 96 / (8 / 4)

A primeira expressão avalia a divisão 96/8 (que resulta em 12) e depois a divisão 12/4,
que resulta em três. Como o compilador avalia as operações para n1 da esquerda para
a direita, a avaliação é a mesma quando essa ordem é indicada explicitamente para n2 .
n1 e n2 têm um resultado de três. Por outro lado, n3 tem um resultado de 48, porque

os parênteses forçam o compilador a avaliar 8/4 primeiro.

Devido a esse comportamento, os operadores são considerados associativos à esquerda


no Visual Basic.

Como substituir Precedência e Associatividade


Você pode usar parênteses para forçar algumas partes de uma expressão a serem
avaliadas antes de outras. Isso pode substituir a ordem de precedência e a
associatividade esquerda. O Visual Basic sempre executa operações que estão entre
parênteses antes daquelas externas. No entanto, entre parênteses, ele mantém
precedência e associatividade comuns, a menos que você use parênteses dentro dos
parênteses. O exemplo a seguir ilustra essa situação.

VB

Dim a, b, c, d, e, f, g As Double

a = 8.0

b = 3.0

c = 4.0

d = 2.0

e = 1.0

f = a - b + c / d * e

' The preceding line sets f to 7.0. Because of natural operator

' precedence and associativity, it is exactly equivalent to the

' following line.

f = (a - b) + ((c / d) * e)

' The following line overrides the natural operator precedence

' and left associativity.

g = (a - (b + c)) / (d * e)

' The preceding line sets g to 0.5.

Confira também
Operador =
Operador Is
Operador IsNot
Operador Like
Operador TypeOf
Operador Await
Operadores Listados por Funcionalidade
Operadores e Expressões
Tipos de dados de resultados do
operador (Visual Basic)
Artigo • 07/04/2023 • 8 minutos para o fim da leitura

O Visual Basic determina o tipo de dados de resultado de uma operação com base nos
tipos de dados dos operandos. Em alguns casos, esse pode ser um tipo de dados com um
intervalo maior do que o de qualquer operando.

Intervalos de tipos de dados


Os intervalos dos tipos de dados relevantes, em ordem de menor a maior, são os
seguintes:

Boolean – dois valores possíveis

SByte, Byte – 256 valores integrais possíveis

Short, UShort – 65.536 (6.5...E+4) valores integrais possíveis

Integer, UInteger – 4.294.967.296 (4.2...E+9) valores integrais possíveis

Long, ULong – 18.446.744.073.709.551.615 (1.8...E+19) valores integrais possíveis

Decimal – 1,5...E+29 valores integrais possíveis, intervalo máximo 7.9...E+28 (valor


absoluto)

Single – intervalo máximo 3,4...E+38 (valor absoluto)

Double – intervalo máximo 1,7...E+308 (valor absoluto)

Para obter mais informações sobre tipos de dados do Visual Basic, confira Tipos de dados.

Se um operando for avaliado como Nothing, os operadores aritméticos do Visual Basic o


tratarão como zero.

Aritmética decimal
Observe que o tipo de dados Decimal não é ponto flutuante nem inteiro.

Se o operando de uma operação + , – , * , / ou Mod for Decimal e o outro não for Single
nem Double , o Visual Basic ampliará o outro operando para Decimal . Ele executa a
operação em Decimal , e o tipo de dados de resultado é Decimal .
Aritmético de ponto flutuante
O Visual Basic executa a aritmética de ponto flutuante no tipo Double, que é o tipo de
dados mais eficiente para essas operações. No entanto, se um operando for Single e o
outro não for Double , o Visual Basic executará a operação em Single . Ele amplia cada
operando conforme necessário para o tipo de dados apropriado antes da operação, e o
resultado tem esse tipo de dados.

Operadores / e ^
O operador / é definido apenas para os tipos de dados Decimal, Single e Double. O
Visual Basic amplia cada operando conforme necessário para o tipo de dados apropriado
antes da operação, e o resultado tem esse tipo de dados.

A tabela a seguir mostra os tipos de dados de resultado do operador / . Observe que esta
tabela é simétrica; para uma determinada combinação de tipos de dados de operando, o
tipo de dados de resultado é o mesmo, independentemente da ordem dos operandos.

Decimal Single Double Qualquer tipo inteiro

Decimal Decimal Single Double Decimal

Single Single Single Double Single

Double Double Double Double Double

Qualquer tipo inteiro Decimal Single Double Double

O operador ^ é definido apenas para o tipo de dados Double . O Visual Basic amplia cada
operando conforme necessário para Double antes da operação, e o tipo de dados de
resultado é sempre Double .

Aritmética do inteiro
O tipo de dados de resultado de uma operação de inteiro depende dos tipos de dados
dos operandos. Em geral, o Visual Basic usa as seguintes políticas para determinar o tipo
de dados de resultado:

Se ambos os operandos de um operador binário tiverem o mesmo tipo de dados, o


resultado terá esse tipo de dados. Uma exceção é Boolean , que é forçado a Short .

Se um operando não assinado participar com um operando assinado, o resultado


terá um tipo assinado com pelo menos um intervalo tão grande quanto qualquer
operando.
Caso contrário, o resultado geralmente tem o maior dos dois tipos de dados de
operando.

Observe que o tipo de dados de resultado pode não ser o mesmo que qualquer tipo de
dados operando.

7 Observação

O tipo de dados de resultado nem sempre é grande o suficiente para conter todos os
valores possíveis resultantes da operação. Uma exceção OverflowException poderá
ocorrer se o valor for muito grande para o tipo de dados de resultado.

Operadores unários + e –
A tabela a seguir mostra os tipos de dados de resultado dos dois operadores unários, + e
–.

Boolean SByte Byte Short UShort Integer UInteger Long ULong

Unário + Short SByte Byte Short UShort Integer UInteger long ULong

Unário – Short SByte Short Short Integer Integer long long Decimal

Operadores << e >>


A tabela a seguir mostra os tipos de dados de resultado dos dois operadores de
deslocamento de bit, << e >> . O Visual Basic trata cada operador de deslocamento de bit
como um operador unário no operando esquerdo (o padrão de bit a ser deslocado).

Boolean SByte Byte Short UShort Integer UInteger Long ULong

<< , >> Short SByte Byte Short UShort Integer UInteger long ULong

Se o operando esquerdo for Decimal , Single ou Double , o String Visual Basic tentará
convertê-lo em Long antes da operação, e o tipo de dados de resultado será Long . O
operando à direita (o número de posições de bit a serem deslocadas) deve ser Integer ou
um tipo que se expanda para Integer .

Operadores binários +, –, * e Mod


A tabela a seguir mostra os tipos de dados de resultado dos operadores binários + e – , e
dos operadores * e Mod . Observe que esta tabela é simétrica; para uma determinada
combinação de tipos de dados de operando, o tipo de dados de resultado é o mesmo,
independentemente da ordem dos operandos.

Boolean SByte Byte Short UShort Integer UInteger Long ULong

Boolean Short SByte Short Short Integer Integer long long Decimal

SByte SByte SByte Short Short Integer Integer long long Decimal

Byte Short Short Byte Short UShort Integer UInteger long ULong

Short Short Short Short Short Integer Integer long long Decimal

UShort Integer Integer UShort Integer UShort Integer UInteger long ULong

Integer Integer Integer Integer Integer Integer Integer long long Decimal

UInteger long long UInteger long UInteger long UInteger long ULong

Long long long long long long long long long Decimal

ULong Decimal Decimal ULong Decimal ULong Decimal ULong Decimal ULong

Operador \
A tabela a seguir mostra os tipos de dados de resultado do operador \ . Observe que esta
tabela é simétrica; para uma determinada combinação de tipos de dados de operando, o
tipo de dados de resultado é o mesmo, independentemente da ordem dos operandos.

Boolean SByte Byte Short UShort Integer UInteger Long ULong

Boolean Short SByte Short Short Integer Integer long long long

SByte SByte SByte Short Short Integer Integer long long long

Byte Short Short Byte Short UShort Integer UInteger long ULong

Short Short Short Short Short Integer Integer long long long

UShort Integer Integer UShort Integer UShort Integer UInteger long ULong

Integer Integer Integer Integer Integer Integer Integer long long long

UInteger long long UInteger long UInteger long UInteger long ULong

Long long long long long long long long long long

ULong long long ULong long ULong long ULong long ULong
Se o operando do operador \ for Decimal, Single ou Double, o Visual Basic tentará
convertê-lo em Long antes da operação, e o tipo de dados de resultado será Long .

Comparações relacionais e bit a bit


O tipo de dados de resultado de uma operação relacional ( = , <> , < , > , <= , >= ) é sempre
Boolean Tipo de dados booliano. O mesmo vale para operações lógicas ( And , AndAlso ,

Not , Or , OrElse , Xor ) em operandos Boolean .

O tipo de dados de resultado de uma operação lógica bi a bit depende dos tipos de dados
dos operandos. Observe que AndAlso e OrElse são definidos apenas para Boolean , e o
Visual Basic converte cada operando conforme necessário em Boolean antes de executar a
operação.

Operadores =, <>, <, >, <= e >=


Se ambos os operandos forem Boolean , o Visual Basic considerará True menor que False .
Se um tipo numérico for comparado com um String , o Visual Basic tentará converter o
String em Double antes da operação. Um operando Char ou Date só pode ser
comparado com outro operando do mesmo tipo de dados. O tipo de dados de resultado
é sempre Boolean .

Operador Not bit a bit


A tabela a seguir mostra os tipos de dados de resultado do operador Not bit a bit.

Boolean SByte Byte Short UShort Integer UInteger Long ULong

Not Booliano SByte Byte Short UShort Integer UInteger long ULong

Se o operando for Decimal , Single ou Double , o String Visual Basic tentará convertê-lo
em Long antes da operação, e o tipo de dados de resultado será Long .

Operadores And, Or e Xor bit a bit


A tabela a seguir mostra os tipos de dados de resultado dos operadores And , Or e Xor bit
a bit. Observe que esta tabela é simétrica; para uma determinada combinação de tipos de
dados de operando, o tipo de dados de resultado é o mesmo, independentemente da
ordem dos operandos.

Boolean SByte Byte Short UShort Integer UInteger Long ULong


Boolean SByte Byte Short UShort Integer UInteger Long ULong

Boolean Booliano SByte Short Short Integer Integer long long long

SByte SByte SByte Short Short Integer Integer long long long

Byte Short Short Byte Short UShort Integer UInteger long ULong

Short Short Short Short Short Integer Integer long long long

UShort Integer Integer UShort Integer UShort Integer UInteger long ULong

Integer Integer Integer Integer Integer Integer Integer long long long

UInteger long long UInteger long UInteger long UInteger long ULong

Long long long long long long long long long long

ULong long long ULong long ULong long ULong long ULong

Se um operando for Decimal , Single , Double ou String , o Visual Basic tentará convertê-
lo em Long antes da operação, e o tipo de dados de resultado será o mesmo que se esse
operando já tivesse sido Long .

Operadores diversos
O operador & é definido apenas para concatenação de operandos String . O Visual Basic
converte cada operando conforme necessário em String antes da operação, e o tipo de
dados de resultado é sempre String . Para as finalidades do operador & , todas as
conversões em String são consideradas ampliadas, mesmo que Option Strict seja On .

Os operadores Is e IsNot exigem que ambos os operandos sejam de um tipo de


referência. A expressão TypeOf ... Is requer que o primeiro operando seja de um tipo de
referência e o segundo operando seja o nome de um tipo de dados. Em todos esses casos,
o tipo de dados de resultado é Boolean .

O operador Like é definido apenas para padrões correspondentes de operandos String .


O Visual Basic tenta converter cada operando conforme necessário em String antes da
operação. O tipo de dados de resultado é sempre Boolean .

Confira também
Data Types
Operadores e Expressões
Operadores aritméticos no Visual Basic
Operadores de comparação no Visual Basic
Operadores
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operadores aritméticos
Operadores de comparação
Instrução Option Strict
Operadores listados por funcionalidade
(Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Consulte uma das categorias listadas abaixo ou abra esta parte do sumário da Ajuda
para ver uma lista alfabética de operadores do Visual Basic.

Categorias de operadores
Operadores Descrição

Operadores aritméticos Esses operadores executam cálculos matemáticos.

Operadores de Atribuição Esses operadores executam operações de atribuição.

Operadores de Esses operadores executam comparações.


comparação

Operadores de Esses operadores combinam cadeias de caracteres.


concatenação

Operadores lógicos/bit a Esses operadores executam operações lógicas.


bit

Operadores Bit Shift Esses operadores executam deslocamentos aritméticos em padrões


de bit.

Operadores diversos Esses operadores executam operações diversas.

Confira também
Operadores e Expressões
Precedência do operador no Visual Basic
Operadores aritméticos (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os exemplos a seguir mostram operadores aritméticos definidos no Visual Basic.

Operador ^

Operador *

Operador /

Operador \

Operador Mod

Operador + (unário e binário)

Operador - (unário e binário)

Confira também
Precedência do operador no Visual Basic
Operadores aritméticos no Visual Basic
Operadores de atribuição (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os exemplos a seguir mostram operadores de atribuição definidos no Visual Basic.

Operador =

Operador ^=

Operador *=

Operador /=

Operador \=

Operador +=

Operador -=

<<Operador =

>>Operador =

&Operador =

Confira também
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Instruções
Operadores Bit Shift (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os exemplos a seguir mostram operadores bit shift definidos no Visual Basic.

<< Operador

>> Operador

Confira também
Operadores Listados por Funcionalidade
Operadores de comparação (Visual
Basic)
Artigo • 07/04/2023 • 5 minutos para o fim da leitura

Os exemplos a seguir mostram operadores de comparação definidos no Visual Basic.

Operador <

Operador <=

Operador >

Operador >=

Operador =

Operador <>

Operador Is

Operador IsNot

Operador Like

Esses operadores comparam duas expressões para determinar se são iguais e, caso
contrário, as diferenças entre elas. Is , IsNot e Like são discutidos detalhadamente em
páginas de Ajuda separadas. Os operadores de comparação relacional são discutidos
detalhadamente nesta página.

Sintaxe
VB

result = expression1 comparisonoperator expression2

result = object1 [Is | IsNot] object2

result = string Like pattern

Partes
result

Obrigatórios. Um valor Boolean que representa o resultado da comparação.


expression1 , expression2

Obrigatórios. Qualquer expressão.

comparisonoperator

Obrigatórios. Qualquer operador de comparação relacional.

object1 , object2

Obrigatórios. Qualquer nome de objeto de referência.

string

Obrigatórios. Qualquer expressão de String .

pattern

Obrigatórios. Qualquer expressão String ou intervalo de caracteres.

Comentários
A tabela a seguir contém uma lista dos operadores de comparação relacional e as
condições que determinam se result é True ou False .

Operador True se False se

< (Menor que) expression1 < expression2 expression1 >= expression2

<= (Menor que ou igual a) expression1 <= expression2 expression1 > expression2

> (Maior que) expression1 > expression2 expression1 <= expression2

>= (Maior que ou igual a) expression1 >= expression2 expression1 < expression2

= (Igual a) expression1 = expression2 expression1 <> expression2

<> (Não é igual a) expression1 <> expression2 expression1 = expression2

7 Observação

O = Operator também é usado como operador de atribuição.

O operador Is , o operador IsNot e o operador Like têm funcionalidades de


comparação específicas que diferem dos operadores na tabela anterior.

Comparação de Números
Quando você compara uma expressão de tipo Single a um tipo Double , a expressão
Single é convertida em Double . Esse comportamento é oposto ao comportamento
encontrado no Visual Basic 6.

Da mesma forma, quando você compara uma expressão de tipo Decimal a uma
expressão de tipo Single ou Double , a expressão Decimal é convertida em Single ou
Double . Para expressões Decimal , qualquer valor fracionário menor que 1E-28 pode se

perder. Essa perda de valor fracionário pode fazer com que dois valores sejam
comparados como iguais, quando não são. Por esse motivo, você deve ter cuidado ao
usar a igualdade ( = ) para comparar duas variáveis de ponto flutuante. É mais seguro
testar se o valor absoluto da diferença entre os dois números é menor que uma
pequena tolerância aceitável.

Imprecisão de ponto flutuante


Quando você trabalha com números de ponto flutuante, tenha em mente que eles nem
sempre têm uma representação precisa na memória. Isso pode levar a resultados
inesperados de determinadas operações, como a comparação de valores e Mod
Operator. Para obter mais informações, consulte Tipos de dados de solução de
problemas.

Comparando cadeias de caracteres


Quando você compara cadeias de caracteres, as expressões de cadeia de caracteres são
avaliadas com base na ordem de classificação alfabética, que depende da configuração
Option Compare .

Option Compare Binary embasa as comparações de cadeias de caracteres em uma


ordem de classificação derivada das representações binárias internas dos caracteres. A
ordem de classificação é determinada pela página de código. O exemplo a seguir
mostra uma típica ordem de classificação binária.

A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø

Option Compare Text embasa as comparações de cadeias de caracteres em uma ordem


de classificação de texto que diferencia maiúsculas de minúsculas, determinada pela
localidade do sistema. Quando você define Option Compare Text e classifica os
caracteres no exemplo anterior, a seguinte ordem de classificação de texto se aplica:

(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)
Dependência de Localidade
Quando você define Option Compare Text , o resultado de uma comparação de cadeia
de caracteres pode depender da localidade em que o aplicativo está em execução. Dois
caracteres podem ser comparados como iguais em uma localidade, mas não em outra.
Se você estiver usando uma comparação de cadeia de caracteres para tomar decisões
importantes, como aceitar uma tentativa de logon, você deve estar atento à
confidencialidade da localidade. Configure Option Compare Binary ou chame StrComp,
que leva em conta a localidade.

Programação Sem Tipo com Operadores de


Comparação Relacional
O uso de operadores de comparação relacional com expressões Object não é permitido
em Option Strict On . Quando Option Strict é Off e expression1 ou expression2 é
uma expressão Object , os tipos de tempo de execução determinam como eles são
comparados. A tabela a seguir mostra como as expressões são comparadas e o
resultado da comparação, dependendo do tipo de runtime dos operandos.

Se os operandos forem A comparação é

Ambos String Classifique a comparação com base nas características de


classificação de cadeia de caracteres.

Ambos numéricos Objetos convertidos em Double , comparação numérica.

Um numérico e outro A String é convertido em Double , uma comparação numérica é


String executada. Se não for possível converter String em Double , um
InvalidCastException será gerado.

Um dos dois ou ambos são InvalidCastException é lançada.


tipos de referência
diferentes de String

As comparações numéricas tratam Nothing como 0. As comparações de cadeia de


caracteres tratam Nothing como "" (uma cadeia de caracteres vazia).

Sobrecarga
Os operadores de comparação relacional ( < , <= , > , >= , = , <> ) podem ser
sobrecarregados, o que significa que uma classe ou estrutura pode redefinir o
comportamento deles, quando um operando tiver o tipo dessa classe ou estrutura. Se o
código usar qualquer um desses operadores nessa classe ou estrutura, você deve
entender o comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Observe que = Operator pode ser sobrecarregado apenas como operador de


comparação relacional, não como operador de atribuição.

Exemplo
O exemplo a seguir mostra vários usos de operadores de comparação relacional, que
você aplica para comparar expressões. Os operadores de comparação relacional
retornam um resultado Boolean , que representa se a expressão declarada é avaliada
como True . Quando você aplica os operadores > e < a cadeias de caracteres, a
comparação é feita usando a ordem de classificação alfabética normal das cadeias de
caracteres. Essa ordem pode depender da configuração de localidade. Determinar se a
classificação diferencia maiúsculas de minúsculas depende da configuração de
Comparação de Opções.

VB

Dim x As testClass

Dim y As New testClass()

x = y

If x Is y Then

' Insert code to run if x and y point to the same instance.

End If

No exemplo anterior, a primeira comparação retorna False e as comparações restantes


retornam True .

Confira também
InvalidCastException
Operador =
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Solução de problemas de tipos de dados
Operadores de comparação no Visual Basic
Operadores de concatenação (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os exemplos a seguir mostram operadores de concatenação definidos no Visual Basic.

& Operador

Operador +

Confira também
System.Text
StringBuilder
Precedência do operador no Visual Basic
Operadores de concatenação no Visual Basic
Operadores lógicos/bit a bit (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Veja a seguir os operadores lógicos/bits definidos no Visual Basic.

Operador And

Operador Not

Operador Or

Operador Xor

Operador AndAlso

Operador OrElse

Operador IsFalse

Operador IsTrue

Confira também
Precedência do operador no Visual Basic
Operadores lógicos e bit a bit no Visual Basic
Operadores diversos (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Veja a seguir operadores diversos definidos no Visual Basic.

?. operador condicional nulo

operador null-conditional ?()

operador AddressOf

operador Await

operador GetType

Expressão de função

operador If

operador TypeOf

Confira também
Operadores listados por funcionalidade
Operador & (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Gera uma concatenação de cadeias de caracteres de duas expressões.

Sintaxe
VB

result = expression1 & expression2

Partes
result

Obrigatórios. Qualquer String ou Object variável.

expression1

Obrigatórios. Qualquer expressão com um tipo de dados que se amplia para String .

expression2

Obrigatórios. Qualquer expressão com um tipo de dados que se amplia para String .

Comentários
Se o tipo de dados de expression1 ou expression2 não for String , mas aumentar para
String , ele será convertido em String . Se qualquer um dos tipos de dados não for
ampliado para String , o compilador gerará um erro.

O tipo de dados de result é String . Se uma ou ambas as expressões forem avaliadas


como Nothing ou tiverem um valor de DBNull.Value, elas serão tratadas como uma
cadeia de caracteres com valor "".

7 Observação

O operador & pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando um operando tem o tipo dessa classe
ou estrutura. Se o código usar esse operador em uma classe ou estrutura,
certifique-se de entender seu comportamento redefinido. Para obter mais
informações, confira Procedimentos de operador.

7 Observação

O caractere ampersand (&) também pode ser usado para identificar variáveis como
tipo Long . Para obter mais informações, confira Caracteres do Tipo.

Exemplo
Este exemplo usa o operador & para forçar a concatenação da cadeia de caracteres. O
resultado é um valor de cadeia de caracteres que representa a concatenação de dois
operandos da cadeia de caracteres.

VB

Dim sampleStr As String

sampleStr = "Hello" & " World"

' The preceding statement sets sampleStr to "Hello World".

Confira também
&Operador =
Operadores de concatenação
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operadores de concatenação no Visual Basic
Operador &= (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Concatena uma expressão String a uma variável ou propriedade String e atribui o


resultado à variável ou à propriedade.

Sintaxe
VB

variableorproperty &= expression

Partes
variableorproperty

Obrigatórios. Qualquer variável ou propriedade String .

expression

Obrigatórios. Qualquer expressão de String .

Comentários
O elemento no lado esquerdo do operador &= pode ser uma variável escalar simples,
uma propriedade ou um elemento de uma matriz. A variável ou propriedade não pode
ser ReadOnly. O operador &= concatena a expressão String à direita à variável ou
propriedade String à esquerda e atribui o resultado a essa última.

Sobrecarga
O operador & pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando um operando tem o tipo dessa classe ou
estrutura. Sobrecarregar o operador & afeta o comportamento do operador &= . Se o
seu código usa &= em uma classe ou estrutura que sobrecarrega & , certifique-se de
entender o comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Exemplo
O exemplo a seguir usa o operador &= para concatenar duas variáveis String e atribuir
o resultado à primeira delas.

VB

Dim var1 As String = "Hello "

Dim var2 As String = "World!"

var1 &= var2

' The value of var1 is now "Hello World!".

Confira também
& Operador
Operador +=
Operadores de Atribuição
Operadores de concatenação
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Instruções
Operador * (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Multiplica dois números.

Sintaxe
VB

number1 * number2

Partes
Termo Definição

number1 Obrigatórios. Qualquer expressão numérica.

number2 Obrigatórios. Qualquer expressão numérica.

Result
O resultado é o produto de number1 e number2 .

Tipos com suporte


Todos os tipos numéricos, incluindo os de ponto flutuante e sem sinal e Decimal .

Comentários
O tipo de dados do resultado depende dos tipos de operandos. A tabela a seguir
mostra como o tipo de dados do resultado é determinado.

Tipos de dados de operando Tipos de dados de resultado

Ambas as expressões são tipos de dados Um tipo de dados numérico apropriado para os
integrais (SByte, Byte, Short, UShort, Integer, tipos de dados de number1 e number2 . Consulte
UInteger, Long, ULong) as tabelas "Aritmética de inteiros" nos Tipos de
dados de resultados do operador.
Tipos de dados de operando Tipos de dados de resultado

As duas expressões são do tipo Decimal Decimal

As duas expressões são do tipo Single Single

Uma expressão é um tipo de dados de ponto Double


flutuante ( Single ou Double), mas não
ambos Single (observe que Decimal não é
um tipo de dados de ponto flutuante)

Se uma expressão for avaliada como Nothing, ela será tratada como zero.

Sobrecarga
O operador * pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando um operando tem o tipo dessa classe ou
estrutura. Se o código usar esse operador em uma classe ou estrutura, certifique-se de
entender seu comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Exemplo
Este exemplo usa o operador * para multiplicar dois números. O resultado é o produto
dos dois operandos.

VB

Dim testValue As Double

testValue = 2 * 2

' The preceding statement sets testValue to 4.

testValue = 459.35 * 334.9

' The preceding statement sets testValue to 153836.315.

Confira também
Operador *=
Operadores aritméticos
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operadores aritméticos no Visual Basic
Operador *= (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Multiplica o valor de uma variável ou propriedade pelo valor de uma expressão e atribui
o resultado à variável ou à propriedade.

Sintaxe
VB

variableorproperty *= expression

Partes
variableorproperty

Obrigatórios. Qualquer variável ou propriedade numérica.

expression

Obrigatórios. Qualquer expressão numérica.

Comentários
O elemento no lado esquerdo do operador *= pode ser uma variável escalar simples,
uma propriedade ou um elemento de uma matriz. A variável ou propriedade não pode
ser ReadOnly.

Primeiramente, o operador *= multiplica o valor da expressão (no lado direito do


operador) pelo valor da variável ou da propriedade (no lado esquerdo do operador). Em
seguida, o operador atribui o resultado dessa operação à variável ou à propriedade.

Sobrecarga
O operador * pode ser sobrecarregado, o que significa que uma classe ou estrutura pode
redefinir seu comportamento quando um operando tem o tipo dessa classe ou
estrutura. Sobrecarregar o operador * afeta o comportamento do operador *= . Se o
seu código usa *= em uma classe ou estrutura que sobrecarrega * , certifique-se de
entender o comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.
Exemplo
O exemplo a seguir usa o operador *= para multiplicar uma variável Integer por um
segundo e atribuir o resultado à primeira variável.

VB

Dim var1 As Integer = 10

Dim var2 As Integer = 3

var1 *= var2

' The value of var1 is now 30.

Confira também
Operador *
Operadores de Atribuição
Operadores aritméticos
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Instruções
Operador + (Visual Basic)
Artigo • 28/11/2022 • 5 minutos para o fim da leitura

Adiciona dois números ou retorna o valor positivo de uma expressão numérica. Também
pode ser usado para concatenar duas expressões de cadeia de caracteres.

Sintaxe
VB

expression1 + expression2

ou

VB

+expression1

Partes
Termo Definição

expression1 Obrigatórios. Qualquer expressão numérica ou de cadeia de caracteres.

expression2 Obrigatório, a menos que o operador + esteja calculando um valor negativo.


Qualquer expressão numérica ou de cadeia de caracteres.

Result
Se expression1 e expression2 forem numéricos, o resultado será a soma aritmética.

Se expression2 estiver ausente, o operador + será o operador de identidade unário


para o valor inalterado de uma expressão. Nesse sentido, a operação consiste em reter
o sinal de expression1 , portanto, o resultado será negativo se expression1 for negativo.

Se expression1 e expression2 forem cadeias de caracteres, o resultado será a


concatenação dos valores.

Se expression1 e expression2 forem de tipos mistos, a ação executada dependerá dos


tipos, do conteúdo e da configuração da Instrução Option Strict. Para obter mais
informações, confira as tabelas em "Comentários".

Tipos com suporte


Todos os tipos numéricos, incluindo os de ponto flutuante e sem sinal, Decimal e
String .

Comentários
Em geral, + executa a adição aritmética quando possível e concatena somente quando
as duas expressões são cadeias de caracteres.

Se nenhuma das expressões for uma Object , o Visual Basic executará as ações a seguir.

Tipos de dados de expressões Ação por compilador

As duas expressões são tipos de Adicionar. O tipo de dados do resultado será um tipo
dados numéricos ( SByte , Byte , numérico apropriado para os tipos de dados de
Short , UShort , Integer , UInteger , expression1 e expression2 . Consulte as tabelas
Long , ULong , Decimal , Single ou "Aritmética de inteiros" nos Tipos de dados de resultados
Double ) do operador.

As duas expressões são do tipo Concatenate.


String

Uma expressão é um tipo de dados Se Option Strict for On , gere um erro do compilador.

numérico e a outra é uma cadeia de


caracteres Se Option Strict for Off , converta implicitamente o
String em Double e adicione.

Se não for possível converter o String em Double , gere


uma exceção InvalidCastException.

Uma expressão é um tipo de dados Adicionar, com Nothing com valor de zero.
numérico e a outra é Nothing

Uma expressão é uma cadeia de Concatenar, com Nothing com valor de "".
caracteres, e a outra é Nothing

Se uma expressão for Object , o Visual Basic executará as ações a seguir.

Tipos de dados de expressões Ação por compilador


Tipos de dados de expressões Ação por compilador

A expressão Object contém um valor Se Option Strict for On , gere um erro do


numérico e a outra é um tipo de dados compilador.

numérico
Se Option Strict for Off , adicione.

A expressão Object contém um valor Se Option Strict for On , gere um erro do


numérico e a outra é do tipo String compilador.

Se Option Strict for Off , converta implicitamente


o String em Double e adicione.

Se não for possível converter o String em Double ,


gere uma exceção InvalidCastException.

A expressão Object contém uma cadeia de Se Option Strict for On , gere um erro do
caracteres e a outra é um tipo de dados compilador.

numérico
Se Option Strict for Off , converta implicitamente
a cadeia de caracteres Object em Double e
adicione.

Se não for possível converter a cadeia de caracteres


Object em Double , gere uma exceção
InvalidCastException.

A expressão Object contém uma cadeia de Se Option Strict for On , gere um erro do
caracteres e a outra é do tipo String compilador.

Se Option Strict for Off , converta implicitamente


Object em String e concatene.

Se as duas expressões forem Object , o Visual Basic executará as ações a seguir


(somente Option Strict Off ).

Tipos de dados de expressões Ação por compilador

As duas expressões Object contêm Adicionar.


valores numéricos

As duas expressões Object são d o tipo Concatenate.


String
Tipos de dados de expressões Ação por compilador

Uma expressão Object contém um valor Converta implicitamente a cadeia de caracteres


numérico e a outra contém uma cadeia Object em Double e adicione.

de caracteres
Se não for possível converter a cadeia de caracteres
Object em um valor numérico, gere uma exceção
InvalidCastException.

Se uma das expressões Object for avaliada como Nothing ou DBNull, o operador + a
tratará como um String com valor de "".

7 Observação

Ao usar o operador + , talvez você não consiga determinar se a concatenação de


adição ou cadeia de caracteres ocorrerá. Use o operador & para concatenação para
eliminar a ambiguidade e fornecer código de autodocumentação.

Sobrecarga
O operador + pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando um operando tem o tipo dessa classe ou
estrutura. Se o código usar esse operador em uma classe ou estrutura, certifique-se de
entender seu comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Exemplo
O exemplo a seguir usa o operador + para adicionar números. Se os operandos forem
numéricos, o Visual Basic calculará o resultado aritmético. O resultado aritmético
representa a soma dos dois operandos.

VB

Dim sumNumber As Integer

sumNumber = 2 + 2

sumNumber = 4257.04 + 98112

' The preceding statements set sumNumber to 4 and 102369.

Você também pode usar o operador + para concatenar cadeias de caracteres. Se os


operandos forem cadeias de caracteres, o Visual Basic os concatenará. O resultado da
concatenação representa uma única cadeia de caracteres que consiste no conteúdo dos
dois operandos um após o outro.

Se os operandos forem de tipos mistos, o resultado dependerá da configuração da


Instrução Option Strict. O exemplo a seguir ilustra o resultado quando Option Strict
for On .

VB

Option Strict On

VB

Dim var1 As String = "34"

Dim var2 As Integer = 6

Dim concatenatedNumber As Integer = var1 + var2

VB

' The preceding statement generates a COMPILER ERROR.

O exemplo a seguir ilustra o resultado quando Option Strict for Off .

VB

Option Strict Off

VB

Dim var1 As String = "34"

Dim var2 As Integer = 6

Dim concatenatedNumber As Integer = var1 + var2

VB

' The preceding statement returns 40 after the string in var1 is

' converted to a numeric value. This might be an unexpected result.

' We do not recommend use of Option Strict Off for these operations.

Para eliminar a ambiguidade, você deve usar o operador & em vez de + para
concatenação.

Confira também
& Operador
Operadores de concatenação
Operadores aritméticos
Operadores Listados por Funcionalidade
Precedência do operador no Visual Basic
Operadores aritméticos no Visual Basic
Instrução Option Strict
Operador += (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Adiciona o valor de uma expressão numérica ao valor de uma variável numérica ou


propriedade e atribui o resultado à variável ou propriedade. Também pode ser usado
para concatenar uma String expressão a uma String variável ou propriedade e atribuir
o resultado à variável ou à propriedade.

Sintaxe
VB

variableorproperty += expression

Partes
variableorproperty

Obrigatórios. Qualquer variável ou propriedade numérica ou String .

expression

Obrigatórios. Qualquer expressão numérica ou String .

Comentários
O elemento no lado esquerdo do operador += pode ser uma variável escalar simples,
uma propriedade ou um elemento de uma matriz. A variável ou propriedade não pode
ser ReadOnly.

O operador += adiciona o valor à direita à variável ou propriedade à esquerda e atribui


o resultado à variável ou à propriedade à esquerda. O operador += também pode ser
usado para concatenar a expressão String à direita para a variável ou propriedade
String à esquerda e atribuir o resultado à variável ou propriedade à esquerda.

7 Observação

Ao usar o operador += , talvez você não consiga determinar se a concatenação de


adição ou cadeia de caracteres ocorrerá. Use o operador &= para concatenação
para eliminar a ambiguidade e fornecer código de autodocumentação.
Esse operador de atribuição executa implicitamente a ampliação, mas não limita as
conversões se o ambiente de compilação impuser semântica estrita. Para obter mais
informações, consulte Ampliando e restringindo conversões. Para obter mais
informações sobre semântica estrita e permissiva, consulte Instrução estrita de opções.

Se a semântica permissiva for permitida, o operador += executará implicitamente uma


variedade de conversões numéricas e de cadeia de caracteres idênticas às executadas
pelo operador + . Para obter detalhes sobre essas conversões, consulte + Operador.

Sobrecarga
O operador + pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando um operando tem o tipo dessa classe ou
estrutura. Sobrecarregar o operador + afeta o comportamento do operador += . Se o
seu código usa += em uma classe ou estrutura que sobrecarrega + , certifique-se de
entender o comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Exemplo
O exemplo a seguir usa o operador += para combinar o valor de uma variável com
outra. A primeira parte usa += com variáveis numéricas para adicionar um valor a outro.
A segunda parte usa += com String variáveis para concatenar um valor com outro. Nos
dois casos, o resultado é atribuído à primeira variável.

VB

' This part uses numeric variables.

Dim num1 As Integer = 10

Dim num2 As Integer = 3

num1 += num2

VB

' This part uses string variables.

Dim str1 As String = "10"

Dim str2 As String = "3"

str1 += str2

Agora, o valor de num1 é 13, e o valor de str1 é "103".


Confira também
Operador +
Operadores de Atribuição
Operadores aritméticos
Operadores de concatenação
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Instruções
Operador = (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Atribui um valor a uma variável ou propriedade.

Sintaxe
VB

variableorproperty = value

Partes
variableorproperty

Qualquer variável gravável ou qualquer propriedade.

value

Qualquer literal, constante ou expressão.

Comentários
O elemento no lado esquerdo do sinal de igual ( = ) pode ser uma variável escalar
simples, uma propriedade ou um elemento de uma matriz. A variável ou propriedade
não pode ser ReadOnly. O operador = atribui o valor à direita à variável ou à
propriedade à esquerda.

7 Observação

O operador = também é usado como um operador de comparação. Para obter


detalhes, confira Operadores de comparação.

Sobrecarga
O operador = pode ser sobrecarregado apenas como um operador de comparação
relacional, não como um operador de atribuição. Para obter mais informações, confira
Procedimentos de operador.
Exemplo
O exemplo a seguir demonstra o operador de atribuição. O valor à direita é atribuído à
variável da esquerda.

VB

Dim testInt As Integer

Dim testString As String

Dim testButton As System.Windows.Forms.Button

Dim testObject As Object

testInt = 42

testString = "This is an example of a string literal."

testButton = New System.Windows.Forms.Button()

testObject = testInt

testObject = testString

testObject = testButton

Confira também
&Operador =
Operador *=
Operador +=
Operador -= (Visual Basic)
Operador /= (Visual Basic)
Operador \=
Operador ^=
Instruções
Operadores de comparação
ReadOnly (somente-leitura)
Inferência de Tipo de Variável Local
Operador - (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Retorna a diferença entre duas expressões numéricas ou o valor negativo de uma


expressão numérica.

Sintaxe
VB

expression1 – expression2

ou

VB

–expression1

Partes
expression1

Obrigatórios. Qualquer expressão numérica.

expression2

Obrigatório, a menos que o operador – esteja calculando um valor negativo. Qualquer


expressão numérica.

Result
O resultado é a diferença entre expression1 e expression2 , ou o valor negativo de
expression1 .

O tipo de dados do resultado será um tipo numérico apropriado para os tipos de dados
de expression1 e expression2 . Consulte as tabelas "Aritmética de inteiros" nos Tipos de
dados de resultados do operador.

Tipos com suporte


Todos os tipos numéricos. Isso inclui os tipos de ponto flutuante e sem sinal e Decimal .

Comentários
No primeiro uso mostrado na sintaxe mostrada anteriormente, o operador – é o
operador de subtração aritmética binária para a diferença entre duas expressões
numéricas.

No segundo uso mostrado na sintaxe mostrada anteriormente, o operador – é o


operador de negação unário para o valor negativo de uma expressão. Nesse sentido, a
negação consiste em reverter o sinal expression1 de modo que o resultado seja
positivo se expression1 for negativo.

Se uma das expressões for avaliada como Nothing, o operador – a tratará como zero.

7 Observação

O operador – pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando um operando tem o tipo dessa classe
ou estrutura. Se o código usar esse operador em uma classe ou estrutura,
certifique-se de entender seu comportamento redefinido. Para obter mais
informações, consulte Procedimentos de operador.

Exemplo
O exemplo a seguir usa o operador – para calcular e retornar a diferença entre dois
números e, em seguida, para negativar um número.

VB

Dim binaryResult As Double = 459.35 - 334.9

Dim unaryResult As Double = -334.9

Após a execução dessas instruções, binaryResult contém 124,45 e unaryResult contém


–334,90.

Confira também
Operador -= (Visual Basic)
Operadores aritméticos
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operadores aritméticos no Visual Basic
Operador -= (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Subtrai o valor de uma expressão do valor de uma variável ou propriedade e atribui o


resultado à variável ou à propriedade.

Sintaxe
VB

variableorproperty -= expression

Partes
variableorproperty

Obrigatórios. Qualquer variável ou propriedade numérica.

expression

Obrigatórios. Qualquer expressão numérica.

Comentários
O elemento no lado esquerdo do operador -= pode ser uma variável escalar simples,
uma propriedade ou um elemento de uma matriz. A variável ou propriedade não pode
ser ReadOnly.

Primeiramente, o operador -= subtrai o valor da expressão (no lado direito do


operador) do valor da variável ou da propriedade (no lado esquerdo do operador). Em
seguida, o operador atribui o resultado dessa operação à variável ou à propriedade.

Sobrecarga
O Operador - (Visual Basic) pode ser sobrecarregado, o que significa que uma classe ou
estrutura pode redefinir seu comportamento quando um operando tem o tipo dessa
classe ou estrutura. Sobrecarregar o operador - afeta o comportamento do operador -
= . Se o seu código usa -= em uma classe ou estrutura que sobrecarrega - , certifique-se
de entender o comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.
Exemplo
O exemplo a seguir usa o operador -= para subtrair uma variável Integer de outra e
atribuir o resultado à última variável.

VB

Dim var1 As Integer = 10

Dim var2 As Integer = 3

var1 -= var2

' The value of var1 is now 7.

Confira também
Operador - (Visual Basic)
Operadores de Atribuição
Operadores aritméticos
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Instruções
Operadores de comparação (Visual
Basic)
Artigo • 07/04/2023 • 5 minutos para o fim da leitura

Os exemplos a seguir mostram operadores de comparação definidos no Visual Basic.

Operador <

Operador <=

Operador >

Operador >=

Operador =

Operador <>

Operador Is

Operador IsNot

Operador Like

Esses operadores comparam duas expressões para determinar se são iguais e, caso
contrário, as diferenças entre elas. Is , IsNot e Like são discutidos detalhadamente em
páginas de Ajuda separadas. Os operadores de comparação relacional são discutidos
detalhadamente nesta página.

Sintaxe
VB

result = expression1 comparisonoperator expression2

result = object1 [Is | IsNot] object2

result = string Like pattern

Partes
result

Obrigatórios. Um valor Boolean que representa o resultado da comparação.


expression1 , expression2

Obrigatórios. Qualquer expressão.

comparisonoperator

Obrigatórios. Qualquer operador de comparação relacional.

object1 , object2

Obrigatórios. Qualquer nome de objeto de referência.

string

Obrigatórios. Qualquer expressão de String .

pattern

Obrigatórios. Qualquer expressão String ou intervalo de caracteres.

Comentários
A tabela a seguir contém uma lista dos operadores de comparação relacional e as
condições que determinam se result é True ou False .

Operador True se False se

< (Menor que) expression1 < expression2 expression1 >= expression2

<= (Menor que ou igual a) expression1 <= expression2 expression1 > expression2

> (Maior que) expression1 > expression2 expression1 <= expression2

>= (Maior que ou igual a) expression1 >= expression2 expression1 < expression2

= (Igual a) expression1 = expression2 expression1 <> expression2

<> (Não é igual a) expression1 <> expression2 expression1 = expression2

7 Observação

O = Operator também é usado como operador de atribuição.

O operador Is , o operador IsNot e o operador Like têm funcionalidades de


comparação específicas que diferem dos operadores na tabela anterior.

Comparação de Números
Quando você compara uma expressão de tipo Single a um tipo Double , a expressão
Single é convertida em Double . Esse comportamento é oposto ao comportamento
encontrado no Visual Basic 6.

Da mesma forma, quando você compara uma expressão de tipo Decimal a uma
expressão de tipo Single ou Double , a expressão Decimal é convertida em Single ou
Double . Para expressões Decimal , qualquer valor fracionário menor que 1E-28 pode se

perder. Essa perda de valor fracionário pode fazer com que dois valores sejam
comparados como iguais, quando não são. Por esse motivo, você deve ter cuidado ao
usar a igualdade ( = ) para comparar duas variáveis de ponto flutuante. É mais seguro
testar se o valor absoluto da diferença entre os dois números é menor que uma
pequena tolerância aceitável.

Imprecisão de ponto flutuante


Quando você trabalha com números de ponto flutuante, tenha em mente que eles nem
sempre têm uma representação precisa na memória. Isso pode levar a resultados
inesperados de determinadas operações, como a comparação de valores e Mod
Operator. Para obter mais informações, consulte Tipos de dados de solução de
problemas.

Comparando cadeias de caracteres


Quando você compara cadeias de caracteres, as expressões de cadeia de caracteres são
avaliadas com base na ordem de classificação alfabética, que depende da configuração
Option Compare .

Option Compare Binary embasa as comparações de cadeias de caracteres em uma


ordem de classificação derivada das representações binárias internas dos caracteres. A
ordem de classificação é determinada pela página de código. O exemplo a seguir
mostra uma típica ordem de classificação binária.

A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø

Option Compare Text embasa as comparações de cadeias de caracteres em uma ordem


de classificação de texto que diferencia maiúsculas de minúsculas, determinada pela
localidade do sistema. Quando você define Option Compare Text e classifica os
caracteres no exemplo anterior, a seguinte ordem de classificação de texto se aplica:

(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)
Dependência de Localidade
Quando você define Option Compare Text , o resultado de uma comparação de cadeia
de caracteres pode depender da localidade em que o aplicativo está em execução. Dois
caracteres podem ser comparados como iguais em uma localidade, mas não em outra.
Se você estiver usando uma comparação de cadeia de caracteres para tomar decisões
importantes, como aceitar uma tentativa de logon, você deve estar atento à
confidencialidade da localidade. Configure Option Compare Binary ou chame StrComp,
que leva em conta a localidade.

Programação Sem Tipo com Operadores de


Comparação Relacional
O uso de operadores de comparação relacional com expressões Object não é permitido
em Option Strict On . Quando Option Strict é Off e expression1 ou expression2 é
uma expressão Object , os tipos de tempo de execução determinam como eles são
comparados. A tabela a seguir mostra como as expressões são comparadas e o
resultado da comparação, dependendo do tipo de runtime dos operandos.

Se os operandos forem A comparação é

Ambos String Classifique a comparação com base nas características de


classificação de cadeia de caracteres.

Ambos numéricos Objetos convertidos em Double , comparação numérica.

Um numérico e outro A String é convertido em Double , uma comparação numérica é


String executada. Se não for possível converter String em Double , um
InvalidCastException será gerado.

Um dos dois ou ambos são InvalidCastException é lançada.


tipos de referência
diferentes de String

As comparações numéricas tratam Nothing como 0. As comparações de cadeia de


caracteres tratam Nothing como "" (uma cadeia de caracteres vazia).

Sobrecarga
Os operadores de comparação relacional ( < , <= , > , >= , = , <> ) podem ser
sobrecarregados, o que significa que uma classe ou estrutura pode redefinir o
comportamento deles, quando um operando tiver o tipo dessa classe ou estrutura. Se o
código usar qualquer um desses operadores nessa classe ou estrutura, você deve
entender o comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Observe que = Operator pode ser sobrecarregado apenas como operador de


comparação relacional, não como operador de atribuição.

Exemplo
O exemplo a seguir mostra vários usos de operadores de comparação relacional, que
você aplica para comparar expressões. Os operadores de comparação relacional
retornam um resultado Boolean , que representa se a expressão declarada é avaliada
como True . Quando você aplica os operadores > e < a cadeias de caracteres, a
comparação é feita usando a ordem de classificação alfabética normal das cadeias de
caracteres. Essa ordem pode depender da configuração de localidade. Determinar se a
classificação diferencia maiúsculas de minúsculas depende da configuração de
Comparação de Opções.

VB

Dim x As testClass

Dim y As New testClass()

x = y

If x Is y Then

' Insert code to run if x and y point to the same instance.

End If

No exemplo anterior, a primeira comparação retorna False e as comparações restantes


retornam True .

Confira também
InvalidCastException
Operador =
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Solução de problemas de tipos de dados
Operadores de comparação no Visual Basic
Operadores de comparação (Visual
Basic)
Artigo • 07/04/2023 • 5 minutos para o fim da leitura

Os exemplos a seguir mostram operadores de comparação definidos no Visual Basic.

Operador <

Operador <=

Operador >

Operador >=

Operador =

Operador <>

Operador Is

Operador IsNot

Operador Like

Esses operadores comparam duas expressões para determinar se são iguais e, caso
contrário, as diferenças entre elas. Is , IsNot e Like são discutidos detalhadamente em
páginas de Ajuda separadas. Os operadores de comparação relacional são discutidos
detalhadamente nesta página.

Sintaxe
VB

result = expression1 comparisonoperator expression2

result = object1 [Is | IsNot] object2

result = string Like pattern

Partes
result

Obrigatórios. Um valor Boolean que representa o resultado da comparação.


expression1 , expression2

Obrigatórios. Qualquer expressão.

comparisonoperator

Obrigatórios. Qualquer operador de comparação relacional.

object1 , object2

Obrigatórios. Qualquer nome de objeto de referência.

string

Obrigatórios. Qualquer expressão de String .

pattern

Obrigatórios. Qualquer expressão String ou intervalo de caracteres.

Comentários
A tabela a seguir contém uma lista dos operadores de comparação relacional e as
condições que determinam se result é True ou False .

Operador True se False se

< (Menor que) expression1 < expression2 expression1 >= expression2

<= (Menor que ou igual a) expression1 <= expression2 expression1 > expression2

> (Maior que) expression1 > expression2 expression1 <= expression2

>= (Maior que ou igual a) expression1 >= expression2 expression1 < expression2

= (Igual a) expression1 = expression2 expression1 <> expression2

<> (Não é igual a) expression1 <> expression2 expression1 = expression2

7 Observação

O = Operator também é usado como operador de atribuição.

O operador Is , o operador IsNot e o operador Like têm funcionalidades de


comparação específicas que diferem dos operadores na tabela anterior.

Comparação de Números
Quando você compara uma expressão de tipo Single a um tipo Double , a expressão
Single é convertida em Double . Esse comportamento é oposto ao comportamento
encontrado no Visual Basic 6.

Da mesma forma, quando você compara uma expressão de tipo Decimal a uma
expressão de tipo Single ou Double , a expressão Decimal é convertida em Single ou
Double . Para expressões Decimal , qualquer valor fracionário menor que 1E-28 pode se

perder. Essa perda de valor fracionário pode fazer com que dois valores sejam
comparados como iguais, quando não são. Por esse motivo, você deve ter cuidado ao
usar a igualdade ( = ) para comparar duas variáveis de ponto flutuante. É mais seguro
testar se o valor absoluto da diferença entre os dois números é menor que uma
pequena tolerância aceitável.

Imprecisão de ponto flutuante


Quando você trabalha com números de ponto flutuante, tenha em mente que eles nem
sempre têm uma representação precisa na memória. Isso pode levar a resultados
inesperados de determinadas operações, como a comparação de valores e Mod
Operator. Para obter mais informações, consulte Tipos de dados de solução de
problemas.

Comparando cadeias de caracteres


Quando você compara cadeias de caracteres, as expressões de cadeia de caracteres são
avaliadas com base na ordem de classificação alfabética, que depende da configuração
Option Compare .

Option Compare Binary embasa as comparações de cadeias de caracteres em uma


ordem de classificação derivada das representações binárias internas dos caracteres. A
ordem de classificação é determinada pela página de código. O exemplo a seguir
mostra uma típica ordem de classificação binária.

A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø

Option Compare Text embasa as comparações de cadeias de caracteres em uma ordem


de classificação de texto que diferencia maiúsculas de minúsculas, determinada pela
localidade do sistema. Quando você define Option Compare Text e classifica os
caracteres no exemplo anterior, a seguinte ordem de classificação de texto se aplica:

(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)
Dependência de Localidade
Quando você define Option Compare Text , o resultado de uma comparação de cadeia
de caracteres pode depender da localidade em que o aplicativo está em execução. Dois
caracteres podem ser comparados como iguais em uma localidade, mas não em outra.
Se você estiver usando uma comparação de cadeia de caracteres para tomar decisões
importantes, como aceitar uma tentativa de logon, você deve estar atento à
confidencialidade da localidade. Configure Option Compare Binary ou chame StrComp,
que leva em conta a localidade.

Programação Sem Tipo com Operadores de


Comparação Relacional
O uso de operadores de comparação relacional com expressões Object não é permitido
em Option Strict On . Quando Option Strict é Off e expression1 ou expression2 é
uma expressão Object , os tipos de tempo de execução determinam como eles são
comparados. A tabela a seguir mostra como as expressões são comparadas e o
resultado da comparação, dependendo do tipo de runtime dos operandos.

Se os operandos forem A comparação é

Ambos String Classifique a comparação com base nas características de


classificação de cadeia de caracteres.

Ambos numéricos Objetos convertidos em Double , comparação numérica.

Um numérico e outro A String é convertido em Double , uma comparação numérica é


String executada. Se não for possível converter String em Double , um
InvalidCastException será gerado.

Um dos dois ou ambos são InvalidCastException é lançada.


tipos de referência
diferentes de String

As comparações numéricas tratam Nothing como 0. As comparações de cadeia de


caracteres tratam Nothing como "" (uma cadeia de caracteres vazia).

Sobrecarga
Os operadores de comparação relacional ( < , <= , > , >= , = , <> ) podem ser
sobrecarregados, o que significa que uma classe ou estrutura pode redefinir o
comportamento deles, quando um operando tiver o tipo dessa classe ou estrutura. Se o
código usar qualquer um desses operadores nessa classe ou estrutura, você deve
entender o comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Observe que = Operator pode ser sobrecarregado apenas como operador de


comparação relacional, não como operador de atribuição.

Exemplo
O exemplo a seguir mostra vários usos de operadores de comparação relacional, que
você aplica para comparar expressões. Os operadores de comparação relacional
retornam um resultado Boolean , que representa se a expressão declarada é avaliada
como True . Quando você aplica os operadores > e < a cadeias de caracteres, a
comparação é feita usando a ordem de classificação alfabética normal das cadeias de
caracteres. Essa ordem pode depender da configuração de localidade. Determinar se a
classificação diferencia maiúsculas de minúsculas depende da configuração de
Comparação de Opções.

VB

Dim x As testClass

Dim y As New testClass()

x = y

If x Is y Then

' Insert code to run if x and y point to the same instance.

End If

No exemplo anterior, a primeira comparação retorna False e as comparações restantes


retornam True .

Confira também
InvalidCastException
Operador =
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Solução de problemas de tipos de dados
Operadores de comparação no Visual Basic
Operadores de comparação (Visual
Basic)
Artigo • 07/04/2023 • 5 minutos para o fim da leitura

Os exemplos a seguir mostram operadores de comparação definidos no Visual Basic.

Operador <

Operador <=

Operador >

Operador >=

Operador =

Operador <>

Operador Is

Operador IsNot

Operador Like

Esses operadores comparam duas expressões para determinar se são iguais e, caso
contrário, as diferenças entre elas. Is , IsNot e Like são discutidos detalhadamente em
páginas de Ajuda separadas. Os operadores de comparação relacional são discutidos
detalhadamente nesta página.

Sintaxe
VB

result = expression1 comparisonoperator expression2

result = object1 [Is | IsNot] object2

result = string Like pattern

Partes
result

Obrigatórios. Um valor Boolean que representa o resultado da comparação.


expression1 , expression2

Obrigatórios. Qualquer expressão.

comparisonoperator

Obrigatórios. Qualquer operador de comparação relacional.

object1 , object2

Obrigatórios. Qualquer nome de objeto de referência.

string

Obrigatórios. Qualquer expressão de String .

pattern

Obrigatórios. Qualquer expressão String ou intervalo de caracteres.

Comentários
A tabela a seguir contém uma lista dos operadores de comparação relacional e as
condições que determinam se result é True ou False .

Operador True se False se

< (Menor que) expression1 < expression2 expression1 >= expression2

<= (Menor que ou igual a) expression1 <= expression2 expression1 > expression2

> (Maior que) expression1 > expression2 expression1 <= expression2

>= (Maior que ou igual a) expression1 >= expression2 expression1 < expression2

= (Igual a) expression1 = expression2 expression1 <> expression2

<> (Não é igual a) expression1 <> expression2 expression1 = expression2

7 Observação

O = Operator também é usado como operador de atribuição.

O operador Is , o operador IsNot e o operador Like têm funcionalidades de


comparação específicas que diferem dos operadores na tabela anterior.

Comparação de Números
Quando você compara uma expressão de tipo Single a um tipo Double , a expressão
Single é convertida em Double . Esse comportamento é oposto ao comportamento
encontrado no Visual Basic 6.

Da mesma forma, quando você compara uma expressão de tipo Decimal a uma
expressão de tipo Single ou Double , a expressão Decimal é convertida em Single ou
Double . Para expressões Decimal , qualquer valor fracionário menor que 1E-28 pode se

perder. Essa perda de valor fracionário pode fazer com que dois valores sejam
comparados como iguais, quando não são. Por esse motivo, você deve ter cuidado ao
usar a igualdade ( = ) para comparar duas variáveis de ponto flutuante. É mais seguro
testar se o valor absoluto da diferença entre os dois números é menor que uma
pequena tolerância aceitável.

Imprecisão de ponto flutuante


Quando você trabalha com números de ponto flutuante, tenha em mente que eles nem
sempre têm uma representação precisa na memória. Isso pode levar a resultados
inesperados de determinadas operações, como a comparação de valores e Mod
Operator. Para obter mais informações, consulte Tipos de dados de solução de
problemas.

Comparando cadeias de caracteres


Quando você compara cadeias de caracteres, as expressões de cadeia de caracteres são
avaliadas com base na ordem de classificação alfabética, que depende da configuração
Option Compare .

Option Compare Binary embasa as comparações de cadeias de caracteres em uma


ordem de classificação derivada das representações binárias internas dos caracteres. A
ordem de classificação é determinada pela página de código. O exemplo a seguir
mostra uma típica ordem de classificação binária.

A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø

Option Compare Text embasa as comparações de cadeias de caracteres em uma ordem


de classificação de texto que diferencia maiúsculas de minúsculas, determinada pela
localidade do sistema. Quando você define Option Compare Text e classifica os
caracteres no exemplo anterior, a seguinte ordem de classificação de texto se aplica:

(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)
Dependência de Localidade
Quando você define Option Compare Text , o resultado de uma comparação de cadeia
de caracteres pode depender da localidade em que o aplicativo está em execução. Dois
caracteres podem ser comparados como iguais em uma localidade, mas não em outra.
Se você estiver usando uma comparação de cadeia de caracteres para tomar decisões
importantes, como aceitar uma tentativa de logon, você deve estar atento à
confidencialidade da localidade. Configure Option Compare Binary ou chame StrComp,
que leva em conta a localidade.

Programação Sem Tipo com Operadores de


Comparação Relacional
O uso de operadores de comparação relacional com expressões Object não é permitido
em Option Strict On . Quando Option Strict é Off e expression1 ou expression2 é
uma expressão Object , os tipos de tempo de execução determinam como eles são
comparados. A tabela a seguir mostra como as expressões são comparadas e o
resultado da comparação, dependendo do tipo de runtime dos operandos.

Se os operandos forem A comparação é

Ambos String Classifique a comparação com base nas características de


classificação de cadeia de caracteres.

Ambos numéricos Objetos convertidos em Double , comparação numérica.

Um numérico e outro A String é convertido em Double , uma comparação numérica é


String executada. Se não for possível converter String em Double , um
InvalidCastException será gerado.

Um dos dois ou ambos são InvalidCastException é lançada.


tipos de referência
diferentes de String

As comparações numéricas tratam Nothing como 0. As comparações de cadeia de


caracteres tratam Nothing como "" (uma cadeia de caracteres vazia).

Sobrecarga
Os operadores de comparação relacional ( < , <= , > , >= , = , <> ) podem ser
sobrecarregados, o que significa que uma classe ou estrutura pode redefinir o
comportamento deles, quando um operando tiver o tipo dessa classe ou estrutura. Se o
código usar qualquer um desses operadores nessa classe ou estrutura, você deve
entender o comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Observe que = Operator pode ser sobrecarregado apenas como operador de


comparação relacional, não como operador de atribuição.

Exemplo
O exemplo a seguir mostra vários usos de operadores de comparação relacional, que
você aplica para comparar expressões. Os operadores de comparação relacional
retornam um resultado Boolean , que representa se a expressão declarada é avaliada
como True . Quando você aplica os operadores > e < a cadeias de caracteres, a
comparação é feita usando a ordem de classificação alfabética normal das cadeias de
caracteres. Essa ordem pode depender da configuração de localidade. Determinar se a
classificação diferencia maiúsculas de minúsculas depende da configuração de
Comparação de Opções.

VB

Dim x As testClass

Dim y As New testClass()

x = y

If x Is y Then

' Insert code to run if x and y point to the same instance.

End If

No exemplo anterior, a primeira comparação retorna False e as comparações restantes


retornam True .

Confira também
InvalidCastException
Operador =
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Solução de problemas de tipos de dados
Operadores de comparação no Visual Basic
Operadores de comparação (Visual
Basic)
Artigo • 07/04/2023 • 5 minutos para o fim da leitura

Os exemplos a seguir mostram operadores de comparação definidos no Visual Basic.

Operador <

Operador <=

Operador >

Operador >=

Operador =

Operador <>

Operador Is

Operador IsNot

Operador Like

Esses operadores comparam duas expressões para determinar se são iguais e, caso
contrário, as diferenças entre elas. Is , IsNot e Like são discutidos detalhadamente em
páginas de Ajuda separadas. Os operadores de comparação relacional são discutidos
detalhadamente nesta página.

Sintaxe
VB

result = expression1 comparisonoperator expression2

result = object1 [Is | IsNot] object2

result = string Like pattern

Partes
result

Obrigatórios. Um valor Boolean que representa o resultado da comparação.


expression1 , expression2

Obrigatórios. Qualquer expressão.

comparisonoperator

Obrigatórios. Qualquer operador de comparação relacional.

object1 , object2

Obrigatórios. Qualquer nome de objeto de referência.

string

Obrigatórios. Qualquer expressão de String .

pattern

Obrigatórios. Qualquer expressão String ou intervalo de caracteres.

Comentários
A tabela a seguir contém uma lista dos operadores de comparação relacional e as
condições que determinam se result é True ou False .

Operador True se False se

< (Menor que) expression1 < expression2 expression1 >= expression2

<= (Menor que ou igual a) expression1 <= expression2 expression1 > expression2

> (Maior que) expression1 > expression2 expression1 <= expression2

>= (Maior que ou igual a) expression1 >= expression2 expression1 < expression2

= (Igual a) expression1 = expression2 expression1 <> expression2

<> (Não é igual a) expression1 <> expression2 expression1 = expression2

7 Observação

O = Operator também é usado como operador de atribuição.

O operador Is , o operador IsNot e o operador Like têm funcionalidades de


comparação específicas que diferem dos operadores na tabela anterior.

Comparação de Números
Quando você compara uma expressão de tipo Single a um tipo Double , a expressão
Single é convertida em Double . Esse comportamento é oposto ao comportamento
encontrado no Visual Basic 6.

Da mesma forma, quando você compara uma expressão de tipo Decimal a uma
expressão de tipo Single ou Double , a expressão Decimal é convertida em Single ou
Double . Para expressões Decimal , qualquer valor fracionário menor que 1E-28 pode se

perder. Essa perda de valor fracionário pode fazer com que dois valores sejam
comparados como iguais, quando não são. Por esse motivo, você deve ter cuidado ao
usar a igualdade ( = ) para comparar duas variáveis de ponto flutuante. É mais seguro
testar se o valor absoluto da diferença entre os dois números é menor que uma
pequena tolerância aceitável.

Imprecisão de ponto flutuante


Quando você trabalha com números de ponto flutuante, tenha em mente que eles nem
sempre têm uma representação precisa na memória. Isso pode levar a resultados
inesperados de determinadas operações, como a comparação de valores e Mod
Operator. Para obter mais informações, consulte Tipos de dados de solução de
problemas.

Comparando cadeias de caracteres


Quando você compara cadeias de caracteres, as expressões de cadeia de caracteres são
avaliadas com base na ordem de classificação alfabética, que depende da configuração
Option Compare .

Option Compare Binary embasa as comparações de cadeias de caracteres em uma


ordem de classificação derivada das representações binárias internas dos caracteres. A
ordem de classificação é determinada pela página de código. O exemplo a seguir
mostra uma típica ordem de classificação binária.

A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø

Option Compare Text embasa as comparações de cadeias de caracteres em uma ordem


de classificação de texto que diferencia maiúsculas de minúsculas, determinada pela
localidade do sistema. Quando você define Option Compare Text e classifica os
caracteres no exemplo anterior, a seguinte ordem de classificação de texto se aplica:

(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)
Dependência de Localidade
Quando você define Option Compare Text , o resultado de uma comparação de cadeia
de caracteres pode depender da localidade em que o aplicativo está em execução. Dois
caracteres podem ser comparados como iguais em uma localidade, mas não em outra.
Se você estiver usando uma comparação de cadeia de caracteres para tomar decisões
importantes, como aceitar uma tentativa de logon, você deve estar atento à
confidencialidade da localidade. Configure Option Compare Binary ou chame StrComp,
que leva em conta a localidade.

Programação Sem Tipo com Operadores de


Comparação Relacional
O uso de operadores de comparação relacional com expressões Object não é permitido
em Option Strict On . Quando Option Strict é Off e expression1 ou expression2 é
uma expressão Object , os tipos de tempo de execução determinam como eles são
comparados. A tabela a seguir mostra como as expressões são comparadas e o
resultado da comparação, dependendo do tipo de runtime dos operandos.

Se os operandos forem A comparação é

Ambos String Classifique a comparação com base nas características de


classificação de cadeia de caracteres.

Ambos numéricos Objetos convertidos em Double , comparação numérica.

Um numérico e outro A String é convertido em Double , uma comparação numérica é


String executada. Se não for possível converter String em Double , um
InvalidCastException será gerado.

Um dos dois ou ambos são InvalidCastException é lançada.


tipos de referência
diferentes de String

As comparações numéricas tratam Nothing como 0. As comparações de cadeia de


caracteres tratam Nothing como "" (uma cadeia de caracteres vazia).

Sobrecarga
Os operadores de comparação relacional ( < , <= , > , >= , = , <> ) podem ser
sobrecarregados, o que significa que uma classe ou estrutura pode redefinir o
comportamento deles, quando um operando tiver o tipo dessa classe ou estrutura. Se o
código usar qualquer um desses operadores nessa classe ou estrutura, você deve
entender o comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Observe que = Operator pode ser sobrecarregado apenas como operador de


comparação relacional, não como operador de atribuição.

Exemplo
O exemplo a seguir mostra vários usos de operadores de comparação relacional, que
você aplica para comparar expressões. Os operadores de comparação relacional
retornam um resultado Boolean , que representa se a expressão declarada é avaliada
como True . Quando você aplica os operadores > e < a cadeias de caracteres, a
comparação é feita usando a ordem de classificação alfabética normal das cadeias de
caracteres. Essa ordem pode depender da configuração de localidade. Determinar se a
classificação diferencia maiúsculas de minúsculas depende da configuração de
Comparação de Opções.

VB

Dim x As testClass

Dim y As New testClass()

x = y

If x Is y Then

' Insert code to run if x and y point to the same instance.

End If

No exemplo anterior, a primeira comparação retorna False e as comparações restantes


retornam True .

Confira também
InvalidCastException
Operador =
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Solução de problemas de tipos de dados
Operadores de comparação no Visual Basic
Operador << (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Executa um deslocamento aritmético à esquerda em um padrão de bit.

Sintaxe
VB

result = pattern << amount

Partes
result

Obrigatórios. Valor numérico integral. O resultado do deslocamento do padrão de bit. O


tipo de dados é o mesmo que o de pattern .

pattern

Obrigatórios. Expressão numérica integral. O padrão de bit a ser deslocado. O tipo de


dados deve ser um tipo integral ( SByte , Byte , Short , UShort , Integer , UInteger , Long
ou ULong ).

amount

Obrigatórios. Expressão numérica. O número de bits para deslocar o padrão de bit. O


tipo de dados deve ser Integer ou ampliado para Integer .

Comentários
Os deslocamentos aritméticos não são circulares, o que significa que os bits deslocados
de uma extremidade do resultado não são reintroduzidos na outra extremidade. Em um
deslocamento aritmético à esquerda, os bits deslocados para além do intervalo do tipo
de dados de resultado são descartados e as posições de bit desocupadas à direita são
definidas como zero.

Para evitar o deslocamento de mais bits do que o resultado pode conter, o Visual Basic
mascara o valor de amount com uma máscara de tamanho que corresponda ao tipo de
dados de pattern . O AND binário desses valores é usado para a quantidade de
deslocamento. As máscaras de tamanho são as seguintes:
Tipo de dados de Máscara de tamanho Máscara de tamanho
pattern (decimal) (hexadecimal)

SByte , Byte 7 &H00000007

Short , UShort 15 &H0000000F

Integer , UInteger 31 &H0000001F

Long , ULong 63 &H0000003F

Se amount for zero, o valor de result será idêntico ao de pattern . Se amount for
negativo, ele será tomado como um valor sem sinal e mascarado com a máscara de
tamanho apropriada.

As mudanças aritméticas nunca geram exceções de estouro.

7 Observação

O operador << pode ser sobrecarregado, o que significa que uma classe ou
estrutura pode redefinir seu comportamento quando um operando tem o tipo
dessa classe ou estrutura. Se o código usar esse operador em uma classe ou
estrutura, certifique-se de entender seu comportamento redefinido. Para obter
mais informações, confira Procedimentos de operador.

Exemplo
O exemplo a seguir usa o operador << para executar turnos aritméticos à esquerda em
valores integrais. O resultado sempre tem o mesmo tipo de dados que o da expressão
que está sendo deslocada.

VB

Dim pattern As Short = 192

' The bit pattern is 0000 0000 1100 0000.

Dim result1, result2, result3, result4, result5 As Short

result1 = pattern << 0

result2 = pattern << 4

result3 = pattern << 9

result4 = pattern << 17

result5 = pattern << -1

Os resultados do exemplo anterior são os seguintes:


result1 é -192 (0000 0000 1100 0000).

result2 é -3072 (0000 1100 0000 0000).

result3 é -32768 (1000 0000 0000 0000).

result4 é -384 (0000 0001 1000 0000).

result5 é 0 (deslocado 15 casas à esquerda).

O valor de deslocamento para result4 é calculado como 17 E 15, que é igual a 1.

Confira também
Operadores Bit Shift
Operadores de Atribuição
<<Operador =
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operadores aritméticos no Visual Basic
Operador <<= (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Executa um deslocamento aritmético à esquerda no valor de uma variável ou


propriedade e atribui o resultado de volta à variável ou propriedade.

Sintaxe
VB

variableorproperty <<= amount

Partes
variableorproperty

Obrigatórios. Variável ou propriedade de um tipo integral ( SByte , Byte , Short , UShort ,


Integer , UInteger , Long ou ULong ).

amount

Obrigatórios. Expressão numérica de um tipo de dados que é ampliada para Integer .

Comentários
O elemento no lado esquerdo do operador <<= pode ser uma variável escalar simples,
uma propriedade ou um elemento de uma matriz. A variável ou propriedade não pode
ser ReadOnly.

O operador <<= primeiro executa um deslocamento aritmético à esquerda no valor da


variável ou da propriedade. Em seguida, o operador atribui o resultado dessa operação
a essa variável ou propriedade.

Os deslocamentos aritméticos não são circulares, o que significa que os bits deslocados
de uma extremidade do resultado não são reintroduzidos na outra extremidade. Em um
deslocamento aritmético à esquerda, os bits deslocados para além do intervalo do tipo
de dados de resultado são descartados e as posições de bit desocupadas à direita são
definidas como zero.

Sobrecarga
O operador << pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando um operando tem o tipo dessa classe ou
estrutura. Sobrecarregar o operador << afeta o comportamento do operador <<= . Se o
seu código usa <<= em uma classe ou estrutura que sobrecarrega << , certifique-se de
entender o comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Exemplo
O exemplo a seguir usa o operador <<= para mudar o padrão de bit de uma variável
Integer deixada pela quantidade especificada e atribuir o resultado à variável.

VB

Dim var As Integer = 10

Dim shift As Integer = 3

var <<= shift

' The value of var is now 80.

Confira também
<< Operador
Operadores de Atribuição
Operadores Bit Shift
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Instruções
Operador >> (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Executa um deslocamento aritmético à direita em um padrão de bit.

Sintaxe
VB

result = pattern >> amount

Partes
result

Obrigatórios. Valor numérico integral. O resultado do deslocamento do padrão de bit. O


tipo de dados é o mesmo que o de pattern .

pattern

Obrigatórios. Expressão numérica integral. O padrão de bit a ser deslocado. O tipo de


dados deve ser um tipo integral ( SByte , Byte , Short , UShort , Integer , UInteger , Long
ou ULong ).

amount

Obrigatórios. Expressão numérica. O número de bits para deslocar o padrão de bit. O


tipo de dados deve ser Integer ou ampliado para Integer .

Comentários
Os deslocamentos aritméticos não são circulares, o que significa que os bits deslocados
de uma extremidade do resultado não são reintroduzidos na outra extremidade. Em um
deslocamento aritmético para a direita, os bits deslocados além da posição de bit mais à
direita são descartados, e o bit mais à esquerda (sinal) é propagado para as posições de
bit desocupadas à esquerda. Isso significa que, se pattern tiver um valor negativo, as
posições desocupadas serão definidas como uma; caso contrário, elas serão definidas
como zero.

Observe que os tipos de dados Byte , UShort , UInteger e ULong não têm sinal, portanto,
não há nenhum bit de sinal a ser propagado. Se pattern for de qualquer tipo sem sinal,
as posições desocupadas sempre serão definidas como zero.

Para evitar o deslocamento de mais bits do que o resultado pode conter, o Visual Basic
mascara o valor de amount com uma máscara de tamanho correspondente ao tipo de
dados de pattern . O AND binário desses valores é usado para a quantidade de
deslocamento. As máscaras de tamanho são as seguintes:

Tipo de dados de Máscara de tamanho Máscara de tamanho


pattern (decimal) (hexadecimal)

SByte , Byte 7 &H00000007

Short , UShort 15 &H0000000F

Integer , UInteger 31 &H0000001F

Long , ULong 63 &H0000003F

Se amount for zero, o valor de result será idêntico ao de pattern . Se amount for
negativo, ele será tomado como um valor sem sinal e mascarado com a máscara de
tamanho apropriada.

As mudanças aritméticas nunca geram exceções de estouro.

Sobrecarga
O operador >> pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando um operando tem o tipo dessa classe ou
estrutura. Se o código usar esse operador em uma classe ou estrutura, certifique-se de
entender seu comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Exemplo
O exemplo a seguir usa o operador >> para executar turnos aritméticos à direita em
valores integrais. O resultado sempre tem o mesmo tipo de dados que o da expressão
que está sendo deslocada.

VB

Dim pattern As Short = 2560

' The bit pattern is 0000 1010 0000 0000.

Dim result1, result2, result3, result4, result5 As Short

result1 = pattern >> 0

result2 = pattern >> 4

result3 = pattern >> 10

result4 = pattern >> 18

result5 = pattern >> -1

Os resultados do exemplo anterior são os seguintes:

result1 é 2560 (0000 1010 0000 0000).

result2 é 160 (0000 0000 1010 0000).

result3 é 2 (0000 0000 0000 0010).

result4 é 640 (0000 0010 1000 0000).

result5 é 0 (deslocado 15 casas à direita).

O valor de deslocamento para result4 é calculado como 18 E 15, que é igual a 2.

O exemplo a seguir mostra as mudanças aritméticas em um valor negativo.

VB

Dim negPattern As Short = -8192

' The bit pattern is 1110 0000 0000 0000.

Dim negResult1, negResult2 As Short

negResult1 = negPattern >> 4

negResult2 = negPattern >> 13

Os resultados do exemplo anterior são os seguintes:

negresult1 é -512 (1111 1110 0000 0000).

negresult2 é -1 (o bit de sinal é propagado).

Confira também
Operadores Bit Shift
Operadores de Atribuição
>>Operador =
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operadores aritméticos no Visual Basic
Operador >>= (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Executa um deslocamento aritmético à direita no valor de uma variável ou propriedade


e atribui o resultado de volta à variável ou propriedade.

Sintaxe
VB

variableorproperty >>= amount

Partes
variableorproperty

Obrigatórios. Variável ou propriedade de um tipo integral ( SByte , Byte , Short , UShort ,


Integer , UInteger , Long ou ULong ).

amount

Obrigatórios. Expressão numérica de um tipo de dados que é ampliada para Integer .

Comentários
O elemento no lado esquerdo do operador >>= pode ser uma variável escalar simples,
uma propriedade ou um elemento de uma matriz. A variável ou propriedade não pode
ser ReadOnly.

O operador >>= primeiro executa um deslocamento aritmético à direita no valor da


variável ou da propriedade. Em seguida, o operador atribui o resultado dessa operação
à variável ou à propriedade.

Os deslocamentos aritméticos não são circulares, o que significa que os bits deslocados
de uma extremidade do resultado não são reintroduzidos na outra extremidade. Em um
deslocamento aritmético para a direita, os bits deslocados além da posição de bit mais à
direita são descartados, e o bit mais à esquerda é propagado para as posições de bit
desocupadas à esquerda. Isso significa que, se variableorproperty tiver um valor
negativo, as posições desocupadas serão definidas como uma. Se variableorproperty
for positivo ou se o tipo de dados for um tipo sem sinal, as posições desocupadas serão
definidas como zero.
Sobrecarga
O operador >> pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando um operando tem o tipo dessa classe ou
estrutura. Sobrecarregar o operador >> afeta o comportamento do operador >>= . Se o
seu código usa >>= em uma classe ou estrutura que sobrecarrega >> , certifique-se de
entender o comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Exemplo
O exemplo a seguir usa o operador >>= para mudar o padrão de bit de uma variável
Integer para a direita pela quantidade especificada e atribuir o resultado à variável.

VB

Dim var As Integer = 10

Dim shift As Integer = 2

var >>= shift

' The value of var is now 2 (two bits were lost off the right end).

Confira também
>> Operador
Operadores de Atribuição
Operadores Bit Shift
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Instruções
Operador / (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Divide dois números e retorna um resultado de ponto flutuante.

Sintaxe
VB

expression1 / expression2

Partes
expression1

Obrigatórios. Qualquer expressão numérica.

expression2

Obrigatórios. Qualquer expressão numérica.

Tipos com suporte


Todos os tipos numéricos, incluindo os de ponto flutuante e sem sinal e Decimal .

Result
O resultado é o quociente total de expression1 dividido por expression2 , incluindo
qualquer resto.

O operador \ (Visual Basic) retorna o quociente inteiro, que descarta o restante.

Comentários
O tipo de dados do resultado depende dos tipos de operandos. A tabela a seguir
mostra como o tipo de dados do resultado é determinado.

Tipos de dados de operando Tipos de dados de


resultado
Tipos de dados de operando Tipos de dados de
resultado

Ambas as expressões são tipos de dados integrais (SByte, Byte, Short, Double
UShort, Integer, UInteger, Long, ULong)

Uma expressão é um tipo de dados Simples e a outra não é um Duplo Single

Uma expressão é um tipo de dados Decimal e a outra não é um Simples ou Decimal


um Duplo

Qualquer expressão é um tipo de dados Duplo Double

Antes que a divisão seja executada, todas as expressões numéricas integrais são
ampliadas para Double . Se você atribuir o resultado a um tipo de dados integral, o
Visual Basic tentará converter o resultado desse tipo Double . Isso poderá gerar uma
exceção se o resultado não se encaixar nesse tipo. Em particular, confira "Tentativa de
Divisão por Zero" nesta página de Ajuda.

Se expression1 ou expression2 for avaliada como Nothing, ela será tratada como zero.

Tentativa de Divisão por Zero


Se expression2 for avaliado como zero, o operador / se comportará de outra forma
para diferentes tipos de dados de operando. A tabela a seguir mostra os
comportamentos possíveis.

Tipos de dados Comportamento se expression2 for zero


de operando

Ponto flutuante Retorna infinito (PositiveInfinity ou NegativeInfinity), ou NaN (não é um


( Single ou número) se expression1 também for zero
Double )

Decimal Gera DivideByZeroException

Integral (com A tentativa de conversão de volta para o tipo integral gera OverflowException
ou sem sinal) porque os tipos integrais não podem aceitar PositiveInfinity, NegativeInfinity
ou NaN

7 Observação

O operador / pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando um operando tem o tipo dessa classe
ou estrutura. Se o código usar esse operador em uma classe ou estrutura,
certifique-se de entender seu comportamento redefinido. Para obter mais
informações, confira Procedimentos de operador.

Exemplo
Este exemplo usa o operador / para executar a divisão de ponto flutuante. O resultado
é o quociente dos dois operandos.

VB

Dim resultValue As Double

resultValue = 10 / 4

resultValue = 10 / 3

As expressões no exemplo anterior retornam valores de 2,5 e -3.333333. Observe que o


resultado é sempre ponto flutuante ( Double ), embora ambos os operandos sejam
constantes inteiros.

Confira também
Operador /= (Visual Basic)
Operador \ (Visual Basic)
Tipos de Dados de Resultados do Operador
Operadores aritméticos
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operadores aritméticos no Visual Basic
Operador /= (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Divide o valor de uma variável ou propriedade pelo valor de uma expressão e atribui o
resultado do ponto flutuante à variável ou à propriedade.

Sintaxe
VB

variableorproperty /= expression

Partes
variableorproperty

Obrigatórios. Qualquer variável ou propriedade numérica.

expression

Obrigatórios. Qualquer expressão numérica.

Comentários
O elemento no lado esquerdo do operador /= pode ser uma variável escalar simples,
uma propriedade ou um elemento de uma matriz. A variável ou propriedade não pode
ser ReadOnly.

Primeiramente, o operador /= divide o valor da variável ou da propriedade (no lado


esquerdo do operador) pelo valor da expressão (no lado direito do operador). Em
seguida, o operador atribui o resultado do ponto flutuante dessa operação à variável ou
à propriedade.

Essa instrução atribui um valor Double à variável ou à propriedade à esquerda. Se


Option Strict for On , variableorproperty deve ser Double . Se Option Strict for Off , o

Visual Basic executa uma conversão implícita e atribui o valor resultante a


variableorproperty , com um possível erro em tempo de execução. Para obter mais
informações, confira Ampliando e restringindo conversões e Instrução Option Strict.

Sobrecarga
O Operador / (Visual Basic) pode ser sobrecarregado, o que significa que uma classe ou
estrutura pode redefinir seu comportamento quando um operando tem o tipo dessa
classe ou estrutura. Sobrecarregar o operador / afeta o comportamento do operador
/= . Se o seu código usa /= em uma classe ou estrutura que sobrecarrega / , certifique-
se de entender o comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Exemplo
O exemplo a seguir usa o operador /= para dividir uma variável Integer por um
segundo e atribuir o quociente à primeira variável.

VB

Dim var1 As Integer = 12

Dim var2 As Integer = 3

var1 /= var2

' The value of var1 is now 4.

Confira também
Operador / (Visual Basic)
Operador \=
Operadores de Atribuição
Operadores aritméticos
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Instruções
Operador \ (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Divide dois números e retorna um resultado de número inteiro.

Sintaxe
VB

expression1 \ expression2

Partes
expression1

Obrigatórios. Qualquer expressão numérica.

expression2

Obrigatórios. Qualquer expressão numérica.

Tipos com suporte


Todos os tipos numéricos, incluindo os de ponto flutuante e sem sinal e Decimal .

Result
O resultado é quociente de inteiro de expression1 dividido por expression2 , que
descarta qualquer resto e retém apenas a parte do inteiro. Isso é conhecido como
truncamento.

O tipo de dados do resultado será um tipo numérico apropriado para os tipos de dados
de expression1 e expression2 . Consulte as tabelas "Aritmética de inteiros" nos Tipos de
dados de resultados do operador.

O Operador / (Visual Basic) retorna o quociente completo, que retém o restante na


parte fracionária.

Comentários
Antes de executar a divisão, o Visual Basic tenta converter qualquer expressão numérica
de ponto flutuante em Long . Se Option Strict for On , ocorrerá um erro do compilador.
Se Option Strict for Off , OverflowException será possível se o valor estiver fora do
intervalo do Tipo de Dados Longo. A conversão Long também está sujeita ao
arredondamento bancário. Para obter mais informações, confira "`Partes Fracionais" em
Funções de Conversão de Tipo.

Se expression1 ou expression2 for avaliada como Nothing, ela será tratada como zero.

Tentativa de Divisão por Zero


Se expression2 for avaliado como zero, o operador \ gerará uma exceção
DivideByZeroException. Isso é verdadeiro para todos os tipos de dados numéricos dos
operandos.

7 Observação

O operador \ pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando um operando tem o tipo dessa classe
ou estrutura. Se o código usar esse operador em uma classe ou estrutura,
certifique-se de entender seu comportamento redefinido. Para obter mais
informações, confira Procedimentos de operador.

Exemplo
O exemplo a seguir usa o operador \ para executar a divisão de inteiros. O resultado é
um inteiro que representa o quociente inteiro dos dois operandos, com o restante
descartado.

VB

Dim resultValue As Integer

resultValue = 11 \ 4

resultValue = 9 \ 3

resultValue = 100 \ 3

resultValue = 67 \ -3

As expressões no exemplo anterior retornam valores de 2, 3, 33 e -22, respectivamente.

Confira também
Operador \=
Operador / (Visual Basic)
Instrução Option Strict
Operadores aritméticos
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operadores aritméticos no Visual Basic
Operador \=
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Divide o valor de uma variável ou propriedade pelo valor de uma expressão e atribui o
resultado do inteiro à variável ou propriedade.

Sintaxe
VB

variableorproperty \= expression

Partes
variableorproperty

Obrigatórios. Qualquer variável ou propriedade numérica.

expression

Obrigatórios. Qualquer expressão numérica.

Comentários
O elemento no lado esquerdo do operador \= pode ser uma variável escalar simples,
uma propriedade ou um elemento de uma matriz. A variável ou propriedade não pode
ser ReadOnly.

O operador \= divide o valor de uma variável ou propriedade à esquerda pelo valor à


direita e atribui o resultado do inteiro à variável ou propriedade à esquerda

Para obter mais informações sobre a divisão de inteiros, confira Operador \ (Visual
Basic).

Sobrecarga
O operador \ pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando um operando tem o tipo dessa classe ou
estrutura. Sobrecarregar o operador \ afeta o comportamento do operador \= . Se o
seu código usa \= em uma classe ou estrutura que sobrecarrega \ , certifique-se de
entender o comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Exemplo
O exemplo a seguir usa o operador \= para dividir uma variável Integer por um
segundo e atribuir o resultado do inteiro à primeira variável.

VB

Dim var1 As Integer = 10

Dim var2 As Integer = 3

var1 \= var2

' The value of var1 is now 3.

Confira também
Operador \ (Visual Basic)
Operador /= (Visual Basic)
Operadores de Atribuição
Operadores aritméticos
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Instruções
Operador ^ (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Eleva um número à potência de outro número.

Sintaxe
VB

number ^ exponent

Partes
number

Obrigatórios. Qualquer expressão numérica.

exponent

Obrigatórios. Qualquer expressão numérica.

Result
O resultado é number elevado à potência de exponent , sempre como um valor Double .

Tipos com suporte


Double . Operandos de qualquer tipo diferente são convertidos em Double .

Comentários
O Visual Basic sempre executa exponencialidade no Tipo de Dados Duplo.

O valor de exponent pode ser fracionário, negativo ou ambos.

Quando mais de uma exponencialização é executada em uma única expressão, o


operador ^ é avaliado como encontrado da esquerda para a direita.

7 Observação
O operador ^ pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando um operando tem o tipo dessa classe
ou estrutura. Se o código usar esse operador em uma classe ou estrutura,
certifique-se de entender seu comportamento redefinido. Para obter mais
informações, confira Procedimentos de operador.

Exemplo
O exemplo a seguir usa o operador ^ para elevar um número à potência de um
expoente. O resultado é o primeiro operando elevado à potência do segundo.

VB

Dim exp1, exp2, exp3, exp4, exp5, exp6 As Double

exp1 = 2 ^ 2

exp2 = 3 ^ 3 ^ 3

exp3 = (-5) ^ 3

exp4 = (-5) ^ 4

exp5 = 8 ^ (1.0 / 3.0)

exp6 = 8 ^ (-1.0 / 3.0)

O exemplo anterior produz os seguintes resultados:

exp1 é definido como 4 (2 ao quadrado).

exp2 é definido como 19683 (3 ao cubo, então esse valor ao cubo).

exp3 é definido como -125 (-5 ao cubo).

exp4 é definido como 625 (-5 à quarta potência).

exp5 é definido como 2 (raiz cúbica de 8).

exp6 é definido como 0,5 (1,0 dividido pela raiz cúbica de 8).

Observe a importância dos parênteses nas expressões no exemplo anterior. Devido à


precedência do operador, o Visual Basic normalmente executa o operador ^ antes de
qualquer outro, até mesmo o operador unário – . Se exp4 e exp6 tivessem sido
calculados sem parênteses, eles teriam produzido os seguintes resultados:

exp4 = -5 ^ 4 seria calculado como –(5 à quarta potência), o que resultaria em -625.

exp6 = 8 ^ -1.0 / 3.0 seria calculado como (8 elevado a -1, ou 0,125) dividido por 3,0,
o que resultaria em 0,041666666666666666666666666666667.
Confira também
Operador ^=
Operadores aritméticos
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operadores aritméticos no Visual Basic
Operador ^= (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Aumenta o valor de uma variável ou propriedade à potência de uma expressão e atribui


o resultado de volta à variável ou à propriedade.

Sintaxe
VB

variableorproperty ^= expression

Partes
variableorproperty

Obrigatórios. Qualquer variável ou propriedade numérica.

expression

Obrigatórios. Qualquer expressão numérica.

Comentários
O elemento no lado esquerdo do operador ^= pode ser uma variável escalar simples,
uma propriedade ou um elemento de uma matriz. A variável ou propriedade não pode
ser ReadOnly.

Primeiramente, o operador ^= aumenta o valor da variável ou da propriedade (no lado


esquerdo do operador) à potência do valor da expressão (no lado direito do operador).
Em seguida, o operador atribui o resultado dessa operação à variável ou à propriedade.

O Visual Basic sempre executa exponencialidade no Tipo de Dados Duplo. Operandos


de qualquer tipo diferente são convertidos em Double , e o resultado é sempre Double .

O valor de expression pode ser fracionário, negativo ou ambos.

Sobrecarga
O operador ^ pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir o comportamento quando um operando tem o tipo dessa classe ou
estrutura. Sobrecarregar o operador ^ afeta o comportamento do operador ^= . Se o
seu código usa ^= em uma classe ou estrutura que sobrecarrega ^ , certifique-se de
entender o comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Exemplo
O exemplo a seguir usa o operador ^= para aumentar o valor de uma variável Integer à
potência de uma segunda e atribuir o resultado à primeira delas.

VB

Dim var1 As Integer = 10

Dim var2 As Integer = 3

var1 ^= var2

' The value of var1 is now 1000.

Confira também
Operador ^
Operadores de Atribuição
Operadores aritméticos
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Instruções
?. Operadores condicionais nulos ?. e ?()
(Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Testa o valor do operando esquerdo para nulo ( Nothing )antes de executar um acesso de
membro ( ?. ) ou uma operação de índice ( ?() ); retorna Nothing se o operando
esquerdo é avaliado como Nothing . Observe que, em expressões que normalmente
retornam tipos de valor, o operador nulo condicional retorna um Nullable<T>.

Esses operadores ajudam a escrever menos código para lidar com verificações de
nulidade, especialmente ao entrar em estruturas de dados. Por exemplo:

VB

' Nothing if customers is Nothing


Dim length As Integer? = customers?.Length

' Nothing if customers is Nothing


Dim first As Customer = customers?(0)

' Nothing if customers, the first customer, or Orders is Nothing

Dim count As Integer? = customers?(0)?.Orders?.Count()

Para comparação, o código alternativo para a primeira dessas expressões sem um


operador condicional nulo é:

VB

Dim length As Integer?

If customers IsNot Nothing Then

length = customers.Length

Else

length = Nothing

End If

Às vezes, você precisa executar uma ação em um objeto que pode ser nulo, com base
no valor de um membro booliano nesse objeto (como a propriedade booliana
IsAllowedFreeShipping no seguinte exemplo):

VB

Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.

If customer IsNot Nothing AndAlso customer.IsAllowedFreeShipping Then

ApplyFreeShippingToOrders(customer)

End If

Você pode reduzir o código e evitar a verificação manual de nulo usando o operador
nulo condicional da seguinte maneira:

VB

Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.

If customer?.IsAllowedFreeShipping Then ApplyFreeShippingToOrders(customer)

Os operadores condicionais nulos estão entrando em curto-circuito. Se uma operação


em uma cadeia de operações de índice e acesso de membro condicionais retornar
Nothing , o restante da execução da cadeia será interrompido. No exemplo a seguir,

C(E) não será executado se A , B ou C for avaliado como Nothing .

VB

A?.B?.C?(E)

Outro uso para o acesso de membro condicional nulo é invocar delegados de maneira
thread-safe com muito menos código. O exemplo a seguir define dois tipos,
NewsBroadcaster e NewsReceiver . Itens de notícias são enviados ao receptor pelo
delegado NewsBroadcaster.SendNews .

VB

Public Module NewsBroadcaster

Dim SendNews As Action(Of String)

Public Sub Main()

Dim rec As New NewsReceiver()

Dim rec2 As New NewsReceiver()

SendNews?.Invoke("Just in: A newsworthy item...")

End Sub

Public Sub Register(client As Action(Of String))

SendNews = SendNews.Combine({SendNews, client})

End Sub

End Module

Public Class NewsReceiver

Public Sub New()

NewsBroadcaster.Register(AddressOf Me.DisplayNews)

End Sub

Public Sub DisplayNews(newsItem As String)

Console.WriteLine(newsItem)
End Sub

End Class

Se não houver elementos na lista de invocação SendNews , o delegado SendNews gerará


NullReferenceException. Antes dos operadores condicionais nulos, um código como o
seguinte garantiu que a lista de invocação do delegado não fosse Nothing :

VB

SendNews = SendNews.Combine({SendNews, client})

If SendNews IsNot Nothing Then

SendNews("Just in...")

End If

A nova maneira é muito mais simples:

VB

SendNews = SendNews.Combine({SendNews, client})

SendNews?.Invoke("Just in...")

A nova forma é thread-safe porque o compilador gera código para avaliar SendNews
somente uma vez, mantendo o resultado em uma variável temporária. Você precisa
chamar explicitamente o método Invoke porque não há nenhuma sintaxe de invocação
de delegado condicional nulo SendNews?(String) .

Confira também
Operadores (Visual Basic)
Guia de programação do Visual Basic
Referência da linguagem Visual Basic
?. Operadores condicionais nulos ?. e ?()
(Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Testa o valor do operando esquerdo para nulo ( Nothing )antes de executar um acesso de
membro ( ?. ) ou uma operação de índice ( ?() ); retorna Nothing se o operando
esquerdo é avaliado como Nothing . Observe que, em expressões que normalmente
retornam tipos de valor, o operador nulo condicional retorna um Nullable<T>.

Esses operadores ajudam a escrever menos código para lidar com verificações de
nulidade, especialmente ao entrar em estruturas de dados. Por exemplo:

VB

' Nothing if customers is Nothing


Dim length As Integer? = customers?.Length

' Nothing if customers is Nothing


Dim first As Customer = customers?(0)

' Nothing if customers, the first customer, or Orders is Nothing

Dim count As Integer? = customers?(0)?.Orders?.Count()

Para comparação, o código alternativo para a primeira dessas expressões sem um


operador condicional nulo é:

VB

Dim length As Integer?

If customers IsNot Nothing Then

length = customers.Length

Else

length = Nothing

End If

Às vezes, você precisa executar uma ação em um objeto que pode ser nulo, com base
no valor de um membro booliano nesse objeto (como a propriedade booliana
IsAllowedFreeShipping no seguinte exemplo):

VB

Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.

If customer IsNot Nothing AndAlso customer.IsAllowedFreeShipping Then

ApplyFreeShippingToOrders(customer)

End If

Você pode reduzir o código e evitar a verificação manual de nulo usando o operador
nulo condicional da seguinte maneira:

VB

Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.

If customer?.IsAllowedFreeShipping Then ApplyFreeShippingToOrders(customer)

Os operadores condicionais nulos estão entrando em curto-circuito. Se uma operação


em uma cadeia de operações de índice e acesso de membro condicionais retornar
Nothing , o restante da execução da cadeia será interrompido. No exemplo a seguir,

C(E) não será executado se A , B ou C for avaliado como Nothing .

VB

A?.B?.C?(E)

Outro uso para o acesso de membro condicional nulo é invocar delegados de maneira
thread-safe com muito menos código. O exemplo a seguir define dois tipos,
NewsBroadcaster e NewsReceiver . Itens de notícias são enviados ao receptor pelo
delegado NewsBroadcaster.SendNews .

VB

Public Module NewsBroadcaster

Dim SendNews As Action(Of String)

Public Sub Main()

Dim rec As New NewsReceiver()

Dim rec2 As New NewsReceiver()

SendNews?.Invoke("Just in: A newsworthy item...")

End Sub

Public Sub Register(client As Action(Of String))

SendNews = SendNews.Combine({SendNews, client})

End Sub

End Module

Public Class NewsReceiver

Public Sub New()

NewsBroadcaster.Register(AddressOf Me.DisplayNews)

End Sub

Public Sub DisplayNews(newsItem As String)

Console.WriteLine(newsItem)
End Sub

End Class

Se não houver elementos na lista de invocação SendNews , o delegado SendNews gerará


NullReferenceException. Antes dos operadores condicionais nulos, um código como o
seguinte garantiu que a lista de invocação do delegado não fosse Nothing :

VB

SendNews = SendNews.Combine({SendNews, client})

If SendNews IsNot Nothing Then

SendNews("Just in...")

End If

A nova maneira é muito mais simples:

VB

SendNews = SendNews.Combine({SendNews, client})

SendNews?.Invoke("Just in...")

A nova forma é thread-safe porque o compilador gera código para avaliar SendNews
somente uma vez, mantendo o resultado em uma variável temporária. Você precisa
chamar explicitamente o método Invoke porque não há nenhuma sintaxe de invocação
de delegado condicional nulo SendNews?(String) .

Confira também
Operadores (Visual Basic)
Guia de programação do Visual Basic
Referência da linguagem Visual Basic
Operador AddressOf (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Cria uma instância delegada que faz referência ao procedimento específico.

Sintaxe
VB

AddressOf procedurename

Partes
procedurename

Obrigatórios. Especifica o procedimento a ser referenciado pelo delegado recém-criado.

Comentários
O operador AddressOf cria um delegado que aponta para o sub ou função especificado
por procedurename . Quando o procedimento especificado é um método de instância, o
delegado se refere à instância e ao método. Em seguida, quando o delegado é
invocado, o método especificado da instância especificada é chamado.

O operador AddressOf pode ser usado como operando de um construtor delegado ou


em um contexto no qual o tipo do delegado pode ser determinado pelo compilador.

Exemplo 1
Este exemplo usa o operador AddressOf com o objetivo de designar um delegado para
manipular o evento Click de um botão.

VB

' Add the following line to Sub Form1_Load().

AddHandler Button1.Click, AddressOf Button1_Click

Exemplo 2
O exemplo a seguir usa o operador AddressOf para designar a função de inicialização
para um thread.

VB

Public Sub CountSheep()


Dim i As Integer = 1 ' Sheep do not count from 0.

Do While (True) ' Endless loop.

Console.WriteLine("Sheep " & i & " Baah")

i = i + 1

System.Threading.Thread.Sleep(1000) 'Wait 1 second.

Loop

End Sub

Sub UseThread()

Dim t As New System.Threading.Thread(AddressOf CountSheep)

t.Start()

End Sub

Confira também
Instrução Declare
Instrução Function
Instrução Sub
Representantes
Operador And (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Desenvolve uma conjunção lógica em duas expressões Boolean ou uma conjunção bit a
bit em duas expressões numéricas.

Sintaxe
VB

result = expression1 And expression2

Partes
result

Obrigatórios. Qualquer Boolean ou expressão numérica. Para comparação booliana,


result é a conjunção lógica de dois valores Boolean . Para operações bit a bit, result é

um valor numérico que representa a conjunção bit a bit de dois padrões de bit
numéricos.

expression1

Obrigatórios. Qualquer Boolean ou expressão numérica.

expression2

Obrigatórios. Qualquer Boolean ou expressão numérica.

Comentários
Para comparação booliana, result é True se e somente se ambos expression1 e
expression2 resultarem em True . A tabela a seguir ilustra como result é determinado.

Se expression1 for E expression2 for O valor de result é

True True True

True False False

False True False

False False False


7 Observação

Em uma comparação booliana, o operador And sempre avalia ambas as expressões,


o que pode incluir a realização de chamadas de procedimento. O Operador
AndAlso executa um curto-circuito, o que significa que, se expression1 for False ,
expression2 não será avaliado.

Quando aplicado a valores numéricos, o operador And executa uma comparação bit a
bit dos bits posicionados de forma idêntica em duas expressões numéricas e define o
bit correspondente em result de acordo com a tabela a seguir.

Se o bit em expression1 for E o bit em expression2 for O bit em result é

1 1 1

1 0 0

0 1 0

0 0 0

7 Observação

Como os operadores lógicos e bit a bit têm uma precedência menor do que outros
operadores aritméticos e relacionais, todas as operações bit a bit devem ser
colocadas entre parênteses para garantir resultados precisos.

Tipos de dados
Se os operandos consistirem em uma expressão Boolean e uma expressão numérica, o
Visual Basic converterá a expressão Boolean em um valor numérico (–1 para True e 0
para False ) e executará uma operação bit a bit.

Para uma comparação booliana, o tipo de dados do resultado será Boolean . Para uma
comparação bit a bit, o tipo de dados de resultado será um tipo numérico apropriado
para os tipos de dados de expression1 e expression2 . Consulte a tabela "Comparações
relacionais e bit a bit" nos Tipos de dados de resultados do operador.

7 Observação
O operador And pode ser sobrecarregado, o que significa que uma classe ou
estrutura pode redefinir seu comportamento quando um operando tem o tipo
dessa classe ou estrutura. Se o código usar esse operador em uma classe ou
estrutura, certifique-se de entender seu comportamento redefinido. Para obter
mais informações, confira Procedimentos de operador.

Exemplo 1
O exemplo a seguir usa o operador And para executar uma conjunção lógica em duas
expressões. O resultado é um valor Boolean que representa se ambas as expressões são
True .

VB

Dim a As Integer = 10

Dim b As Integer = 8

Dim c As Integer = 6

Dim firstCheck, secondCheck As Boolean

firstCheck = a > b And b > c

secondCheck = b > a And b > c

O exemplo anterior produz resultados de True e False , respectivamente.

Exemplo 2
O exemplo a seguir usa o operador And para executar a conjunção lógica nos bits
individuais de duas expressões numéricas. O bit no padrão de resultado será definido se
os bits correspondentes nos operandos forem definidos como 1.

VB

Dim a As Integer = 10

Dim b As Integer = 8

Dim c As Integer = 6

Dim firstPattern, secondPattern, thirdPattern As Integer


firstPattern = (a And b)

secondPattern = (a And c)

thirdPattern = (b And c)

O exemplo anterior produz resultados de 8, 2 e 0, respectivamente.

Confira também
Operadores lógicos/bit a bit (Visual Basic)
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operador AndAlso
Operadores lógicos e bit a bit no Visual Basic
Operador AndAlso (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Realiza uma conjunção lógica de curto-circuito em duas expressões.

Sintaxe
VB

result = expression1 AndAlso expression2

Partes
Termo Definição

result Obrigatórios. Qualquer expressão de Boolean . O resultado é o resultado Boolean


da comparação das duas expressões.

expression1 Obrigatórios. Qualquer expressão de Boolean .

expression2 Obrigatórios. Qualquer expressão de Boolean .

Comentários
Uma operação lógica será considerada de curto-circuito se o código compilado puder
ignorar a avaliação de uma expressão, a depender do resultado de outra expressão. Se o
resultado da primeira expressão avaliada determinar o resultado final da operação, não
será necessário avaliar a segunda expressão, pois ela não poderá alterar o resultado
final. O curto-circuito pode melhorar o desempenho se a expressão ignorada for
complexa ou se envolver chamadas de procedimento.

Se ambas as expressões forem avaliadas como True , então result retornará True . A
tabela a seguir ilustra como result é determinado.

Se expression1 for E expression2 for O valor de result será

True True True

True False False

False (não avaliado) False


7 Observação

Em uma comparação booliana, o operador And sempre avalia ambas as expressões,


o que pode incluir a realização de chamadas de procedimento. O Operador
AndAlso executa um curto-circuito, o que significa que, se expression1 for False ,
expression2 não será avaliado.

Tipos de dados
O operador AndAlso é definido apenas para o tipo de dados booliano. O Visual Basic
converte cada operando conforme necessário para Boolean antes de avaliar a
expressão. Se você atribuir o resultado a um tipo numérico, o Visual Basic o converterá
de Boolean para esse tipo, de modo que False se torne 0 e True se torne -1 .
Para
obter mais informações, consulte Conversões de tipo booliano.

Sobrecarga
O operador And e o operador IsFalse podem ser sobrecarregados, o que significa que
uma classe ou estrutura pode redefinir seu comportamento quando um operando tiver
o tipo dessa classe ou estrutura. Sobrecarregar os operadores And e IsFalse afeta o
comportamento do operador AndAlso . Se o seu código usar AndAlso em uma classe ou
estrutura que sobrecarrega And e IsFalse , certifique-se de entender o comportamento
redefinido. Para obter mais informações, confira Procedimentos de operador.

Exemplo 1
O exemplo a seguir usa o operador AndAlso para executar uma conjunção lógica em
duas expressões. O resultado é um valor Boolean que representa se toda a expressão
conjunta é verdadeira. Se a primeira expressão for False , a segunda não será avaliada.

VB

Dim a As Integer = 10

Dim b As Integer = 8

Dim c As Integer = 6

Dim firstCheck, secondCheck, thirdCheck As Boolean

firstCheck = a > b AndAlso b > c

secondCheck = b > a AndAlso b > c

thirdCheck = a > b AndAlso c > b

O exemplo anterior produz resultados de True , False e False , respectivamente. No


cálculo de secondCheck , a segunda expressão não é avaliada porque a primeira já está
como False . No entanto, a segunda expressão é avaliada no cálculo de thirdCheck .

Exemplo 2
O exemplo a seguir mostra um procedimento Function que procura um determinado
valor entre os elementos de uma matriz. Se a matriz estiver vazia, ou se o comprimento
da matriz tiver sido excedido, a instrução While não testará o elemento de matriz em
relação ao valor de pesquisa.

VB

Public Function findValue(ByVal arr() As Double,

ByVal searchValue As Double) As Double

Dim i As Integer = 0

While i <= UBound(arr) AndAlso arr(i) <> searchValue

' If i is greater than UBound(arr), searchValue is not checked.

i += 1

End While

If i > UBound(arr) Then i = -1

Return i

End Function

Confira também
Operadores lógicos/bit a bit (Visual Basic)
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operador And
Operador IsFalse
Operadores lógicos e bit a bit no Visual Basic
Operador Await (Visual Basic)
Artigo • 28/11/2022 • 4 minutos para o fim da leitura

Você aplica o operador Await a um operando em um método assíncrono ou expressão


lambda para suspender a execução do método até que a tarefa aguardada seja
concluída. A tarefa representa um trabalho em andamento.

O método no qual Await é usado deve ter um modificador Async. Esse tipo de método,
definido pelo uso do modificador Async e, geralmente, contendo uma ou mais
expressões Await , é conhecido como um método assíncrono.

7 Observação

As palavras-chave Async e Await foram introduzidas no Visual Studio 2012. Para


uma introdução à programação assíncrona, consulte Programação assíncrona com
Async e Await.

A tarefa à qual o operador Await é aplicado, normalmente é o valor retornado de uma


chamada a um método que implementa o Padrão assíncrono baseado em tarefa , que
é Task ou Task<TResult>.

No código a seguir, o método HttpClientGetByteArrayAsync retorna getContentsTask ,


um Task(Of Byte()) . A tarefa é uma promessa de produzir a matriz de bytes real
quando a operação for concluída. O operador Await é aplicado a getContentsTask para
suspender a execução em SumPageSizesAsync até que getContentsTask seja concluída.
Enquanto isso, o controle é retornado ao chamador de SumPageSizesAsync . Quando
getContentsTask for concluído, a expressão Await resulta em uma matriz de bytes.

VB

Private Async Function SumPageSizesAsync() As Task

' To use the HttpClient type in desktop apps, you must include a using
directive and add a

' reference for the System.Net.Http namespace.

Dim client As HttpClient = New HttpClient()

' . . .

Dim getContentsTask As Task(Of Byte()) = client.GetByteArrayAsync(url)

Dim urlContents As Byte() = Await getContentsTask

' Equivalently, now that you see how it works, you can write the same
thing in a single line.

'Dim urlContents As Byte() = Await client.GetByteArrayAsync(url)

' . . .

End Function

) Importante

Para obter o exemplo completo, consulte Passo a passo: acessando a Web usando
async e await. Você pode baixar o exemplo do Navegador de Exemplo do .NET. O
código de exemplo está no projeto SerialAsyncExample.

Se Await for aplicado ao resultado de uma chamada de método que retorna uma
Task(Of TResult) , o tipo da expressão Await será TResult. Se Await for aplicado ao

resultado de uma chamada de método que retorna um Task , a expressão Await não
retornará um valor. O exemplo a seguir ilustra a diferença.

VB

' Await used with a method that returns a Task(Of TResult).

Dim result As TResult = Await AsyncMethodThatReturnsTaskTResult()

' Await used with a method that returns a Task.

Await AsyncMethodThatReturnsTask()

Uma expressão ou instrução Await não bloqueia o thread no qual está sendo
executada. Em vez disso, ela faz com que o compilador inscreva o restante do método
assíncrono, após a expressão Await , como uma continuação da tarefa aguardada. Em
seguida, o controle retorna para o chamador do método assíncrono. Quando a tarefa
for concluída, ela invoca a sua continuação e a execução do método assíncrono
continua de onde parou.

Uma expressão Await pode ocorrer apenas no corpo de um método imediatamente


delimitador ou expressão lambda marcada por um modificador Async . O termo Await
só serve como uma palavra-chave nesse contexto. Em outro local, ele será interpretado
como um identificador. Dentro do método Async ou da expressão lambda, uma
expressão Await não pode ocorrer em uma expressão de consulta, no bloco Catch ou
Finally de uma instrução Try…Catch…Finally, no loop expressão de variável de controle

de um loop For ou For Each , ou no corpo de uma instrução SyncLock.

Exceções
A maioria dos métodos assíncronos retorna um Task ou um Task<TResult>. As
propriedades da tarefa retornada transportam informações sobre seu status e histórico
como: se a tarefa foi concluída, se o método assíncrono causou uma exceção ou se foi
cancelado e qual foi o resultado final. O operador Await acessa essas propriedades.

Se você aguarda um método assíncrono de retorno de tarefa que causou uma exceção,
o operador Await relança a exceção.

Se você aguarda um método assíncrono de retorno de tarefa que está cancelado, o


operador Await relança uma OperationCanceledException.

Uma tarefa única que está em um estado com falha pode refletir várias exceções. Por
exemplo, a tarefa pode ser o resultado de uma chamada para Task.WhenAll. Quando
você aguarda essa tarefa, a operação de aguardar relança apenas uma das exceções. No
entanto, você não pode prever qual das exceções será relançada.

Para obter exemplos de tratamento de erro em métodos assíncronos, confira Instrução


Try...Catch...Finally.

Exemplo
O exemplo do Windows Forms a seguir ilustra o uso do Await em um método
assíncrono WaitAsynchronouslyAsync . Compare o comportamento desse método com o
comportamento de WaitSynchronously . Sem um operador Await , WaitSynchronously é
executado de maneira síncrona, apesar do uso do modificador Async na definição e de
uma chamada para Thread.Sleep no corpo.

VB

Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles


Button1.Click

' Call the method that runs asynchronously.

Dim result As String = Await WaitAsynchronouslyAsync()

' Call the method that runs synchronously.

'Dim result As String = Await WaitSynchronously()

' Display the result.

TextBox1.Text &= result

End Sub

' The following method runs asynchronously. The UI thread is not

' blocked during the delay. You can move or resize the Form1 window

' while Task.Delay is running.

Public Async Function WaitAsynchronouslyAsync() As Task(Of String)

Await Task.Delay(10000)

Return "Finished"

End Function

' The following method runs synchronously, despite the use of Async.

' You cannot move or resize the Form1 window while Thread.Sleep

' is running because the UI thread is blocked.

Public Async Function WaitSynchronously() As Task(Of String)

' Import System.Threading for the Sleep method.

Thread.Sleep(10000)

Return "Finished"

End Function

Confira também
Programação assíncrona com Async e Await
Instruções passo a passo: acessando a Web e usando Async e Await
Async
Operador DirectCast (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Apresenta uma operação de conversão de tipo com base na herança ou implementação.

Comentários
O DirectCast não usa as rotinas auxiliares de tempo de execução do Visual Basic para
conversão; portanto, ele pode fornecer um desempenho um pouco melhor do que o
CType ao converter de e para o tipo de dados Object .

Você usa a palavra-chave DirectCast semelhante à maneira como usa a Função CType e
a palavra-chave Operador TryCast. Você fornece uma expressão como o primeiro
argumento e um tipo para convertê-la como o segundo argumento. O DirectCast testa
uma relação de herança ou implementação entre os tipos de dados dos dois
argumentos. Isso significa que um tipo deve herdar de ou implementar o outro.

Erros e falhas
O DirectCast gerará um erro do compilador se detectar que não existe nenhuma
relação de herança ou implementação. Mas a falta de um erro do compilador não
garante uma conversão bem-sucedida. Se a conversão desejada estiver estreitando, ela
poderá falhar em tempo de execução. Se isso acontecer, o runtime gerará um erro
InvalidCastException.

Palavras-chave de conversão
Uma comparação das palavras-chave de conversão de tipo é a seguinte.

Palavra- Tipos de Relação de argumento Falha em tempo de


chave dados execução

Função Qualquer A conversão de expansão ou de restrição Gera


CType tipo de deve ser definida entre os dois tipos de InvalidCastException
dados dados

DirectCast Qualquer Um tipo deve herdar ou implementar o Gera


tipo de outro tipo InvalidCastException
dados
Palavra- Tipos de Relação de argumento Falha em tempo de
chave dados execução

Operador Apenas tipos Um tipo deve herdar ou implementar o Retorna Nada


TryCast de referência outro tipo

Exemplo
O exemplo a seguir demonstra dois usos de DirectCast , um que falha em tempo de
execução e outro que é bem-sucedido.

VB

Dim q As Object = 2.37

Dim i As Integer = CType(q, Integer)

' The following conversion fails at run time

Dim j As Integer = DirectCast(q, Integer)

Dim f As New System.Windows.Forms.Form

Dim c As System.Windows.Forms.Control

' The following conversion succeeds.

c = DirectCast(f, System.Windows.Forms.Control)

No exemplo anterior, o tipo de tempo de execução de q é Double . O CType é bem-


sucedido porque Double pode ser convertido em Integer . No entanto, o primeiro
DirectCast falha em tempo de execução porque o tipo de tempo de execução de
Double não tem nenhuma relação de herança com Integer , embora exista uma

conversão. O segundo DirectCast é bem-sucedido porque converte do tipo Form em


tipo Control, do qual Form herda.

Confira também
Convert.ChangeType
Conversões de Widening e Narrowing
Conversões implícitas e explícitas
Expressão de função (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Declara os parâmetros e o código que definem uma expressão lambda de função.

Sintaxe
VB

Function ( [ parameterlist ] ) expression

- or -

Function ( [ parameterlist ] )

[ statements ]

End Function

Partes
Termo Definição

parameterlist Opcional. Uma lista de nomes de variáveis locais que representam os parâmetros
deste procedimento. Os parênteses devem estar presentes mesmo quando a
lista estiver vazia. Confira a Lista de parâmetros.

expression Obrigatórios. Uma expressão única. O tipo da expressão é o tipo de retorno da


função.

statements Obrigatórios. Uma lista de instruções que retorna um valor usando a instrução
Return . Confira Instrução Return. O tipo do valor retornado é o tipo de retorno
da função.

Comentários
Uma expressão lambda é uma função sem um nome que calcula e retorna um valor.
Você pode usar uma expressão lambda em qualquer lugar em que possa usar um tipo
delegado, exceto como um argumento para RemoveHandler . Para obter mais
informações sobre delegados e o uso de expressões lambda com delegados, confira
Instrução Delegate e Conversão de delegado reduzida.

Sintaxe da expressão lambda


A sintaxe de uma expressão lambda é semelhante à de uma função padrão. As
diferenças são:

Uma expressão lambda não tem um nome.

As expressões lambda não podem ter modificadores, como Overloads ou


Overrides .

As expressões Lambda não usam uma cláusula As para designar o tipo de retorno
da função. Em vez disso, o tipo é inferido do valor ao qual o corpo de uma
expressão lambda de linha única é avaliado ou o valor retornado de uma
expressão lambda de várias linhas. Por exemplo, se o corpo de uma expressão
lambda de linha única for Where cust.City = "London" , o tipo de retorno será
Boolean .

O corpo de uma expressão lambda de linha única deve ser uma expressão, não
uma instrução. O corpo pode consistir em uma chamada para um procedimento
Function, mas não uma chamada para um subprocedimento.

Todos os parâmetros devem ter tipos de dados especificados ou todos devem ser
inferidos.

Parâmetros opcionais e Paramarray não são permitidos.

Parâmetros genéricos não são permitidos.

Exemplo 1
Os exemplos a seguir mostram duas maneiras de criar expressões lambda simples. O
primeiro usa um Dim para fornecer um nome para a função. Para chamar a função, você
envia um valor para o parâmetro.

VB

Dim add1 = Function(num As Integer) num + 1

VB

' The following line prints 6.

Console.WriteLine(add1(5))

Exemplo 2
Como alternativa, você pode declarar e executar a função ao mesmo tempo.

VB

Console.WriteLine((Function(num As Integer) num + 1)(5))

Exemplo 3
Mostraremos a seguir um exemplo de uma expressão lambda que incrementa seu
argumento e retorna o valor. O exemplo mostra a sintaxe de expressão lambda de linha
única e de várias linhas para uma função. Para obter mais exemplos, confira Expressões
lambda.

VB

Dim increment1 = Function(x) x + 1

Dim increment2 = Function(x)

Return x + 2

End Function

' Write the value 2.

Console.WriteLine(increment1(1))

' Write the value 4.

Console.WriteLine(increment2(2))

Exemplo 4
As expressões lambda são subjacentes a muitos dos operadores de consulta LINQ
(consulta integrada à linguagem) e podem ser usadas explicitamente em consultas
baseadas em método. O exemplo a seguir mostra uma consulta LINQ típica, seguida
pela tradução da consulta no formato de método.

VB

Dim londonCusts = From cust In db.Customers

Where cust.City = "London"

Select cust

' This query is compiled to the following code:

Dim londonCusts = db.Customers.

Where(Function(cust) cust.City = "London").

Select(Function(cust) cust)

Para obter mais informações sobre métodos de consulta, leia Consultas. Para obter mais
informações sobre os operadores de consulta padrão, confira Visão geral de operadores
de consulta padrão.

Confira também
Instrução Function
Expressões Lambda
Operadores e Expressões
Instruções
Comparações de Valor
Expressões Boolianas
Operador If
Conversão de delegado reduzida
Operador GetType (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Retorna um objeto Type para o tipo especificado. O objeto Type fornece informações
sobre o tipo, como suas propriedades, métodos e eventos.

Sintaxe
VB

GetType(typename)

Parâmetros
Parâmetro Descrição

typename O nome do tipo para o qual você deseja informações.

Comentários
O operador GetType retorna o objeto Type para o typename especificado. Você pode
passar o nome de qualquer tipo definido em typename . Isso inclui o seguinte:

Qualquer tipo de dados do Visual Basic, como Boolean ou Date .

Qualquer classe .NET Framework, estrutura, módulo ou interface, como


System.ArgumentException ou System.Double.

Qualquer classe, estrutura, módulo ou interface definida pelo aplicativo.

Qualquer matriz definida pelo aplicativo.

Qualquer delegado definido pelo aplicativo.

Qualquer enumeração definida pelo Visual Basic, pelo .NET Framework ou pelo
aplicativo.

Se você quiser obter o objeto do tipo de uma variável de objeto, use o método
Object.GetType.

O operador GetType pode ser útil na seguinte circunstância:


Você deve acessar os metadados para um tipo em tempo de execução. O objeto
Type fornece metadados, como membros do tipo e informações de implantação.
Você precisa disso, por exemplo, para refletir sobre um assembly. Para obter mais
informações, consulte também System.Reflection.

Exemplo
Os exemplos a seguir mostram o operador GetType em uso.

VB

' The following statement returns the Type object for Integer.

MsgBox(GetType(Integer).ToString())

' The following statement returns the Type object for one-dimensional string
arrays.

MsgBox(GetType(String()).ToString())

Confira também
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operadores e Expressões
Object.GetType
Type.GetType
Operador GetXmlNamespace (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Obtém o objeto XNamespace que corresponde ao prefixo de namespace de XML


especificado.

Sintaxe
VB

GetXmlNamespace(xmlNamespacePrefix)

Partes
xmlNamespacePrefix Opcional. A cadeia de caracteres que identifica o prefixo de

namespace de XML. Se fornecida, essa cadeia de caracteres deve ser um identificador


XML válido. Para obter mais informações, confira Nomes de elementos e atributos XML
declarados. Se nenhum prefixo for especificado, o namespace padrão será retornado. Se
nenhum namespace padrão for especificado, o namespace vazio será retornado.

Valor Retornado
O objeto XNamespace que corresponde ao prefixo do namespace de XML.

Comentários
O operador GetXmlNamespace obtém o objeto XNamespace que corresponde ao prefixo
de namespace de XML xmlNamespacePrefix .

Você pode usar prefixos de namespace de XML diretamente em literais XML e


propriedades de eixo XML. No entanto, você deve usar o operador GetXmlNamespace
para converter um prefixo de namespace em um objeto XNamespace antes de poder
usá-lo no código. Você pode anexar um nome de elemento não qualificado a um objeto
XNamespace para obter um objeto XName totalmente qualificado, que muitos métodos
LINQ to XML exigem.
Exemplo
O exemplo a seguir importa ns como um prefixo de namespace de XML. Em seguida,
ele usa o prefixo do namespace para criar um literal do XML e acessar o primeiro nó
filho que possui o nome qualificado ns:phone . Em seguida, ele passa esse nó filho para
a sub-rotina ShowName , que constrói um nome qualificado usando o operador
GetXmlNamespace . A sub-rotina ShowName então passa o nome qualificado para o método
Ancestors para obter o nó pai ns:contact .

VB

' Place Imports statements at the top of your program.

Imports <xmlns:ns="http://SomeNamespace">

Module GetXmlNamespaceSample

Sub RunSample()

' Create test by using a global XML namespace prefix.

Dim contact =

<ns:contact>

<ns:name>Patrick Hines</ns:name>

<ns:phone ns:type="home">206-555-0144</ns:phone>

<ns:phone ns:type="work">425-555-0145</ns:phone>

</ns:contact>

ShowName(contact.<ns:phone>(0))

End Sub

Sub ShowName(ByVal phone As XElement)

Dim qualifiedName = GetXmlNamespace(ns) + "contact"

Dim contact = phone.Ancestors(qualifiedName)(0)

Console.WriteLine("Name: " & contact.<ns:name>.Value)

End Sub

End Module

Quando você chama TestGetXmlNamespace.RunSample() , ele exibe uma caixa de


mensagem que contém o seguinte texto:

Name: Patrick Hines

Confira também
Instrução Imports (namespace XML)
Acessando XML no Visual Basic
Operador If (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Usa a avaliação de curto-circuito para retornar condicionalmente um dos dois valores. O


operador If pode ser chamado com três argumentos ou com dois argumentos.

Sintaxe
VB

If( [argument1,] argument2, argument3 )

Se o operador for chamado com três


argumentos
Quando If é chamado usando três argumentos, o primeiro argumento deve ser
avaliado como um valor que pode ser convertido como um Boolean . Esse valor Boolean
determinará qual dos outros dois argumentos é avaliado e retornado. A lista a seguir se
aplica somente quando o operador If é chamado usando três argumentos.

Partes

Termo Definição

argument1 Obrigatórios. Boolean . Determina qual dos outros argumentos avaliar e retornar.

argument2 Obrigatórios. Object . Avaliado e retornado se argument1 for avaliado como True .

argument3 Obrigatórios. Object . Avaliado e retornado se argument1 for avaliado como False ou
se argument1 for uma variável anulável Boolean que é avaliada como Nothing.

Um operador If chamado com três argumentos funciona como uma função IIf ,
exceto que ele usa a avaliação de curto-circuito. Uma função IIf sempre avalia todos
os três argumentos, enquanto um operador If que tem três argumentos avalia apenas
dois deles. O primeiro argumento If é avaliado e o resultado é convertido como um
valor Boolean , True ou False . Se o valor for True , argument2 será avaliado e o valor
dele será retornado, mas argument3 não será avaliado. Se o valor da expressão Boolean
for False , argument3 erá avaliado e o valor dele será retornado, mas argument2 não será
avaliado. Os seguintes exemplos ilustram o uso de If quando três argumentos são
usados:

VB

' This statement prints TruePart, because the first argument is true.

Console.WriteLine(If(True, "TruePart", "FalsePart"))

' This statement prints FalsePart, because the first argument is false.

Console.WriteLine(If(False, "TruePart", "FalsePart"))

Dim number = 3

' With number set to 3, this statement prints Positive.

Console.WriteLine(If(number >= 0, "Positive", "Negative"))

number = -1

' With number set to -1, this statement prints Negative.

Console.WriteLine(If(number >= 0, "Positive", "Negative"))

O exemplo a seguir ilustra o valor da avaliação de curto-circuito. O exemplo mostra


duas tentativas de dividir a variável number pela variável divisor , exceto quando
divisor é zero. Nesse caso, um 0 deve ser retornado e nenhuma tentativa deve ser feita

para executar a divisão porque isso resultaria em um erro em tempo de execução. Como
a expressão If usa a avaliação de curto-circuito, ela avalia o segundo ou o terceiro
argumento, dependendo do valor do primeiro argumento. Se o primeiro argumento for
verdadeiro, o divisor não será zero e será seguro avaliar o segundo argumento e
executar a divisão. Se o primeiro argumento for falso, somente o terceiro argumento
será avaliado e um 0 será retornado. Portanto, quando o divisor é 0, nenhuma tentativa
é feita para executar a divisão e nenhum erro é gerado. No entanto, como IIf não usa
a avaliação de curto-circuito, o segundo argumento é avaliado mesmo quando o
primeiro argumento é falso. Isso causa um erro de divisão por zero em tempo de
execução.

VB

number = 12

' When the divisor is not 0, both If and IIf return 4.

Dim divisor = 3

Console.WriteLine(If(divisor <> 0, number \ divisor, 0))


Console.WriteLine(IIf(divisor <> 0, number \ divisor, 0))

' When the divisor is 0, IIf causes a run-time error, but If does not.

divisor = 0

Console.WriteLine(If(divisor <> 0, number \ divisor, 0))


' Console.WriteLine(IIf(divisor <> 0, number \ divisor, 0))

Se o operador for chamado com dois


argumentos
O primeiro argumento para If pode ser omitido. Isso permite que o operador seja
chamado usando apenas dois argumentos. A lista a seguir se aplica somente quando o
operador If é chamado com dois argumentos.

Partes

Termo Definição

argument2 Obrigatórios. Object . Precisa ser um tipo de valor de referência ou anulável. Avaliado
e retornado quando ele é avaliado para qualquer outra coisa diferente de Nothing .

argument3 Obrigatórios. Object . Avaliado e retornado se argument2 for avaliado como Nothing .

Quando o argumento Boolean é omitido, o primeiro argumento precisa ser um tipo de


valor de referência ou anulável. Se o primeiro argumento for avaliado como Nothing , o
segundo argumento será avaliado e retornado. Em todos os outros casos, o valor do
primeiro argumento é retornado. O exemplo a seguir ilustra como essa avaliação
funciona:

VB

' Variable first is a nullable type.

Dim first? As Integer = 3

Dim second As Integer = 6

' Variable first <> Nothing, so its value, 3, is returned.

Console.WriteLine(If(first, second))

second = Nothing

' Variable first <> Nothing, so the value of first is returned again.

Console.WriteLine(If(first, second))

first = Nothing

second = 6

' Variable first = Nothing, so 6 is returned.

Console.WriteLine(If(first, second))

Confira também
IIf
Tipos de Valor Anulável
Nothing
Operador Is (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Compara duas variáveis de referência de objeto.

Sintaxe
VB

result = object1 Is object2

Partes
result

Obrigatórios. Qualquer valor Boolean .

object1

Obrigatórios. Qualquer nome Object .

object2

Obrigatórios. Qualquer nome Object .

Comentários
O operador Is determina se duas referências de objeto se referem ao mesmo objeto.
No entanto, ele não executa comparações de valor. Se object1 e object2 se referirem
exatamente à mesma instância de objeto, result será True ; se não, result será False .

7 Observação

A palavra-chave Is também é usada na Instrução Select...Case.

Exemplo
O exemplo a seguir usa o operador Is para comparar pares de referências de objeto.
Os resultados são atribuídos a um valor Boolean que representa se os dois objetos são
idênticos.
VB

Dim myObject As New Object

Dim otherObject As New Object

Dim yourObject, thisObject, thatObject As Object

Dim myCheck As Boolean

yourObject = myObject

thisObject = myObject

thatObject = otherObject

' The following statement sets myCheck to True.

myCheck = yourObject Is thisObject

' The following statement sets myCheck to False.

myCheck = thatObject Is thisObject

' The following statement sets myCheck to False.

myCheck = myObject Is thatObject

thatObject = myObject

' The following statement sets myCheck to True.

myCheck = thisObject Is thatObject

Como demonstra o exemplo anterior, você pode usar o operador Is para testar objetos
com associação antecipada e tardia.

Usar o operador TypeOf com o operador Is


O operador Is também pode ser usado com a palavra-chave TypeOf para fazer uma
expressão TypeOf ... Is , que testa se uma variável de objeto é compatível com um tipo
de dados. Por exemplo:

VB

If TypeOf sender Is Button Then

Confira também
Operador TypeOf
Operador IsNot
Operadores de comparação no Visual Basic
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operadores e Expressões
Operador IsFalse (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Determina se uma expressão é False .

Você não pode chamar IsFalse explicitamente no código, mas o compilador do Visual
Basic pode usá-lo para gerar código usando cláusulas AndAlso . Se você definir uma
classe ou estrutura e usar uma variável desse tipo em uma cláusula AndAlso , deverá
definir IsFalse nessa classe ou estrutura.

O compilador considera os operadores IsFalse e IsTrue como um par correspondente.


Isso significa que, se você definir um deles, também será necessário definir o outro.

7 Observação

O operador IsFalse pode ser sobrecarregado, o que significa que uma classe ou
estrutura pode redefinir o respectivo comportamento quando seu operando tem o
tipo dessa classe ou estrutura. Se o código usar esse operador em uma classe ou
estrutura, certifique-se de entender seu comportamento redefinido. Para obter
mais informações, confira Procedimentos de operador.

Exemplo
O exemplo de código a seguir define o contorno de uma estrutura que inclui definições
para os operadores IsFalse e IsTrue .

VB

Public Structure p

Dim a As Double

Public Shared Operator IsFalse(ByVal w As p) As Boolean

Dim b As Boolean

' Insert code to calculate IsFalse of w.

Return b

End Operator

Public Shared Operator IsTrue(ByVal w As p) As Boolean

Dim b As Boolean

' Insert code to calculate IsTrue of w.

Return b

End Operator

End Structure

Confira também
Operador IsTrue
Como definir um operador
Operador AndAlso
Operador IsNot (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Compara duas variáveis de referência de objeto.

Sintaxe
VB

result = object1 IsNot object2

Partes
result

Obrigatórios. Um valor Boolean .

object1

Obrigatórios. Qualquer variável ou expressão Object .

object2

Obrigatórios. Qualquer variável ou expressão Object .

Comentários
O operador IsNot determina se duas referências de objeto se referem a objetos
diferentes. No entanto, ele não executa comparações de valor. Se object1 e object2 se
referirem exatamente à mesma instância de objeto, result será False ; se não, result
será True .

IsNot é o oposto do operador Is . A vantagem de IsNot é que você pode evitar sintaxe
estranha com Not e Is , o que pode ser difícil de ler.

Você pode usar os operadores Is e IsNot para testar objetos associados


antecipadamente e com limite tardio.

Exemplo
O exemplo de código a seguir usa o operador Is e o operador IsNot para realizar a
mesma comparação.

VB

Dim o1, o2 As New Object

If Not o1 Is o2 Then MsgBox("o1 and o2 do not refer to the same instance.")

If o1 IsNot o2 Then MsgBox("o1 and o2 do not refer to the same instance.")

Usar o operador TypeOf com o operador IsNot


A partir do Visual Basic 14, você pode usar o operador TypeOf com o operador IsNot
para testar se um objeto não é compatível com um tipo de dados. Por exemplo:

VB

If TypeOf sender IsNot Button Then

Confira também
Operador Is
Operador TypeOf
Precedência do operador no Visual Basic
Como testar se dois objetos são iguais
Operador IsTrue (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Determina se uma expressão é True .

Você não pode chamar IsTrue explicitamente no código, mas o compilador do Visual
Basic pode usá-lo para gerar código usando cláusulas OrElse . Se você definir uma
classe ou estrutura e usar uma variável desse tipo em uma cláusula OrElse , deverá
definir IsTrue nessa classe ou estrutura.

O compilador considera os operadores IsTrue e IsFalse como um par correspondente.


Isso significa que, se você definir um deles, também será necessário definir o outro.

Uso do Compilador do IsTrue


Ao definir uma classe ou estrutura, você pode usar uma variável desse tipo em uma
instrução For , If , Else If ou While ou em uma cláusula When . Se você fizer isso, o
compilador exigirá um operador que converta o tipo em um valor Boolean para que ele
possa testar uma condição. Ele procura um operador adequado na seguinte ordem:

1. Um operador de conversão de expansão da classe ou da estrutura para Boolean .

2. Um operador de conversão de expansão da classe ou da estrutura para Boolean? .

3. O operador IsTrue na classe ou na estrutura.

4. Uma conversão de restrição para Boolean? que não envolve uma conversão de
Boolean para Boolean? .

5. Um operador de conversão de restrição da classe ou da estrutura para Boolean .

Se você não definiu nenhuma conversão para Boolean ou um operador IsTrue , o


compilador sinaliza um erro.

7 Observação

O operador IsTrue pode ser sobrecarregado, o que significa que uma classe ou
estrutura pode redefinir o respectivo comportamento quando seu operando tem o
tipo dessa classe ou estrutura. Se o código usar esse operador em uma classe ou
estrutura, certifique-se de entender seu comportamento redefinido. Para obter
mais informações, confira Procedimentos de operador.
Exemplo
O exemplo de código a seguir define o contorno de uma estrutura que inclui definições
para os operadores IsFalse e IsTrue .

VB

Public Structure p

Dim a As Double

Public Shared Operator IsFalse(ByVal w As p) As Boolean

Dim b As Boolean

' Insert code to calculate IsFalse of w.

Return b

End Operator

Public Shared Operator IsTrue(ByVal w As p) As Boolean

Dim b As Boolean

' Insert code to calculate IsTrue of w.

Return b

End Operator

End Structure

Confira também
Operador IsFalse
Como definir um operador
Operador OrElse
Operador Like (Visual Basic)
Artigo • 22/02/2023 • 6 minutos para o fim da leitura

Compara uma cadeia de caracteres com um padrão.

) Importante

Atualmente, o operador Like não é compatível com projetos .NET Core e .NET
Standard.

Sintaxe
VB

result = string Like pattern

Partes
result

Obrigatórios. Qualquer variável Boolean . O resultado é um valor Boolean que indica se


o string satisfaz ou não pattern .

string

Obrigatórios. Qualquer expressão de String .

pattern

Obrigatórios. Qualquer expressão String de acordo com as convenções de


correspondência de padrão descritas em "Comentários."

Comentários
Se o valor em string satisfizer o padrão contido em pattern , result será True . Se a
string não satisfizer o padrão, result será False . Se string e pattern forem cadeias de
caracteres vazias, o resultado será True .

Método de comparação
O comportamento do operador Like depende da Instrução Option Compare. O método
de comparação de cadeia de caracteres padrão para cada arquivo de origem é Option
Compare Binary .

Opções de padrão
Os padrões correspondentes internos fornecem uma ferramenta versátil para
comparações de cadeia de caracteres. Os recursos de padrões correspondentes
permitem que você faça a correspondência de cada caractere em string com um
caractere específico, curinga, uma lista de caracteres ou um intervalo deles. A tabela a
seguir mostra os caracteres permitidos em pattern e os respectivos correspondentes.

Caracteres em pattern Correspondências em string

? Qualquer caractere único

* Zero ou mais caracteres

# Qualquer dígito único (de 0 a 9)

[charlist] Qualquer caractere único em charlist

[!charlist] Qualquer caractere único que não esteja em charlist

Listas de caracteres
Um grupo de um ou mais caracteres ( charlist ) entre colchetes ( [ ] ) pode ser usado
para corresponder a qualquer caractere único em string e pode incluir praticamente
qualquer código de caractere, incluindo dígitos.

Um ponto de exclamação ( ! ) no início de charlist significa que uma correspondência


é feita se qualquer caractere exceto aqueles em charlist for encontrado em string .
Quando usado entre colchetes externos, o ponto de exclamação corresponde a si
mesmo.

Caracteres Especiais
Para corresponder aos colchete esquerdo de caracteres especiais ( [ ), ponto de
interrogação ( ? ), sinal de número ( # ) e asterisco ( * ), coloque-os entre colchetes. O
colchete direito ( ] ) não pode ser usado dentro de um grupo para corresponder a si
mesmo, mas pode ser usado fora de um grupo como um caractere individual.
A sequência de caracteres [] é considerada uma cadeia de caracteres de comprimento
zero ( "" ). No entanto, ele não pode fazer parte de uma lista de caracteres entre
colchetes. Se você quiser verificar se uma posição em string contém um de um grupo
de caracteres ou nenhum deles, você pode usar Like duas vezes. Para obter um
exemplo, confira Como fazer a correspondência de uma cadeia de caracteres com um
padrão.

Intervalos de caracteres
Usando um hífen ( – ) para separar os limites inferior e superior do intervalo, charlist
pode especificar um intervalo de caracteres. Por exemplo, [A–Z] resultará em uma
correspondência se a posição do caractere correspondente em string contiver
qualquer caractere dentro do intervalo A – Z , e [!H–L] resultará em uma
correspondência se a posição do caractere correspondente contiver qualquer caractere
fora do intervalo H – L .

Quando você especifica um intervalo de caracteres, eles devem aparecer em ordem de


classificação crescente, ou seja, do mais baixo ao mais alto. Assim, [A–Z] é um padrão
válido, mas [Z–A] não é.

Vários intervalos de caracteres


Para especificar vários intervalos para a mesma posição de caractere, coloque-os dentro
dos mesmos colchetes sem delimitadores. Por exemplo, [A–CX–Z] resultará em uma
correspondência se a posição do caractere correspondente em string contiver
qualquer caractere dentro do intervalo A – C ou do intervalo X – Z .

Uso do Hífen
Um hífen ( – ) pode aparecer no início (após um ponto de exclamação, se houver) ou no
final de charlist para corresponder a si mesmo. Em qualquer outro local, o hífen
identifica um intervalo de caracteres delimitado pelos caracteres em cada lado dele.

Sequência de agrupamento
O significado de um intervalo especificado depende da ordem dos caracteres em tempo
de execução, conforme determinado por Option Compare e da configuração de
localidade do sistema em que o código está sendo executado. Com Option Compare
Binary , o intervalo [A–E] corresponde a A , B , C , D e E . Com Option Compare Text , [A–
E] ele corresponde a A , a , À , à , B , b , C , c , D , d , E e e . O intervalo não corresponde

a Ê ou ê porque os caracteres acentuados são agrupados após os caracteres não


acentuados na ordem de classificação.

Caracteres de dígrafo
Em alguns idiomas, há caracteres alfabéticos que representam dois caracteres
separados. Por exemplo, várias linguagens usam o caractere æ para representar a e e
quando eles aparecem juntos. O operador Like reconhece que o caractere de dígrafo
único e os dois caracteres individuais são equivalentes.

Quando uma linguagem que usa um caractere de dígrafo é especificada nas


configurações de localidade do sistema, uma ocorrência do caractere de dígrafo único
em um pattern ou string corresponde à sequência equivalente de dois caracteres na
outra cadeia de caracteres. Da mesma forma, um caractere de dígrafo em pattern entre
colchetes (por si só, em uma lista ou em um intervalo) corresponde à sequência
equivalente de dois caracteres em string .

Sobrecarga
O operador Like pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando um operando tem o tipo dessa classe ou
estrutura. Se o código usar esse operador em uma classe ou estrutura, certifique-se de
entender seu comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Exemplo
Este exemplo usa o operador Like para comparar cadeias de caracteres com vários
padrões. Os resultados entram em uma variável Boolean que indica se cada cadeia de
caracteres satisfaz o padrão.

VB

Dim testCheck As Boolean

' The following statement returns True (does "F" satisfy "F"?)

testCheck = "F" Like "F"

' The following statement returns False for Option Compare Binary

' and True for Option Compare Text (does "F" satisfy "f"?)

testCheck = "F" Like "f"

' The following statement returns False (does "F" satisfy "FFF"?)

testCheck = "F" Like "FFF"

' The following statement returns True (does "aBBBa" have an "a" at the

' beginning, an "a" at the end, and any number of characters in

' between?)

testCheck = "aBBBa" Like "a*a"

' The following statement returns True (does "F" occur in the set of

' characters from "A" through "Z"?)

testCheck = "F" Like "[A-Z]"

' The following statement returns False (does "F" NOT occur in the

' set of characters from "A" through "Z"?)

testCheck = "F" Like "[!A-Z]"

' The following statement returns True (does "a2a" begin and end with

' an "a" and have any single-digit number in between?)

testCheck = "a2a" Like "a#a"

' The following statement returns True (does "aM5b" begin with an "a",

' followed by any character from the set "L" through "P", followed

' by any single-digit number, and end with any character NOT in

' the character set "c" through "e"?)

testCheck = "aM5b" Like "a[L-P]#[!c-e]"

' The following statement returns True (does "BAT123khg" begin with a

' "B", followed by any single character, followed by a "T", and end

' with zero or more characters of any type?)

testCheck = "BAT123khg" Like "B?T*"

' The following statement returns False (does "CAT123khg"?) begin with

' a "B", followed by any single character, followed by a "T", and

' end with zero or more characters of any type?)

testCheck = "CAT123khg" Like "B?T*"

Confira também
InStr
StrComp
Operadores de comparação
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Instrução Option Compare
Operadores e Expressões
Como corresponder uma cadeia de caracteres a um padrão
Operador Mod (Visual Basic)
Artigo • 22/02/2023 • 3 minutos para o fim da leitura

Divide dois números e retorna apenas o resto.

Sintaxe
VB

result = number1 Mod number2

Partes
result

Obrigatórios. Qualquer variável ou propriedade numérica.

number1

Obrigatórios. Qualquer expressão numérica.

number2

Obrigatórios. Qualquer expressão numérica.

Tipos com suporte


Todos os tipos numéricos. Isso inclui os tipos de ponto flutuante e sem sinal e Decimal .

Result
O resultado é o restante após number1 ser dividido por number2 . Por exemplo, a
expressão 14 Mod 4 é avaliada como 2.

7 Observação

Há uma diferença entre o restante e o módulo em matemática, com resultados


diferentes para números negativos. O operador Mod no Visual Basic, o operador
.NET Framework op_Modulus e a instrução IL rem subjacente executam uma
operação restante.
O resultado de uma operação Mod retém o sinal do dividendo, number1 , e pode ser
positivo ou negativo. O resultado está sempre no intervalo (- number2 , number2 ),
exclusivo. Por exemplo:

VB

Public Module Example

Public Sub Main()

Console.WriteLine($" 8 Mod 3 = {8 Mod 3}")

Console.WriteLine($"-8 Mod 3 = {-8 Mod 3}")

Console.WriteLine($" 8 Mod -3 = {8 Mod -3}")

Console.WriteLine($"-8 Mod -3 = {-8 Mod -3}")

End Sub

End Module

' The example displays the following output:

' 8 Mod 3 = 2

' -8 Mod 3 = -2

' 8 Mod -3 = 2

' -8 Mod -3 = -2

Comentários
Se number1 ou number2 for um valor de ponto flutuante, o restante do ponto flutuante
da divisão será retornado. O tipo de dados do resultado é o menor tipo de dados que
pode conter todos os valores possíveis resultantes da divisão com os tipos de dados de
number1 e number2 .

Se number1 ou number2 for avaliada como Nothing, ela será tratada como zero.

Os operadores relacionados incluem o seguinte:

O operador \ (Visual Basic) retorna o quociente inteiro de uma divisão. Por


exemplo, a expressão 14 \ 4 é avaliada como 3.

O operador / (Visual Basic) retorna o quociente completo, incluindo o restante,


como um número de ponto flutuante. Por exemplo, a expressão 14 / 4 é avaliada
como 3,5.

Tentativa de divisão por zero


Se number2 for avaliado como zero, o comportamento do operador Mod depende do
tipo de dados dos operandos:
Uma divisão integral lança uma exceção DivideByZeroException se number2 não
puder ser determinado em tempo de compilação e gera um erro em tempo de
compilação BC30542 Division by zero occurred while evaluating this expression
se number2 for avaliado como zero em tempo de compilação.
Uma divisão de ponto flutuante retorna Double.NaN.

Fórmula equivalente
A expressão a Mod b é equivalente a qualquer uma das seguintes fórmulas:

a - (b * (a \ b))

a - (b * Fix(a / b))

Imprecisão de ponto flutuante


Quando você trabalha com números de ponto flutuante, tenha em mente que eles nem
sempre têm uma representação decimal precisa na memória. Isso pode levar a
resultados inesperados de determinadas operações, como a comparação de valores e o
operador Mod . Para obter mais informações, consulte Tipos de dados de solução de
problemas.

Sobrecarga
O operador Mod pode ser sobrecarregado, o que significa que uma classe ou uma
estrutura pode redefinir o comportamento. Se o código aplicar Mod a uma instância de
uma classe ou estrutura que inclui essa sobrecarga, entenda o comportamento
redefinido. Para obter mais informações, confira Procedimentos de operador.

Exemplo 1
O exemplo a seguir usa o operador Mod para dividir dois números e retornar apenas o
restante. Se um dos números for um número de ponto flutuante, o resultado será um
número de ponto flutuante que representa o restante.

VB

Debug.WriteLine(10 Mod 5)

' Output: 0

Debug.WriteLine(10 Mod 3)

' Output: 1

Debug.WriteLine(-10 Mod 3)

' Output: -1

Debug.WriteLine(12 Mod 4.3)

' Output: 3.4

Debug.WriteLine(12.6 Mod 5)

' Output: 2.6

Debug.WriteLine(47.9 Mod 9.35)

' Output: 1.15

Exemplo 2
O exemplo a seguir demonstra a possível imprecisão dos operandos de ponto flutuante.
Na primeira instrução, os operandos são Double , e 0,2 é uma fração binária
infinitamente repetida com um valor armazenado de 0,20000000000000001. Na
segunda instrução, o caractere de tipo literal D força ambos os operandos para Decimal
e 0,2 tem uma representação precisa.

VB

firstResult = 2.0 Mod 0.2

' Double operation returns 0.2, not 0.

secondResult = 2D Mod 0.2D

' Decimal operation returns 0.

Confira também
Int
Fix
Operadores aritméticos
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Solução de problemas de tipos de dados
Operadores aritméticos no Visual Basic
Operador \ (Visual Basic)
Operador NameOf − Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O operador NameOf obtém o nome de uma variável, tipo ou membro como uma cadeia
de caracteres constante:

VB

Console.WriteLine(NameOf(System.Collections.Generic)) ' output: Generic

Console.WriteLine(NameOf(List(Of Integer))) ' output: List

Console.WriteLine(NameOf(List(Of Integer).Count)) ' output: Count

Console.WriteLine(NameOf(List(Of Integer).Add)) ' output: Add

Dim numbers As New List(Of Integer) From { 1, 2, 3 }

Console.WriteLine(NameOf(numbers)) ' output: numbers

Console.WriteLine(NameOf(numbers.Count)) ' output: Count

Console.WriteLine(NameOf(numbers.Add)) ' output: Add

Como mostra o exemplo anterior, no caso de um tipo e um namespace, o nome


produzido geralmente não é totalmente qualificado.

O operador NameOf é avaliado no tempo de compilação e não tem efeitos no tempo de


execução.

Você pode usar o operador NameOf para tornar o código de verificação de argumentos
mais passível de manutenção:

VB

Private _name As String

Public Property Name As String

Get

Return _name

End Get

Set

If value Is Nothing Then

Throw New ArgumentNullException(NameOf(value), $"{NameOf(name)}


cannot be null.")

End If

End Set

End Property

O operador NameOf está disponível no Visual Basic 14 e posterior.


Confira também
Referência da linguagem Visual Basic
Operadores (Visual Basic)
Operador New (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Introduz uma cláusula New para criar uma nova instância de objeto, especifica uma
restrição de construtor em um parâmetro de tipo ou identifica um procedimento Sub
como um construtor de classe.

Comentários
Em uma declaração ou instrução de atribuição, uma cláusula New deve especificar uma
classe definida da qual a instância pode ser criada. Isso significa que a classe deve expor
um ou mais construtores que o código de chamada pode acessar.

Você pode usar uma cláusula New em uma instrução de declaração ou de atribuição.
Quando a instrução é executada, ela chama o construtor apropriado da classe
especificada, passando todos os argumentos fornecidos. O exemplo a seguir demonstra
isso criando instâncias de uma classe Customer que tem dois construtores, um que não
usa parâmetros e outro que usa um parâmetro de cadeia de caracteres:

VB

' For customer1, call the constructor that takes no arguments.

Dim customer1 As New Customer()

' For customer2, call the constructor that takes the name of the

' customer as an argument.

Dim customer2 As New Customer("Blue Yonder Airlines")

' For customer3, declare an instance of Customer in the first line

' and instantiate it in the second.

Dim customer3 As Customer

customer3 = New Customer()

' With Option Infer set to On, the following declaration declares

' and instantiates a new instance of Customer.

Dim customer4 = New Customer("Coho Winery")

Como as matrizes são classes, New pode criar uma nova instância de matriz, conforme
mostrado no seguinte exemplo:

VB

Dim intArray1() As Integer

intArray1 = New Integer() {1, 2, 3, 4}

Dim intArray2() As Integer = {5, 6}

' The following example requires that Option Infer be set to On.

Dim intArray3() = New Integer() {6, 7, 8}

O CLR (Common Language Runtime) gerará um erro OutOfMemoryException se não


houver memória suficiente para criar a nova instância.

7 Observação

A palavra-chave New também é usada em listas de parâmetros de tipo para


especificar que o tipo fornecido deve expor um construtor sem parâmetros
acessível. Para obter mais informações sobre parâmetros e restrições de tipo,
confira Lista de Tipos.

Para criar um procedimento de construtor para uma classe, defina o nome de um


procedimento Sub como a palavra-chave New . Para obter mais informações, confira
Tempo de vida do objeto: como os objetos são criados e destruídos.

A palavra-chave New pode ser usada nestes dois contextos:

Instrução Dim
Of
Instrução Sub

Confira também
OutOfMemoryException
Palavras-chave
Lista de Tipos
Tipos genéricos no Visual Basic
Tempo de vida do objeto: como os objetos são criados e destruídos
Operador Not (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Executa uma negação lógica em uma expressão Boolean ou uma negação bit a bit em
uma expressão numérica.

Sintaxe
VB

result = Not expression

Partes
result

Obrigatórios. Qualquer Boolean ou expressão numérica.

expression

Obrigatórios. Qualquer Boolean ou expressão numérica.

Comentários
Para expressões Boolean , a tabela a seguir ilustra como result é determinado.

Se expression for O valor de result será

True False

False True

Para expressões numéricas, o operador Not inverte os valores de bit de qualquer


expressão numérica e define o bit correspondente em result de acordo com a tabela a
seguir.

Se o bit em expression for O bit em result será

1 0

0 1
7 Observação

Como os operadores lógicos e bit a bit têm uma precedência menor do que outros
operadores aritméticos e relacionais, todas as operações bit a bit devem ser
colocadas entre parênteses para garantir execução precisa.

Tipos de dados
Para uma negação booliana, o tipo de dados do resultado será Boolean . Para uma
negação bit a bit, o tipo de dados de resultado é o mesmo que o de expression . No
entanto, se a expressão for Decimal , o resultado será Long .

Sobrecarga
O operador Not pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando seu operando tem o tipo dessa classe ou
estrutura. Se o código usar esse operador em uma classe ou estrutura, certifique-se de
entender seu comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Exemplo 1
O exemplo a seguir usa o operador Not para executar negação lógica em uma
expressão Boolean . O resultado é um valor Boolean que representa o inverso do valor
da expressão.

VB

Dim a As Integer = 10

Dim b As Integer = 8

Dim c As Integer = 6

Dim firstCheck, secondCheck As Boolean

firstCheck = Not (a > b)

secondCheck = Not (b > a)

O exemplo anterior produz resultados de False e True , respectivamente.

Exemplo 2
O exemplo a seguir usa o operador Not para executar a negação lógica nos bits
individuais de uma expressão numérica. O bit no padrão de resultado é definido como o
inverso do bit correspondente no padrão de operando, incluindo o bit de sinal.

VB

Dim a As Integer = 10

Dim b As Integer = 8

Dim c As Integer = 6

Dim firstPattern, secondPattern, thirdPattern As Integer


firstPattern = (Not a)

secondPattern = (Not b)
thirdPattern = (Not c)

O exemplo anterior produz resultados de –11, –9 e –7, respectivamente.

Confira também
Operadores lógicos/bit a bit (Visual Basic)
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operadores lógicos e bit a bit no Visual Basic
Operador Or (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Desenvolve uma disjunção lógica em duas expressões Boolean ou uma disjunção bit a
bit em duas expressões numéricas.

Sintaxe
VB

result = expression1 Or expression2

Partes
result

Obrigatórios. Qualquer Boolean ou expressão numérica. Para a comparação Boolean ,


result é a disjunção lógica inclusiva de dois valores Boolean . Para operações bit a bit,

result é um valor numérico que representa a disjunção inclusiva bit a bit de dois
padrões de bit numéricos.

expression1

Obrigatórios. Qualquer Boolean ou expressão numérica.

expression2

Obrigatórios. Qualquer Boolean ou expressão numérica.

Comentários
Para comparação Boolean , result é False se e somente se ambos expression1 e
expression2 resultarem em False . A tabela a seguir ilustra como result é

determinado.

Se expression1 for E expression2 for O valor de result é

True True True

True False True

False True True


Se expression1 for E expression2 for O valor de result é

False False False

7 Observação

Em uma comparação Boolean , o operador Or sempre avalia ambas as expressões,


o que pode incluir a realização de chamadas de procedimento. O Operador OrElse
executa um curto-circuito, o que significa que, se expression1 for True ,
expression2 não será avaliado.

Para operações bit a bit, o operador Or executa uma comparação bit a bit dos bits
posicionados de forma idêntica em duas expressões numéricas e define o bit
correspondente em result de acordo com a tabela a seguir.

Se o bit em expression1 for E o bit em expression2 for O bit em result é

1 1 1

1 0 1

0 1 1

0 0 0

7 Observação

Como os operadores lógicos e bit a bit têm uma precedência menor do que outros
operadores aritméticos e relacionais, todas as operações bit a bit devem ser
colocadas entre parênteses para garantir execução precisa.

Tipos de dados
Se os operandos consistirem em uma expressão Boolean e uma expressão numérica, o
Visual Basic converterá a expressão Boolean em um valor numérico (–1 para True e 0
para False ) e executará uma operação bit a bit.

Para uma comparação Boolean , o tipo de dados do resultado será Boolean . Para uma
comparação bit a bit, o tipo de dados de resultado será um tipo numérico apropriado
para os tipos de dados de expression1 e expression2 . Consulte a tabela "Comparações
relacionais e bit a bit" nos Tipos de dados de resultados do operador.
Sobrecarga
O operador Or pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando um operando tem o tipo dessa classe ou
estrutura. Se o código usar esse operador em uma classe ou estrutura, certifique-se de
entender seu comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Exemplo 1
O exemplo a seguir usa o operador Or para executar uma disjunção lógica inclusiva em
duas expressões. O resultado é um valor Boolean que representa se uma das duas
expressões é True .

VB

Dim a As Integer = 10

Dim b As Integer = 8

Dim c As Integer = 6

Dim firstCheck, secondCheck, thirdCheck As Boolean

firstCheck = a > b Or b > c

secondCheck = b > a Or b > c

thirdCheck = b > a Or c > b

O exemplo anterior produz resultados de True , True e False , respectivamente.

Exemplo 2
O exemplo a seguir usa o operador Or para executar a disjunção inclusiva lógica nos
bits individuais de duas expressões numéricas. O bit no padrão de resultado será
definido se qualquer um dos bits correspondentes nos operandos for definido como 1.

VB

Dim a As Integer = 10

Dim b As Integer = 8

Dim c As Integer = 6

Dim firstPattern, secondPattern, thirdPattern As Integer


firstPattern = (a Or b)

secondPattern = (a Or c)

thirdPattern = (b Or c)

O exemplo anterior produz resultados de 10, 14 e 14, respectivamente.


Confira também
Operadores lógicos/bit a bit (Visual Basic)
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operador OrElse
Operadores lógicos e bit a bit no Visual Basic
Operador OrElse (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Realiza uma disjunção lógica inclusiva de curto-circuito em duas expressões.

Sintaxe
VB

result = expression1 OrElse expression2

Partes
result

Obrigatórios. Qualquer expressão de Boolean .

expression1

Obrigatórios. Qualquer expressão de Boolean .

expression2

Obrigatórios. Qualquer expressão de Boolean .

Comentários
Uma operação lógica será considerada de curto-circuito se o código compilado puder
ignorar a avaliação de uma expressão, a depender do resultado de outra expressão. Se o
resultado da primeira expressão avaliada determinar o resultado final da operação, não
será necessário avaliar a segunda expressão, pois ela não poderá alterar o resultado
final. O curto-circuito pode melhorar o desempenho se a expressão ignorada for
complexa ou se envolver chamadas de procedimento.

Se uma das expressões ou as duas forem avaliadas como True , então result retornará
True . A tabela a seguir ilustra como result é determinado.

Se expression1 for E expression2 for O valor de result será

True (não avaliado) True

False True True


Se expression1 for E expression2 for O valor de result será

False False False

Tipos de dados
O operador OrElse é definido apenas para o tipo de dados booliano. O Visual Basic
converte cada operando conforme necessário para Boolean antes de avaliar a
expressão. Se você atribuir o resultado a um tipo numérico, o Visual Basic o converterá
de Boolean para esse tipo, de modo que False se torne 0 e True se torne -1 .
Para
obter mais informações, consulte Conversões de tipo booliano.

Sobrecarga
O operador Or e o operador IsTrue podem ser sobrecarregados, o que significa que uma
classe ou estrutura pode redefinir seu comportamento quando um operando tiver o
tipo dessa classe ou estrutura. Sobrecarregar os operadores Or e IsTrue afeta o
comportamento do operador OrElse . Se o seu código usar OrElse em uma classe ou
estrutura que sobrecarrega Or e IsTrue , certifique-se de entender o comportamento
redefinido. Para obter mais informações, confira Procedimentos de operador.

Exemplo 1
O exemplo a seguir usa o operador OrElse para executar uma disjunção lógica em duas
expressões. O resultado é um valor Boolean que representa se uma das duas expressões
é verdadeira. Se a primeira expressão for True , a segunda não será avaliada.

VB

Dim a As Integer = 10

Dim b As Integer = 8

Dim c As Integer = 6

Dim firstCheck, secondCheck, thirdCheck As Boolean

firstCheck = a > b OrElse b > c

secondCheck = b > a OrElse b > c

thirdCheck = b > a OrElse c > b

O exemplo anterior produz resultados de True , True e False , respectivamente. No


cálculo de firstCheck , a segunda expressão não é avaliada porque a primeira já está
como True . No entanto, a segunda expressão é avaliada no cálculo de secondCheck .
Exemplo 2
O exemplo a seguir mostra uma instrução If ... Then contendo duas chamadas de
procedimento. Se a primeira chamada retornar True , o segundo procedimento não será
chamado. Isso poderá produzir resultados inesperados se o segundo procedimento
executar tarefas importantes que sempre devem ser executadas quando esta seção do
código for executada.

VB

If testFunction(5) = True OrElse otherFunction(4) = True Then

' If testFunction(5) is True, otherFunction(4) is not called.

' Insert code to be executed.


End If

Confira também
Operadores lógicos/bit a bit (Visual Basic)
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operador Or
Operador IsTrue
Operadores lógicos e bit a bit no Visual Basic
Subexpressão (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Declara os parâmetros e o código que definem uma expressão lambda de sub-rotina.

Sintaxe
VB

Sub ( [ parameterlist ] ) statement

- or -

Sub ( [ parameterlist ] )

[ statements ]

End Sub

Partes
Termo Definição

parameterlist Opcional. Uma lista de nomes de variáveis locais que representam os parâmetros
do procedimento. Os parênteses devem estar presentes mesmo quando a lista
estiver vazia. Para obter mais informações, confira Lista de parâmetros.

statement Obrigatórios. Uma única instrução.

statements Obrigatórios. Uma lista de instruções.

Comentários
Uma expressão lambda é uma sub-rotina que não tem um nome e que executa uma ou
mais instruções. Você pode usar uma expressão lambda em qualquer lugar em que
possa usar um tipo delegado, exceto como um argumento para RemoveHandler . Para
obter mais informações sobre delegados e o uso de expressões lambda com delegados,
consulte Instrução Delegate e Conversão de delegado reduzida.

Sintaxe da expressão lambda


A sintaxe de uma expressão lambda é semelhante à de uma sub-rotina padrão. As
diferenças são:
Uma expressão lambda não tem um nome.

Uma expressão lambda não pode ter um modificador, como Overloads ou


Overrides .

O corpo de uma expressão lambda de linha única deve ser uma instrução, não
uma expressão. O corpo pode consistir em uma chamada para um sub-
procedimento, mas não uma chamada para um procedimento Function.

Em uma expressão lambda, todos os parâmetros devem ter tipos de dados


especificados ou todos os parâmetros devem ser inferidos.

Parâmetros ParamArray e opcionais não são permitidos em expressões lambda.

Parâmetros genéricos não são permitidos em expressões lambda.

Exemplo
A seguir está um exemplo de uma expressão lambda que grava um valor no console. O
exemplo mostra a sintaxe de expressão lambda de linha única e de várias linhas para
uma sub-rotina. Para obter mais exemplos, confira Expressões lambda.

VB

Dim writeline1 = Sub(x) Console.WriteLine(x)

Dim writeline2 = Sub(x)

Console.WriteLine(x)

End Sub

' Write "Hello".

writeline1("Hello")

' Write "World"

writeline2("World")

Confira também
Instrução Sub
Expressões Lambda
Operadores e Expressões
Instruções
Conversão de delegado reduzida
Operador TryCast (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Apresenta uma operação de conversão de tipo que não gera uma exceção.

Comentários
Se uma tentativa de conversão falhar, CType e DirectCast lançam um erro
InvalidCastException. Isso pode afetar negativamente o desempenho do aplicativo.
TryCast retorna Nothing, de modo que, em vez de lidar com uma possível exceção,

você só precisa testar o resultado retornado em relação a Nothing .

Você usa a palavra-chave TryCast semelhante à maneira como usa a Função CType e a
palavra-chave Operador DirectCast. Você fornece uma expressão como o primeiro
argumento e um tipo para convertê-la como o segundo argumento. O TryCast opera
apenas em tipos de referência, como classes e interfaces. Ele requer uma relação de
herança ou implementação entre os dois tipos. Isso significa que um tipo deve herdar
de ou implementar o outro.

Erros e falhas
O TryCast gerará um erro do compilador se detectar que não existe nenhuma relação
de herança ou implementação. Mas a falta de um erro do compilador não garante uma
conversão bem-sucedida. Se a conversão desejada estiver estreitando, ela poderá falhar
em tempo de execução. Se isso acontecer, TryCast retornará Nothing.

Palavras-chave de conversão
Uma comparação das palavras-chave de conversão de tipo é a seguinte.

Palavra- Tipos de Relação de argumento Falha em tempo de


chave dados execução

Função Qualquer A conversão de expansão ou de restrição Gera


CType tipo de deve ser definida entre os dois tipos de InvalidCastException
dados dados

Operador Qualquer Um tipo deve herdar ou implementar o outro Gera


DirectCast tipo de tipo InvalidCastException
dados
Palavra- Tipos de Relação de argumento Falha em tempo de
chave dados execução

TryCast Apenas tipos Um tipo deve herdar ou implementar o outro Retorna Nada
de referência tipo

Exemplo
O exemplo a seguir mostra como usar TryCast .

VB

Function PrintTypeCode(ByVal obj As Object) As String

Dim objAsConvertible As IConvertible = TryCast(obj, IConvertible)

If objAsConvertible Is Nothing Then

Return obj.ToString() & " does not implement IConvertible"


Else

Return "Type code is " & objAsConvertible.GetTypeCode()

End If

End Function

Confira também
Conversões de Widening e Narrowing
Conversões implícitas e explícitas
Operador TypeOf (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Verifica se o tipo de runtime do resultado de uma expressão é compatível com o tipo


especificado.

Sintaxe
VB

result = TypeOf objectexpression Is typename

VB

result = TypeOf objectexpression IsNot typename

Partes
result

Retornou. Um valor Boolean .

objectexpression

Obrigatórios. Qualquer expressão avaliada como um tipo de referência.

typename

Obrigatórios. Qualquer nome de tipo de dados.

Comentários
O operador TypeOf determina se o tipo de tempo de execução objectexpression é
compatível com typename . A compatibilidade depende da categoria de tipo de
typename . A tabela a seguir mostra como a compatibilidade é determinada.

Categoria de tipo de Critério de compatibilidade


typename

Classe objectexpression é do tipo typename ou herda de typename

Estrutura objectexpression é do tipo typename


Categoria de tipo de Critério de compatibilidade
typename

Interface objectexpression implementa typename ou herda de uma classe que


implementa typename

Se o tipo de tempo de execução de objectexpression atender ao critério de


compatibilidade, result será True . Caso contrário, result é False . Se
objectexpression for nulo, então TypeOf ... Is retornará False e ... IsNot retornará True .

TypeOf é sempre usado com a palavra-chave Is para construir uma expressão

TypeOf ... Is ou com a palavra-chave IsNot para construir uma expressão

TypeOf ... IsNot .

Exemplo
O exemplo a seguir usa expressões TypeOf ... Is para testar a compatibilidade de tipo de
duas variáveis de referência de objeto com vários tipos de dados.

VB

Dim refInteger As Object = 2

MsgBox("TypeOf Object[Integer] Is Integer? " & TypeOf refInteger Is Integer)

MsgBox("TypeOf Object[Integer] Is Double? " & TypeOf refInteger Is Double)

Dim refForm As Object = New System.Windows.Forms.Form

MsgBox("TypeOf Object[Form] Is Form? " & TypeOf refForm Is


System.Windows.Forms.Form)

MsgBox("TypeOf Object[Form] Is Label? " & TypeOf refForm Is


System.Windows.Forms.Label)

MsgBox("TypeOf Object[Form] Is Control? " & TypeOf refForm Is


System.Windows.Forms.Control)

MsgBox("TypeOf Object[Form] Is IComponent? " & TypeOf refForm Is


System.ComponentModel.IComponent)

A variável refInteger tem um tipo de tempo de execução de Integer . Ela é compatível


com Integer , mas não com Double . A variável refForm tem um tipo de tempo de
execução de Form. Ela compatível com Form porque esse é o tipo dela, com Control
porque Form herda de Control e com IComponent porque Form herda de Component,
que implementa IComponent. No entanto, refForm não é compatível com Label.

Confira também
Operador Is
Operador IsNot
Operadores de comparação no Visual Basic
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operadores e Expressões
Operador Xor (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Desenvolve uma exclusão lógica em duas expressões Boolean ou uma exclusão bit a bit
em duas expressões numéricas.

Sintaxe
VB

result = expression1 Xor expression2

Partes
result

Obrigatórios. Qualquer Boolean ou variável numérica. Para uma comparação booliana,


result é a exclusão lógica (disjunção lógica exclusiva) de dois valores Boolean . Para

operações bit a bit, result é um valor numérico que representa a exclusão bit a bit
(disjunção bit a bit exclusiva) dos dois padrões de bits numéricos.

expression1

Obrigatórios. Qualquer Boolean ou expressão numérica.

expression2

Obrigatórios. Qualquer Boolean ou expressão numérica.

Comentários
Para comparação booleana, result é True se e somente se exatamente um de
expression1 e expression2 for avaliado como True . Ou seja, se e somente se

expression1 e expression2 forem avaliados para valores opostos de Boolean . A tabela a


seguir ilustra como result é determinado.

Se expression1 for E expression2 for O valor de result é

True True False

True False True


Se expression1 for E expression2 for O valor de result é

False True True

False False False

7 Observação

Em uma comparação booliana, o operador Xor sempre avalia ambas as expressões,


o que pode incluir a realização de chamadas de procedimento. Não há nenhum
equivalente de curto-circuito para Xor , porque o resultado sempre depende de
ambos os operandos. Para operadores lógicos de curto-circuito, confira Operador
AndAlso e Operador OrElse.

Para operações bit a bit, o operador Xor executa uma comparação bit a bit dos bits
posicionados de forma idêntica em duas expressões numéricas e define o bit
correspondente em result de acordo com a tabela a seguir.

Se o bit em expression1 for E o bit em expression2 for O bit em result é

1 1 0

1 0 1

0 1 1

0 0 0

7 Observação

Como os operadores lógicos e bit a bit têm uma precedência menor do que outros
operadores aritméticos e relacionais, todas as operações bit a bit devem ser
colocadas entre parênteses para garantir execução precisa.

Por exemplo, 5 Xor 3 é 6. Para ver por que isso é assim, converta 5 e 3 nas respectivas
representações binárias, 101 e 011. Em seguida, use a tabela anterior para determinar
que 101 Xor 011 é 110, que é a representação binária do número decimal 6.

Tipos de dados
Se os operandos consistirem em uma expressão Boolean e uma expressão numérica, o
Visual Basic converterá a expressão Boolean em um valor numérico (–1 para True e 0
para False ) e executará uma operação bit a bit.

Para uma comparação Boolean , o tipo de dados do resultado será Boolean . Para uma
comparação bit a bit, o tipo de dados de resultado será um tipo numérico apropriado
para os tipos de dados de expression1 e expression2 . Consulte a tabela "Comparações
relacionais e bit a bit" nos Tipos de dados de resultados do operador.

Sobrecarga
O operador Xor pode ser sobrecarregado, o que significa que uma classe ou estrutura
pode redefinir seu comportamento quando um operando tem o tipo dessa classe ou
estrutura. Se o código usar esse operador em uma classe ou estrutura, certifique-se de
entender o comportamento redefinido. Para obter mais informações, confira
Procedimentos de operador.

Exemplo 1
O exemplo a seguir usa o operador Xor para executar a exclusão lógica (disjunção
lógica exclusiva) em duas expressões. O resultado é um valor Boolean que representa se
exatamente uma das expressões é True .

VB

Dim a As Integer = 10

Dim b As Integer = 8

Dim c As Integer = 6

Dim firstCheck, secondCheck, thirdCheck As Boolean

firstCheck = a > b Xor b > c

secondCheck = b > a Xor b > c

thirdCheck = b > a Xor c > b

O exemplo anterior produz resultados de False , True e False , respectivamente.

Exemplo 2
O exemplo a seguir usa o operador Xor para executar a exclusão lógica (disjunção
lógica exclusiva) nos bits individuais de duas expressões numéricas. O bit no padrão de
resultado é definido se exatamente um dos bits correspondentes nos operandos for
definido como 1.
VB

Dim a As Integer = 10 ' 1010 in binary

Dim b As Integer = 8 ' 1000 in binary

Dim c As Integer = 6 ' 0110 in binary

Dim firstPattern, secondPattern, thirdPattern As Integer


firstPattern = (a Xor b) ' 2, 0010 in binary

secondPattern = (a Xor c) ' 12, 1100 in binary

thirdPattern = (b Xor c) ' 14, 1110 in binary

O exemplo anterior produz resultados de 2, 12 e 14, respectivamente.

Confira também
Operadores lógicos/bit a bit (Visual Basic)
Precedência do operador no Visual Basic
Operadores Listados por Funcionalidade
Operadores lógicos e bit a bit no Visual Basic
Propriedades (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Esta página lista as propriedades que são membros dos módulos do Visual Basic. Outras
propriedades que são membros de objetos específicos do Visual Basic são listadas em
Objetos.

Propriedades do Visual Basic


Propriedade Descrição

DateString Retorna ou define um valor String que representa a data atual de


acordo com o sistema.

Now Retorna um valor de Date que contém a data e hora atual de acordo
com seu sistema.

ScriptEngine Retorna um String que representa o runtime em uso no momento.

ScriptEngineBuildVersion Retorna um Integer que contém o número de versão de build do


runtime atualmente em uso.

ScriptEngineMajorVersion Retorna um Integer que contém o número de versão principal do


runtime atualmente em uso.

ScriptEngineMinorVersion Retorna um Integer que contém o número de versão secundária do


runtime atualmente em uso.

TimeOfDay Retorna ou define um valor de Date que representa a hora atual do


dia, de acordo com seu sistema.

Timer Retorna um valor Double que representa o número de segundos


decorridos desde a meia-noite.

TimeString Retorna ou define um valor de String que representa a hora atual do


dia de acordo com o sistema.

Today Retorna ou define um valor Date que contém a data atual de acordo
com o sistema.

Confira também
Referência da linguagem Visual Basic
Consultas (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O Visual Basic permite que você crie expressões LINQ (Consulta integrada à linguagem)
em seu código.

Nesta seção
Cláusula Aggregate

Descreve a cláusula Aggregate , que aplica uma ou mais funções de agregação a uma
coleção.

Cláusula Distinct

Descreve a cláusula Distinct , que restringe os valores da variável de intervalo atual


para eliminar valores duplicados nos resultados da consulta.

Cláusula From

Descreve a cláusula From , que especifica uma coleção e uma variável de intervalo para
uma consulta.

Cláusula Group By

Descreve a cláusula Group By , que agrupa os elementos de um resultado de consulta e


pode ser usada para aplicar funções de agregação a cada grupo.

Cláusula Group Join

Descreve a cláusula Group Join , que combina duas coleções em uma única coleção
hierárquica.

Cláusula Join

Descreve a cláusula Join , que combina duas coleções em uma única coleção.

Cláusula Let

Descreve a cláusula Let , que calcula um valor e o atribui a uma nova variável na
consulta.

Cláusula Order By

Descreve a cláusula Order By , que especifica a ordem de classificação para colunas em


uma consulta.

Cláusula Select

Descreve a cláusula Select , que declara um conjunto de variáveis de intervalo para uma
consulta.

Cláusula Skip

Descreve a cláusula Skip , que ignora um número especificado de elementos em uma


coleção e, em seguida, retorna os elementos restantes.

Cláusula Skip While

Descreve a cláusula Skip While , que ignora elementos em uma coleção, contanto que
uma condição especificada seja true e retorne os elementos restantes.

Cláusula Take

Descreve a cláusula Take , que retorna um número especificado de elementos contíguos


do início de uma coleção.

Cláusula Take While

Descreve a cláusula Take While , que inclui elementos em uma coleção, contanto que
uma condição especificada seja true e ignore os elementos restantes.

Cláusula Where

Descreve a cláusula Where , que especifica uma condição de filtragem para uma consulta.

Confira também
LINQ
Introdução a LINQ no Visual Basic
Cláusula Aggregate (Visual Basic)
Artigo • 07/04/2023 • 7 minutos para o fim da leitura

Aplica uma ou mais funções de agregação a uma coleção.

Sintaxe
VB

Aggregate element [As type] In collection _

[, element2 [As type2] In collection2, [...]]

[ clause ]

Into expressionList

Partes
Termo Definição

element Obrigatórios. Variável usada para iterar por meio dos elementos da coleção.

type Opcional. O tipo de element . Se nenhum tipo for especificado, o de element é


inferido de collection .

collection Obrigatórios. Refere-se à coleção na qual a operação deve ocorrer.

clause Opcional. Uma ou mais cláusulas de consulta, como Where , para refinar o
resultado da consulta, com o objetivo de aplicar a cláusula ou as cláusulas de
agregação.

expressionList Obrigatórios. Uma ou mais expressões delimitadas por vírgulas que identificam
uma função de agregação a ser aplicada à coleção. Você pode aplicar um alias
a uma função de agregação para especificar um nome de membro para o
resultado da consulta. Se nenhum alias for fornecido, o nome da função de
agregação será usado. Para obter exemplos, confira a seção sobre funções de
agregação posteriormente neste tópico.

Comentários
A cláusula Aggregate pode ser usada para incluir funções de agregação nas consultas.
As funções de agregação realizam verificações e cálculos sobre um conjunto de valores
e retornam um valor único. Você pode acessar o valor calculado usando um membro do
tipo de resultado da consulta. As funções de agregação padrão que você pode usar são
All , Any , Average , Count , LongCount , Max , Min e Sum . Essas funções são familiares aos

desenvolvedores, que conhecem as agregações em SQL. Elas são descritos na próxima


seção deste tópico.

O resultado de uma função agregada é incluído no resultado da consulta como um


campo do tipo de resultado dela. Você pode fornecer um alias para o resultado da
função de agregação para especificar o nome do membro do tipo de resultado da
consulta que conterá o valor agregado. Se nenhum alias for fornecido, o nome da
função de agregação será usado.

A cláusula Aggregate pode iniciar uma consulta ou pode ser incluída como uma cláusula
adicional em uma consulta. Se a cláusula Aggregate iniciar uma consulta, o resultado
será um valor único, que é o resultado da função agregada especificada na cláusula
Into . Se mais de uma função de agregação for especificada na cláusula Into , a consulta
retornará um único tipo com uma propriedade separada para referenciar o resultado de
cada função de agregação na cláusula Into . Se a cláusula Aggregate for incluída como
cláusula adicional em uma consulta, o tipo retornado na coleção de consultas terá uma
propriedade separada para referenciar o resultado de cada função de agregação na
cláusula Into .

Funções de Agregação
Veja a seguir as funções de agregação padrão que podem ser usadas com a cláusula
Aggregate .

Todos
Retorna true se todos os elementos na coleção atenderem a uma condição
especificada; caso contrário, retornará false . A seguir, é mostrado um exemplo:

VB

Dim customerList1 = Aggregate order In orders

Into AllOrdersOver100 = All(order.Total >= 100)

Qualquer
Retorna true se qualquer elemento na coleção atender a uma condição especificada;
caso contrário, retornará false . A seguir, é mostrado um exemplo:
VB

Dim customerList2 = From cust In customers

Aggregate order In cust.Orders

Into AnyOrderOver500 = Any(order.Total >= 500)

Média
Calcula a média de todos os elementos na coleção ou calcula uma expressão fornecida
para todos os elementos da coleção. A seguir, é mostrado um exemplo:

VB

Dim customerOrderAverage = Aggregate order In orders

Into Average(order.Total)

Contagem
Conta o número de elementos na coleção. Você pode fornecer uma expressão opcional
Boolean para contar apenas o número de elementos na coleção que atendam a uma

condição. A seguir, é mostrado um exemplo:

VB

Dim customerOrderAfter1996 = From cust In customers

Aggregate order In cust.Orders

Into Count(order.OrderDate > #12/31/1996#)

Grupo
Refere-se aos resultados da consulta que são agrupados como resultado de uma
cláusula Group By ou Group Join . A função Group é válida somente na cláusula Into de
Group By ou Group Join . Para obter mais informações e exemplos, confira Cláusula

Group By e Cláusula Group Join.

LongCount
Conta o número de elementos na coleção. Você pode fornecer uma expressão opcional
Boolean para contar apenas o número de elementos na coleção que atendam a uma

condição. Retorna o resultado como um Long . Para obter um exemplo, confira a função
de agregação Count .
Max
Calcula o valor máximo da coleção ou uma expressão fornecida para todos os
elementos da coleção. A seguir, é mostrado um exemplo:

VB

Dim customerMaxOrder = Aggregate order In orders

Into MaxOrder = Max(order.Total)

Min
Calcula o valor mínimo da coleção ou uma expressão fornecida para todos os elementos
da coleção. A seguir, é mostrado um exemplo:

VB

Dim customerMinOrder = From cust In customers

Aggregate order In cust.Orders

Into MinOrder = Min(order.Total)

Somar
Calcula a soma de todos os elementos na coleção ou uma expressão fornecida para
todos os elementos da coleção. A seguir, é mostrado um exemplo:

VB

Dim customerTotals = From cust In customers

Aggregate order In cust.Orders

Into Sum(order.Total)

Exemplo
O exemplo a seguir mostra como usar a cláusula Aggregate para aplicar funções de
agregação a um resultado de consulta.

VB

Public Sub AggregateSample()

Dim customers = GetCustomerList()

Dim customerOrderTotal =

From cust In customers

Aggregate order In cust.Orders

Into Sum(order.Total), MaxOrder = Max(order.Total),

MinOrder = Min(order.Total), Avg = Average(order.Total)

For Each customer In customerOrderTotal

Console.WriteLine(customer.cust.CompanyName & vbCrLf &

vbTab & "Sum = " & customer.Sum & vbCrLf &

vbTab & "Min = " & customer.MinOrder & vbCrLf &

vbTab & "Max = " & customer.MaxOrder & vbCrLf &

vbTab & "Avg = " & customer.Avg.ToString("#.##"))

Next

End Sub

Como criar funções de agregação definidas


pelo usuário
Você pode incluir as próprias funções de agregação personalizadas em uma expressão
de consulta adicionando métodos de extensão ao tipo IEnumerable<T>. Em seguida, o
método personalizado pode executar um cálculo ou uma operação na coleção
enumerável que fez referência à função de agregação. Para obter mais informações
sobre os métodos de extensão, consulte Métodos de extensão.

Por exemplo, o exemplo a seguir mostra uma função de agregação personalizada que
calcula o valor mediano de uma coleção de números. Há duas sobrecargas do método
de extensão Median . A primeira sobrecarga aceita, como entrada, uma coleção de tipo
IEnumerable(Of Double) . Se a função de agregação Median for chamada para um campo
de consulta do tipo Double , esse método será chamado. A segunda sobrecarga do
método Median pode ser passada por qualquer tipo genérico. A sobrecarga genérica do
método Median usa um segundo parâmetro que faz referência à expressão lambda
Func(Of T, Double) para projetar um valor para um tipo (de uma coleção) como o valor
correspondente do tipo Double . Em seguida, ele delega o cálculo do valor mediano para
a outra sobrecarga do método Median . Para obter mais informações sobre expressões
lambda, consulte Expressões lambda.

VB

Imports System.Runtime.CompilerServices

Module UserDefinedAggregates

' Calculate the median value for a collection of type Double.

<Extension()>

Function Median(ByVal values As IEnumerable(Of Double)) As Double

If values.Count = 0 Then

Throw New InvalidOperationException("Cannot compute median for


an empty set.")

End If

Dim sortedList = From number In values

Order By number

Dim medianValue As Double

Dim itemIndex = CInt(Int(sortedList.Count / 2))

If sortedList.Count Mod 2 = 0 Then

' Even number of items in list.

medianValue = ((sortedList(itemIndex) + sortedList(itemIndex -


1)) / 2)

Else

' Odd number of items in list.

medianValue = sortedList(itemIndex)

End If

Return medianValue

End Function

' "Cast" the collection of generic items as type Double and call the

' Median() method to calculate the median value.

<Extension()>

Function Median(Of T)(ByVal values As IEnumerable(Of T),

ByVal selector As Func(Of T, Double)) As Double

Return (From element In values Select selector(element)).Median()

End Function

End Module

O exemplo a seguir mostra consultas de exemplo que chamam a função de agregação


Median em uma coleção de tipos Integer e uma coleção de tipo Double . A consulta que

chama a função de agregação Median na coleção de tipos Double chama a sobrecarga


do método Median que aceita, como entrada, uma coleção de tipo Double . A consulta
que chama a função de agregação Median na coleção de tipos Integer chama a
sobrecarga genérica do método Median .

VB

Module Module1

Sub Main()

Dim numbers1 = {1, 2, 3, 4, 5}

Dim query1 = Aggregate num In numbers1 Into Median(num)

Console.WriteLine("Median = " & query1)

Dim numbers2 = {1.9, 2, 8, 4, 5.7, 6, 7.2, 0}

Dim query2 = Aggregate num In numbers2 Into Median()

Console.WriteLine("Median = " & query2)

End Sub

End Module

Confira também
Introdução a LINQ no Visual Basic
Consultas
Cláusula Select
Cláusula From
Cláusula Where
Cláusula Group By
Cláusula Distinct (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Restringe os valores da variável de intervalo atual para eliminar valores duplicados em


cláusulas de consulta subsequentes.

Sintaxe
VB

Distinct

Comentários
Você pode usar a cláusula Distinct para retornar uma lista de itens exclusivos. A
cláusula Distinct faz com que a consulta ignore os resultados da consulta duplicada. A
cláusula Distinct se aplica a valores duplicados para todos os campos de retorno
especificados pela cláusula Select . Se nenhuma cláusula Select for especificada,
Distinct será aplicada à variável de intervalo para a consulta identificada na cláusula

From . Se a variável de intervalo não for um tipo imutável, a consulta só ignorará um


resultado de consulta se todos os membros do tipo corresponderem a um resultado de
consulta existente.

Exemplo
A expressão de consulta a seguir ingressa em uma lista de clientes e uma lista de
pedidos de clientes. A cláusula Distinct está incluída para retornar uma lista de nomes
de clientes exclusivos e datas de pedido.

VB

Dim customerOrders = From cust In customers, ord In orders

Where cust.CustomerID = ord.CustomerID

Select cust.CompanyName, ord.OrderDate

Distinct

Confira também
Introdução a LINQ no Visual Basic
Consultas
Cláusula From
Cláusula Select
Cláusula Where
Cláusula Equals (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Compara as chaves das coleções ingressadas.

Comentários
A palavra-chave Equals é usada nos seguintes contextos:

Cláusula Group Join

Cláusula Join

Confira também
Palavras-chave
Cláusula From (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Especifica uma ou mais variáveis de intervalo e uma coleção para consultar.

Sintaxe
VB

From element [ As type ] In collection [ _ ]

[, element2 [ As type2 ] In collection2 [, ... ] ]

Partes
Termo Definição

element Obrigatórios. Uma variável de intervalo usada para iterar por meio dos elementos
da coleção. Uma variável de intervalo é usada para se referir a cada membro da
collection como a consulta itera por meio do collection . Deve ser um tipo
enumerável.

type Opcional. O tipo de element . Se nenhum type for especificado, o tipo de element é
inferido de collection .

collection Obrigatórios. Refere-se à coleção a ser consultada. Deve ser um tipo enumerável.

Comentários
A cláusula From é usada para identificar os dados de origem de uma consulta e as
variáveis usadas para fazer referência a um elemento da coleção de origem. Essas
variáveis são chamadas de variáveis de intervalo. A cláusula From é necessária para uma
consulta, exceto quando a cláusula Aggregate é usada para identificar uma consulta que
retorna apenas resultados agregados. Para obter mais informações, confira Cláusula
Aggregate.

Você pode especificar várias cláusulas From em uma consulta para identificar várias
coleções a serem ingressadas. Quando várias coleções são especificadas, elas são
iteradas de maneira independente ou você pode juntá-las se elas estiverem
relacionadas. Você pode ingressar coleções implicitamente usando a cláusula Select ou
explicitamente usando as cláusulas Join ou Group Join . Como alternativa, você pode
especificar diversas variáveis de intervalo e coleções em uma única cláusula From , com
cada variável de intervalo relacionada e coleção separadas das outras por uma vírgula. O
exemplo de código a seguir mostra as duas opções de sintaxe para a cláusula From .

VB

' Multiple From clauses in a query.

Dim result = From var1 In collection1, var2 In collection2

' Equivalent syntax with a single From clause.

Dim result2 = From var1 In collection1

From var2 In collection2

A cláusula From define o escopo de uma consulta, que é semelhante ao escopo de um


loop For . Portanto, cada variável de intervalo element no escopo de uma consulta deve
ter um nome exclusivo. Como você pode especificar várias cláusulas From para uma
consulta, as cláusulas From seguintes podem se referir a variáveis de intervalo na
cláusula From ou podem se referir a variáveis de intervalo em uma cláusula From
anterior. Por exemplo, o exemplo a seguir mostra uma cláusula From aninhada em que a
coleção na segunda cláusula é baseada em uma propriedade da variável de intervalo na
primeira cláusula.

VB

Dim allOrders = From cust In GetCustomerList()

From ord In cust.Orders

Select ord

Cada cláusula From pode ser seguida por qualquer combinação de cláusulas de consulta
adicionais para refinar a consulta. Você pode refinar a consulta das seguintes formas:

Combine várias coleções implicitamente usando as cláusulas From e Select ou


explicitamente usando as cláusulas Join ou Group Join .

Use a cláusula Where para filtrar o resultado da consulta.

Classifique o resultado usando a cláusula Order By .

Agrupe resultados semelhantes usando a cláusula Group By .

Use a cláusula Aggregate para identificar funções de agregação para avaliar todo o
resultado da consulta.
Use a cláusula Let para introduzir uma variável de iteração cujo valor é
determinado por uma expressão em vez de uma coleção.

Use a cláusula Distinct para ignorar resultados de consulta duplicados.

Identifique partes do resultado a serem retornadas usando as cláusulas Skip ,


Take , Skip While e Take While .

Exemplo
A expressão de consulta a seguir usa uma cláusula From para declarar uma variável de
intervalo cust para cada objeto Customer na coleção customers . A cláusula Where usa a
variável de intervalo para restringir a saída aos clientes da região especificada. O loop
For Each exibe o nome da empresa para cada cliente no resultado da consulta.

VB

Sub DisplayCustomersForRegion(ByVal customers As List(Of Customer),

ByVal region As String)

Dim customersForRegion = From cust In customers

Where cust.Region = region

For Each cust In customersForRegion

Console.WriteLine(cust.CompanyName)

Next

End Sub

Confira também
Consultas
Introdução a LINQ no Visual Basic
Instrução For Each...Next
Instrução For...Next
Cláusula Select
Cláusula Where
Cláusula Aggregate
Cláusula Distinct
Cláusula Join
Cláusula Group Join
Cláusula Order By
Cláusula Let
Cláusula Skip
Cláusula Take
Cláusula Skip While
Cláusula Take While
Cláusula Group By (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Agrupa os elementos de um resultado de consulta. Também pode ser usada para aplicar
funções de agregação a cada grupo. A operação de agrupamento é baseada em uma ou
mais chaves.

Sintaxe
VB

Group [ listField1 [, listField2 [...] ] By keyExp1 [, keyExp2 [...] ]

Into aggregateList

Partes
listField1 , listField2

Opcional. Um ou mais campos da variável ou das variáveis de consulta que


identificam explicitamente os campos a serem incluídos no resultado agrupado. Se
nenhum campo for especificado, todos os campos da variável ou das variáveis de
consulta serão incluídos no resultado agrupado.

keyExp1

Obrigatórios. Uma expressão que identifica a chave a ser usada para determinar os
grupos de elementos. Você pode especificar mais de uma chave para especificar
uma chave composta.

keyExp2

Opcional. Uma ou mais chaves adicionais que são combinadas com keyExp1 para
criar uma chave composta.

aggregateList

Obrigatórios. Uma ou mais expressões que identificam como os grupos são


agregados. Para identificar um nome de membro para os resultados agrupados,
use a palavra-chave Group , que pode estar em qualquer uma das seguintes
formas:
VB

Into Group

-ou-

VB

Into <alias> = Group

Você também pode incluir funções de agregação a serem aplicadas ao grupo.

Comentários
Você pode usar a cláusula Group By para interromper os resultados de uma consulta
nos grupos. O agrupamento é baseado em uma chave ou chave composta que consiste
em várias chaves. Os elementos associados aos valores de chave correspondentes são
incluídos no mesmo grupo.

Use o parâmetro aggregateList da cláusula Into e a palavra-chave Group para


identificar o nome do membro usado para fazer referência ao grupo. Você também
pode incluir funções de agregação na cláusula Into para calcular valores para os
elementos agrupados. Para obter uma lista de funções de agregação padrão, confira
Cláusula Aggregate.

Exemplo
O exemplo de código a seguir agrupa uma lista de clientes com base na localização
(país/região) e fornece uma contagem dos clientes em cada grupo. Os resultados são
ordenados pelo nome de país/região. Os resultados agrupados são ordenados pelo
nome da cidade.

VB

Public Sub GroupBySample()

Dim customers = GetCustomerList()

Dim customersByCountry = From cust In customers

Order By cust.City

Group By CountryName = cust.Country

Into RegionalCustomers = Group, Count()

Order By CountryName

For Each country In customersByCountry

Console.WriteLine(country.CountryName &

" (" & country.Count & ")" & vbCrLf)

For Each customer In country.RegionalCustomers

Console.WriteLine(vbTab & customer.CompanyName &

" (" & customer.City & ")")

Next

Next

End Sub

Confira também
Introdução a LINQ no Visual Basic
Consultas
Cláusula Select
Cláusula From
Cláusula Order By
Cláusula Aggregate
Cláusula Group Join
Cláusula Join Group (Visual Basic)
Artigo • 28/11/2022 • 3 minutos para o fim da leitura

Combina duas coleções em uma única coleção hierárquica. A operação de junção é


baseada em chaves correspondentes.

Sintaxe
VB

Group Join element [As type] In collection _

On key1 Equals key2 [ And key3 Equals key4 [... ] ] _

Into expressionList

Partes
Termo Definição

element Obrigatórios. A variável de controle para a coleção que está sendo ingressadas.

type Opcional. O tipo de element . Se nenhum type for especificado, o tipo de


element é inferido de collection .

collection Obrigatórios. A coleção a ser combinada com a coleção no lado esquerdo do


operador Group Join . Uma cláusula Group Join pode ser aninhada em uma
cláusula Join ou em outra cláusula Group Join .

key1 Equals Obrigatórios. Identifica as chaves para as coleções sendo ingressadas. Você
key2 deve usar o operador Equals para comparar as chaves das coleções que estão
sendo ingressadas. Você pode combinar condições de junção usando o
operador And para identificar várias chaves. O parâmetro key1 deve vir da
coleção do lado esquerdo do operador Join . O parâmetro key2 deve vir da
coleção do lado direito do operador Join .

As chaves usadas na condição de junção podem ser expressões que incluem


mais de um item da coleção. No entanto, cada expressão de chave pode conter
apenas itens de sua respectiva coleção.

expressionList Obrigatórios. Uma ou mais expressões que identificam como os grupos de


elementos da coleção são agregados. Para identificar um nome de membro
para os resultados agrupados, use a palavra-chave Group ( <alias> = Group ).
Você também pode incluir funções de agregação a serem aplicadas ao grupo.
Comentários
A cláusula Group Join combina duas coleções com base em valores de chave
correspondentes das coleções que estão sendo ingressadas. A coleção resultante pode
conter um membro que faz referência a uma coleção de elementos da segunda coleção
que correspondem ao valor da chave da primeira coleção. Você também pode
especificar funções de agregação a serem aplicadas aos elementos agrupados da
segunda coleção. Para obter mais informações sobre funções de agregação, consulte
Cláusula agregada.

Considere, por exemplo, uma coleção de gerentes e uma coleção de funcionários.


Elementos de ambas as coleções têm uma propriedade ManagerID que identifica os
funcionários que se reportam a um gerente específico. Os resultados de uma operação
de junção conteriam um resultado para cada gerente e funcionário com um valor
ManagerID correspondente. Os resultados de uma operação Group Join conteriam a
lista completa de gerentes. Cada resultado de gerente teria um membro que faria
referência à lista de funcionários correspondentes ao gerente específico.

A coleção resultante de uma operação Group Join pode conter qualquer combinação
de valores da coleção identificada na cláusula From e as expressões identificadas na
cláusula Into da cláusula Group Join . Para obter mais informações sobre expressões
válidas para a cláusula Into , consulte aCláusula agregada.

Uma operação Group Join retornará todos os resultados da coleção identificada no


lado esquerdo do operador Group Join . Isso é válido mesmo se não houver nenhuma
correspondência na coleção que está sendo ingressada. Isso é como um LEFT OUTER
JOIN no SQL.

Você pode usar a cláusula Join para combinar coleções em uma única coleção. Isso é
equivalente a INNER JOIN no SQL.

Exemplo
O exemplo de código a seguir une duas coleções usando a cláusula Group Join .

VB

Dim customerList = From cust In customers

Group Join ord In orders On

cust.CustomerID Equals ord.CustomerID

Into CustomerOrders = Group,

OrderTotal = Sum(ord.Total)

Select cust.CompanyName, cust.CustomerID,

CustomerOrders, OrderTotal

For Each customer In customerList

Console.WriteLine(customer.CompanyName &

" (" & customer.OrderTotal & ")")

For Each order In customer.CustomerOrders

Console.WriteLine(vbTab & order.OrderID & ": " & order.Total)

Next

Next

Confira também
Introdução a LINQ no Visual Basic
Consultas
Cláusula Select
Cláusula From
Cláusula Join
Cláusula Where
Cláusula Group By
Cláusula Join (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Combina duas coleções em uma coleção única. A operação de junção é baseada em


chaves correspondentes e usa o operador Equals .

Sintaxe
VB

Join element In collection _

[ joinClause _ ]

[ groupJoinClause ... _ ]

On key1 Equals key2 [ And key3 Equals key4 [... ]

Partes
element Necessário. A variável de controle para a coleção que está sendo ingressadas.

collection

Obrigatórios. A coleção a ser combinada com a coleção identificada no lado esquerdo


do operador Join . Uma cláusula Join pode ser aninhada em outra cláusula Join ou em
Group Join .

joinClause

Opcional. Uma ou mais cláusulas adicionais Join para refinar ainda mais a consulta.

groupJoinClause

Opcional. Uma ou mais cláusulas adicionais Group Join para refinar ainda mais a
consulta.

key1 Equals key2

Obrigatórios. Identifica as chaves para as coleções sendo ingressadas. Você deve usar o
operador Equals para comparar as chaves das coleções que estão sendo ingressadas.
Você pode combinar condições de junção usando o operador And para identificar várias
chaves. key1 deve vir da coleção do lado esquerdo do operador Join . key2 deve vir da
coleção do lado direito do operador Join .

As chaves usadas na condição de junção podem ser expressões que incluem mais de um
item da coleção. No entanto, cada expressão de chave pode conter apenas itens de sua
respectiva coleção.

Comentários
A cláusula Join combina duas coleções com base em valores de chave correspondentes
das coleções que estão sendo ingressadas. A coleção resultante pode conter qualquer
combinação de valores da coleção identificada no lado esquerdo do operador Join e a
coleção identificada na cláusula Join . A consulta retornará apenas os resultados para os
quais a condição especificada pelo operador Equals é atendida. Isso é equivalente a
INNER JOIN no SQL.

Você pode usar várias cláusulas Join em uma consulta para unir duas ou mais coleções
em uma coleção única.

Você pode executar uma junção implícita para combinar coleções sem a cláusula Join .
Para fazer isso, inclua várias cláusulas In em From e especifique uma cláusula Where
que identifique as chaves que você deseja usar para a junção.

Você pode usar a cláusula Group Join para combinar coleções em uma coleção
hierárquica única. Isso é como um LEFT OUTER JOIN no SQL.

Exemplo 1
O exemplo de código a seguir executa uma junção implícita para combinar uma lista de
clientes com seus pedidos.

VB

Dim customerIDs() = {"ALFKI", "VICTE", "BLAUS", "TRAIH"}

Dim customerList = From cust In customers, custID In customerIDs

Where cust.CustomerID = custID

Select cust.CompanyName

For Each companyName In customerList

Console.WriteLine(companyName)

Next

Exemplo 2
O exemplo de código a seguir une duas coleções usando a cláusula Join .
VB

Imports System.Diagnostics

Public Class JoinSample

Public Sub ListProcesses()

Dim processDescriptions As New List(Of ProcessDescription)

processDescriptions.Add(New ProcessDescription With {

.ProcessName = "explorer",

.Description = "Windows Explorer"})

processDescriptions.Add(New ProcessDescription With {

.ProcessName = "winlogon",

.Description = "Windows Logon"})

processDescriptions.Add(New ProcessDescription With {

.ProcessName = "cmd",

.Description = "Command Window"})

processDescriptions.Add(New ProcessDescription With {

.ProcessName = "iexplore",

.Description = "Internet Explorer"})

Dim processes = From proc In Process.GetProcesses

Join desc In processDescriptions

On proc.ProcessName Equals desc.ProcessName

Select proc.ProcessName, proc.Id, desc.Description

For Each proc In processes

Console.WriteLine("{0} ({1}), {2}",

proc.ProcessName, proc.Id, proc.Description)

Next

End Sub

End Class

Public Class ProcessDescription

Public ProcessName As String

Public Description As String

End Class

Este exemplo produzirá uma saída semelhante à seguinte:

winlogon (968), Windows Logon

explorer (2424), File Explorer

cmd (5136), Command Window

Exemplo 3
O exemplo de código a seguir une duas coleções usando a cláusula Join com duas
colunas de chave.

VB

Imports System.Diagnostics

Public Class JoinSample2

Public Sub ListProcesses()

Dim processDescriptions As New List(Of ProcessDescription2)

' 8 = Normal priority, 13 = High priority

processDescriptions.Add(New ProcessDescription2 With {

.ProcessName = "explorer",

.Description = "Windows Explorer",

.Priority = 8})

processDescriptions.Add(New ProcessDescription2 With {

.ProcessName = "winlogon",

.Description = "Windows Logon",

.Priority = 13})

processDescriptions.Add(New ProcessDescription2 With {

.ProcessName = "cmd",

.Description = "Command Window",

.Priority = 8})

processDescriptions.Add(New ProcessDescription2 With {

.ProcessName = "iexplore",

.Description = "Internet Explorer",

.Priority = 8})

Dim processes = From proc In Process.GetProcesses

Join desc In processDescriptions

On proc.ProcessName Equals desc.ProcessName And

proc.BasePriority Equals desc.Priority

Select proc.ProcessName, proc.Id, desc.Description,

desc.Priority

For Each proc In processes

Console.WriteLine("{0} ({1}), {2}, Priority = {3}",

proc.ProcessName,

proc.Id,

proc.Description,

proc.Priority)

Next

End Sub

End Class

Public Class ProcessDescription2

Public ProcessName As String

Public Description As String

Public Priority As Integer

End Class

O exemplo produzirá uma saída semelhante à seguinte:

winlogon (968), Windows Logon, Priority = 13

cmd (700), Command Window, Priority = 8

explorer (2424), File Explorer, Priority = 8

Confira também
Introdução a LINQ no Visual Basic
Consultas
Cláusula Select
Cláusula From
Cláusula Group Join
Cláusula Where
Cláusula Let (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Calcula um valor e o atribui a uma nova variável dentro da consulta.

Sintaxe
VB

Let variable = expression [, ...]

Partes
Termo Definição

variable Obrigatórios. Um alias que pode ser usado para fazer referência aos resultados da
expressão fornecida.

expression Obrigatórios. Uma expressão que será avaliada e atribuída à variável especificada.

Comentários
A cláusula Let permite calcular valores para cada resultado de consulta e referenciá-los
usando um alias. O alias pode ser usado em outras cláusulas, como a cláusula Where . A
cláusula Let permite criar uma instrução de consulta mais fácil de ler porque você pode
especificar um alias para uma cláusula de expressão incluída na consulta e substituir o
alias sempre que a cláusula de expressão for usada.

É possível incluir qualquer número de atribuições variable e expression na cláusula


Let . Separe cada atribuição com uma vírgula (,).

Exemplo
O exemplo de código a seguir usa a cláusula Let para calcular um desconto de 10% em
produtos.

VB
Dim discountedProducts = From prod In products

Let Discount = prod.UnitPrice * 0.1

Where Discount >= 50

Select prod.ProductName, prod.UnitPrice, Discount

For Each prod In discountedProducts

Console.WriteLine("Product: {0}, Price: {1}, Discounted Price: {2}",

prod.ProductName, prod.UnitPrice.ToString("$#.00"),

(prod.UnitPrice - prod.Discount).ToString("$#.00"))

Next

Confira também
Introdução a LINQ no Visual Basic
Consultas
Cláusula Select
Cláusula From
Cláusula Where
Cláusula Order By (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica a ordem de classificação de um resultado de consulta.

Sintaxe
VB

Order By orderExp1 [ Ascending | Descending ] [, orderExp2 [...] ]

Partes
orderExp1 Necessário. Um ou mais campos do resultado da consulta atual que

identificam como ordenar os valores retornados. Os nomes de campo devem ser


separados por vírgulas (,). Você pode identificar cada campo como classificado em
ordem crescente ou decrescente usando as palavras-chave Ascending ou Descending . Se
nenhuma palavra-chave Ascending ou Descending for especificada, a ordem de
classificação padrão será crescente. Os campos de ordem de classificação têm
precedência da esquerda para a direita.

Comentários
Você pode usar a cláusula Order By para classificar os resultados de uma consulta. A
cláusula Order By só pode classificar um resultado com base na variável de intervalo
para o escopo atual. Por exemplo, a cláusula Select introduz um novo escopo em uma
expressão de consulta com novas variáveis de iteração para esse escopo. As variáveis de
intervalo definidas antes de uma cláusula Select em uma consulta não estão
disponíveis após Select . Portanto, se você quiser ordenar os resultados por um campo
que não esteja disponível na cláusula Select , deverá colocar a Order By antes de
Select . Um exemplo de quando você teria que fazer isso é quando deseja classificar a

consulta por campos que não são retornados como parte do resultado.

A ordem crescente e decrescente de um campo é determinada pela implementação da


interface IComparable para o tipo de dados do campo. Se o tipo de dados não
implementar a interface IComparable, a ordem de classificação será ignorada.
Exemplo 1
A expressão de consulta a seguir usa uma cláusula From para declarar uma variável de
intervalo book para a coleção books . A cláusula Order By classifica o resultado da
consulta por preço em ordem crescente (o padrão). Livros com o mesmo preço são
classificados por título em ordem crescente. A cláusula Select seleciona as
propriedades Title e Price como os valores retornados pela consulta.

VB

Dim titlesAscendingPrice = From book In books

Order By book.Price, book.Title

Select book.Title, book.Price

Exemplo 2
A expressão de consulta a seguir usa a cláusula Order By para classificar o resultado da
consulta por preço em ordem decrescente. Livros com o mesmo preço são classificados
por título em ordem crescente.

VB

Dim titlesDescendingPrice = From book In books

Order By book.Price Descending, book.Title

Select book.Title, book.Price

Exemplo 3
A expressão de consulta a seguir usa uma cláusula Select para selecionar o título do
livro, o preço, a data de publicação e o autor. Em seguida, ele preenche os campos
Title , Price , PublishDate e Author da variável de intervalo para o novo escopo. A

cláusula Order By ordena a nova variável de intervalo por nome do autor, título do livro
e preço. Cada coluna é classificada na ordem padrão (crescente).

VB

Dim bookOrders =

From book In books

Select book.Title, book.Price, book.PublishDate, book.Author

Order By Author, Title, Price

Confira também
Introdução a LINQ no Visual Basic
Consultas
Cláusula Select
Cláusula From
Cláusula Select (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Define o resultado de uma consulta.

Sintaxe
VB

Select [ var1 = ] fieldName1 [, [ var2 = ] fieldName2 [...] ]

Partes
var1

Opcional. Um alias que pode ser usado para fazer referência aos resultados da
expressão da coluna.

fieldName1

Obrigatórios. O nome do campo a ser retornado no resultado da consulta.

Comentários
Você pode usar a cláusula Select para definir os resultados a serem retornados de uma
consulta. Isso permite definir os membros de um novo tipo anônimo criado por uma
consulta ou direcionar os membros de um tipo nomeado que é retornado por uma
consulta. A cláusula Select não é necessária para uma consulta. Se nenhuma cláusula
Select for especificada, a consulta retornará um tipo com base em todos os membros

das variáveis de intervalo identificadas para o escopo atual. Para obter mais
informações, consulte Tipos Anônimos. Quando uma consulta cria um tipo nomeado,
ela retorna um resultado do tipo IEnumerable<T> em que T é o tipo criado.

A cláusula Select pode fazer referência a qualquer variável no escopo atual. Isso inclui
variáveis de intervalo identificadas na cláusula From (ou cláusulas From ). Ele também
inclui novas variáveis criadas com um alias pelas cláusulas Aggregate , Let , Group By ou
Group Join , ou variáveis de uma cláusula Select anterior na expressão de consulta. A

cláusula Select também pode incluir valores estáticos. Por exemplo, o exemplo de
código a seguir mostra uma expressão de consulta na qual a cláusula Select define o
resultado da consulta como um novo tipo anônimo com quatro membros: ProductName ,
Price , Discount e DiscountedPrice . Os valores de membro ProductName e Price são

obtidos da variável de intervalo de produtos definida na cláusula From . O valor do


membro DiscountedPrice é calculado na cláusula Let . O membro Discount é um valor
estático.

VB

' 10% discount

Dim discount_10 = 0.1

Dim priceList =

From product In products

Let DiscountedPrice = product.UnitPrice * (1 - discount_10)

Select product.ProductName, Price = product.UnitPrice,

Discount = discount_10, DiscountedPrice

A cláusula Select introduz um novo conjunto de variáveis de intervalo para cláusulas de


consulta seguintes, e as variáveis de intervalo anteriores não estão mais no escopo. A
última cláusula Select em uma expressão de consulta determina o valor retornado da
consulta. Por exemplo, a consulta a seguir retorna o nome da empresa e a ID do pedido
para cada pedido do cliente para o qual o total excede 500. A primeira cláusula Select
identifica as variáveis de intervalo para a cláusula Where e a segunda cláusula Select . A
segunda cláusula Select identifica os valores retornados pela consulta como um novo
tipo anônimo.

VB

Dim customerList = From cust In customers, ord In cust.Orders

Select Name = cust.CompanyName,

Total = ord.Total, ord.OrderID

Where Total > 500

Select Name, OrderID

Se a cláusula Select identificar um único item a ser retornado, a expressão de consulta


retornará uma coleção do tipo desse único item. Se a cláusula Select identificar vários
itens a serem retornados, a expressão de consulta retornará uma coleção de um novo
tipo anônimo, com base nos itens selecionados. Por exemplo, as duas consultas a seguir
retornam coleções de dois tipos diferentes com base na cláusula Select . A primeira
consulta retorna uma coleção de nomes de empresa como cadeias de caracteres. A
segunda consulta retorna uma coleção de objetos Customer preenchidos com os nomes
da empresa e informações de endereço.

VB
Dim customerNames = From cust In customers

Select cust.CompanyName

Dim customerInfo As IEnumerable(Of Customer) =

From cust In customers

Select New Customer With {.CompanyName = cust.CompanyName,

.Address = cust.Address,

.City = cust.City,

.Region = cust.Region,

.Country = cust.Country}

Exemplo
A expressão de consulta a seguir usa uma cláusula From para declarar uma variável de
intervalo cust para a coleção customers . A cláusula Select seleciona o nome do cliente
e o valor da ID e preenche as colunas CompanyName e CustomerID da nova variável de
intervalo. A instrução For Each faz loop sobre cada objeto retornado e exibe as colunas
CompanyName e CustomerID de cada registro.

VB

Sub SelectCustomerNameAndId(ByVal customers() As Customer)

Dim nameIds = From cust In customers

Select cust.CompanyName, cust.CustomerID

For Each nameId In nameIds

Console.WriteLine(nameId.CompanyName & ": " & nameId.CustomerID)

Next

End Sub

Confira também
Introdução a LINQ no Visual Basic
Consultas
Cláusula From
Cláusula Where
Cláusula Order By
Tipos anônimos
Cláusula Skip (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Ignora um número especificado de elementos em uma coleção e, em seguida, retorna


os elementos restantes.

Sintaxe
VB

Skip count

Partes
count

Obrigatórios. Um valor ou uma expressão que é avaliada como o número de elementos


da sequência a ser ignorada.

Comentários
A cláusula Skip faz com que uma consulta ignore os elementos no início de uma lista
de resultados e retorne os elementos restantes. O número de elementos a serem
ignorados é identificado pelo parâmetro count .

Você pode usar a cláusula Skip com a cláusula Take para retornar um intervalo de
dados de qualquer segmento de uma consulta. Para fazer isso, passe o índice do
primeiro elemento do intervalo para a cláusula Skip e o tamanho do intervalo para a
cláusula Take .

Ao usar a cláusula Skip em uma consulta, talvez você também precise garantir que os
resultados sejam retornados em uma ordem que permitirá que a cláusula Skip ignore
os resultados pretendidos. Para obter mais informações sobre como ordenar resultados
da consulta, confira Cláusula Order By.

Você pode usar a cláusula SkipWhile para especificar que apenas determinados
elementos sejam ignorados, dependendo de uma condição fornecida.

Exemplo
O exemplo de código a seguir usa a cláusula Skip junto com a cláusula Take para
retornar dados de uma consulta em páginas. A função GetCustomers usa a cláusula Skip
para ignorar os clientes na lista até o valor de índice inicial fornecido e usa a cláusula
Take para retornar uma página de clientes começando a partir do valor de índice.

VB

Public Sub PagingSample()

Dim pageNumber As Integer = 0

Dim pageSize As Integer = 10

Dim customersPage = GetCustomers(pageNumber * pageSize, pageSize)

Do While customersPage IsNot Nothing

Console.WriteLine(vbCrLf & "Page: " & pageNumber + 1 & vbCrLf)

For Each cust In customersPage

Console.WriteLine(cust.CustomerID & ", " & cust.CompanyName)

Next

Console.WriteLine(vbCrLf)

pageNumber += 1

customersPage = GetCustomers(pageNumber * pageSize, pageSize)

Loop

End Sub

Public Function GetCustomers(ByVal startIndex As Integer,

ByVal pageSize As Integer) As List(Of Customer)

Dim customers = GetCustomerList()

Dim returnCustomers = From cust In customers

Skip startIndex Take pageSize

If returnCustomers.Count = 0 Then Return Nothing

Return returnCustomers

End Function

Confira também
Introdução a LINQ no Visual Basic
Consultas
Cláusula Select
Cláusula From
Cláusula Order By
Cláusula Skip While
Cláusula Take
Ignorar cláusula While (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Ignora elementos em uma coleção, contanto que uma condição especificada seja true
e retorne os elementos restantes.

Sintaxe
VB

Skip While expression

Partes
Termo Definição

expression Obrigatórios. Uma expressão que representa uma condição para a qual testar
elementos. A expressão deve retornar um valor Boolean ou um equivalente
funcional, como um Integer para ser avaliado como um Boolean .

Comentários
A cláusula Skip While ignora elementos do início de um resultado de consulta até que
o expression fornecido retorne false . Depois que expression retornar false , a
consulta retorna todos os elementos restantes. O expression é ignorado para os
resultados restantes.

A cláusula Skip While difere da cláusula Where porque a cláusula Where pode ser usada
para excluir todos os elementos de uma consulta que não atendam a uma condição
específica. A cláusula Skip While exclui elementos somente até a primeira vez em que a
condição não é atendida. A cláusula Skip While é mais útil quando você está
trabalhando com um resultado de consulta ordenado.

Você pode ignorar um número específico de resultados desde o início de um resultado


de consulta usando a cláusula Skip .

Exemplo
O exemplo de código a seguir usa a cláusula Skip While para ignorar os resultados até
que o primeiro cliente dos Estados Unidos seja encontrado.

VB

Public Sub SkipWhileSample()

Dim customers = GetCustomerList()

' Return customers starting from the first U.S. customer encountered.

Dim customerList = From cust In customers

Order By cust.Country

Skip While IsInternationalCustomer(cust)

For Each cust In customerList

Console.WriteLine(cust.CompanyName & vbTab & cust.Country)

Next

End Sub

Public Function IsInternationalCustomer(ByVal cust As Customer) As Boolean

If cust.Country = "USA" Then Return False

Return True

End Function

Confira também
Introdução a LINQ no Visual Basic
Consultas
Cláusula Select
Cláusula From
Cláusula Skip
Cláusula Take While
Cláusula Where
Cláusula Take (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Retorna um número especificado de elementos contíguos do início de uma coleção.

Sintaxe
VB

Take count

Partes
count

Obrigatórios. Um valor ou uma expressão que é avaliada como o número de elementos


da sequência a ser retornada.

Comentários
A cláusula Take faz com que uma consulta inclua um número especificado de
elementos contíguos desde o início de uma lista de resultados. O número de elementos
a serem incluídos é especificado pelo parâmetro count .

Você pode usar a cláusula Take com a cláusula Skip para retornar um intervalo de
dados de qualquer segmento de uma consulta. Para fazer isso, passe o índice do
primeiro elemento do intervalo para a cláusula Skip e o tamanho do intervalo para a
cláusula Take . Nesse caso, a cláusula Take deve ser especificada após a cláusula Skip .

Ao usar a cláusula Take em uma consulta, talvez você também precise garantir que os
resultados sejam retornados em uma ordem que permitirá que a cláusula Take inclua os
resultados pretendidos. Para obter mais informações sobre como ordenar resultados da
consulta, confira Cláusula Order By.

Você pode usar a cláusula TakeWhile para especificar que apenas determinados
elementos sejam retornados, dependendo de uma condição fornecida.

Exemplo
O exemplo de código a seguir usa a cláusula Take junto com a cláusula Skip para
retornar dados de uma consulta em páginas. A função GetCustomers usa a cláusula
Skip para ignorar os clientes na lista até o valor de índice inicial fornecido e usa a

cláusula Take para retornar uma página de clientes começando desse valor de índice.

VB

Public Sub PagingSample()

Dim pageNumber As Integer = 0

Dim pageSize As Integer = 10

Dim customersPage = GetCustomers(pageNumber * pageSize, pageSize)

Do While customersPage IsNot Nothing

Console.WriteLine(vbCrLf & "Page: " & pageNumber + 1 & vbCrLf)

For Each cust In customersPage

Console.WriteLine(cust.CustomerID & ", " & cust.CompanyName)

Next

Console.WriteLine(vbCrLf)

pageNumber += 1

customersPage = GetCustomers(pageNumber * pageSize, pageSize)

Loop

End Sub

Public Function GetCustomers(ByVal startIndex As Integer,

ByVal pageSize As Integer) As List(Of Customer)

Dim customers = GetCustomerList()

Dim returnCustomers = From cust In customers

Skip startIndex Take pageSize

If returnCustomers.Count = 0 Then Return Nothing

Return returnCustomers

End Function

Confira também
Introdução a LINQ no Visual Basic
Consultas
Cláusula Select
Cláusula From
Cláusula Order By
Cláusula Take While
Cláusula Skip
Cláusula Take While (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Inclui elementos em uma coleção, contanto que a condição especificada seja true , e
ignora os elementos restantes.

Sintaxe
VB

Take While expression

Partes
Termo Definição

expression Obrigatórios. Uma expressão que representa uma condição para a qual testar
elementos. A expressão deve retornar um valor Boolean ou um equivalente
funcional, como um Integer para ser avaliado como um Boolean .

Comentários
A cláusula Take While inclui elementos do início de um resultado de consulta até que o
expression fornecido retorne false . Após expression retornar false , a consulta

ignorará todos os elementos restantes. O expression é ignorado para os resultados


restantes.

A cláusula Take While difere da Where porque a Where pode ser usada para incluir
todos os elementos de uma consulta que atendam a uma condição específica. A
cláusula Take While inclui elementos somente até a primeira vez em que a condição
não é atendida. A cláusula Take While é mais útil quando você está trabalhando com
um resultado de consulta ordenado.

Exemplo
O exemplo de código a seguir usa a cláusula Take While para recuperar resultados até
que o primeiro cliente sem nenhum pedido seja encontrado.
VB

Public Sub TakeWhileSample()

Dim customers = GetCustomerList()

' Return customers until the first customer with no orders is found.

Dim customersWithOrders = From cust In customers

Order By cust.Orders.Count Descending

Take While HasOrders(cust)

For Each cust In customersWithOrders

Console.WriteLine(cust.CompanyName & " (" & cust.Orders.Length &


")")

Next

End Sub

Public Function HasOrders(ByVal cust As Customer) As Boolean

If cust.Orders.Length > 0 Then Return True

Return False

End Function

Confira também
Introdução a LINQ no Visual Basic
Consultas
Cláusula Select
Cláusula From
Cláusula Take
Cláusula Skip While
Cláusula Where
Cláusula Where (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica a condição de filtragem de uma consulta.

Sintaxe
VB

Where condition

Partes
condition

Obrigatórios. Uma expressão que determina se os valores do item atual na coleção


estão incluídos na coleção de saída. A expressão deve ser avaliada como um valor
Boolean ou o equivalente a um valor Boolean . Se a condição for avaliada como True , o

elemento será incluído no resultado da consulta; caso contrário, o elemento será


excluído dele.

Comentários
A cláusula Where permite filtrar dados de consulta selecionando apenas elementos que
atendam a determinados critérios. Os elementos cujos valores fazem com que a cláusula
Where seja avaliada como True são incluídos no resultado da consulta; outros

elementos são excluídos. A expressão usada em uma cláusula Where deve ser avaliada
como Boolean ou o equivalente a Boolean , como um Integer que é avaliado como
False quando o valor é zero. Você pode combinar várias expressões em uma cláusula

Where usando operadores lógicos como And , Or , AndAlso , OrElse , Is e IsNot .

Por padrão, as expressões de consulta não são avaliadas até serem acessadas, por
exemplo, quando são vinculadas a dados ou iteradas em um loop For . Como resultado,
a cláusula Where não é avaliada até que a consulta seja acessada. Se você tiver valores
externos à consulta usados ​na cláusula Where , certifique-se de que o valor apropriado
seja usado na cláusula Where no momento em que a consulta for executada. Para obter
mais informações sobre a execução da consulta, consulte Como gravar sua primeira
consulta LINQ.
Você pode chamar funções dentro de uma cláusula Where para realizar um cálculo ou
operação em um valor do elemento atual na coleção. Chamar uma função em uma
cláusula Where pode fazer com que a consulta seja executada imediatamente quando
for definida, e não quando for acessada. Para obter mais informações sobre a execução
da consulta, consulte Como gravar sua primeira consulta LINQ.

Exemplo 1
A expressão de consulta a seguir usa uma cláusula From para declarar uma variável de
intervalo cust para cada objeto Customer na coleção customers . A cláusula Where usa a
variável de intervalo para restringir a saída aos clientes da região especificada. O loop
For Each exibe o nome da empresa para cada cliente no resultado da consulta.

VB

Sub DisplayCustomersForRegion(ByVal customers As List(Of Customer),

ByVal region As String)

Dim customersForRegion = From cust In customers

Where cust.Region = region

For Each cust In customersForRegion

Console.WriteLine(cust.CompanyName)

Next

End Sub

Exemplo 2
O exemplo a seguir usa os operadores lógicos And e Or na cláusula Where .

VB

Private Sub DisplayElements()

Dim elements As List(Of Element) = BuildList()

' Get a list of elements that have an atomic number from 12 to 14,

' or that have a name that ends in "r".

Dim subset = From theElement In elements

Where (theElement.AtomicNumber >= 12 And


theElement.AtomicNumber < 15) _

Or theElement.Name.EndsWith("r")

Order By theElement.Name

For Each theElement In subset

Console.WriteLine(theElement.Name & " " & theElement.AtomicNumber)

Next

' Output:

' Aluminum 13

' Magnesium 12

' Silicon 14

' Sulfur 16

End Sub

Private Function BuildList() As List(Of Element)

Return New List(Of Element) From

{New Element With {.Name = "Sodium", .AtomicNumber = 11}},

{New Element With {.Name = "Magnesium", .AtomicNumber = 12}},

{New Element With {.Name = "Aluminum", .AtomicNumber = 13}},

{New Element With {.Name = "Silicon", .AtomicNumber = 14}},

{New Element With {.Name = "Phosphorous", .AtomicNumber = 15}},

{New Element With {.Name = "Sulfur", .AtomicNumber = 16}}

End Function

Public Class Element

Public Property Name As String

Public Property AtomicNumber As Integer

End Class

Confira também
Introdução a LINQ no Visual Basic
Consultas
Cláusula From
Cláusula Select
Instrução For Each...Next
Instruções (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os tópicos nesta seção contêm tabelas da declaração do Visual Basic e instruções


executáveis e de listas importantes que se aplicam a muitas instruções.

Nesta seção
Instruções A-E

Instruções F-P

Instruções Q-Z

Cláusulas

Contextos de Declaração e Níveis de Acesso Padrão

Lista de Atributos

Lista de parâmetros

Lista de Tipos

Seções relacionadas
Referência da linguagem Visual Basic
Instruções A-E
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A tabela a seguir contém uma lista de instruções de linguagem do Visual Basic.

AddHandler

Chamar

Classe

Const

Continuar

Declare

Delegar

Dim

Loop Do…

Else

End

Palavra-chave End <>

Enumeração

Erase

Erro

Evento

Sair

Confira também
Instruções F-P
Instruções Q-Z
Referência da linguagem Visual Basic
Instrução AddHandler
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Associa um evento a um manipulador de eventos em tempo de execução.

Sintaxe
VB

AddHandler event, {AddressOf eventhandler | expression }

Partes
Parte Descrição

event O nome do evento a ser manipulado.

eventhandler O nome de um procedimento que manipula o evento.

expression Uma expressão lambda que manipula o evento.

As partes AddressOf eventhandler e expression são mutuamente exclusivas.

Comentários
As instruções AddHandler e RemoveHandler permitem que você inicie e pare a
manipulação a qualquer momento durante a execução do programa.

A assinatura do novo manipulador de eventos (o eventhandler procedimento ou


lambda expression ) deve corresponder à assinatura do evento event .

A palavra-chave Handles e a instrução AddHandler permitem que você especifique que


procedimentos específicos manipulem eventos específicos, mas há diferenças. A
instrução AddHandler conecta procedimentos a eventos em tempo de execução. Use a
palavra-chave Handles ao definir um procedimento para especificar que ele manipula
um evento específico. Para obter mais informações, confira Identificadores.

Um manipulador adicionado com um lambda explícito NÃO PODE ser removido mais
tarde (usando RemoveHandler ). De fato, se a lambda não receber um nome, não será
possível referenciá-la mais tarde. Mas atribuir o lambda a uma variável e adicionar o
manipulador por meio dessa variável permite remover o manipulador usando essa
variável.

7 Observação

Para eventos personalizados, a instrução AddHandler invoca o acessador do evento


AddHandler . Para obter mais informações sobre eventos personalizados, confira

Instrução de evento.

Exemplo
VB

Sub TestEvents()

Dim Obj As New Class1

' Associate an event handler with an event.

AddHandler Obj.Ev_Event, AddressOf EventHandler

' Call the method to raise the event.

Obj.CauseSomeEvent()

' Stop handling events.

RemoveHandler Obj.Ev_Event, AddressOf EventHandler

' This event will not be handled.

Obj.CauseSomeEvent()

' Associate an event handler with an event, using a lambda.

' This handler cannot be removed.

AddHandler Obj.Ev_Event, Sub ()

MsgBox("Lambda caught event.")

End Sub

' This event will be handled by the lambda above.

Obj.CauseSomeEvent()

End Sub

Sub EventHandler()

' Handle the event.

MsgBox("EventHandler caught event.")

End Sub

Public Class Class1

' Declare an event.

Public Event Ev_Event()

Sub CauseSomeEvent()

' Raise an event.

RaiseEvent Ev_Event()

End Sub

End Class

Confira também
Instrução RemoveHandler
Alças
Instrução Event
Eventos
Instrução Call (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Transfere o controle para um Function , Sub ou um procedimento de DDL (biblioteca de


vínculo dinâmico).

Sintaxe
VB

[ Call ] procedureName [ (argumentList) ]

Partes
Parte Descrição

procedureName Obrigatórios. Nome do procedimento a ser chamado.

argumentList Opcional. Lista de variáveis ou expressões que representam argumentos que são
passados para o procedimento quando ele é chamado. Vários argumentos são
separados por vírgulas. Se você incluir argumentList , deverá colocá-lo entre
parênteses.

Comentários
Você pode usar a palavra-chave Call ao chamar um procedimento. Para a maioria das
chamadas de procedimento, você não precisa usar essa palavra-chave.

Normalmente, você usa a palavra-chave Call quando a expressão chamada não


começa com um identificador. O uso da palavra-chave Call para outros usos não é
recomendado.

Se o procedimento retornar um valor, a instrução Call o descartará.

Exemplo
O código a seguir mostra dois exemplos em que a palavra-chave Call é necessária para
chamar um procedimento. Em ambos os exemplos, a expressão chamada não começa
com um identificador.
VB

Sub TestCall()

Call (Sub() Console.Write("Hello"))()

Call New TheClass().ShowText()

End Sub

Class TheClass

Public Sub ShowText()

Console.Write(" World")

End Sub

End Class

Confira também
Instrução Function
Instrução Sub
Instrução Declare
Expressões Lambda
Instrução Class (Visual Basic)
Artigo • 28/11/2022 • 4 minutos para o fim da leitura

Declara o nome de uma classe e apresenta a definição das variáveis, propriedades,


eventos e procedimentos que a classe compreende.

Sintaxe
VB

[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ MustInherit |


NotInheritable ] [ Partial ] _

Class name [ ( Of typelist ) ]

[ Inherits classname ]

[ Implements interfacenames ]

[ statements ]

End Class

Partes
Termo Definição

attributelist Opcional. Confira Lista de atributos.

accessmodifier Opcional. Um dos seguintes pode ser feito:

- Público

- Protegido

- Amigo

- Particular

- Amigo Protegido

- Protegido de forma particular

Confira Níveis de acesso no Visual Basic.

Shadows Opcional. Confira Sombras.

MustInherit Opcional. Confira MustInherit.

NotInheritable Opcional. Confira NotInheritable.

Partial Opcional. Indica uma definição parcial da classe. Confira Parcial.

name Obrigatórios. Nome desta classe. Confira Nomes de elementos declarados.


Termo Definição

Of Opcional. Especifica que essa é uma classe genérica.

typelist Obrigatório se você usar a palavra-chave Of. Lista de parâmetros de tipo para
essa classe. Confira Lista de tipos.

Inherits Opcional. Indica que essa classe herda os membros de outra classe. Confira
Instrução Inherits.

classname Obrigatório se você usar a instrução Inherits . O nome da classe da qual essa
classe deriva.

Implements Opcional. Indica que essa classe implementa os membros de uma ou mais
interfaces. Confira Instrução Implements.

interfacenames Obrigatório se você usar a instrução Implements . Os nomes das interfaces que
essa classe implementa.

statements Opcional. Instruções que definem os membros dessa classe.

End Class Obrigatórios. Termina a definição Class .

Comentários
Uma instrução Class define um novo tipo de dados. Uma classe é um bloco de
construção fundamental da OOP (programação orientada a objeto). Para obter mais
informações, confira Objetos e classes.

Você só pode usar Class no namespace ou no nível do módulo. Isso significa que o
contexto de declaração de uma classe precisa ser um arquivo de origem, namespace,
classe, estrutura, módulo ou interface, e não pode ser um procedimento ou bloco. Para
obter mais informações, consulte Contextos de declaração e níveis de acesso padrão.

Cada instância de uma classe tem um tempo de vida independente de todas as outras
instâncias. Esse tempo de vida começa quando ele é criado por uma cláusula New
Operator ou por uma função como CreateObject. Ele termina quando todas as variáveis
que apontam para a instância foram definidas como Nothing ou para instâncias de
outras classes.

As classes assumem o padrão de acesso Amigo. Você pode ajustar os níveis de acesso
com os modificadores de acesso. Para obter mais informações, consulte Níveis de
acesso no Visual Basic.

Regras
Aninhamento. Você pode definir uma classe dentro de outra. A classe externa é
chamada de classe independente e a classe interna é chamada de classe aninhada.

Herança. Se a classe usar a Instrução Inherits, você poderá especificar apenas uma
classe base ou interface. Uma classe não pode herdar de mais de um elemento.

Uma classe não pode herdar de outra classe com um nível de acesso mais
restritivo. Por exemplo, uma classe Public não pode herdar de uma classe Friend .

Uma classe não pode herdar de uma classe que está aninhada dentro dela.

Implementação. Se a classe usar a Instrução Implements, você deverá


implementar todos os membros definidos por cada interface especificada em
interfacenames . Uma exceção a isso é a reimplementação de um membro de

classe base. Para obter mais informações, consulte "Reimplementação" em


Implements.

Propriedade padrão. Uma classe pode especificar no máximo uma propriedade


como a propriedade padrão. Para obter mais informações, confira Padrão.

Comportamento
Nível de acesso. Em uma classe, você pode declarar cada membro com o próprio
nível de acesso. Os membros da classe assumem o padrão de acesso Público,
exceto variáveis e constantes, que assumem o padrão de acesso Privado. Quando
uma classe tem acesso mais restrito do que um dos membros dele, o nível de
acesso da classe tem precedência.

Escopo. Uma classe está no escopo em todo o namespace, classe, estrutura ou


módulo que a contém.

O escopo de cada membro de classe é a classe inteira.

Tempo de vida. Visual Basic não oferece suporte a classes estáticas. O equivalente
funcional de uma classe estática é fornecido por um módulo. Para obter mais
informações, confira Instrução Module.

Os membros da classe têm tempo de vida dependendo de como e onde são


declarados. Para saber mais, consulte Tempo de vida no Visual Basic.

Qualificação. O código fora de uma classe deve qualificar o nome de um membro


com o nome dessa classe.
Se o código dentro de uma classe aninhada fizer uma referência não qualificada a
um elemento de programação, o Visual Basic procurará o elemento primeiro na
classe aninhada e, em seguida, na classe recipiente e assim por diante até o
elemento recipiente mais externo.

Classes e módulos
Estes elementos têm muitas semelhanças, mas também há algumas diferenças
importantes.

Terminologia. As versões anteriores do Visual Basic reconhecem dois tipos de


módulos: módulos de classe (arquivos .cls) e módulos padrão (arquivos .bas). A
versão atual chama essas classes e módulos, respectivamente.

Membros compartilhados. Você pode controlar se um membro de uma classe é


um membro compartilhado ou de instância.

Orientação a objeto. As classes são orientadas a objetos, mas os módulos não são.
Você pode criar uma ou mais instâncias de uma classe. Para obter mais
informações, confira Objetos e classes.

Exemplo
O exemplo a seguir usa uma instrução Class para definir uma classe e vários membros.

VB

Class BankAccount

Shared interestRate As Decimal

Private accountNumber As String

Private accountBalance As Decimal

Public holdOnAccount As Boolean = False

Public ReadOnly Property Balance() As Decimal

Get

Return accountBalance

End Get

End Property

Public Sub PostInterest()

accountBalance = accountBalance * (1 + interestRate)

End Sub

Public Sub PostDeposit(ByVal amountIn As Decimal)

accountBalance = accountBalance + amountIn

End Sub

Public Sub PostWithdrawal(ByVal amountOut As Decimal)

accountBalance = accountBalance - amountOut

End Sub

End Class

Confira também
Objetos e Classes
Estruturas e classes
Instrução Interface
Instrução Module
Instrução Property
Tempo de vida do objeto: como os objetos são criados e destruídos
Tipos genéricos no Visual Basic
Como: Usar uma classe genérica
Instrução Const (Visual Basic)
Artigo • 07/04/2023 • 4 minutos para o fim da leitura

Declara e define uma ou mais constantes.

Sintaxe
VB

[ <attributelist> ] [ accessmodifier ] [ Shadows ]

Const constantlist

Partes
attributelist

Opcional. Lista de atributos que se aplicam a todas as constantes declaradas nesta


instrução. Confira Lista de atributos em colchetes angulares (" < " e " > ").

accessmodifier

Opcional. Use isso para especificar qual código pode acessar essas constantes. Pode ser
Público, Protegido, Amigo, Amigo protegido, Particular ou Protegido de forma
particular.

Shadows

Opcional. Use isso para declarar novamente e ocultar um elemento de programação em


uma classe base. Confira Sombras.

constantlist

Obrigatórios. Lista de constantes que estão sendo declaradas nesta instrução.

constant [ , constant ... ]

Cada constant tem a seguinte sintaxe e partes:

constantname [ As datatype ] = initializer

Parte Descrição

constantname Obrigatórios. Nome da constante. Confira Nomes de elemento declarados.

datatype Necessário se Option Strict for On . O tipo de dados da constante.


Parte Descrição

initializer Obrigatórios. Expressão avaliada em tempo de compilação e atribuída à


constante.

Comentários
Se você tiver um valor que nunca é alterado em seu aplicativo, poderá definir uma
constante nomeada e usá-la no lugar de um valor literal. Um nome é mais fácil de
lembrar do que um valor. Você pode definir a constante apenas uma vez e usá-la em
muitos lugares em seu código. Se em uma versão posterior você precisar redefinir o
valor, a instrução Const será o único local em que você precisa fazer uma alteração.

Você só pode usar Const no nível do módulo ou procedimento. Isso significa que o
contexto de declaração de uma variável precisa ser uma classe, uma estrutura, um
módulo, um procedimento ou um bloco e não pode ser um arquivo de origem, um
namespace ou uma interface. Para obter mais informações, consulte Contextos de
declaração e níveis de acesso padrão.

Constantes locais (dentro de um procedimento) assumem o padrão de acesso público, e


você não pode usar nenhum modificador de acesso nelas. Constantes de membro de
classe e módulo (fora de qualquer procedimento) assume o padrão de acesso particular
e constantes de membro de estrutura assumem o padrão e acesso público. Você pode
ajustar os níveis de acesso com os modificadores de acesso.

Regras
Contextos da declaração. Uma constante declarada no nível do módulo, fora de
qualquer procedimento, é uma constante de membro; é um membro da classe, da
estrutura ou do módulo que a declara.

Uma constante declarada no nível do procedimento é uma constante local; é local


para o procedimento ou bloco que a declara.

Atributos. Você pode aplicar atributos somente a constantes de membro, não a


constantes locais. Um atributo contribui com informações para os metadados do
assembly, o que não é significativo para o armazenamento temporário, como
constantes locais.

Modificadores. Por padrão, todas as constantes são Shared , Static e ReadOnly .


Você não pode usar nenhuma dessas palavras-chave ao declarar uma constante.
No nível do procedimento, você não pode usar Shadows nem modificadores de
acesso para declarar constantes locais.

Várias constantes. Você pode declarar diversas constantes na mesma instrução de


declaração, especificando a parte constantname para cada uma delas. Várias
constantes são separadas por vírgulas.

Regras de tipo de dados


Tipos de dados. A instrução Const pode declarar o tipo de dados de uma variável.
Você pode especificar qualquer tipo de dados ou o nome de uma enumeração.

Tipo padrão. Se você não especificar datatype , a constante usará o tipo de dados
de initializer . Se você especificar datatype e initializer , o tipo de dados de
initializer deverá ser conversível para datatype . Se nem datatype nem
initializer estiver presente, o tipo de dados será padrão para Object .

Tipos diferentes. Você pode especificar tipos de dados diferentes para constantes
diferentes usando uma cláusula As separada para cada variável que você declarar.
No entanto, você não pode declarar diversas constantes como sendo do mesmo
tipo usando uma cláusula As comum.

Inicialização. Você deve inicializar o valor de cada constante em constantlist .


Você usa initializer para fornecer uma expressão a ser atribuída à constante. A
expressão pode ser qualquer combinação de literais, outras constantes que já
estão definidas e membros de enumeração que já estão definidos. Você pode usar
operadores aritméticos e lógicos para combinar esses elementos.

Você não pode usar variáveis ou funções em initializer . No entanto, você pode
usar palavras-chave de conversão, como CByte e CShort . Você também pode usar
AscW se chamá-lo com uma constante String ou um argumento Char , já que isso
pode ser avaliado em tempo de compilação.

Comportamento
Escopo. As constantes locais são acessíveis somente de dentro do procedimento
ou bloco. As constantes de membro são acessíveis de qualquer lugar dentro da
classe, da estrutura ou do módulo.

Qualificação. O código fora de uma classe, estrutura ou módulo deve qualificar o


nome de uma constante de membro com o nome dessa classe, estrutura ou
módulo. O código fora de um procedimento ou bloco não pode se referir a
nenhuma constante local dentro desse procedimento ou bloco.

Exemplo 1
O exemplo a seguir usa a instrução Const para declarar constantes para uso no lugar de
valores literais.

VB

' The following statements declare constants.

Const maximum As Long = 459

Public Const helpString As String = "HELP"

Private Const startValue As Integer = 5

Exemplo 2
Se você definir uma constante com o tipo de dados Object , o compilador do Visual
Basic fornecerá o tipo de initializer , em vez de Object . No exemplo a seguir, a
constante naturalLogBase tem o tipo de tempo de execução Decimal .

VB

Const naturalLogBase As Object = CDec(2.7182818284)

MsgBox("Run-time type of constant naturalLogBase is " &

naturalLogBase.GetType.ToString())

O exemplo anterior usa o método ToString no objeto Type retornado pelo Operador
GetType, porque Type não pode ser convertido em String usando CStr .

Confira também
Asc
AscW
Instrução Enum
Diretiva #Const
Instrução Dim
Instrução ReDim
Conversões implícitas e explícitas
Constantes e Enumerações
Constantes e Enumerações
Funções de conversão do tipo
Instrução Continue (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Transfere o controle imediatamente para a próxima iteração do loop.

Sintaxe
VB

Continue { Do | For | While }

Comentários
Você pode transferir de dentro de um loop Do , For ou While para a próxima iteração
desse loop. O controle passa imediatamente para o teste de condição de loop, que é
equivalente à transferência para a instrução For ou While , ou para a instrução Do ou
Loop que contém a cláusula Until ou While .

Você pode usar Continue em qualquer local no loop que permita transferências. As
regras que permitem a transferência de controle são iguais às da Instrução GoTo.

Por exemplo, se um loop estiver totalmente contido em um bloco Try , Catch ou


Finally , você pode usar Continue para fazer a transferência para fora do loop. Se, por

outro lado, a estrutura Try ... End Try estiver contida no loop, você não poderá usar
Continue para transferir o controle para fora do bloco Finally e poderá usá-lo para
transferir para fora um bloco Try ou Catch somente se você transferir completamente
para fora da estrutura Try ... End Try .

Se você tiver loops aninhados do mesmo tipo, por exemplo, um loop Do dentro de Do ,
uma instrução Continue Do pulará para a próxima iteração do loop Do mais interno que
o contém. Você não pode usar Continue para pular para a próxima iteração de um loop
contendo do mesmo tipo.

Se você tiver loops aninhados de tipos diferentes, por exemplo, um loop Do dentro de
For , poderá pular para a próxima iteração de qualquer loop usando Continue Do ou

Continue For .

Exemplo
O exemplo de código a seguir usa a instrução Continue While para pular para a próxima
coluna de uma matriz se um divisor for zero. O Continue While está dentro de um loop
For . Ele é transferido para a instrução While col < lastcol , que é a próxima iteração

do loop While mais interno que contém For .

VB

Dim row, col As Integer


Dim lastrow As Integer = 6

Dim lastcol As Integer = 10

Dim a(,) As Double = New Double(lastrow, lastcol) {}

Dim b(7) As Double

row = -1

While row < lastrow

row += 1

col = -1

While col < lastcol

col += 1

a(row, col) = 0

For i As Integer = 0 To b.GetUpperBound(0)

If b(i) = col Then

Continue While

Else

a(row, col) += (row + b(i)) / (col - b(i))

End If

Next i

End While

End While

Confira também
Instrução Do...Loop
Instrução For...Next
Instrução While...End While
Instrução Try...Catch...Finally
Instrução Declare
Artigo • 28/11/2022 • 8 minutos para o fim da leitura

Declara uma referência a um procedimento implementado em um arquivo externo.

Sintaxe
VB

[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Overloads ] _

Declare [ charsetmodifier ] [ Sub ] name Lib "libname" _

[ Alias "aliasname" ] [ ([ parameterlist ]) ]

' -or-

[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Overloads ] _

Declare [ charsetmodifier ] [ Function ] name Lib "libname" _

[ Alias "aliasname" ] [ ([ parameterlist ]) ] [ As returntype ]

Partes
Termo Definição

attributelist Opcional. Veja Lista de atributo.

accessmodifier Opcional. Um dos seguintes pode ser feito:

- Público

- Protegido

- Amigo

- Particular

- Amigo Protegido

- Protegido de forma particular

Consulte Níveis de acesso no Visual Basic.

Shadows Opcional. Confira Sombras.

charsetmodifier Opcional. Especifica informações de conjunto de caracteres e pesquisa de


arquivo. Um dos seguintes pode ser feito:

- Ansi (padrão)

- Unicode

- Auto

Sub Opcional, mas Sub ou Function deve aparecer. Indica que o procedimento
externo não retorna um valor.
Termo Definição

Function Opcional, mas Sub ou Function deve aparecer. Indica que o procedimento
externo retorna um valor.

name Obrigatórios. Nome dessa referência externa. Para obter mais informações,
consulte Nomes do Elemento Declarado.

Lib Obrigatórios. Apresenta uma cláusula Lib que identifica o arquivo externo
(DLL ou recurso de código) contendo um procedimento externo.

libname Obrigatórios. Nome do arquivo que contém o procedimento declarado.

Alias Opcional. Indica que o procedimento que está sendo declarado não pode ser
identificado no arquivo pelo nome especificado em name . Especifique a
identificação em aliasname .

aliasname Obrigatório se você usar a palavra-chave Alias . Cadeia de caracteres que


identifica o procedimento de duas maneiras:

O nome do ponto de entrada do procedimento no arquivo, entre aspas ( "" )

-ou-

Um sinal numérico ( # ) seguido por um inteiro especificando o número ordinal


do ponto de entrada do procedimento no arquivo

parameterlist Necessário se o procedimento usa parâmetros. Consulte a Lista de parâmetros.

returntype Obrigatório se Function for especificado e Option Strict for On . Tipo de


dados do valor retornado pelo procedimento.

Comentários
Às vezes, você precisa chamar um procedimento definido em um arquivo (como uma
DLL ou um recurso de código) fora do projeto. Quando você faz isso, o compilador do
Visual Basic não tem acesso às informações necessárias para chamar o procedimento
corretamente, como onde o procedimento está localizado, como ele é identificado, sua
sequência de chamada e tipo de retorno e o conjunto de caracteres de cadeia de
caracteres usado. A instrução Declare cria uma referência a um procedimento externo e
fornece essas informações necessárias.

Você só pode usar Declare no nível do módulo. Isso significa que o contexto de
declaração de uma referência externa precisa ser uma classe, estrutura, módulo ou
procedimento, e não pode ser um arquivo de origem, namespace, interface,
procedimento ou bloco. Para obter mais informações, consulte Contextos de declaração
e níveis de acesso padrão.

Referências externas padrão para acesso Público. Você pode ajustar os níveis de acesso
com os modificadores de acesso.

Regras
Atributos. É possível aplicar atributos a uma referência externa. Qualquer atributo
aplicado só tem efeito em seu projeto, não no arquivo externo.

Modificadores. Procedimentos externos são implicitamente Compartilhados. Não


é possível usar a palavra-chave Shared ao declarar uma referência externa, nem
alterar seu status compartilhado.

Um procedimento externo não pode participar da substituição, implementar


membros da interface ou manipular eventos. Dessa forma, você não pode usar a
Overrides , Overridable , NotOverridable , MustOverride , Implements ou Handles

em uma instrução Declare .

Nome do procedimento externo. Você não precisa dar a essa referência externa o
mesmo nome (em name ) que o nome do ponto de entrada do procedimento em
seu arquivo externo ( aliasname ). Você pode usar uma cláusula Alias para
especificar o nome do ponto de entrada. Isso poderá ser útil se o procedimento
externo tiver o mesmo nome que um modificador reservado do Visual Basic ou
uma variável, procedimento ou outro elemento de programação no mesmo
escopo.

7 Observação

Na maioria das DLLs, os nomes do ponto de entrada diferenciam maiúsculas


de minúsculas.

Número do procedimento externo. Como alternativa, é possível usar uma cláusula


Alias para especificar o número ordinal do ponto de entrada na tabela de
exportação do arquivo externo. Para fazer isso, aliasname deve começar com uma
tecla jogo da velha ( # ). Isso pode ser útil se qualquer caractere no nome do
procedimento externo não for permitido no Visual Basic ou se o arquivo externo
exportar o procedimento sem um nome.
Regras de tipo de dados
Tipos de dados do parâmetro. Se Option Strict for On , especifique o tipo de
dados de cada parâmetro em parameterlist . Pode ser qualquer tipo de dados ou
o nome de uma enumeração, estrutura, classe ou interface. Em parameterlist , use
uma cláusula As para especificar o tipo de dados do argumento a ser passado
para cada parâmetro.

7 Observação

Se o procedimento externo não foi gravado no .NET Framework, verifique se


os tipos de dados correspondem. Por exemplo, se você declarar uma
referência externa a um procedimento do Visual Basic 6.0 com um parâmetro
Integer (16 bits no Visual Basic 6.0), identifique o argumento correspondente
como Short na instrução Declare , pois esse é o tipo inteiro de 16 bits no
Visual Basic. Da mesma forma, Long tem uma largura de dados diferente no
Visual Basic 6.0 e Date é implementado de forma diferente.

Tipo de dados de retorno. Se o procedimento externo for Function e Option


Strict for On , você deverá especificar o tipo de dados do valor retornado ao
código de chamada. Pode ser qualquer tipo de dados ou o nome de uma
enumeração, estrutura, classe ou interface.

7 Observação

O compilador do Visual Basic não verifica se os tipos de dados são


compatíveis com os do procedimento externo. Se houver uma
incompatibilidade, o Common Language Runtime gerará uma exceção
MarshalDirectiveException no tempo de execução.

Tipos de dados padrão. Se Option Strict for Off e você não especificar o tipo de
dados de um parâmetro em parameterlist , o compilador do Visual Basic
converterá o argumento correspondente no Tipo de Dados do Objeto. Da mesma
forma, se você não especificar returntype , o compilador usará o tipo de dados de
retorno como Object .

7 Observação
Como você está lidando com um procedimento externo que pode ter sido
gravado em uma plataforma diferente, é perigoso fazer qualquer suposição
sobre tipos de dados ou permitir que eles sejam padrão. É mais seguro
especificar o tipo de dados de cada parâmetro e do valor retornado, se
houver. Isso também melhora a legibilidade do código.

Comportamento
Escopo. Uma referência externa está no escopo em toda a classe, estrutura ou
módulo.

Tempo de vida. Uma referência externa tem o mesmo tempo de vida que a classe,
a estrutura ou o módulo em que ela é declarada.

Chamada de um procedimento externo. Um procedimento externo é chamado da


mesma forma que um procedimento Function ou Sub , usando-o em uma
expressão se ele retorna um valor ou especificando-o em uma Instrução de
Chamada se ele não retornar um valor.

Você passa argumentos para o procedimento externo exatamente conforme


especificado por parameterlist na instrução Declare . Não considere como os
parâmetros foram originalmente declarados no arquivo externo. Da mesma forma,
se houver um valor retornado, use-o exatamente como especificado por
returntype na instrução Declare .

Conjuntos de caracteres. Você pode especificar no charsetmodifier como o Visual


Basic deve realizar marshal de cadeias de caracteres quando ele chama o
procedimento externo. O modificador Ansi direciona o Visual Basic para realizar
marshal de todas as cadeias de caracteres para valores ANSI e o modificador
Unicode direciona-o para realizar marshal de todas as cadeias de caracteres para
valores Unicode. O modificador Auto direciona o Visual Basic para realizar marshal
de cadeias de caracteres de acordo com as regras do .NET Framework com base na
referência externa name ou aliasname , se especificado. O valor padrão é Ansi .

charsetmodifier também especifica como o Visual Basic deve pesquisar o

procedimento externo em seu arquivo externo. Ansi e Unicode direcionam o


Visual Basic para pesquisá-lo sem modificar o nome durante a pesquisa. Auto
direciona o Visual Basic para determinar o conjunto de caracteres base da
plataforma do tempo de execução e, possivelmente, modificar o nome do
procedimento externo, da seguinte maneira:
Em uma plataforma Unicode, como o Windows, primeiro procure o
procedimento externo sem modificação do nome. Se isso falhar, acrescente "W"
ao final do nome do procedimento externo e procure-o novamente.

Em uma plataforma ANSI, primeiro procure o procedimento externo sem


modificação de nome. Se isso falhar, acrescente "A" ao final do nome do
procedimento externo e procure-o novamente.

Mecanismo. O Visual Basic usa o mecanismo de invocação de plataforma (PInvoke)


do .NET Framework para resolver e acessar procedimentos externos. A instrução
Declare e a classe DllImportAttribute usam esse mecanismo automaticamente e
você não precisa ter conhecimento do PInvoke. Para obter mais informações,
consulte Passo a passo: Fazer chamadas de APIs do Windows.

) Importante

Se o procedimento externo for executado fora do CLR (Common Language


Runtime), ele será um código não gerenciado. Ao chamar esse procedimento, por
exemplo, uma função de API do Windows ou um método COM, seu aplicativo pode
ficar exposto a riscos de segurança. Para obter mais informações, consulte
Diretrizes de codificação segura para código não gerenciado.

Exemplo 1
O exemplo a seguir declara uma referência externa a um procedimento Function que
retorna o nome de usuário atual. Em seguida, ele chama o procedimento externo
GetUserNameA como parte do procedimento getUser .

VB

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (

ByVal lpBuffer As String, ByRef nSize As Integer) As Integer

Sub GetUser()

Dim buffer As String = New String(CChar(" "), 25)

Dim retVal As Integer = GetUserName(buffer, 25)

Dim userName As String = Strings.Left(buffer, InStr(buffer, Chr(0)) - 1)

MsgBox(userName)

End Sub

Exemplo 2
DllImportAttribute fornece uma maneira alternativa de usar funções no código não
gerenciado. O exemplo a seguir declara uma função importada sem usar uma instrução
Declare .

VB

' Add an Imports statement at the top of the class, structure, or

' module that uses the DllImport attribute.

Imports System.Runtime.InteropServices

VB

<DllImportAttribute("kernel32.dll", EntryPoint:="MoveFileW",

SetLastError:=True, CharSet:=CharSet.Unicode,

ExactSpelling:=True,

CallingConvention:=CallingConvention.StdCall)>

Public Shared Function MoveFile(ByVal src As String,

ByVal dst As String) As Boolean

' This function copies a file from the path src to the path dst.

' Leave this function empty. The DLLImport attribute forces calls

' to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL.

End Function

Confira também
LastDllError
Instrução Imports (tipo e namespace .NET)
Operador AddressOf
Instrução Function
Instrução Sub
Lista de parâmetros
Instrução Call
Passo a passo: Fazer chamadas de APIs do Windows
Instrução Delegate
Artigo • 12/12/2022 • 4 minutos para o fim da leitura

Usada para declarar um delegado. Um delegado é um tipo de referência que se refere a


um método Shared de um tipo ou a um método de instância de um objeto. Qualquer
procedimento com parâmetros e tipos de retorno correspondentes pode ser usado para
criar uma instância dessa classe delegada. Em seguida, o procedimento pode ser
invocado posteriormente por meio da instância delegada.

Sintaxe
VB

[ <attrlist> ] [ accessmodifier ] _

[ Shadows ] Delegate [ Sub | Function ] name [( Of typeparamlist )] [([


parameterlist ])] [ As type ]

Partes
Termo Definição

attrlist Opcional. Lista de atributos que se aplicam a esse delegado. Vários atributos
são separados por vírgulas. Você precisa colocar a Lista de atributos entre
colchetes angulares (" < " e " > ").

accessmodifier Opcional. Especifica qual código pode acessar o delegado. Um dos seguintes
pode ser feito:

- Público. Qualquer código que possa acessar o elemento que declara o


delegado pode acessá-lo.

- Protegido. Somente o código dentro da classe do delegado ou de uma classe


derivada pode acessá-lo.

- Amigo. Somente o código dentro do mesmo assembly pode acessar o


delegado.

- Particular. Somente o código dentro do elemento que declara o delegado


pode acessá-lo.

- Amigo Protegido Somente o código dentro da classe do delegado, de uma


classe derivada ou do mesmo assembly pode acessar o delegado.

- Protegido de forma particular Somente o código dentro da classe do


delegado, de uma classe derivada ou do mesmo assembly pode acessar o
delegado.
Termo Definição

Shadows Opcional. Indica que esse delegado redeclara novamente e oculta um elemento
de programação nomeado de maneira idêntica, ou conjunto de elementos
sobrecarregados, em uma classe base. Você pode sombrear qualquer tipo de
elemento declarado com qualquer outro tipo.

Um elemento sombreado não está disponível de dentro da classe derivada que


o sombreia, exceto de onde o elemento de sombreamento está inacessível. Por
exemplo, se um elemento Private sombrear um elemento de classe base, o
código que não tem permissão para acessar o elemento Private acessará o
elemento de classe base.

Sub Opcional, mas Sub ou Function deve aparecer. Declara esse procedimento
como um procedimento Sub delegado que não retorna um valor.

Function Opcional, mas Sub ou Function deve aparecer. Declara esse procedimento
como um procedimento Function delegado que retorna um valor.

name Obrigatórios. Nome do tipo de delegado; segue as convenções de


nomenclatura de variáveis padrão.

typeparamlist Opcional. Lista de parâmetros de tipo para esse delegado. Vários parâmetros de
tipo são separados por vírgulas. Como opção, cada parâmetro de tipo pode ser
declarado variante usando os modificadores In e Out genéricos. Você deve
colocar a Lista de Tipos entre parênteses e apresentá-la com a palavra-chave
Of .

parameterlist Opcional. Lista de parâmetros passados para o procedimento quando ele é


chamado. Você deve colocar a Lista de Parâmetros entre parênteses.

type Obrigatório se você especificar um procedimento Function . Tipo de dados do


valor retornado.

Comentários
A instrução Delegate define o parâmetro e os tipos de retorno de uma classe delegada.
Qualquer procedimento com parâmetros e tipos de retorno correspondentes pode ser
usado para criar uma instância dessa classe delegada. Em seguida, o procedimento
pode ser invocado posteriormente por meio da instância delegada, chamando o
método Invoke do delegado.

Os delegados podem ser declarados no namespace, no módulo, na classe ou no nível


de estrutura, mas não dentro de um procedimento.

Cada classe de delegado define um construtor que é passado para a especificação de


um método do objeto. Um argumento para o construtor delegado deve ser uma
referência a um método ou uma expressão lambda.

Para especificar uma referência a um método, use a seguinte sintaxe:

AddressOf [ expression .] methodname

O tipo de tempo de compilação do expression deve ser o nome de uma classe ou uma
interface que contém um método do nome especificado cuja assinatura coincide com a
assinatura da classe delegada. O methodname pode ser um método compartilhado ou um
método de instância. O methodname não é opcional, mesmo se você criar um delegado
para o método padrão da classe.

Para especificar uma expressão lambda, use a seguinte sintaxe:

Function ([ parm As type , parm2 As type2 , ...]) expression

A assinatura da função deve corresponder a do tipo delegado. Para obter mais


informações sobre expressões lambda, consulte Expressões lambda.

Para obter mais informações sobre delegados, confira Delegados.

Exemplo
O exemplo a seguir usa a instrução Delegate para declarar um delegado para operar em
dois números e retornar um número. O método DelegateTest usa uma instância de um
delegado desse tipo e o usa para operar em pares de números.

VB

Delegate Function MathOperator(

ByVal x As Double,

ByVal y As Double

) As Double

Function AddNumbers(

ByVal x As Double,

ByVal y As Double

) As Double

Return x + y

End Function

Function SubtractNumbers(

ByVal x As Double,

ByVal y As Double

) As Double

Return x - y

End Function

Sub DelegateTest(

ByVal x As Double,

ByVal op As MathOperator,

ByVal y As Double

Dim ret As Double

ret = op.Invoke(x, y) ' Call the method.

MsgBox(ret)

End Sub

Protected Sub Test()

DelegateTest(5, AddressOf AddNumbers, 3)

DelegateTest(9, AddressOf SubtractNumbers, 3)

End Sub

Confira também
Operador AddressOf
Of
Representantes
Como: Usar uma classe genérica
Tipos genéricos no Visual Basic
Covariância e Contravariância
In
Saída
Instrução Dim (Visual Basic)
Artigo • 28/11/2022 • 13 minutos para o fim da leitura

Declara e aloca espaço de armazenamento para uma ou mais variáveis.

Sintaxe
VB

[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]]


[ ReadOnly ]

Dim [ WithEvents ] variablelist

Partes
attributelist

Opcional. Confira Lista de atributos.

accessmodifier

Opcional. Um dos seguintes pode ser feito:

Público

Protegido

Friend

Privado

Amigo Protegido

Particular Protegido

Confira Níveis de acesso no Visual Basic.

Shared

Opcional. Confira Compartilhado.

Shadows

Opcional. Confira Sombras.


Static

Opcional. Confira Estático.

ReadOnly

Opcional. Confira ReadOnly.

WithEvents

Opcional. Especifica que essas são variáveis de objeto que se referem a instâncias
de uma classe que podem gerar eventos. Confira WithEvents.

variablelist

Obrigatórios. Lista de variáveis que estão sendo declaradas nesta instrução.

variable [ , variable ... ]

Cada variable tem a sintaxe e as partes a seguir:

variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With { [


.propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]

Parte Descrição

variablename Obrigatórios. Nome da variável. Confira Nomes de elementos


declarados.

boundslist Opcional. Lista de limites de cada dimensão de uma variável de matriz.

New Opcional. Cria uma nova instância da classe quando a instrução Dim é
executada.

datatype Opcional. O tipo de dados da variável.

With Opcional. Apresenta a lista de inicializadores de objeto.

propertyname Opcional. O nome de uma propriedade na classe da qual você está


fazendo uma instância.

propinitializer Obrigatório após propertyname =. A expressão que é avaliada e


atribuída ao nome da propriedade.

initializer Opcional se New não for especificado. Expressão que é avaliada e


atribuída à variável quando ela é criada.

Comentários
O compilador do Visual Basic usa a instrução Dim para determinar o tipo de dados da
variável e outras informações, como qual código pode acessar a variável. O exemplo a
seguir declara uma variável para manter um valor Integer .

VB

Dim numberOfStudents As Integer

Você pode especificar qualquer tipo de dados ou o nome de uma enumeração,


estrutura, classe ou interface.

VB

Dim finished As Boolean


Dim monitorBox As System.Windows.Forms.Form

Para um tipo de referência, use a palavra-chave New para criar uma nova instância da
classe ou estrutura especificada pelo tipo de dados. Se você usar New , não usará uma
expressão do inicializador. Em vez disso, você fornecerá argumentos, se forem
necessários, para o construtor da classe da qual está criando a variável.

VB

Dim bottomLabel As New System.Windows.Forms.Label

Você pode declarar uma variável em um procedimento, um bloco, uma classe, uma
estrutura ou um módulo. Você não pode declarar uma variável em um arquivo de
origem, namespace ou interface. Para obter mais informações, consulte Contextos de
declaração e níveis de acesso padrão.

Uma variável declarada no nível do módulo, fora de qualquer procedimento, é uma


variável de membro ou campo. As variáveis de membro estão no escopo em toda a
classe, estrutura ou módulo. Uma variável declarada no nível do procedimento é uma
variável local. As variáveis locais estão no escopo apenas dentro do procedimento ou do
bloco.

Os seguintes modificadores de acesso são usados para declarar variáveis fora de um


procedimento: Public , Protected , Friend , Protected Friend e Private . Para obter mais
informações, consulte Níveis de acesso no Visual Basic.

A palavra-chave Dim é opcional e geralmente omitida se você especificar qualquer um


dos seguintes modificadores: Public , Protected , Friend , Protected Friend , Private ,
Shared , Shadows , Static , ReadOnly ou WithEvents .
VB

Public maximumAllowed As Double

Protected Friend currentUserName As String

Private salary As Decimal

Static runningTotal As Integer

Se Option Explicit estiver ativado (o padrão), o compilador exigirá uma declaração


para cada variável que você usa. Para obter mais informações, confira a Instrução Option
Explicit.

Especificar um valor inicial


Você pode atribuir um valor a uma variável quando ela for criada. Para um tipo de valor,
você usa um inicializador para fornecer uma expressão a ser atribuída à variável. A
expressão deve ser avaliada como uma constante que pode ser calculada em tempo de
compilação.

VB

Dim quantity As Integer = 10

Dim message As String = "Just started"

Se um inicializador for especificado e um tipo de dados não for especificado em uma


cláusula As , a inferência de tipo será usada para inferir o tipo de dados do inicializador.
No exemplo a seguir, num1 e num2 são classificados como inteiros. Na segunda
declaração, a inferência de tipo infere o tipo do valor 3.

VB

' Use explicit typing.

Dim num1 As Integer = 3

' Use local type inference.

Dim num2 = 3

A inferência de tipo se aplica no âmbito do procedimento. Ela não se aplica fora de um


procedimento em uma classe, estrutura, módulo ou interface. Para obter mais
informações sobre inferência de tipos, confira Instrução Option Infer
e Inferência de
Tipo de Variável Local.

Para obter informações sobre o que acontece quando um tipo de dados ou inicializador
não é especificado, confira Tipos e Valores de Dados Padrão mais adiante neste tópico.
Você pode usar um inicializador de objeto para declarar instâncias de tipos nomeados e
anônimos. O código a seguir cria uma instância de uma classe Student e usa um
inicializador de objeto para inicializar propriedades.

VB

Dim student1 As New Student With {.First = "Michael",

.Last = "Tucker"}

Para obter mais informações sobre inicializadores de objeto, confira Como declarar um
objeto usando um inicializador de objeto, Inicializadores de objeto: tipos nomeados e
anônimos e Tipos anônimos.

Declarar várias variáveis


Você pode declarar várias variáveis em uma instrução de declaração, especificando o
nome da variável para cada uma e seguindo cada nome de matriz com parênteses.
Várias variáveis são separadas por vírgulas.

VB

Dim lastTime, nextTime, allTimes() As Date

Se você declarar mais de uma variável com uma cláusula As , não poderá fornecer um
inicializador para esse grupo de variáveis.

Você pode especificar tipos de dados diferentes para constantes variáveis usando uma
cláusula As separada para cada variável que você declarar. Cada variável usa o tipo de
dados especificado na primeira cláusula As encontrada após sua parte variablename .

VB

Dim a, b, c As Single, x, y As Double, i As Integer

' a, b, and c are all Single; x and y are both Double

Matrizes
Você pode declarar uma variável para manter uma matriz, que pode conter vários
valores. Para especificar que uma variável contém uma matriz, variablename deve estar
imediatamente entre parênteses. Para obter mais informações sobre matrizes, confira
Matrizes.
Você pode especificar o limite inferior e superior de cada dimensão de uma matriz. Para
fazer isso, inclua um parêntese boundslist . Para cada dimensão, boundslist especifica
o limite superior e, opcionalmente, o limite inferior. O limite inferior é sempre zero, quer
você o especifique ou não. Cada índice pode variar de zero até seu valor associado
superior.

As duas instruções a seguir são equivalentes. Cada instrução declara uma matriz de 21
elementos Integer . Quando você acessa a matriz, o índice pode variar de 0 a 20.

VB

Dim totals(20) As Integer

Dim totals(0 To 20) As Integer

A instrução a seguir declara uma matriz bidimensional do tipo Double . A matriz tem 4
linhas (3 + 1) de 6 colunas (5 + 1) cada. Observe que um limite superior representa o
valor mais alto possível para o índice, não o comprimento da dimensão. O comprimento
da dimensão é o limite superior mais um.

VB

Dim matrix2(3, 5) As Double

Uma matriz pode ter de 1 a 32 dimensões.

Você pode deixar todos os limites em branco em uma declaração de matriz. Se você
fizer isso, a matriz terá o número de dimensões especificadas, mas ela não será
inicializada. Ele tem um valor de Nothing até que você inicialize pelo menos alguns de
seus elementos. A instrução Dim deve especificar limites para todas as dimensões ou
para nenhuma dimensão.

VB

' Declare an array with blank array bounds.

Dim messages() As String

' Initialize the array.

ReDim messages(4)

Se a matriz tiver mais de uma dimensão, você deverá incluir vírgulas entre os parênteses
para indicar o número de dimensões.

VB

Dim oneDimension(), twoDimensions(,), threeDimensions(,,) As Byte

Você pode declarar uma matriz de comprimento zero declarando uma das dimensões da
matriz como -1. Uma variável que contém uma matriz de tamanho igual a zero não tem
o valor Nothing . Matrizes de comprimento zero são exigidas por determinadas funções
comuns de runtime de linguagem. Se você tentar acessar essa matriz, ocorrerá uma
exceção de runtime. Saiba mais em Matrizes.

Você pode inicializar os valores de uma matriz usando um literal de matriz. Para fazer
isso, cerque os valores de inicialização com chaves ( {} ).

VB

Dim longArray() As Long = {0, 1, 2, 3}

Para matrizes multidimensionais, a inicialização para cada dimensão separada é


colocada entre chaves na dimensão externa. Os elementos são especificados em ordem
de linha principal.

VB

Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}

Para obter mais informações sobre literais de matrizes, confira Matrizes.

Tipos de dados e valores padrão


A tabela a seguir descreve os resultados de várias combinações de especificar o tipo de
dados e o inicializador em uma instrução Dim .

Tipo de Inicializador Exemplo Result


dados especificado?
especificado?

Não No Dim qty Se Option Strictestiver desativado (padrão), a


variável é definida como Nothing .

Se Option Strict estiver ativado, ocorre um erro de


tempo de compilação.
Tipo de Inicializador Exemplo Result
dados especificado?
especificado?

No Yes Dim qty Se Option Infer estiver ativado (padrão), a variável


= 5 usa o tipo de dados do inicializador. Confira
Inferência de tipo de variável local.

Se Option Infer estiver desativado e Option Strict


estiver desativado, a variável usa o tipo de dados do
Object .

Se Option Infer estiver desativado e Option Strict


estiver ativado, ocorre um erro de tempo de
compilação.

Sim Não Dim qty A variável é inicializada para o valor padrão para o
As tipo de dados. Consulte a tabela posteriormente
Integer nesta seção.

Sim Sim Dim qty Se o tipo de dados do inicializador não for


As conversível para o tipo de dados especificado,
Integer ocorrerá um erro de tempo de compilação.
= 5

Se você especificar um tipo de dados, mas não especificar um inicializador, o Visual


Basic inicializará a variável para o valor padrão para o tipo de dados. A tabela a seguir
mostra os valores de inicialização padrão.

Tipo de dados Valor padrão

Todos os tipos numéricos (incluindo Byte e SByte ) 0

Char Binário 0

Todos os tipos de referência (incluindo Object , Nothing


String e todas as matrizes)

Boolean False

Date 12:00 AM de 1º de janeiro do ano 1


(01/01/0001 12:00:00 AM)

Cada elemento de uma estrutura é inicializado como se fosse uma variável separada. Se
você declarar o comprimento de uma matriz, mas não inicializar os respectivos
elementos, cada elemento será inicializado como se fosse uma variável separada.
Tempo de vida de variável local estático
Uma variável local Static tem um tempo de vida maior do que o do procedimento no
qual é declarada. Os limites do tempo de vida da variável dependem de onde o
procedimento é declarado e se é Shared .

Declaração de Variável inicializada A variável para de


procedimento existir

Em um módulo A primeira vez que o procedimento é Quando o programa


chamado interrompe a
execução

Em uma classe ou A primeira vez que o procedimento é Quando o programa


estrutura, o chamado em uma instância específica ou na interrompe a
procedimento é Shared própria classe ou estrutura execução

Em uma classe ou A primeira vez que o procedimento é Quando a instância é


estrutura, o chamado em uma instância específica liberada para GC
procedimento não (coleta de lixo)
Shared

Atributos e modificadores
Você pode aplicar atributos somente a variáveis membro, não a variáveis locais. Um
atributo contribui com informações para os metadados do assembly, o que não é
significativo para o armazenamento temporário, como variáveis locais.

No nível do módulo, você não pode usar o modificador Static para declarar variáveis
membro. No nível do procedimento, você não pode usar Shared , Shadows , ReadOnly ,
WithEvents nem modificadores de acesso para declarar variáveis locais.

Você pode especificar qual código pode acessar uma variável fornecendo um
accessmodifier . Variáveis de membro de classe e módulo (fora de qualquer

procedimento) assume o padrão de acesso particular e variáveis de membro de


estrutura assumem o padrão e acesso público. Você pode ajustar os níveis de acesso
com os modificadores de acesso. Você não pode usar modificadores de acesso em
variáveis locais (dentro de um procedimento).

Você pode especificar WithEvents apenas em variáveis de membro, não em variáveis


locais dentro de um procedimento. Se você especificar WithEvents , o tipo de dados da
variável deve ser um tipo de classe específico, não Object . Você não pode declarar uma
matriz com WithEvents . Para obter mais informações sobre eventos, confira Eventos.
7 Observação

O código fora de uma classe, estrutura ou módulo deve qualificar o nome de uma
variável de membro com o nome dessa classe, estrutura ou módulo. O código fora
de um procedimento ou bloco não pode se referir a nenhuma variável local dentro
desse procedimento ou bloco.

Liberar recursos gerenciados


O coletor de lixo do .NET Framework descarta recursos gerenciados sem nenhuma
codificação extra de sua parte. No entanto, você pode forçar o descarte de um recurso
gerenciado em vez de aguardar o coletor de lixo.

Se uma classe mantiver um recurso particularmente valioso e escasso (como uma


conexão de banco de dados ou identificador de arquivo), talvez você não queira esperar
até a próxima coleta de lixo para limpar uma instância de classe que não está mais em
uso. Uma classe pode implementar a interface IDisposable para fornecer uma maneira
de liberar recursos antes de uma coleta de lixo. Uma classe que implementa essa
interface expõe um método Dispose que pode ser chamado para forçar a liberação
imediata de recursos valiosos.

A instrução Using automatiza o processo de aquisição de um recurso, a execução de


um conjunto de instruções e, em seguida, a eliminação do recurso. No entanto, o
recurso deve implementar a interface IDisposable. Para obter mais informações,
consulte Instrução using.

Exemplo 1
O exemplo a seguir declara variáveis usando a instrução Dim com várias opções.

VB

' Declare and initialize a Long variable.

Dim startingAmount As Long = 500

' Declare a variable that refers to a Button object,

' create a Button object, and assign the Button object

' to the variable.

Dim switchButton As New System.Windows.Forms.Button

' Declare a local variable that always retains its value,

' even after its procedure returns to the calling code.

Static totalSales As Double

' Declare a variable that refers to an array.

Dim highTemperature(31) As Integer

' Declare and initialize an array variable that

' holds four Boolean check values.

Dim checkValues() As Boolean = {False, False, True, False}

Exemplo 2
O exemplo a seguir lista os números principais entre 1 e 30. O escopo das variáveis
locais é descrito em comentários de código.

VB

Public Sub ListPrimes()


' The sb variable can be accessed only

' within the ListPrimes procedure.

Dim sb As New System.Text.StringBuilder()

' The number variable can be accessed only

' within the For...Next block. A different

' variable with the same name could be declared

' outside of the For...Next block.

For number As Integer = 1 To 30

If CheckIfPrime(number) = True Then

sb.Append(number.ToString & " ")

End If

Next

Debug.WriteLine(sb.ToString)

' Output: 2 3 5 7 11 13 17 19 23 29

End Sub

Private Function CheckIfPrime(ByVal number As Integer) As Boolean

If number < 2 Then

Return False

Else

' The root and highCheck variables can be accessed

' only within the Else block. Different variables

' with the same names could be declared outside of

' the Else block.

Dim root As Double = Math.Sqrt(number)

Dim highCheck As Integer = Convert.ToInt32(Math.Truncate(root))

' The div variable can be accessed only within

' the For...Next block.

For div As Integer = 2 To highCheck

If number Mod div = 0 Then

Return False

End If

Next

Return True

End If

End Function

Exemplo 3
No exemplo a seguir, a variável speedValue é declarada no nível da classe. A palavra-
chave Private é usada para declarar a variável. A variável pode ser acessada por
qualquer procedimento na classe Car .

VB

' Create a new instance of a Car.


Dim theCar As New Car()

theCar.Accelerate(30)

theCar.Accelerate(20)

theCar.Accelerate(-5)

Debug.WriteLine(theCar.Speed.ToString)

' Output: 45

VB

Public Class Car

' The speedValue variable can be accessed by

' any procedure in the Car class.

Private speedValue As Integer = 0

Public ReadOnly Property Speed() As Integer

Get

Return speedValue

End Get

End Property

Public Sub Accelerate(ByVal speedIncrease As Integer)

speedValue += speedIncrease

End Sub

End Class

Confira também
Instrução Const
Instrução ReDim
Instrução Option Explicit
Instrução Option Infer
Instrução Option Strict
Página de Compilação, Designer de Projeto (Visual Basic)
Declaração de Variável
matrizes
Inicializadores de objeto: tipos nomeados e anônimos
Tipos anônimos
Inicializadores de objeto: tipos nomeados e anônimos
Como declarar um objeto usando um inicializador de objeto
Inferência de Tipo de Variável Local
Instrução Do...Loop (Visual Basic)
Artigo • 07/04/2023 • 4 minutos para o fim da leitura

Repete um bloco de instruções enquanto uma condição Boolean é True ou até que a
condição se torne True .

Sintaxe
VB

Do [ { While | Until } condition ]

[ statements ]

[ Continue Do ]

[ statements ]

[ Exit Do ]

[ statements ]

Loop

' -or-

Do

[ statements ]

[ Continue Do ]

[ statements ]

[ Exit Do ]

[ statements ]

Loop [ { While | Until } condition ]

Partes
Termo Definição

Do Obrigatórios. Inicia a definição do loop Do .

While Não é possível receber se Until for usado. Repita o loop condition até que seja
False .

Until Não é possível receber se While for usado. Repita o loop condition até que seja
True .

condition Opcional. Expressão Boolean . Se condition for Nothing , o Visual Basic o tratará
como False .

statements Opcional. Uma ou mais instruções que são repetidas enquanto, ou até que
condition seja True .
Termo Definição

Continue Opcional. Transfere o controle para a próxima iteração do loop Do .


Do

Exit Do Opcional. Transfere o controle para fora do loop Do .

Loop Obrigatórios. Finaliza a definição do loop Do .

Comentários
Use uma estrutura Do...Loop quando quiser repetir um conjunto de instruções um
número indefinido de vezes até que uma condição seja atendida. Se você quiser repetir
as instruções um número definido de vezes, a instrução For...Next geralmente é uma
opção melhor.

Você pode usar While ou Until para especificar condition , mas não ambos. Se você
não der nenhum dos dois, o loop continuará até que um Exit controle de transferência
saia do loop.

Você pode testar condition apenas uma vez, no início ou no final do loop. Se você
testar condition no início do loop (na instrução Do ), o loop poderá não ser executado
nem uma vez. Se você testar no final do loop (na instrução Loop ), o loop sempre será
executado pelo menos uma vez.

A condição geralmente resulta de uma comparação de dois valores, mas pode ser
qualquer expressão avaliada como um valor de Tipo de dados booliano ( True ou
False ). Isso inclui valores de outros tipos de dados, como tipos numéricos, que foram
convertidos em Boolean .

Você pode aninhar loops Do colocando um loop dentro de outro. Você também pode
aninhar diferentes tipos de estruturas de controle entre si. Para obter mais informações,
confira Estruturas de controle aninhadas.

7 Observação

A estrutura Do...Loop oferece mais flexibilidade do que a instrução While...End


While porque permite que você decida se deseja encerrar o loop quando
condition parar de ser True ou quando ele se tornar True pela primeira vez. Ele
também permite que você teste condition no início ou no final do loop.
Exit Do
A instrução Exit Do pode fornecer uma forma alternativa de sair de um Do…Loop . Exit
Do transfere o controle imediatamente para a instrução que segue a instrução Loop .

Exit Do geralmente é usado após avaliação de alguma condição, por exemplo, em uma
estrutura If...Then...Else . Talvez você queira sair de um loop se detectar uma
condição que torna desnecessário ou impossível continuar iterando, como um valor
errôneo ou uma solicitação de encerramento. Um uso de Exit Do serve para testar uma
condição que pode causar um loop infinito, que é um loop que pode ser executada
várias vezes ou até mesmo infinitamente. Você pode usar Exit Do para ignorar o loop.

Você pode incluir qualquer número de instruções Exit Do em qualquer lugar em um


Do…Loop .

Quando usado em loops Do aninhados, Exit Do transfere o controle para fora do loop
mais interno e para dentro do próximo nível mais alto de aninhamento.

Exemplo 1
No exemplo a seguir, as instruções no loop continuam a ser executadas até que a
variável index seja maior que 10. A cláusula Until está no final do loop.

VB

Dim index As Integer = 0

Do

Debug.Write(index.ToString & " ")

index += 1

Loop Until index > 10

Debug.WriteLine("")

' Output: 0 1 2 3 4 5 6 7 8 9 10

Exemplo 2
O exemplo a seguir usa uma cláusula While em vez de uma cláusula Until , e condition
é testado no início do loop em vez de no final.

VB

Dim index As Integer = 0

Do While index <= 10

Debug.Write(index.ToString & " ")

index += 1

Loop

Debug.WriteLine("")

' Output: 0 1 2 3 4 5 6 7 8 9 10

Exemplo 3
No exemplo a seguir, condition interrompe o loop quando a variável index é maior
que 100. No entanto, a instrução If no loop faz com que a instrução Exit Do
interrompa o loop quando a variável de índice for maior que 10.

VB

Dim index As Integer = 0

Do While index <= 100

If index > 10 Then

Exit Do

End If

Debug.Write(index.ToString & " ")

index += 1

Loop

Debug.WriteLine("")

' Output: 0 1 2 3 4 5 6 7 8 9 10

Exemplo 4
O exemplo a seguir lê todas as linhas em um arquivo de texto. O método OpenText abre
o arquivo e retorna um StreamReader que lê os caracteres. Na condição Do...Loop , o
método Peek do StreamReader determina se há caracteres adicionais.

VB

Private Sub ShowText(ByVal textFilePath As String)

If System.IO.File.Exists(textFilePath) = False Then

Debug.WriteLine("File Not Found: " & textFilePath)

Else

Dim sr As System.IO.StreamReader =
System.IO.File.OpenText(textFilePath)

Do While sr.Peek() >= 0

Debug.WriteLine(sr.ReadLine())

Loop

sr.Close()

End If

End Sub

Confira também
Estruturas de Loop
Instrução For...Next
Tipo de dados booliano
Estruturas de Controle Aninhadas
Instrução Exit
Instrução While...End While
Instrução Else (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Introduz um grupo de instruções a serem executadas ou compiladas se nenhum outro


grupo condicional de instruções tiver sido executado ou compilado.

Comentários
A palavra-chave Else pode ser usada nestes dois contextos:

Instrução If...Then...Else

Instrução Select...Case

Diretiva #If...Then...#Else

Confira também
Palavras-chave
Instrução End
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Encerra a execução imediatamente.

Sintaxe
VB

End

Comentários
Você pode colocar a instrução End em qualquer lugar em um procedimento para forçar
todo o aplicativo a parar de executar. End fecha todos os arquivos abertos com uma
instrução Open e limpa todas as variáveis do aplicativo. O aplicativo fecha assim que não
há outros programas que contêm referências a seus objetos e nenhum de seus códigos
está em execução.

7 Observação

A instrução End interrompe a execução de código abruptamente e não invoca o


método Dispose ou Finalize , ou qualquer outro código do Visual Basic. As
referências de objeto mantidas por outros programas são invalidadas. Se uma
instrução End for encontrada dentro de um bloco Try ou Catch , o controle não
passará para o bloco Finally correspondente.

A instrução Stop suspende a execução, mas, ao contrário de End , não fecha nenhum
arquivo ou limpa nenhuma variável, a menos que ela seja encontrada em um arquivo
executável compilado (.exe).

Como End encerra seu aplicativo sem atender a nenhum recurso que possa estar
aberto, você deve tentar fechar de maneira limpa antes de usá-lo. Por exemplo, se o
aplicativo tiver formulários abertos, você deverá fechá-los antes que o controle chegue
à instrução End .

Você deve usar End com moderação e somente quando precisar parar imediatamente.
As formas normais de encerrar um procedimento (Instrução Return e Instrução Exit) não
apenas fecham o procedimento de maneira limpa, mas também dão ao código de
chamada a oportunidade de fechar de maneira limpa. Um aplicativo de console, por
exemplo, pode simplesmente Return do procedimento Main .

) Importante

A instrução End chama o método Exit da classe Environment no namespace


System. Exit requer que você tenha permissão UnmanagedCode . Se você não tiver,
ocorrerá um erro SecurityException.

Quando seguida por uma palavra-chave adicional, a Instrução End <keyword> delineia
a definição do procedimento ou bloco apropriado. Por exemplo, End Function encerra a
definição de um procedimento Function .

Exemplo
O exemplo a seguir usa a instrução End para encerrar a execução do código se o
usuário a solicitar.

VB

Sub Form_Load()

Dim answer As MsgBoxResult

answer = MsgBox("Do you want to quit now?", MsgBoxStyle.YesNo)


If answer = MsgBoxResult.Yes Then

MsgBox("Terminating program")

End

End If

End Sub

Anotações do desenvolvedor de dispositivo


inteligente
Não há suporte para essa instrução.

Confira também
Instrução Stop
Instrução End <keyword>
Instrução End <palavra-chave> (Visual
Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Quando seguida por uma palavra-chave adicional, termina a definição do bloco de


instrução introduzido por essa palavra-chave.

Sintaxe
VB

End AddHandler

End Class

End Enum

End Event

End Function

End Get

End If

End Interface

End Module

End Namespace

End Operator

End Property

End RaiseEvent

End RemoveHandler

End Select

End Set

End Structure

End Sub

End SyncLock

End Try

End While

End With

Partes
Parte Descrição

End Obrigatórios. Termina a definição do elemento de programação.

AddHandler Obrigatório para terminar um acessador AddHandler iniciado por uma instrução
AddHandler correspondente em uma Instrução Event personalizada.
Parte Descrição

Class Obrigatório para terminar uma definição de classe iniciada por uma Instrução
Class correspondente.

Enum Obrigatório para terminar uma definição de enumeração iniciada por uma
Instrução Enum correspondente.

Event Obrigatório para terminar uma definição de evento Custom iniciada por uma
Instrução Event correspondente.

Function Obrigatório para terminar uma Function definição de procedimento iniciada por
uma Instrução Function correspondente. Se a execução encontrar uma instrução
End Function , o controle retornará ao código de chamada.

Get Obrigatório para terminar uma definição de procedimento Property iniciada por
uma Instrução Get correspondente. Se a execução encontrar uma instrução End
Get , o controle retornará à instrução que solicita o valor da propriedade.

If Obrigatório para terminar uma definição de bloco If ... Then ... Else iniciada por
uma instrução If correspondente. Consulte Instrução If...Then...Else.

Interface Obrigatório para terminar uma definição de interface iniciada por uma Instrução
Interface correspondente.

Module Obrigatório para terminar uma definição de módulo iniciada por uma Instrução
Module correspondente.

Namespace Obrigatório para terminar uma definição de namespace iniciada por uma
Instrução Namespace correspondente.

Operator Obrigatório para terminar uma definição de operador iniciada por uma instrução
Operator correspondente.

Property Obrigatório para terminar uma definição de propriedade iniciada por uma
Instrução Property correspondente.

RaiseEvent Obrigatório para terminar um acessador RaiseEvent iniciado por uma instrução
RaiseEvent correspondente em uma Instrução Event personalizada.

RemoveHandler Obrigatório para terminar um acessador RemoveHandler iniciado por uma


instrução RemoveHandler correspondente em uma Instrução Event personalizada.

Select Obrigatório para terminar uma definição de bloco Select ... Case iniciada por
uma instrução Select correspondente. Consulte Instrução Select...Case.

Set Obrigatório para terminar uma definição de procedimento Property iniciada por
uma Instrução Set correspondente. Se a execução encontrar uma instrução End
Set , o controle retornará à instrução que solicita o valor da propriedade.
Parte Descrição

Structure Obrigatório para terminar uma definição de estrutura iniciada por uma Instrução
Structure correspondente.

Sub Obrigatório para terminar uma definição de procedimento Sub iniciada por uma
Instrução Sub correspondente. Se a execução encontrar uma instrução End Sub ,
o controle retornará ao código de chamada.

SyncLock Obrigatório para terminar uma definição de bloco SyncLock iniciada por uma
instrução SyncLock correspondente. Consulte Instrução SyncLock.

Try Obrigatório para terminar uma definição de bloco Try ... Catch ... Finally iniciada
por uma instrução Try correspondente. Consulte Instrução Try...Catch...Finally.

While Obrigatório para terminar uma definição de loop While iniciada por uma
instrução While correspondente. Consulte Instrução While...End While.

With Obrigatório para terminar uma definição de bloco With iniciada por uma
instrução With correspondente. Consulte Instrução With...End With.

Diretivas
Quando precedida por um sinal numérico ( # ), a palavra-chave End termina um bloco de
pré-processamento introduzido pela diretiva correspondente.

VB

#End ExternalSource

#End If

#End Region

Parte Descrição

#End Obrigatórios. Termina a definição do bloco de pré-processamento.

ExternalSource Obrigatório para terminar um bloco de origem externo iniciado por uma
Diretiva #ExternalSource correspondente.

If Obrigatório para terminar um bloco de compilação condicional iniciado por


uma diretiva #If correspondente. Consulte Diretivas #If...Then...#Else.

Region Obrigatório para terminar um bloco de região de origem iniciado por uma
Diretiva #Region correspondente.

Comentários
A Instrução End, sem uma palavra-chave adicional, termina a execução imediatamente.

Anotações do desenvolvedor de dispositivo


inteligente
A instrução End , sem uma palavra-chave adicional, não tem suporte.

Confira também
Instrução End
Instrução Enum (Visual Basic)
Artigo • 07/04/2023 • 8 minutos para o fim da leitura

Declara uma enumeração e define os valores dos membros.

Sintaxe
VB

[ <attributelist> ] [ accessmodifier ] [ Shadows ]

Enum enumerationname [ As datatype ]

memberlist

End Enum

Partes
attributelist

Opcional. Lista de atributos que se aplicam a essa enumeração. Você deve colocar
a lista de atributos entre colchetes angulares (" < " e " > ").

O atributo FlagsAttribute indica que o valor de uma instância da enumeração pode


incluir vários membros de enumeração e que cada membro representa um campo
de bits no valor de enumeração.

accessmodifier

Opcional. Especifica qual código pode acessar essa enumeração. Um dos seguintes
pode ser feito:

Público

Protegido

Friend

Privado

Amigo Protegido

Particular Protegido

Shadows
Opcional. Especifica que essa enumeração declara novamente e oculta um
elemento de programação nomeado de maneira idêntica, ou conjunto de
elementos sobrecarregados, em uma classe base. Você pode especificar Sombras
apenas na enumeração em si, não em nenhum dos membros.

enumerationname

Obrigatórios. Nome da enumeração. Para obter informações sobre nomes válidos,


confira Nomes de elemento declarados.

datatype

Opcional. Tipo de dados da enumeração e todos os membros.

memberlist

Obrigatórios. Lista de constantes de membro que estão sendo declaradas nesta


instrução. Vários membros aparecem em linhas de código-fonte individuais.

Cada member tem a seguinte sintaxe e partes: [<attribute list>] member name [ =
initializer ]

Parte Descrição

membername Obrigatórios. Nome desse membro.

initializer Opcional. Expressão avaliada em tempo de compilação e atribuída a este


membro.

End Enum

Termina o bloco Enum .

Comentários
Se você tiver um conjunto de valores inalterados logicamente relacionados uns aos
outros, poderá defini-los juntos em uma enumeração. Isso fornece nomes significativos
para a enumeração e os membros, que são mais fáceis de lembrar do que os valores.
Em seguida, você pode usar os membros de enumeração em muitos locais em seu
código.

Os benefícios da utilização de enumerações são:

Reduz erros causados pela transposição ou digitação incorreta de números.


Torna mais fácil alterar valores no futuro.

Torna o código mais fácil de ler, o que significa que é menos provável que os erros
sejam introduzidos.

Garante a compatibilidade com o futuro. Se você usa enumerações, o código será


menos propenso a falhar se, posteriormente, alguém alterar os valores
correspondentes aos nomes dos membros.

Uma enumeração tem um nome, um tipo de dados subjacente e um conjunto de


membros. Cada membro representa uma constante.

Uma enumeração declarada no nível de classe, estrutura, módulo ou interface, fora de


qualquer procedimento, é uma enumeração de membro. Ela é um membro da classe, da
estrutura, do módulo ou da interface que a declara.

As enumerações de membro podem ser acessadas de qualquer lugar dentro da classe,


da estrutura, do módulo ou da interface. O código fora de uma classe, estrutura ou
módulo deve qualificar o nome de uma enumeração de membro com o nome dessa
classe, estrutura ou módulo. Você pode evitar a necessidade de usar nomes totalmente
qualificados adicionando uma instrução Imports ao arquivo de origem.

Uma enumeração declarada no nível do namespace, fora de qualquer classe, estrutura,


módulo ou interface, é um membro do namespace no qual ela aparece.

O contexto de declaração para uma enumeração deve ser um arquivo de origem,


namespace, classe, estrutura, módulo ou interface e não pode ser um procedimento.
Para obter mais informações, consulte Contextos de declaração e níveis de acesso
padrão.

Você pode aplicar atributos a uma enumeração como um todo, mas não aos membros
individualmente. Um atributo contribui com informações para os metadados do
assembly.

Tipo de Dados
A instrução Enum pode declarar o tipo de dados de uma enumeração. Cada membro usa
o tipo de dados da enumeração. Você pode especificar Byte , Integer , Long , SByte ,
Short , UInteger , ULong ou UShort .

Se você não especificar datatype para a enumeração, cada membro usará o tipo de
dados de initializer . Se você especificar datatype e initializer , o tipo de dados de
initializer deverá ser conversível para datatype . Se nem datatype nem initializer

estiver presente, o tipo de dados será padrão para Integer .

Inicialização de membros
A instrução Enum pode inicializar o conteúdo dos membros selecionados em
memberlist . Você usa initializer para fornecer uma expressão a ser atribuída ao

membro.

Se você não especificar initializer para um membro, o Visual Basic o inicializará como
zero (se for o primeiro member em memberlist ) ou como um valor maior por um do que
o member imediatamente anterior.

A expressão fornecida em cada initializer pode ser qualquer combinação de literais,


outras constantes que já estão definidas e membros de enumeração que já estão
definidos, incluindo um membro anterior dessa enumeração. Você pode usar
operadores aritméticos e lógicos para combinar esses elementos.

Você não pode usar variáveis ou funções em initializer . No entanto, você pode usar
palavras-chave de conversão, como CByte e CShort . Você também pode usar AscW se
chamá-lo com uma constante String ou um argumento Char , já que isso pode ser
avaliado em tempo de compilação.

As enumerações não podem ter valores de ponto flutuante. Se um membro receber um


valor de ponto flutuante e Option Strict estiver definido como ativado, ocorrerá um
erro do compilador. Se Option Strict estiver desativado, o valor será convertido
automaticamente no tipo Enum .

Se o valor de um membro exceder o intervalo permitido para o tipo de dados


subjacente ou se você inicializar qualquer membro para o valor máximo permitido pelo
tipo de dados subjacente, o compilador relatará um erro.

Modificadores
As enumerações de membro de classe, estrutura, módulo e interface assumem o padrão
de acesso público. Você pode ajustar os níveis de acesso com os modificadores de
acesso. Enumerações de membro de namespace assumem o padrão de acesso de
amigos. Você pode ajustar os níveis de acesso para público, mas não para particular
nem protegido. Para obter mais informações, confira Níveis de acesso no Visual Basic.
Todos os membros de enumeração têm acesso público, e você não pode usar
modificadores de acesso neles. No entanto, se a enumeração em si tiver um nível de
acesso mais restrito, o nível de acesso especificado da enumeração terá precedência.

Por padrão, todas as enumerações são tipos e os campos são constantes. Portanto, as
palavras-chave Shared , Static e ReadOnly não podem ser usadas ao declarar uma
enumeração ou os membros.

Atribuição de vários valores


As enumerações normalmente representam valores mutuamente exclusivos. Ao incluir o
atributo FlagsAttribute na declaração Enum , você pode atribuir vários valores a uma
instância da enumeração. O atributo FlagsAttribute especifica que a enumeração pode
ser tratada como um campo de bits; isto é, um conjunto de sinalizadores. Elas são
chamadas de enumerações bit a bit.

Quando você declara uma enumeração usando o atributo FlagsAttribute,


recomendamos que você use potências de 2, ou seja, 1, 2, 4, 8, 16 e assim por diante,
para os valores. Também recomendamos que "Nenhum" seja o nome de um membro
cujo valor é 0. Para obter diretrizes adicionais, confira FlagsAttribute e Enum.

Exemplo 1
O exemplo a seguir mostra como usar a instrução Enum . Observe que o membro é
conhecido como EggSizeEnum.Medium , e não como Medium .

VB

Public Class Egg

Enum EggSizeEnum

Jumbo

ExtraLarge

Large

Medium

Small

End Enum

Public Sub Poach()

Dim size As EggSizeEnum

size = EggSizeEnum.Medium
' Continue processing...

End Sub

End Class

Exemplo 2
O método no exemplo a seguir está fora da Egg classe. Portanto, EggSizeEnum é
totalmente qualificado como Egg.EggSizeEnum .

VB

Public Sub Scramble(ByVal size As Egg.EggSizeEnum)

' Process for the three largest sizes.

' Throw an exception for any other size.

Select Case size

Case Egg.EggSizeEnum.Jumbo

' Process.

Case Egg.EggSizeEnum.ExtraLarge

' Process.

Case Egg.EggSizeEnum.Large

' Process.

Case Else

Throw New ApplicationException("size is invalid: " &


size.ToString)

End Select

End Sub

Exemplo 3
O exemplo a seguir usa a instrução Enum para definir um conjunto relacionado de
valores de constante nomeados. Nesse caso, os valores são cores que você pode optar
por criar formulários de entrada de dados para um banco de dados.

VB

Public Enum InterfaceColors

MistyRose = &HE1E4FF&

SlateGray = &H908070&

DodgerBlue = &HFF901E&

DeepSkyBlue = &HFFBF00&

SpringGreen = &H7FFF00&

ForestGreen = &H228B22&

Goldenrod = &H20A5DA&

Firebrick = &H2222B2&

End Enum

Exemplo 4
O exemplo a seguir mostra valores que incluem números positivos e negativos.
VB

Enum SecurityLevel

IllegalEntry = -1

MinimumSecurity = 0

MaximumSecurity = 1

End Enum

Exemplo 5
No exemplo a seguir, uma cláusula As é usada para especificar o datatype de uma
enumeração.

VB

Public Enum MyEnum As Byte

Zero

One

Two

End Enum

Exemplo 6
O exemplo a seguir mostra como usar uma enumeração bit a bit. Vários valores podem
ser atribuídos a uma instância de uma enumeração bit a bit. A declaração Enum inclui o
atributo FlagsAttribute, que indica que a enumeração pode ser tratada como um
conjunto de sinalizadores.

VB

' Apply the Flags attribute, which allows an instance

' of the enumeration to have multiple values.

<Flags()> Public Enum FilePermissions As Integer

None = 0

Create = 1

Read = 2

Update = 4

Delete = 8

End Enum

Public Sub ShowBitwiseEnum()

' Declare the non-exclusive enumeration object and

' set it to multiple values.

Dim perm As FilePermissions

perm = FilePermissions.Read Or FilePermissions.Update

' Show the values in the enumeration object.

Console.WriteLine(perm.ToString)

' Output: Read, Update

' Show the total integer value of all values

' in the enumeration object.

Console.WriteLine(CInt(perm))

' Output: 6

' Show whether the enumeration object contains

' the specified flag.

Console.WriteLine(perm.HasFlag(FilePermissions.Update))

' Output: True

End Sub

Exemplo 7
O exemplo a seguir itera por meio de uma enumeração. Ele usa o método GetNames
para recuperar uma matriz de nomes de membro da enumeração e GetValues recuperar
uma matriz de valores de membro.

VB

Enum EggSizeEnum

Jumbo

ExtraLarge

Large

Medium

Small

End Enum

Public Sub Iterate()

Dim names = [Enum].GetNames(GetType(EggSizeEnum))

For Each name In names

Console.Write(name & " ")

Next

Console.WriteLine()

' Output: Jumbo ExtraLarge Large Medium Small

Dim values = [Enum].GetValues(GetType(EggSizeEnum))

For Each value In values

Console.Write(value & " ")

Next

Console.WriteLine()

' Output: 0 1 2 3 4

End Sub

Confira também
Enum
AscW
Instrução Const
Instrução Dim
Conversões implícitas e explícitas
Funções de conversão do tipo
Constantes e Enumerações
Instrução Erase (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Usada para liberar variáveis de matriz e desalocar a memória usada para seus
elementos.

Sintaxe
VB

Erase arraylist

Partes
arraylist

Obrigatórios. Lista de variáveis de matriz a serem apagadas. Várias variáveis são


separadas por vírgulas.

Comentários
A instrução Erase só pode aparecer no nível de procedimento. Isso significa que você
pode liberar matrizes em um procedimento, mas não no nível de classe ou módulo.

A instrução Erase equivale a atribuir Nothing a cada variável de matriz.

Exemplo
O exemplo a seguir usa a instrução Erase para limpar duas matrizes e liberar memória
(mil e 100 elementos de armazenamento, respectivamente). Em seguida, a instrução
ReDim atribui uma nova instância de matriz à matriz tridimensional.

VB

Dim threeDimArray(9, 9, 9), twoDimArray(9, 9) As Integer

Erase threeDimArray, twoDimArray

ReDim threeDimArray(4, 4, 9)

Confira também
Nothing
Instrução ReDim
Instrução Error
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Simula a ocorrência de um erro.

Sintaxe
VB

Error errornumber

Partes
errornumber

Obrigatórios. Pode ser qualquer número de erro inválido.

Comentários
A instrução Error possui suporte para compatibilidade com versões anteriores. No
novo código, principalmente ao criar objetos, use o método Raise do objeto Err para
gerar erros em tempo de execução.

Se errornumber estiver definido, a instrução Error chamará o manipulador de erros


depois que as propriedades do objeto Err receberem os seguintes valores padrão:

Propriedade Valor

Number Valor especificado como argumento para instrução Error . Pode ser qualquer
número de erro inválido.

Source Nome do projeto atual do Visual Basic.

Description Expressão de cadeia de caracteres correspondente ao valor retornado da função


Error para a especificada Number , se essa cadeia de caracteres existir. Se a cadeia
de caracteres não existir, Description conterá uma cadeia de caracteres de
comprimento zero ("").

HelpFile A unidade totalmente qualificada, o caminho e o nome do arquivo de Ajuda do


Visual Basic.
Propriedade Valor

HelpContext A ID de contexto do arquivo de Ajuda do Visual Basic apropriada para o erro


correspondente à propriedade Number .

LastDLLError Zero.

Se nenhum manipulador de erro existir ou estiver habilitado, uma mensagem de erro


será criada e exibida a partir das propriedades do objeto Err .

7 Observação

Alguns aplicativos host do Visual Basic não podem criar objetos. Consulte a
documentação do aplicativo host para determinar se ele pode criar classes e
objetos.

Exemplo
Este exemplo usa a instrução Error para gerar o erro número 11.

VB

On Error Resume Next ' Defer error handling.

Error 11 ' Simulate the "Division by zero" error.

Requisitos
Namespace:Microsoft.VisualBasic

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Clear
Err
Raise
Instrução On Error
Instrução Resume
Mensagens de Erro
Instrução Event
Artigo • 12/12/2022 • 7 minutos para o fim da leitura

Declara um evento definido pelo usuário.

Sintaxe
VB

[ <attrlist> ] [ accessmodifier ] _

[ Shared ] [ Shadows ] Event eventname[(parameterlist)] _

[ Implements implementslist ]

' -or-

[ <attrlist> ] [ accessmodifier ] _

[ Shared ] [ Shadows ] Event eventname As delegatename _

[ Implements implementslist ]

' -or-

[ <attrlist> ] [ accessmodifier ] _

[ Shared ] [ Shadows ] Custom Event eventname As delegatename _

[ Implements implementslist ]

[ <attrlist> ] AddHandler(ByVal value As delegatename)

[ statements ]

End AddHandler

[ <attrlist> ] RemoveHandler(ByVal value As delegatename)

[ statements ]

End RemoveHandler

[ <attrlist> ] RaiseEvent(delegatesignature)

[ statements ]

End RaiseEvent

End Event

Partes
Parte Descrição

attrlist Opcional. Lista de atributos que se aplicam a esse evento. Vários atributos
são separados por vírgulas. Você deve colocar a Lista de atributos entre
colchetes angulares (" < " e " > ").
Parte Descrição

accessmodifier Opcional. Especifica qual código pode acessar o evento. Um dos seguintes
pode ser feito:

- Público – qualquer código que possa acessar o elemento que o declara


pode acessá-lo.

- Protegido – somente o código dentro de sua classe ou uma classe


derivada pode acessá-lo.

- Amigo – somente o código no mesmo assembly pode acessá-lo.

- Privado – somente o código no elemento que o declara que pode acessá-


lo.

- Amigo protegido – somente o código na classe do evento, uma classe


derivada ou o mesmo assembly pode acessá-lo.

- Privado Protegido – somente o código na classe do evento ou uma classe


derivada no mesmo assembly pode acessá-lo.

Shared Opcional. Especifica que esse evento não está associado a uma instância
específica de uma classe ou estrutura.

Shadows Opcional. Indica que esse evento redeclara novamente e oculta um


elemento de programação nomeado de forma idêntica, ou conjunto de
elementos sobrecarregados, em uma classe base. Você pode sombrear
qualquer tipo de elemento declarado com qualquer outro tipo.

Um elemento sombreado não está disponível de dentro da classe derivada


que o sombreia, exceto de onde o elemento de sombreamento está
inacessível. Por exemplo, se um elemento Private sombrear um elemento
de classe base, o código que não tem permissão para acessar o elemento
Private acessará o elemento de classe base.

eventname Obrigatórios. Nome do evento; segue as convenções de nomenclatura de


variáveis padrão.

parameterlist Opcional. Lista de variáveis locais que representam os parâmetros desse


evento. Você deve colocar a Lista de Parâmetros entre parênteses.

Implements Opcional. Indica que esse evento implementa um evento de uma interface.
Parte Descrição

implementslist Necessário se Implements for fornecido. Lista de procedimentos Sub que


estão sendo implementados. Vários procedimentos são separados por
vírgulas:

implementedprocedure [ , implementedprocedure ... ]

Cada implementedprocedure tem a sintaxe e as partes a seguir:

interface . definedname

- interface - Required. Nome de uma interface que este procedimento


contendo classe ou estrutura está implementando.

- Definedname - Required. Nome pelo qual o procedimento é definido em


interface . Isso não precisa ser o mesmo que name , o nome que este
procedimento está usando para implementar o procedimento definido.

Custom Obrigatórios. Eventos declarados como Custom devem definir acessadores


AddHandler , RemoveHandler e RaiseEvent personalizados.

delegatename Opcional. O nome de um delegado que especifica a assinatura do


manipulador de eventos.

AddHandler Obrigatórios. Declara um acessador AddHandler , que especifica as instruções


a serem executadas quando um manipulador de eventos é adicionado,
usando explicitamente a instrução AddHandler ou usando implicitamente a
cláusula Handles .

End AddHandler Obrigatórios. Termina o bloco AddHandler .

value Obrigatórios. Nome do parâmetro.

RemoveHandler Obrigatórios. Declara um acessador RemoveHandler , que especifica as


instruções a serem executadas quando um manipulador de eventos é
removido usando a instrução RemoveHandler .

End RemoveHandler Obrigatórios. Termina o bloco RemoveHandler .

RaiseEvent Obrigatórios. Declara um acessador RaiseEvent , que especifica as instruções


a serem executadas quando o evento é gerado usando a instrução
RaiseEvent . Normalmente, isso invoca uma lista de delegados mantidos
pelos acessadores AddHandler e RemoveHandler .

End RaiseEvent Obrigatórios. Termina o bloco RaiseEvent .

delegatesignature Obrigatórios. Lista de parâmetros que correspondem aos parâmetros


exigidos pelo delegado delegatename . Você deve colocar a Lista de
Parâmetros entre parênteses.
Parte Descrição

statements Opcional. Instruções que contêm os corpos dos métodos AddHandler ,


RemoveHandler e RaiseEvent .

End Event Obrigatórios. Termina o bloco Event .

Comentários
Depois que o evento for declarado, use a instrução RaiseEvent para acionar o evento.
Um evento típico pode ser declarado e gerado conforme mostrado nos fragmentos a
seguir:

VB

Public Class EventSource

' Declare an event.

Public Event LogonCompleted(ByVal UserName As String)

Sub CauseEvent()

' Raise an event on successful logon.

RaiseEvent LogonCompleted("AustinSteele")

End Sub

End Class

7 Observação

É possível declarar argumentos de evento da mesma forma que faz com


argumentos de procedimentos, com as seguintes exceções: os eventos não podem
ter argumentos nomeados, argumentos ParamArray ou argumentos Optional . Os
eventos não têm valores retornados.

Para manipular um evento, você deve associá-lo com uma sub-rotina manipuladora de
eventos usando a instrução Handles ou AddHandler . As assinaturas da sub-rotina e do
evento devem corresponder. Para lidar com um evento compartilhado, você deve usar a
instrução AddHandler .

Você só pode usar Event no nível do módulo. Isso significa que o contexto de declaração
para um evento deve ser uma classe, estrutura, módulo ou interface e não pode ser um
arquivo de origem, namespace, procedimento ou bloco. Para obter mais informações,
consulte Contextos de declaração e níveis de acesso padrão.

Na maioria das circunstâncias, você pode usar a primeira sintaxe na seção Sintaxe deste
tópico para declarar eventos. No entanto, alguns cenários exigem que você tenha mais
controle sobre o comportamento detalhado do evento. A última sintaxe na seção
Sintaxe deste tópico, que usa a palavra-chave Custom , fornece esse controle, que lhe
permite definir eventos personalizados. Em um evento personalizado, você especifica
exatamente o que ocorre quando o código adiciona ou remove um manipulador de
eventos de ou para o evento ou quando o código gera o evento. Para obter exemplos,
consulte Como declarar eventos personalizados para conservar memória e Como
declarar eventos personalizados para evitar o bloqueio.

Exemplo
O exemplo a seguir usa eventos para contagem regressiva de segundos de 10 para 0. O
código ilustra vários métodos, propriedades e instruções relacionados a evento. Isso
inclui a instrução RaiseEvent .

A classe que gera um evento é a origem do evento e os métodos que processam o


evento são os manipuladores de eventos. Uma origem do evento pode ter vários
manipuladores para os eventos gerados. Quando a classe aciona o evento, esse evento
é gerado em cada classe que optou por tratar eventos para essa instância do objeto.

O exemplo também usa um formulário ( Form1 ) com um botão ( Button1 ) e uma caixa de
texto ( TextBox1 ). Quando você clica no botão, a primeira caixa de texto exibe uma
contagem regressiva de 10 para 0 segundos. Quando o tempo integral (10 segundos)
tiver decorrido, a primeira caixa de texto exibirá "Concluído".

O código para Form1 especifica os estados iniciais e terminais do formulário. Ele


também contém o código executado quando os eventos são gerados.

Para usar este exemplo, abra um novo projeto do Windows Forms. Em seguida, adicione
um botão chamado Button1 e uma caixa de texto chamada TextBox1 para o formulário
principal, chamado Form1 . Em seguida, clique com o botão direito do mouse no
formulário e clique em Exibir Código para abrir o editor de código.

Adicione uma variável WithEvents à seção declarações da classe Form1 :

VB

Private WithEvents mText As TimerState

Adicione o código a seguir ao código de Form1 . Substitua todos os procedimentos


duplicados que possam existir, como Form_Load ou Button_Click .

VB
Private Sub Form1_Load() Handles MyBase.Load

Button1.Text = "Start"

mText = New TimerState

End Sub

Private Sub Button1_Click() Handles Button1.Click

mText.StartCountdown(10.0, 0.1)

End Sub

Private Sub mText_ChangeText() Handles mText.Finished

TextBox1.Text = "Done"

End Sub

Private Sub mText_UpdateTime(ByVal Countdown As Double

) Handles mText.UpdateTime

TextBox1.Text = Format(Countdown, "##0.0")

' Use DoEvents to allow the display to refresh.

My.Application.DoEvents()

End Sub

Class TimerState

Public Event UpdateTime(ByVal Countdown As Double)

Public Event Finished()

Public Sub StartCountdown(ByVal Duration As Double,

ByVal Increment As Double)

Dim Start As Double = DateAndTime.Timer

Dim ElapsedTime As Double = 0

Dim SoFar As Double = 0

Do While ElapsedTime < Duration

If ElapsedTime > SoFar + Increment Then

SoFar += Increment

RaiseEvent UpdateTime(Duration - SoFar)

End If

ElapsedTime = DateAndTime.Timer - Start

Loop

RaiseEvent Finished()

End Sub

End Class

Pressione F5 para executar o exemplo anterior e clique no botão de rótulo Iniciar. A


primeira caixa de texto começa a contar os segundos. Quando o tempo integral (10
segundos) tiver decorrido, a primeira caixa de texto exibirá "Concluído".

7 Observação

O método My.Application.DoEvents não processa eventos da mesma forma que o


formulário. Para habilitar o formulário para manipular os eventos diretamente, use
o multithreading. Para obter mais informações, confira Threading gerenciado.
Confira também
Instrução RaiseEvent
Instrução Implements
Eventos
Instrução AddHandler
Instrução RemoveHandler
Alças
Instrução Delegate
Como declarar eventos personalizados para conservar memória
Como declarar eventos personalizados para evitar bloqueio
Compartilhado
Sombras
Instrução Exit (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Sai de um procedimento ou bloqueio e transfere o controle imediatamente para a


instrução após a chamada de procedimento ou a definição do bloco.

Sintaxe
VB

Exit { Do | For | Function | Property | Select | Sub | Try | While }

Instruções
Exit Do

Sai imediatamente do loop Do no qual ele aparece. A execução continua com a


instrução após Loop . Exit Do pode ser usado somente dentro de um loop Do . Quando
usado em loops Do aninhados, Exit Do sai do loop mais interno e transfere o controle
para o próximo nível superior de aninhamento.

Exit For

Sai imediatamente do loop For no qual ele aparece. A execução continua com a
instrução após Next . Exit For pode ser usado somente dentro de um loop For ... Next
ou For Each ... Next . Quando usado em loops For aninhados, Exit For sai do loop mais
interno e transfere o controle para o próximo nível superior de aninhamento.

Exit Function

Sai imediatamente do procedimento Function no qual ele aparece. A execução continua


com a instrução após a instrução que chamou o procedimento Function . Exit Function
pode ser usado somente dentro de um procedimento Function .

Para especificar um valor retornado, você pode atribuir o valor ao nome da função em
uma linha antes da instrução Exit Function . Para atribuir o valor retornado e sair da
função em uma instrução, você pode usar a Instrução Return.

Exit Property

Sai imediatamente do procedimento Property no qual ele aparece. A execução continua


com a instrução que chamou o procedimento Property , ou seja, com a instrução
solicitando ou definindo o valor da propriedade. Exit Property pode ser usado apenas
dentro do procedimento Get ou Set de uma propriedade.

Para especificar um valor retornado em um procedimento Get , você pode atribuir o


valor ao nome da função em uma linha antes da instrução Exit Property . Para atribuir o
valor retornado e sair do procedimento Get em uma instrução, você pode usar a
instrução Return .

Em um procedimento Set , a instrução Exit Property é equivalente a Return .

Exit Select

Sai imediatamente do bloco Select Case em que aparece. A execução continua com a
instrução após End Select . Exit Select pode ser usado somente dentro de uma
instrução Select Case .

Exit Sub

Sai imediatamente do procedimento Sub no qual ele aparece. A execução continua com
a instrução após a instrução que chamou o procedimento Sub . Exit Sub pode ser
usado somente dentro de um procedimento Sub .

Em um procedimento Sub , a instrução Exit Sub é equivalente a Return .

Exit Try

Sai imediatamente do bloco Try ou Catch em que aparece. A execução continua com o
bloco Finally se houver um, ou com a instrução após a instrução End Try caso
contrário. Exit Try pode ser usado apenas dentro de um bloco Try ou Catch , e não
dentro de um bloco Finally .

Exit While

Sai imediatamente do loop While no qual ele aparece. A execução continua com a
instrução após End While . Exit While pode ser usado somente dentro de um loop
While . Quando usado em loops While aninhados, Exit While transfere o controle para

o loop que está um nível aninhado acima do loop em que Exit While ocorre.

Comentários
Não confunda instruções Exit com End . Exit não define o fim de uma instrução.

Exemplo 1
No exemplo a seguir, a condição de loop interrompe o loop quando a variável index é
maior que 100. No entanto, a instrução If no loop faz com que a instrução Exit Do
interrompa o loop quando a variável de índice for maior que 10.

VB

Dim index As Integer = 0

Do While index <= 100

If index > 10 Then

Exit Do

End If

Debug.Write(index.ToString & " ")

index += 1

Loop

Debug.WriteLine("")

' Output: 0 1 2 3 4 5 6 7 8 9 10

Exemplo 2
O exemplo a seguir atribui o valor de retorno ao nome da função myFunction e, em
seguida, usa Exit Function para retornar da função:

VB

Function MyFunction(ByVal j As Integer) As Double

MyFunction = 3.87 * j

Exit Function

End Function

Exemplo 3
O seguinte exemplo usa a Instrução Return para atribuir o valor retornado e sair da
função:

VB

Function MyFunction(ByVal j As Integer) As Double

Return 3.87 * j

End Function

Confira também
Instrução Continue
Instrução Do...Loop
Instrução End
Instrução For Each...Next
Instrução For...Next
Instrução Function
Instrução return
Instrução Stop
Instrução Sub
Instrução Try...Catch...Finally
Instruções F-P
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

A tabela a seguir contém uma lista de instruções de linguagem do Visual Basic.

For Each...Next

For...Next

Função

Get

GoTo

If...Then...Else

Implementações

Imports (Namespace e Tipo do .NET)

Imports (Namespace de XML)

Inherits

Interface

Mid

Módulo

Namespace

Se Houver Erro

Operador

Opção <palavra-chave>

Opção Comparar

Opção Explícita

Opção Inferir
Opção Estrita

Propriedade

Confira também
Instruções A-E
Instruções Q-Z
Referência da linguagem Visual Basic
Instrução For Each...Next (Visual Basic)
Artigo • 07/04/2023 • 13 minutos para o fim da leitura

Repete um grupo de instruções para cada elemento em uma coleção.

Sintaxe
VB

For Each element [ As datatype ] In group

[ statements ]

[ Continue For ]

[ statements ]

[ Exit For ]

[ statements ]

Next [ element ]

Partes
Termo Definição

element Obrigatório na instrução For Each . Opcional na instrução Next . Variável. Usada para
iterar por meio dos elementos da coleção.

datatype Opcional se Option Infer estiver ativado (o padrão) ou element já estiver declarado;
obrigatório se Option Infer estiver desativado e element ainda não estiver
declarado. O tipo de dados de element .

group Obrigatórios. Uma variável com um tipo que é um tipo de coleção ou Objeto.
Refere-se à coleção sobre a qual as statements devem ser repetidas.

statements Opcional. Uma ou mais instruções entre For Each e Next que são executadas em
cada item em group .

Continue Opcional. Transfere o controle para o início do loop For Each .


For

Exit For Opcional. Transfere o controle para fora do loop For Each .

Next Obrigatórios. Finaliza a definição do loop For Each .

Exemplo simples
Use um loop For Each ... Next quando quiser repetir um conjunto de instruções para
cada elemento de uma coleção ou matriz.

 Dica

A Instrução For...Next funciona bem quando você pode associar cada iteração de
um loop a uma variável de controle e determinar os valores iniciais e finais dessa
variável. No entanto, quando você está lidando com uma coleção, o conceito de
valores iniciais e finais não é significativo e você não sabe necessariamente quantos
elementos a coleção tem. Nesse tipo de caso, um loop For Each ... Next muitas
vezes é uma escolha melhor.

No exemplo a seguir, a instrução For Each … Next itera por meio de todos os elementos
de uma coleção List.

VB

' Create a list of strings by using a

' collection initializer.

Dim lst As New List(Of String) _

From {"abc", "def", "ghi"}

' Iterate through the list.

For Each item As String In lst

Debug.Write(item & " ")

Next

Debug.WriteLine("")

'Output: abc def ghi

Para obter mais exemplos, confira Coleções e Matrizes.

Nested Loops
Você pode aninhar loops For Each colocando um loop dentro de outro.

O exemplo a seguir demonstra estruturas For Each … Next aninhadas.

VB

' Create lists of numbers and letters

' by using array initializers.

Dim numbers() As Integer = {1, 4, 7}


Dim letters() As String = {"a", "b", "c"}

' Iterate through the list by using nested loops.

For Each number As Integer In numbers

For Each letter As String In letters

Debug.Write(number.ToString & letter & " ")

Next

Next

Debug.WriteLine("")

'Output: 1a 1b 1c 4a 4b 4c 7a 7b 7c

Quando você aninha loops, cada loop deve ter uma variável element exclusiva.

Você também pode aninhar diferentes tipos de estruturas de controle entre si. Para
obter mais informações, confira Estruturas de controle aninhadas.

Exit For e Continue For


A instrução Exit For faz com que a execução saia do loop For ... Next e transfere o
controle para a instrução que segue a instrução Next .

A instrução Continue For transfere o controle imediatamente para a próxima iteração do


loop. Para obter mais informações, confira Instrução Continue.

O exemplo a seguir mostra como usar as instruções Continue For e Exit For .

VB

Dim numberSeq() As Integer =

{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}

For Each number As Integer In numberSeq

' If number is between 5 and 8, continue

' with the next iteration.

If number >= 5 And number <= 8 Then

Continue For

End If

' Display the number.

Debug.Write(number.ToString & " ")

' If number is 10, exit the loop.

If number = 10 Then
Exit For

End If

Next

Debug.WriteLine("")

' Output: 1 2 3 4 9 10

Você pode colocar qualquer número de instruções Exit For em um loop For Each .
Quando usado em loops For Each aninhados, Exit For faz com que a execução saia do
loop mais interno e transfere o controle para o próximo nível mais alto de aninhamento.

Exit For geralmente é usado após uma avaliação de alguma condição, por exemplo,
em uma estrutura If ... Then ... Else . Talvez você queira usar Exit For para as seguintes
condições:

Continuar a iterar é desnecessário ou impossível. Isso pode ser causado por um


valor incorreto ou uma solicitação de encerramento.

Uma exceção é capturada em um Try ... Catch ... Finally . Você pode usar Exit For
no final do bloco Finally .

Há um loop infinito, que é um loop que pode se executado várias vezes ou até
infinitamente. Se você detectar essa condição, poderá usar Exit For para pular o
loop. Para obter mais informações, confira Instrução Do...Loop.

Iterators
Use um iterador para realizar uma iteração personalizada em uma coleção. Um iterador
pode ser uma função ou um acessador Get . Ele usa uma instrução Yield para retornar
um elemento da coleção por vez.

Chame um iterador usando uma instrução For Each...Next . Cada iteração do loop For
Each chama o iterador. Quando uma instrução Yield é alcançada no iterador, a

expressão na instrução Yield é retornada e o local atual no código é retido. A execução


será reiniciada desse local na próxima vez que o iterador for chamado.

O exemplo a seguir usa uma função iteradora. A função iteradora tem uma instrução
Yield que está em um loop For…Next. No método ListEvenNumbers , cada iteração do
corpo da instrução For Each cria uma chamada à função iteradora, que avança para a
próxima instrução Yield .

VB

Public Sub ListEvenNumbers()

For Each number As Integer In EvenSequence(5, 18)

Debug.Write(number & " ")

Next

Debug.WriteLine("")

' Output: 6 8 10 12 14 16 18

End Sub

Private Iterator Function EvenSequence(

ByVal firstNumber As Integer, ByVal lastNumber As Integer) _

As System.Collections.Generic.IEnumerable(Of Integer)

' Yield even numbers in the range.

For number = firstNumber To lastNumber

If number Mod 2 = 0 Then

Yield number

End If

Next

End Function

Para obter mais informações, confira Iteradores, Instrução Yield e Iterador.

Implementação Técnica
Quando uma instrução For Each … Next é executada, o Visual Basic avalia a coleção
apenas uma vez, antes do loop ser iniciado. Se o bloco de instruções alterar element ou
group , essas alterações não afetarão a iteração do loop.

Quando todos os elementos na coleção foram atribuídos a element sucessivamente, o


loop For Each para e o controle passa para a instrução após a instrução Next .

Se Option Infer estiver ativado (configuração padrão), o compilador do Visual Basic


poderá inferir o tipo de dados de element . Se ele estiver desativado e element não tiver
sido declarado fora do loop, você deverá declará-lo na instrução For Each . Para declarar
o tipo de dados de element explicitamente, use uma cláusula As . A menos que o tipo
de dados do elemento seja definido fora do constructo For Each ... Next , o escopo é o
corpo do loop. Observe que você não pode declarar element fora e dentro do loop.

Como opção, você pode especificar element na instrução Next . Isso melhora a
legibilidade do programa, especialmente se você tiver loops For Each aninhados. Você
precisa especificar a mesma variável que a exibida na instrução For Each
correspondente.

Talvez você queira evitar alterar o valor de element dentro de um loop. Fazer isso pode
dificultar a leitura e a depuração do código. Alterar o valor de group não afeta a coleção
nem os elementos dela, que foram determinados quando o loop foi inserido pela
primeira vez.

Quando você está aninhando loops, se uma instrução Next de um nível de aninhamento
externo for encontrada antes do Next de nível interno, o compilador sinalizará um erro.
No entanto, o compilador só poderá detectar esse erro sobreposto se você especificar
element em cada instrução Next .
Se o código depender de percorrer uma coleção em uma determinada ordem, um loop
For Each ... Next não será a melhor opção, a menos que você saiba as características do
objeto enumerador que a coleção expõe. A ordem de passagem não é determinada
pelo Visual Basic, mas pelo método MoveNext do objeto enumerador. Portanto, talvez
não seja possível prever qual elemento da coleção é o primeiro a ser retornado em
element ou qual é o próximo a ser retornado após determinado elemento. Você pode

obter resultados mais confiáveis usando uma estrutura de loop diferente, como
For ... Next ou Do ... Loop .

O runtime deve ser capaz de converter os elementos em group em element . A instrução


[ Option Strict ] controla se as conversões de expansão e restrição são permitidas
( Option Strict está desativada, valor padrão) ou se somente conversões de expansão
são permitidas ( Option Strict está ativada). Para obter mais informações, confira
Conversões de restrição.

O tipo de dados de group deve ser um tipo de referência que se refere a uma coleção
ou a uma matriz enumerável. Mais comumente isso significa que group se refere a um
objeto que implementa a interface IEnumerable do namespace System.Collections ou a
interface IEnumerable<T> do namespace System.Collections.Generic .
System.Collections.IEnumerable define o método GetEnumerator, que retorna um

objeto enumerador para a coleção. O objeto enumerador implementa a interface


System.Collections.IEnumerator do namespace System.Collections e expõe a

propriedade Current e os métodos Reset e MoveNext. O Visual Basic os usa para


percorrer a coleção.

Conversões de redução
Quando Option Strict é definido como On , as conversões de restrição normalmente
causam erros do compilador. No entanto, em uma instrução For Each , as conversões
dos elementos em group em element são avaliadas e executadas em tempo de
execução, e os erros do compilador causados pelas conversões de restrição são
suprimidos.

No exemplo a seguir, a atribuição de m como o valor inicial para n não é compilada


quando Option Strict está ativada porque a conversão de um Long em um Integer é
uma conversão de restrição. No entanto, na instrução For Each , nenhum erro do
compilador é relatado, embora a atribuição para number exigir a mesma conversão de
Long em Integer . Na instrução For Each que contém um número grande, ocorre um

erro em tempo de execução quando ToInteger é aplicado ao número grande.


VB

Option Strict On

Imports System

Module Program

Sub Main(args As String())

' The assignment of m to n causes a compiler error when

' Option Strict is on.

Dim m As Long = 987

'Dim n As Integer = m

' The For Each loop requires the same conversion but

' causes no errors, even when Option Strict is on.

For Each number As Integer In New Long() {45, 3, 987}

Console.Write(number & " ")

Next

Console.WriteLine()

' Output: 45 3 987

' Here a run-time error is raised because 9876543210

' is too large for type Integer.

'For Each number As Integer In New Long() {45, 3, 9876543210}

' Console.Write(number & " ")

'Next

End Sub

End Module

Chamadas IEnumerator
Quando a execução de um loop For Each ... Next é iniciada, o Visual Basic verifica se
group se refere a um objeto de coleção válido. Se não for, ele vai gerar uma exceção.
Caso contrário, ele chama o método MoveNext e a propriedade Current do objeto
enumerador para retornar o primeiro elemento. Se MoveNext indicar que não há
nenhum próximo elemento, ou seja, se a coleção estiver vazia, o loop For Each será
interrompido e o controle passará para a instrução após a instrução Next . Caso
contrário, o Visual Basic define element como o primeiro elemento e executa o bloco de
instruções.

Sempre que o Visual Basic encontra a instrução Next , ela retorna à instrução For Each .
Novamente, ele chama MoveNext e Current para retornar o próximo elemento e,
novamente, executa o bloco ou interrompe o loop dependendo do resultado. Esse
processo continua até MoveNext indicar que não há nenhum próximo elemento ou uma
instrução Exit For encontrada.
Modificando a coleção. O objeto enumerador retornado por GetEnumerator
normalmente não permite alterar a coleção adicionando, excluindo, substituindo ou
reordenando elementos. Se você alterar a coleção depois de iniciar um loop For
Each ... Next , o objeto enumerador se tornará inválido e a próxima tentativa de acessar
um elemento causará uma exceção InvalidOperationException.

No entanto, esse bloqueio de modificação não é determinado pelo Visual Basic, mas sim
pela implementação da interface IEnumerable. É possível implementar IEnumerable de
uma forma que permita a modificação durante a iteração. Se você estiver considerando
fazer essa modificação dinâmica, certifique-se de entender as características da
implementação IEnumerable na coleção que você está usando.

Modificando elementos da coleção. A propriedade Current do objeto enumerador é


ReadOnly e retorna uma cópia local de cada elemento da coleção. Isso significa que
você não pode modificar os próprios elementos em um loop For Each ... Next . Qualquer
modificação feita afeta apenas a cópia local de Current e não é refletida novamente na
coleção subjacente. No entanto, se um elemento for um tipo de referência, você poderá
modificar os membros da instância para a qual ele aponta. O exemplo a seguir modifica
o membro BackColor de cada elemento thisControl . No entanto, você não pode
modificar thisControl em si.

VB

Sub LightBlueBackground(thisForm As System.Windows.Forms.Form)

For Each thisControl In thisForm.Controls

thisControl.BackColor = System.Drawing.Color.LightBlue

Next thisControl

End Sub

O exemplo anterior pode modificar o membro BackColor de cada elemento


thisControl , embora ele não possa modificar thisControl em si.

Percorrendo matrizes. Como a classe Array implementa a interface IEnumerable, todas


as matrizes expõem o método GetEnumerator. Isso significa que você pode iterar por
meio de uma matriz com um loop For Each ... Next . No entanto, você só pode ler os
elementos da matriz. Não é possível alterá-los.

Exemplo 1
O exemplo a seguir lista todas as pastas no C:\ diretório usando a classe DirectoryInfo.

VB
Dim dInfo As New System.IO.DirectoryInfo("c:\")

For Each dir As System.IO.DirectoryInfo In dInfo.GetDirectories()

Debug.WriteLine(dir.Name)

Next

Exemplo 2
O exemplo a seguir ilustra um procedimento para a classificação de uma coleção. O
exemplo classifica instâncias de uma classe Car que estão armazenados em uma
List<T>. A classe Car implementa a interface IComparable<T>, que requer que o
método CompareTo seja implementado.

Cada chamada ao método CompareTo faz uma comparação única que é usada para
classificação. Os códigos escritos pelo usuário no método CompareTo retornam um valor
para cada comparação do objeto atual com outro objeto. O valor retornado será menor
que zero se o objeto atual for menor que o outro objeto, maior que zero se o objeto
atual for maior que o outro objeto e zero, se eles forem iguais. Isso permite que você
defina no código os critérios para maior que, menor que e igual.

No método ListCars , a instrução cars.Sort() classifica a lista. Essa chamada para o


método Sort da List<T> faz com que o método CompareTo seja chamado
automaticamente para os objetos Car na List .

VB

Public Sub ListCars()

' Create some new cars.

Dim cars As New List(Of Car) From

New Car With {.Name = "car1", .Color = "blue", .Speed = 20},

New Car With {.Name = "car2", .Color = "red", .Speed = 50},

New Car With {.Name = "car3", .Color = "green", .Speed = 10},

New Car With {.Name = "car4", .Color = "blue", .Speed = 50},

New Car With {.Name = "car5", .Color = "blue", .Speed = 30},

New Car With {.Name = "car6", .Color = "red", .Speed = 60},

New Car With {.Name = "car7", .Color = "green", .Speed = 50}

' Sort the cars by color alphabetically, and then by speed

' in descending order.

cars.Sort()

' View all of the cars.

For Each thisCar As Car In cars

Debug.Write(thisCar.Color.PadRight(5) & " ")

Debug.Write(thisCar.Speed.ToString & " ")

Debug.Write(thisCar.Name)
Debug.WriteLine("")

Next

' Output:

' blue 50 car4

' blue 30 car5

' blue 20 car1

' green 50 car7

' green 10 car3

' red 60 car6

' red 50 car2

End Sub

Public Class Car

Implements IComparable(Of Car)

Public Property Name As String

Public Property Speed As Integer

Public Property Color As String

Public Function CompareTo(ByVal other As Car) As Integer _

Implements System.IComparable(Of Car).CompareTo

' A call to this method makes a single comparison that is

' used for sorting.

' Determine the relative order of the objects being compared.

' Sort by color alphabetically, and then by speed in

' descending order.

' Compare the colors.

Dim compare As Integer

compare = String.Compare(Me.Color, other.Color, True)

' If the colors are the same, compare the speeds.

If compare = 0 Then

compare = Me.Speed.CompareTo(other.Speed)

' Use descending order for speed.

compare = -compare

End If

Return compare

End Function

End Class

Confira também
Coleções
Instrução For...Next
Estruturas de Loop
Instrução While...End While
Instrução Do...Loop
Conversões de Widening e Narrowing
Inicializadores de objeto: tipos nomeados e anônimos
Inicializadores de Coleção
matrizes
Instrução For...Next (Visual Basic)
Artigo • 07/04/2023 • 9 minutos para o fim da leitura

Repete um grupo de instruções por um determinado número de vezes.

Sintaxe
VB

For counter [ As datatype ] = start To end [ Step step ]

[ statements ]

[ Continue For ]

[ statements ]

[ Exit For ]

[ statements ]

Next [ counter ]

Partes
Parte Descrição

counter Obrigatório na instrução For . Variável numérica. A variável de controle para o loop.
Para obter mais informações, consulte Contra-argumento posteriormente neste
tópico.

datatype Opcional. Tipo de dados de counter . Para obter mais informações, consulte Contra-
argumento posteriormente neste tópico.

start Obrigatórios. Expressão numérica. O valor inicial de counter .

end Obrigatórios. Expressão numérica. O valor final de counter .

step Opcional. Expressão numérica. O valor pelo qual counter é incrementado cada vez
por meio do loop.

statements Opcional. Uma ou mais instruções entre For e Next que executam o número
especificado de vezes.

Continue Opcional. Transfere o controle para a próxima iteração de loop.


For

Exit For Opcional. Transfere o controle para fora do loop For .

Next Obrigatórios. Finaliza a definição do loop For .


7 Observação

A palavra-chave To é usada nesta instrução para especificar o intervalo para o


contador. Você também pode usar essa palavra-chave na Instrução Select...Case e
em declarações de matriz. Para obter mais informações sobre as declarações de
matriz, consulte Instrução Dim.

Exemplos simples
A estrutura For ... Next é usada para repetir um conjunto de instruções por um número
definido de vezes.

No exemplo a seguir, a variável index começa com um valor de 1 e é incrementada com


cada iteração do loop, terminando após o valor de index atingir 5.

VB

For index As Integer = 1 To 5

Debug.Write(index.ToString & " ")

Next

Debug.WriteLine("")

' Output: 1 2 3 4 5

No exemplo a seguir, a variável number começa em 2 e diminui 0,25 a cada iteração do


loop, terminando após o valor de number atingir 0. O argumento Step de -.25 reduzir o
valor em 0,25 em cada iteração do loop.

VB

For number As Double = 2 To 0 Step -0.25

Debug.Write(number.ToString & " ")

Next

Debug.WriteLine("")

' Output: 2 1.75 1.5 1.25 1 0.75 0.5 0.25 0

 Dica

Uma Instrução While...End While ou Do...Loop funciona bem quando você não
sabe com antecedência quantas vezes as instruções devem ser executadas no loop.
No entanto, quando você espera executar o loop um número específico de vezes,
um loop For ... Next é uma opção melhor. Você determina o número de iterações
ao inserir o loop pela primeira vez.
Loops de aninhamento
Você pode aninhar loops For colocando um loop dentro de outro. O exemplo a seguir
demonstra estruturas aninhadas For ... Next que têm valores de etapa diferentes. O loop
externo cria uma cadeia de caracteres para cada iteração do loop. O loop interno
decrementa uma variável de contador de loop para cada iteração do loop.

VB

For indexA = 1 To 3

' Create a new StringBuilder, which is used

' to efficiently build strings.

Dim sb As New System.Text.StringBuilder()

' Append to the StringBuilder every third number

' from 20 to 1 descending.

For indexB = 20 To 1 Step -3

sb.Append(indexB.ToString)

sb.Append(" ")

Next indexB

' Display the line.

Debug.WriteLine(sb.ToString)

Next indexA

' Output:

' 20 17 14 11 8 5 2

' 20 17 14 11 8 5 2

' 20 17 14 11 8 5 2

Ao aninhar loops, cada loop deve ter uma variável counter exclusiva.

Você também pode aninhar diferentes tipos de estruturas de controle entre si. Para
obter mais informações, confira Estruturas de controle aninhadas.

Exit For e Continue For


A instrução Exit For sai imediatamente do For … Next e transfere o controle para a
instrução que segue a instrução Next .

A instrução Continue For transfere o controle imediatamente para a próxima iteração do


loop. Para obter mais informações, confira Instrução Continue.

O exemplo a seguir ilustra o uso das instruções Continue For e Exit For .
VB

For index As Integer = 1 To 100000

' If index is between 5 and 7, continue

' with the next iteration.

If index >= 5 AndAlso index <= 8 Then

Continue For

End If

' Display the index.

Debug.Write(index.ToString & " ")

' If index is 10, exit the loop.

If index = 10 Then

Exit For

End If

Next

Debug.WriteLine("")

' Output: 1 2 3 4 9 10

Você pode colocar qualquer número de instruções Exit For em um For … Next loop.
Quando usado no For … aninhado Next loops, Exit For sai do loop mais interno e
transfere o controle para o próximo nível mais alto de aninhamento.

Exit For geralmente é usado após avaliação de alguma condição (por exemplo, em

uma estrutura If ... Then ... Else ). Talvez você queira usar Exit For para as seguintes
condições:

Continuar a iterar é desnecessário ou impossível. Um valor incorreto ou uma


solicitação de encerramento pode criar essa condição.

Uma instrução Try ... Catch ... Finally captura uma exceção. Você pode usar Exit
For no final do bloco Finally .

Você tem um loop infinito, que é um loop que pode se executado várias vezes ou
até infinitamente. Se você detectar essa condição, poderá usar Exit For para pular
o loop. Para obter mais informações, confira Instrução Do...Loop.

Implementação Técnica
Quando um loop For ... Next é iniciado, o Visual Basic avalia start , end e step . O Visual
Basic avalia esses valores apenas neste momento e, em seguida, atribui start a
counter . Antes que o bloco de instruções seja executado, o Visual Basic compara
counter a end . Se counter já for maior que o valor end (ou menor se step for
negativo), o loop For terminará e o controle passará para a instrução que segue a
instrução Next . Caso contrário, o bloco de instruções será executado.

Sempre que o Visual Basic encontra a instrução Next , counter é incrementado em step
e retorna à instrução For . Novamente, ele compara counter a end e executa o bloco ou
sai do loop, dependendo do resultado. Esse processo continua até que counter passe
end ou uma instrução Exit For seja encontrada.

O loop não para até que counter tenha passado end . Se counter for igual a end , o loop
continuará. A comparação determina se a execução do bloco deve ser counter <= end
se step for positivo e counter >= end se step for negativo.

Se o valor de counter for alterado enquanto estiver dentro de um loop, poderá ser mais
difícil gravar e depurar o código. A alteração do valor de start , end ou step não afeta
os valores de iteração que foram determinados quando o loop foi inserido pela primeira
vez.

Se você aninhar loops, o compilador sinalizará um erro se encontrar a instrução Next de


um nível de aninhamento externo antes da instrução Next de um nível interno. No
entanto, o compilador só poderá detectar esse erro sobreposto se você especificar
counter em cada instrução Next .

Argumento de etapa
O valor de step pode ser positivo ou negativo. Esse parâmetro determina o
processamento de loop de acordo com a tabela a seguir:

Valor da etapa O loop será executado se

Positivo ou zero counter <= end

Negativo counter >= end

O valor padrão de step é 1.

Contra-argumento
A tabela a seguir indica se counter define uma nova variável local com escopo para
todo o loop For…Next . Essa determinação depende se datatype está presente e se
counter já foi definido.
datatype counter Resultado (se counter define uma nova variável local com escopo
está está para todo o loop For...Next )
presente? definido?

No Sim Não, porque counter já está definido. Se o escopo de counter não for
local para o procedimento, ocorrerá um aviso de tempo de compilação.

No Não Sim. O tipo de dados é inferido das expressões e start , end e step .
Para obter informações sobre inferência de tipos, consulte Instrução
Option Infer
e Inferência de Tipo de Variável Local.

Sim Sim Sim, mas somente se a variável counter existente for definida fora do
procedimento. Essa variável permanece separada. Se o escopo da
variável counter existente for local para o procedimento, ocorrerá um
erro em tempo de compilação.

Sim Não Sim.

O tipo de dados de counter determina o tipo de iteração, que deve ser um dos
seguintes:

A Byte , SByte , UShort , Short , UInteger , Integer , ULong , Long , Decimal , Single
ou Double .

Uma enumeração declarada usando uma Instrução Enum.

Um Object .

Um tipo T que tem os operadores a seguir, onde B é um tipo que pode ser usado
em uma expressão Boolean .

Public Shared Operator >= (op1 As T, op2 As T) As B

Public Shared Operator <= (op1 As T, op2 As T) As B

Public Shared Operator - (op1 As T, op2 As T) As T

Public Shared Operator + (op1 As T, op2 As T) As T

Opcionalmente, é possível especificar a variável counter na instrução Next . Essasintaxe


melhora a legibilidade do programa, especialmente se você tiver loops For aninhados.
Você precisa especificar a variável exibida na instrução For correspondente.

As expressões start , end e step podem ser avaliadas para qualquer tipo de dados
expandido para o tipo de counter . Se você usar um tipo definido pelo usuário para
counter , talvez seja necessário definir o operador de conversão CType para converter os

tipos start , end ou step para o tipo counter .

Exemplo 1
O exemplo a seguir remove todos os elementos de uma lista genérica. Em vez de uma
Instrução For Each...Next, o exemplo mostra uma instrução For ... Next que itera em
ordem decrescente. O exemplo usa essa técnica porque o método removeAt faz com
que os elementos após o elemento removido tenham um valor de índice menor.

VB

Dim lst As New List(Of Integer) From {10, 20, 30, 40}

For index As Integer = lst.Count - 1 To 0 Step -1

lst.RemoveAt(index)

Next

Debug.WriteLine(lst.Count.ToString)

' Output: 0

Exemplo 2
O exemplo a seguir itera por uma enumeração declarada usando uma Instrução Enum.

VB

Public Enum Mammals

Buffalo

Gazelle

Mongoose

Rhinoceros

Whale

End Enum

Public Sub ListSomeMammals()

For mammal As Mammals = Mammals.Gazelle To Mammals.Rhinoceros

Debug.Write(mammal.ToString & " ")

Next

Debug.WriteLine("")

' Output: Gazelle Mongoose Rhinoceros

End Sub

Exemplo 3
No exemplo a seguir, os parâmetros de instrução usam uma classe com sobrecargas de
operador para operadores + , - , >= e <= .

VB

Private Class Distance

Public Property Number() As Double

Public Sub New(ByVal number As Double)

Me.Number = number

End Sub

' Define operator overloads to support For...Next statements.

Public Shared Operator +(ByVal op1 As Distance, ByVal op2 As Distance)


As Distance

Return New Distance(op1.Number + op2.Number)

End Operator

Public Shared Operator -(ByVal op1 As Distance, ByVal op2 As Distance)


As Distance

Return New Distance(op1.Number - op2.Number)

End Operator

Public Shared Operator >=(ByVal op1 As Distance, ByVal op2 As Distance)


As Boolean

Return (op1.Number >= op2.Number)

End Operator

Public Shared Operator <=(ByVal op1 As Distance, ByVal op2 As Distance)


As Boolean

Return (op1.Number <= op2.Number)

End Operator

End Class

Public Sub ListDistances()

Dim distFrom As New Distance(10)

Dim distTo As New Distance(25)

Dim distStep As New Distance(4)

For dist As Distance = distFrom To distTo Step distStep

Debug.Write(dist.Number.ToString & " ")

Next

Debug.WriteLine("")

' Output: 10 14 18 22

End Sub

Confira também
List<T>
Estruturas de Loop
Instrução While...End While
Instrução Do...Loop
Estruturas de Controle Aninhadas
Instrução Exit
Coleções
Instrução Function (Visual Basic)
Artigo • 07/04/2023 • 8 minutos para o fim da leitura

Declara o nome, os parâmetros e o código que definem um procedimento Function .

Sintaxe
VB

[ <attributelist> ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [


Shadows ] [ Async | Iterator ]

Function name [ (Of typeparamlist) ] [ (parameterlist) ] [ As returntype ] [


Implements implementslist | Handles eventlist ]

[ statements ]

[ Exit Function ]

[ statements ]

End Function

Partes
attributelist

Opcional. Veja Lista de atributo.

accessmodifier

Opcional. Um dos seguintes pode ser feito:

Público

Protegido

Friend

Privado

Amigo Protegido

Particular Protegido

Consulte Níveis de acesso no Visual Basic.

proceduremodifiers
Opcional. Um dos seguintes pode ser feito:

Sobrecargas

Substituições

Substituível

NotOverridable

MustOverride

MustOverride Overrides

NotOverridable Overrides

Shared

Opcional. Consulte Shared.

Shadows

Opcional. Confira Sombras.

Async

Opcional. Consulte Async.

Iterator

Opcional. Consulte Iterator.

name

Obrigatórios. O nome do procedimento. Confira Nomes de elementos declarados.

typeparamlist

Opcional. Lista de parâmetros de tipo para um procedimento genérico. Confira


Lista de tipos.

parameterlist

Opcional. Lista de nomes de variáveis locais que representam os parâmetros deste


procedimento. Consulte Lista de parâmetros.

returntype
Obrigatório se Option Strict for On . Tipo de dados do valor retornado por este
procedimento.

Implements

Opcional. Indica que este procedimento implementa um ou mais procedimentos


Function , cada um definido em uma interface implementada pela classe ou

estrutura que contém esse procedimento. Consulte Instrução Implements.

implementslist

Necessário se Implements for fornecido. Lista de procedimentos Function que


estão sendo implementados.

implementedprocedure [ , implementedprocedure ... ]

Cada implementedprocedure tem a sintaxe e as partes a seguir:

interface.definedname

Parte Descrição

interface Obrigatórios. Nome de uma interface implementada pela classe ou estrutura


que contém este procedimento.

definedname Obrigatórios. Nome pelo qual o procedimento é definido em interface .

Handles

Opcional. Indica que esse procedimento pode lidar com um ou mais eventos
específicos. Consulte Identificadores.

eventlist

Necessário se Handles for fornecido. Lista de eventos que este procedimento


manipula.

eventspecifier [ , eventspecifier ... ]

Cada eventspecifier tem a sintaxe e as partes a seguir:

eventvariable.event

Parte Descrição
Parte Descrição

eventvariable Obrigatórios. Variável de objeto declarada com o tipo de dados da classe


ou estrutura que gera o evento.

event Obrigatórios. Nome do evento que este procedimento manipula.

statements

Opcional. Bloco de instruções a serem executadas dentro deste procedimento.

End Function

Termina a definição deste procedimento.

Comentários
Todo código executável deve estar dentro de um procedimento. Cada procedimento,
por sua vez, é declarado dentro de uma classe, uma estrutura ou um módulo que é
chamado de classe, estrutura ou módulo que contém.

Para retornar um valor ao código de chamada, use um procedimento Function ; caso


contrário, use um procedimento Sub .

Definição de uma função


Você só pode definir um procedimento Function no nível do módulo. Portanto, o
contexto de declaração de uma função deve ser uma classe, uma estrutura, um módulo
ou uma interface e não pode ser um arquivo de origem, um namespace, um
procedimento ou um bloco. Para obter mais informações, consulte Contextos de
declaração e níveis de acesso padrão.

Os procedimentos Function têm como padrão o acesso público. Você pode ajustar os
níveis de acesso com os modificadores de acesso.

Um procedimento Function pode declarar o tipo de dados do valor que o


procedimento retorna. Você pode especificar qualquer tipo de dados ou o nome de
uma enumeração, uma estrutura, uma classe ou uma interface. Se você não especificar o
parâmetro returntype , o procedimento retornará Object .

Se o procedimento usar a palavra-chave Implements , a classe ou estrutura que contém


deverá ter uma instrução Implements que siga imediatamente sua instrução Class ou
Structure . A instrução Implements deve incluir cada interface especificada em
implementslist . No entanto, o nome pelo qual uma interface define o Function (em

definedname ) não precisa corresponder ao nome desse procedimento (em name ).

7 Observação

Você pode usar expressões lambda para definir expressões de função embutidas.
Para obter mais informações, consulte Expressão de Função e Expressões Lambda.

Retorno de uma função


Quando o procedimento Function retorna ao código de chamada, a execução continua
com a instrução após a instrução que chamou o procedimento.

Para retornar um valor de uma função, você poderá atribuir o valor ao nome da função
ou incluí-lo em uma instrução Return .

A instrução Return atribui simultaneamente o valor retornado e sai da função, como


mostra o exemplo a seguir.

VB

Function MyFunction(ByVal j As Integer) As Double

Return 3.87 * j

End Function

O exemplo a seguir atribui o valor retornado ao nome da propriedade myFunction e, em


seguida, usa a instrução Exit Function a ser retornada.

VB

Function MyFunction(ByVal j As Integer) As Double

MyFunction = 3.87 * j

Exit Function

End Function

As instruções Exit Function e Return causam uma saída imediata de um procedimento


Function . Qualquer número de instruções Exit Function e Return podem aparecer em
qualquer lugar no procedimento, e você pode misturar instruções Exit Function e
Return .

Se você usar Exit Function sem atribuir um valor a name , o procedimento retornará o
valor padrão para o tipo de dados especificado em returntype . Se returntype não for
especificado, o procedimento retornará Nothing , que é o valor padrão para Object .

Chamando uma Função


Você chama um procedimento Function usando o nome do procedimento, seguido
pela lista de argumentos em parênteses, em uma expressão. Você só poderá omitir os
parênteses se não estiver fornecendo argumentos. No entanto, seu código será mais
legível se você sempre incluir os parênteses.

Você chama um procedimento Function da mesma forma que chama qualquer função
de biblioteca, como Sqrt , Cos ou ChrW .

Você também pode chamar uma função usando a palavra-chave Call . Nesse caso, o
valor retornado é ignorado. O uso da palavra-chave Call não é recomendado na
maioria dos casos. Para obter mais informações, consulte Instrução Call.

Às vezes, o Visual Basic reorganiza expressões aritméticas para aumentar a eficiência


interna. Por esse motivo, você não deve usar um procedimento Function em uma
expressão aritmética quando a função altera o valor das variáveis na mesma expressão.

Funções assíncronas
Usando o recurso Async, você pode invocar funções assíncronas sem usar retornos de
chamada explícitos ou dividir manualmente seu código entre várias funções ou
expressões lambda.

Se marcar uma função com o modificador Async, você poderá usar o operador Await na
função. Quando o controle atinge uma expressão Await na função Async , ele retorna
para o chamador e o progresso na função é suspenso até a tarefa aguardada ser
concluída. Quando a tarefa for concluída, a execução poderá ser retomada na função.

7 Observação

Um procedimento Async retorna para o chamador quando encontra o primeiro


objeto esperado que ainda não está completo ou chega ao final do procedimento
Async , o que ocorrer primeiro.

Uma função Async pode ter um tipo de retorno Task<TResult> ou Task. Um exemplo de
uma função Async que tem um tipo de retorno Task<TResult> é fornecido abaixo.
Uma função Async não pode declarar parâmetros ByRef.

Uma Instrução Sub também pode ser marcada com o modificador Async . Isso é usado
principalmente para manipuladores de eventos, em que um valor não pode ser
retornado. Um procedimento Async Sub não pode ser aguardado e o chamador de um
procedimento Async Sub não pode capturar exceções geradas pelo procedimento Sub .

Para obter mais informações sobre as funções Async , consulte Programação assíncrona
com Async e Await, Fluxo de controle em programas assíncronos e Tipos de retorno
assíncronos.

Funções Iterator
Uma função iterator realiza uma iteração personalizada em uma coleção, como uma lista
ou uma matriz. Um método iterator usa a instrução Yield para retornar um elemento de
cada vez. Quando uma instrução Yield for atingida, o local atual no código será
lembrado. A execução será reiniciada desse local na próxima vez que a função iteradora
for chamada.

Você chama um iterador de um código de cliente usando uma instrução For Each…Next.

O tipo de retorno de uma função iterator pode ser IEnumerable, IEnumerable<T>,


IEnumerator ou IEnumerator<T>.

Para obter mais informações, consulte Iteradores.

Exemplo 1
O exemplo a seguir usa a instrução Function para declarar o nome, os parâmetros e o
código que formam o corpo de um procedimento Function . O modificador ParamArray
permite que a função aceite um número variável de argumentos.

VB

Public Function CalcSum(ByVal ParamArray args() As Double) As Double

CalcSum = 0

If args.Length <= 0 Then Exit Function

For i As Integer = 0 To UBound(args, 1)

CalcSum += args(i)

Next i

End Function

Exemplo 2
O exemplo a seguir invoca a função declarada no exemplo anterior.

VB

Module Module1

Sub Main()

' In the following function call, CalcSum's local variables

' are assigned the following values: args(0) = 4, args(1) = 3,

' and so on. The displayed sum is 10.

Dim returnedValue As Double = CalcSum(4, 3, 2, 1)

Console.WriteLine("Sum: " & returnedValue)

' Parameter args accepts zero or more arguments. The sum

' displayed by the following statements is 0.

returnedValue = CalcSum()
Console.WriteLine("Sum: " & returnedValue)

End Sub

Public Function CalcSum(ByVal ParamArray args() As Double) As Double

CalcSum = 0

If args.Length <= 0 Then Exit Function

For i As Integer = 0 To UBound(args, 1)

CalcSum += args(i)

Next i

End Function

End Module

Exemplo 3
No exemplo a seguir, DelayAsync é um Function Task<TResult> que tem um tipo de
retorno Async . DelayAsync tem uma instrução Return que retorna um número inteiro.
Portanto, a declaração da função Task(Of Integer) deve ter um tipo de retorno
DelayAsync . Como o tipo de retorno é Task(Of Integer) , a avaliação da expressão

Await em DoSomethingAsync produz um inteiro. Isso é demonstrado nesta instrução: Dim


result As Integer = Await delayTask .

O procedimento startButton_Click é um exemplo de um procedimento Async Sub .


Como DoSomethingAsync é uma função Async , a tarefa para a chamada a
DoSomethingAsync deve ser colocada em espera, como demonstra a seguinte instrução:

Await DoSomethingAsync() . O procedimento startButton_Click Sub deve ser definido


com o modificador Async porque ele tem uma expressão Await .

VB
' Imports System.Diagnostics

' Imports System.Threading.Tasks

' This Click event is marked with the Async modifier.

Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs)


Handles startButton.Click

Await DoSomethingAsync()

End Sub

Private Async Function DoSomethingAsync() As Task

Dim delayTask As Task(Of Integer) = DelayAsync()

Dim result As Integer = Await delayTask

' The previous two statements may be combined into

' the following statement.

' Dim result As Integer = Await DelayAsync()

Debug.WriteLine("Result: " & result)

End Function

Private Async Function DelayAsync() As Task(Of Integer)

Await Task.Delay(100)

Return 5

End Function

' Output:

' Result: 5

Confira também
Instrução Sub
Procedimentos de função
Lista de parâmetros
Instrução Dim
Instrução Call
Of
Matrizes de Parâmetros
Como: Usar uma classe genérica
Solucionando problemas de procedimentos
Expressões Lambda
Expressão de Função
Instrução Get
Artigo • 12/12/2022 • 3 minutos para o fim da leitura

Declara um procedimento de propriedade Get usado para recuperar o valor de uma


propriedade.

Sintaxe
VB

[ <attributelist> ] [ accessmodifier ] Get()

[ statements ]

End Get

Partes
Termo Definição

attributelist Opcional. Veja Lista de atributo.

accessmodifier Opcional em no máximo uma das instruções Get e Set nesta propriedade. Um
dos seguintes pode ser feito:

- Protegido

- Amigo

- Particular

- Protected Friend

Consulte Níveis de acesso no Visual Basic.

statements Opcional. Uma ou mais instruções que são executadas quando o procedimento
de propriedade Get é chamado.

End Get Obrigatórios. Encerra a definição do procedimento de propriedade Get .

Comentários
Cada propriedade deve ter um procedimento de propriedade Get , a menos que a
propriedade seja marcada WriteOnly . O procedimento Get é usado para retornar o
valor atual da propriedade.
O Visual Basic chama automaticamente o procedimento Get de uma propriedade
quando uma expressão solicita o valor da propriedade.

O corpo da declaração de propriedade pode conter apenas os procedimentos Get e


Set da propriedade entre a Declaração de Propriedade e a instrução End Property . Ele
não pode armazenar nada além desses procedimentos. Em especial, ele não pode
armazenar o valor atual da propriedade. Você deve armazenar esse valor fora da
propriedade, porque se você armazená-lo dentro de qualquer um dos procedimentos
de propriedade, o outro procedimento de propriedade não poderá acessá-lo. A
abordagem usual é armazenar o valor em uma variável privada declarada no mesmo
nível da propriedade. Você deve definir um procedimento Get dentro da propriedade à
qual ele se aplica.

O procedimento Get é padrão para o nível de acesso da propriedade que o contém, a


menos que você use accessmodifier na instrução Get .

Regras
Níveis de acesso mistos. Se você estiver definindo uma propriedade de
leitura/gravação, opcionalmente poderá especificar um nível de acesso diferente
para o procedimento Get ou o procedimento Set , mas não ambos. Se você fizer
isso, o nível de acesso ao procedimento deverá ser mais restritivo do que o nível
de acesso da propriedade. Por exemplo, se a propriedade for declarada Friend ,
você poderá declarar o procedimento Get Private , mas não Public .

Se você estiver definindo uma propriedade ReadOnly , o procedimento Get


representará toda a propriedade. Você não pode declarar um nível de acesso
diferente para Get , pois isso definiria dois níveis de acesso para a propriedade.

Tipo de retorno. A instrução de propriedade pode declarar o tipo de dados do


valor que retorna. O procedimento Get retorna automaticamente esse tipo de
dados. Você pode especificar qualquer tipo de dados ou o nome de uma
enumeração, estrutura, classe ou interface.

Se a instrução Property não especificar returntype , o procedimento retornará


Object .

Comportamento
Retorno de um procedimento. Quando o procedimento Get retorna ao código de
chamada, a execução continua dentro da instrução que solicitou o valor da
propriedade.

Os procedimentos de propriedade Get podem retornar um valor usando a


instrução return ou atribuindo o valor retornado ao nome da propriedade. Para
obter mais informações, consulte "Valor retornado" na instrução function.

As instruções Exit Property e Return causam uma saída imediata de um


procedimento de propriedade. Qualquer número de instruções Exit Property e
Return podem aparecer em qualquer lugar no procedimento, e você pode
misturar instruções Exit Property e Return .

Valor de retorno. Para retornar um valor de um procedimento Get , você pode


atribuir o valor ao nome da propriedade ou incluí-lo em uma instrução return. Ao
mesmo tempo, a instrução Return atribui o valor de retorno do procedimento Get
e sai do procedimento.

Se você usar Exit Property sem atribuir um valor ao nome da propriedade, o


procedimento Get retornará o valor padrão para o tipo de dados da propriedade.
Para obter mais informações, consulte "Valor retornado" na instrução function.

O exemplo a seguir ilustra duas maneiras pelas quais a propriedade somente


leitura quoteForTheDay pode retornar o valor mantido na variável privada
quoteValue .

VB

Private quoteValue As String = "No quote assigned yet."

VB

ReadOnly Property QuoteForTheDay() As String

Get

QuoteForTheDay = quoteValue

Exit Property

End Get

End Property

VB

ReadOnly Property QuoteForTheDay() As String

Get

Return quoteValue

End Get

End Property

Exemplo
O exemplo a seguir usa a instrução Get para retornar o valor de uma propriedade.

VB

Class propClass

' Define a private local variable to store the property value.


Private currentTime As String

' Define the read-only property.

Public ReadOnly Property DateAndTime() As String

Get

' The Get procedure is called automatically when the

' value of the property is retrieved.

currentTime = CStr(Now)

' Return the date and time As a string.

Return currentTime

End Get

End Property

End Class

Confira também
Instrução Set
Instrução Property
Instrução Exit
Objetos e Classes
Instruções passo a passo: definindo classes
Instrução GoTo
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Ramifica incondicionalmente para uma linha especificada em um procedimento.

Sintaxe
VB

GoTo line

Parte
line

Obrigatórios. Qualquer rótulo de linha.

Comentários
A instrução GoTo só pode ramificar para linhas no procedimento no qual ela aparece. A
linha deve ter um rótulo de linha ao qual GoTo possa se referir. Para obter mais
informações, consulte Como rotular instruções.

7 Observação

As instruções GoTo podem dificultar a leitura e a manutenção do código. Sempre


que possível, use uma estrutura de controle. Para obter mais informações, consulte
Control Flow.

Você não pode usar uma instrução GoTo para ramificar de fora de uma construção
For ... Next , For Each ... Next , SyncLock ... End SyncLock , Try ... Catch ... Finally , With ... End
With , ou Using ... End Using para um rótulo interno.

Ramificação e construções Try


Dentro de uma construção Try ... Catch ... Finally , as regras a seguir se aplicam à
ramificação com a instrução GoTo .
Bloco Ramificando de fora para Ramificando de dentro para fora
ou dentro
região

Bloco Somente de um bloco Catch Somente para fora de toda a construção


Try da mesma construção 1

Bloco Nunca permitido Somente para fora de toda a construção ou para o


Catch bloco Try da mesma construção 1

Bloco Nunca permitido Nunca permitido


Finally

1
Se uma construção Try ... Catch ... Finally estiver aninhada dentro de outra, um bloco
Catch pode ramificar-se no bloco Try em seu próprio nível de aninhamento, mas não

em nenhum outro bloco Try . Uma construção aninhada Try ... Catch ... Finally deve
estar completamente contida em um bloco Try ou Catch da construção dentro da qual
está aninhada.

A ilustração a seguir mostra uma construção Try aninhada dentro de outra. Várias
ramificações entre os blocos das duas construções são indicadas como válidas ou
inválidas.

Exemplo
O exemplo a seguir usa a instrução GoTo para ramificar para rótulos de linha em um
procedimento.

VB

Sub GoToStatementDemo()

Dim number As Integer = 1

Dim sampleString As String

' Evaluate number and branch to appropriate label.

If number = 1 Then GoTo Line1 Else GoTo Line2

Line1:

sampleString = "Number equals 1"

GoTo LastLine

Line2:

' The following statement never gets executed because number = 1.

sampleString = "Number equals 2"

LastLine:

' Write "Number equals 1" in the Debug window.

Debug.WriteLine(sampleString)

End Sub

Confira também
Instrução Do...Loop
Instrução For...Next
Instrução For Each...Next
Instrução If...Then...Else
Instrução Select...Case
Instrução Try...Catch...Finally
Instrução While...End While
Instrução With...End With
Instrução If...Then... (Visual Basic)
Artigo • 28/11/2022 • 5 minutos para o fim da leitura

Execute um grupo de instruções condicionalmente, dependendo do valor de uma


expressão.

Sintaxe
VB

' Multiline syntax:

If condition [ Then ]

[ statements ]

[ ElseIf elseifcondition [ Then ]

[ elseifstatements ] ]

[ Else

[ elsestatements ] ]

End If

' Single-line syntax:

If condition Then [ statements ] [ Else [ elsestatements ] ]

Links rápidos para código de exemplo


Este artigo inclui vários exemplos que ilustram os usos da instrução If ... Then ... Else :

Exemplo de sintaxe multilinha


Exemplo de sintaxe aninhada
Exemplo de sintaxe de linha única

Partes
condition

Obrigatórios. Expressão. Deve avaliar para True ou False , ou para um tipo de dados
implicitamente conversível para Boolean .

Se a expressão for uma variável anulável Boolean que seja avaliada como Nothing, a
condição será tratada como se a expressão fosse False , e os blocos ElseIf serão
avaliados se existirem ou se o bloco Else for executado se existir.
Then

Obrigatório na sintaxe de linha única; opcional na sintaxe multilinha.

statements

Opcional. Uma ou mais instruções If ... Then a seguir que são executadas se condition
for avaliado como True .

elseifcondition

Obrigatório se ElseIf estiver presente. Expressão. Deve avaliar para True ou False , ou
para um tipo de dados implicitamente conversível para Boolean .

elseifstatements
Opcional. Uma ou mais instruções ElseIf ... Then a seguir que são executadas se
elseifcondition for avaliado como True .

elsestatements

Opcional. Uma ou mais instruções executadas se nenhuma expressão condition ou


elseifcondition anterior for avaliada como True .

End If

Encerra a versão multilinha do bloco If ... Then ... Else .

Comentários

Sintaxe multilinha
Quando uma instrução If ... Then ... Else é encontrada, condition é testada. Se
condition for True , as instruções Then a seguir serão executadas. Se condition for

False , cada instrução ElseIf (se houver alguma) será avaliada em ordem. Quando um

True elseifcondition é encontrado, as instruções imediatamente após os ElseIf


associados são executadas. Se nenhuma elseifcondition for avaliada como True , ou se
não houver instruções ElseIf , as instruções Else a seguir serão executadas. Depois de
executar as instruções Then , ElseIf ou Else a seguir, a execução continua com a
instrução End If a seguir.

As cláusulas ElseIf e Else são opcionais. Você pode ter quantas cláusulas ElseIf
quiser em uma instrução If ... Then ... Else , mas nenhuma cláusula ElseIf pode aparecer
após uma cláusula Else . As instruções If ... Then ... Else podem ser aninhadas entre si.
Na sintaxe multilinha, a instrução If deve ser a única instrução na primeira linha. As
instruções ElseIf , Else e End If podem ser precedidas apenas por um rótulo de linha.
O bloco If ... Then ... Else deve terminar com uma instrução End If .

 Dica

A instrução Select...Case pode ser mais útil quando você avalia uma única
expressão que tem vários valores possíveis.

Sintaxe de linha única


Você pode usar a sintaxe de linha única para uma única condição com código a ser
executada se for verdadeira. No entanto, a sintaxe de várias linhas fornece mais
estrutura e flexibilidade e é mais fácil de ler, manter e depurar.

O que segue a palavra-chave Then é examinado para determinar se uma instrução é


uma If de linha única. Se algo diferente de um comentário aparecer depois de Then na
mesma linha, a instrução será tratada como uma instrução If de linha única. Se Then
estiver ausente, ela deverá ser o início de uma If ... Then ... Else de várias linhas.

Na sintaxe de linha única, você pode ter várias instruções executadas como resultado de
uma decisão If ... Then . Todas as instruções precisam estar na mesma linha e ser
separadas por dois-pontos.

Exemplo de sintaxe multilinha


O exemplo a seguir ilustra o uso da sintaxe multilinha da instrução If ... Then ... Else .

VB

Module Multiline

Public Sub Main()

'Create a Random object to seed our starting value

Dim randomizer As New Random()

'set our variable

Dim count As Integer = randomizer.Next(0, 5)

Dim message As String

'If count is zero, output will be no items

If count = 0 Then

message = "There are no items."

'If count is 1, output will be "There is 1 item.".

ElseIf count = 1 Then

message = "There is 1 item."

'If count is greater than 1, output will be "There are {count}


items.", where {count} is replaced by the value of count.

Else

message = $"There are {count} items."

End If

Console.WriteLine(message)

End Sub

End Module

'This example displays output like the following:

' There are 4 items.

Exemplo de sintaxe aninhada


O exemplo a seguir contém instruções If ... Then ... Else aninhadas.

VB

Module Nested

Public Sub Main()

' Run the function as part of the WriteLine output.

Console.WriteLine("Time Check is " & CheckIfTime() & ".")

End Sub

Private Function CheckIfTime() As Boolean

' Determine the current day of week and hour of day.

Dim dayW As DayOfWeek = DateTime.Now.DayOfWeek

Dim hour As Integer = DateTime.Now.Hour

' Return True if Wednesday from 2 to 3:59 P.M.,

' or if Thursday from noon to 12:59 P.M.

If dayW = DayOfWeek.Wednesday Then

If hour = 14 Or hour = 15 Then

Return True

Else

Return False

End If

ElseIf dayW = DayOfWeek.Thursday Then

If hour = 12 Then

Return True

Else

Return False

End If

Else

Return False

End If

End Function

End Module

'This example displays output like the following:

'Time Check is False.

Exemplo de sintaxe de linha única


O exemplo a seguir ilustra o uso da sintaxe de linha única.

VB

Module SingleLine

Public Sub Main()

'Create a Random object to seed our starting values

Dim randomizer As New Random()

Dim A As Integer = randomizer.Next(10, 20)

Dim B As Integer = randomizer.Next(0, 20)

Dim C As Integer = randomizer.Next(0, 5)

'Let's display the initial values for comparison

Console.WriteLine($"A value before If: {A}")

Console.WriteLine($"B value before If: {B}")

Console.WriteLine($"C value before If: {C}")

' If A > 10, execute the three colon-separated statements in the


order

' that they appear

If A > 10 Then A = A + 1 : B = B + A : C = C + B

'If the condition is true, the values will be different

Console.WriteLine($"A value after If: {A}")

Console.WriteLine($"B value after If: {B}")

Console.WriteLine($"C value after If: {C}")

End Sub

End Module

'This example displays output like the following:

'A value before If: 11

'B value before If: 6

'C value before If: 3

'A value after If: 12

'B value after If: 18

'C value after If: 21

Confira também
Choose
Switch
Diretivas #If...Then...#Else
Instrução Select...Case
Estruturas de Controle Aninhadas
Estruturas de Decisão
Operadores lógicos e bit a bit no Visual Basic
Operador If
Instrução Implements
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica uma ou mais interfaces, ou membros de inteface, que devem ser


implementados na definição de classe ou estrutura na qual ela aparece.

Sintaxe
VB

Implements interfacename [, ...]

' -or-

Implements interfacename.interfacemember [, ...]

Partes
interfacename

Obrigatórios. Uma interface cujos procedimentos, propriedades e eventos devem ser


implementados por membros correspondentes na classe ou na estrutura.

interfacemember

Obrigatórios. O membro de uma interface que está sendo implementada.

Comentários
Uma interface é uma coleção de protótipos que representam os membros
(propriedades, procedimentos e eventos) que a interface encapsula. As interfaces
contêm apenas as declarações para membros; classes e estruturas implementam esses
membros. Para obter mais informações, consulte Interfaces.

A instrução Implements deve vir imediatamente após Class ou Structure .

Ao implementar uma interface, você deve implementar todos os membros nela


declarados. Omitir qualquer membro é considerado um erro de sintaxe. Para
implementar um membro individual, especifique a palavra-chave Implements (que é
separada da instrução Implements ) ao declarar o membro na classe ou na estrutura. Para
obter mais informações, consulte Interfaces.

As classes podem usar implementações Privadas de propriedades e procedimentos, mas


esses membros são acessíveis apenas pela conversão de uma instância da classe de
implementação em uma variável declarada como do tipo da interface.

Exemplo 1
O exemplo a seguir mostra como usar a instrução Implements para implementar
membros de uma interface. Ele define uma interface nomeada ICustomerInfo com um
evento, uma propriedade e um procedimento. A classe customerInfo implementa todos
os membros definidos na interface.

VB

Public Interface ICustomerInfo

Event UpdateComplete()

Property CustomerName() As String

Sub UpdateCustomerStatus()

End Interface

Public Class customerInfo

Implements ICustomerInfo

' Storage for the property value.

Private customerNameValue As String

Public Event UpdateComplete() Implements ICustomerInfo.UpdateComplete

Public Property CustomerName() As String _

Implements ICustomerInfo.CustomerName

Get

Return customerNameValue

End Get

Set(ByVal value As String)

' The value parameter is passed to the Set procedure

' when the contents of this property are modified.

customerNameValue = value

End Set

End Property

Public Sub UpdateCustomerStatus() _

Implements ICustomerInfo.UpdateCustomerStatus

' Add code here to update the status of this account.

' Raise an event to indicate that this procedure is done.

RaiseEvent UpdateComplete()

End Sub

End Class

Observe que a classe customerInfo usa a instrução Implements em uma linha de código-
fonte separada para indicar que a classe implementa todos os membros da interface
ICustomerInfo . Em seguida, cada membro da classe usa a palavra-chave

Implements como parte de sua declaração de membro para indicar que ele implementa
esse membro de interface.
Exemplo 2
Os dois procedimentos a seguir mostram como você pode usar a interface
implementada no exemplo anterior. Para testar a implementação, adicione esses
procedimentos ao projeto e chame o procedimento testImplements .

VB

Public Sub TestImplements()

' This procedure tests the interface implementation by

' creating an instance of the class that implements ICustomerInfo.

Dim cust As ICustomerInfo = New customerInfo()

' Associate an event handler with the event that is raised by

' the cust object.

AddHandler cust.UpdateComplete, AddressOf HandleUpdateComplete

' Set the CustomerName Property

cust.CustomerName = "Fred"

' Retrieve and display the CustomerName property.

MsgBox("Customer name is: " & cust.CustomerName)

' Call the UpdateCustomerStatus procedure, which raises the

' UpdateComplete event.

cust.UpdateCustomerStatus()

End Sub

Sub HandleUpdateComplete()

' This is the event handler for the UpdateComplete event.

MsgBox("Update is complete.")

End Sub

Confira também
Implementações
Instrução Interface
Interfaces
Instrução Imports (tipo e namespace
.NET)
Artigo • 22/02/2023 • 4 minutos para o fim da leitura

Permite que nomes de tipo sejam referenciados sem a qualificação de namespace.

Sintaxe
VB

Imports [ aliasname = ] namespace

' -or-

Imports [ aliasname = ] namespace.element

Partes
Termo Definição

aliasname Opcional. Um alias ou nome de importação pelo qual o código pode se referir a
namespace em vez da cadeia de caracteres de qualificação completa. Confira Nomes
de elementos declarados.

namespace Obrigatórios. O nome totalmente qualificado do namespace a ser importado. Pode


ser uma cadeia de caracteres de namespaces aninhada para qualquer nível.

element Opcional. O nome de um elemento de programação declarado no namespace. Pode


ser qualquer elemento de contêiner.

Comentários
A instrução Imports permite que os tipos contidos em um determinado namespace
sejam referenciados diretamente.

Você pode fornecer um único nome de namespace ou uma cadeia de caracteres de


namespaces aninhados. Cada namespace aninhado é separado do próximo namespace
de nível superior por um ponto ( . ), como ilustra o exemplo a seguir:

VB

Imports System.Collections.Generic

Cada arquivo de origem pode conter qualquer número de instruções Imports . Elas
devem seguir alguma declaraçâo de opção, como a instrução Option Strict , e devem
preceder declarações de elemento de programação, como as instruções Module ou
Class .

Você só pode usar Imports no nível do arquivo. Isso significa que o contexto de
declaração para importação precisa ser um arquivo de origem, e não pode ser um
namespace, uma classe, uma estrutura, um módulo, uma interface, um procedimento
nem um bloco.

Observe que a instrução Imports não disponibiliza elementos de outros projetos e


assemblies para seu projeto. A importação não ocupa o lugar de definir uma referência.
Ela apenas remove a necessidade de qualificar nomes que já estão disponíveis no seu
projeto. Para obter mais informações, consulte "Importar elementos que contêm" em
Referências a elementos declarados.

7 Observação

Você pode definir instruções implícitas Imports usando a Página de Referências,


Designer de Projeto (Visual Basic). Para mais informações, consulte Como
adicionar ou remover namespaces importados (Visual Basic).

Aliases de importação
Um alias de importação define o alias para um namespace ou tipo. Os aliases de
importação são úteis quando você precisa usar itens com o mesmo nome declarado em
um ou mais namespaces. Para obter mais informações e um exemplo, consulte
"Qualificar um nome de elemento" em Referências a elementos declarados.

Você não deve declarar um membro no nível do módulo com o mesmo nome de
aliasname . Se você fizer isso, o compilador do Visual Basic usará aliasname apenas para
o membro declarado e não o reconhecerá mais como um alias de importação.

Embora a sintaxe usada para declarar um alias de importação seja semelhante à usada
para importar um prefixo do namespace de XML, os resultados são diferentes. Um alias
de importação pode ser usado como uma expressão no seu código, enquanto um
prefixo de namespace de XML pode ser usado apenas em literais XML ou propriedades
do eixo XML como o prefixo para um nome qualificado de elemento ou atributo.

Nomes de elementos
Se você fornecer element , ele deve representar um elemento de contêiner, ou seja, um
elemento de programação que pode conter outros elementos. Os elementos de
contêiner incluem classes, estruturas, módulos, interfaces e enumerações.

O escopo dos elementos disponibilizados por uma instrução Imports depende se você
especificar element . Se você especificar apenas namespace , todos os membros
nomeados exclusivamente desse namespace e membros de elementos de contêiner
dentro desse namespace estarão disponíveis sem qualificação. Se você especificar
namespace e element , somente os membros desse elemento estarão disponíveis sem

qualificação.

Exemplo 1
O exemplo a seguir lista todas as pastas no diretório C:\ usando a classe DirectoryInfo:

O código não tem instruções Imports na parte superior do arquivo. Portanto, as


referências DirectoryInfo, StringBuilder e CrLf são totalmente qualificadas com os
namespaces.

VB

Public Function GetFolders() As String

' Create a new StringBuilder, which is used

' to efficiently build strings.

Dim sb As New System.Text.StringBuilder

Dim dInfo As New System.IO.DirectoryInfo("c:\")

' Obtain an array of directories, and iterate through

' the array.

For Each dir As System.IO.DirectoryInfo In dInfo.GetDirectories()

sb.Append(dir.Name)

sb.Append(Microsoft.VisualBasic.ControlChars.CrLf)

Next

Return sb.ToString

End Function

Exemplo 2
O exemplo a seguir inclui instruções Imports para os namespaces referenciados.
Portanto, os tipos não precisam ser totalmente qualificados com os namespaces.

VB
' Place Imports statements at the top of your program.

Imports System.Text

Imports System.IO

Imports Microsoft.VisualBasic.ControlChars

VB

Public Function GetFolders() As String

Dim sb As New StringBuilder

Dim dInfo As New DirectoryInfo("c:\")

For Each dir As DirectoryInfo In dInfo.GetDirectories()

sb.Append(dir.Name)

sb.Append(CrLf)

Next

Return sb.ToString

End Function

Exemplo 3
O exemplo a seguir inclui instruções Imports que criam aliases para os namespaces
referenciados. Os tipos são qualificados com os aliases.

VB

Imports systxt = System.Text

Imports sysio = System.IO

Imports ch = Microsoft.VisualBasic.ControlChars

VB

Public Function GetFolders() As String

Dim sb As New systxt.StringBuilder

Dim dInfo As New sysio.DirectoryInfo("c:\")

For Each dir As sysio.DirectoryInfo In dInfo.GetDirectories()

sb.Append(dir.Name)

sb.Append(ch.CrLf)

Next

Return sb.ToString

End Function

Exemplo 4
O exemplo a seguir inclui instruções Imports que criam aliases para os tipos de
referência. Os aliases são usados para especificar os tipos.

VB

Imports strbld = System.Text.StringBuilder

Imports dirinf = System.IO.DirectoryInfo

VB

Public Function GetFolders() As String

Dim sb As New strbld

Dim dInfo As New dirinf("c:\")

For Each dir As dirinf In dInfo.GetDirectories()

sb.Append(dir.Name)

sb.Append(ControlChars.CrLf)

Next

Return sb.ToString

End Function

Confira também
Instrução Namespace
Namespaces no Visual Basic
Referências e a instrução Imports
Instrução Imports (namespace XML)
Referências a elementos declarados
Instrução Imports (namespace XML)
Artigo • 22/02/2023 • 4 minutos para o fim da leitura

Importa prefixos do namespace de XML para uso em literais do XML e propriedades do


eixo XML.

Sintaxe
VB

Imports <xmlns:xmlNamespacePrefix = "xmlNamespaceName">

Partes
xmlNamespacePrefix

Opcional. A cadeia de caracteres pela qual elementos XML e atributos podem se referir
a xmlNamespaceName . Se nenhum xmlNamespacePrefix for fornecido, o namespace de
XML importado será o namespace de XML padrão. Deve ser um identificador XML
válido. Para obter mais informações, confira Nomes de elementos e atributos XML
declarados.

xmlNamespaceName

Obrigatórios. A cadeia de caracteres que identifica o namespace de XML que está sendo
importado.

Comentários
Você pode usar a instrução Imports para definir namespaces de XML globais que
podem ser usados com literais do XML e propriedades do eixo XML ou como
parâmetros passados para o operador GetXmlNamespace . (Para obter informações sobre
como usar a instrução Imports para importar um alias que pode ser usado onde os
nomes de tipo são usados em seu código, confira Instrução Imports (tipo e namespace
.NET).) A sintaxe para declarar um namespace de XML usando a instrução Imports é
idêntica à sintaxe usada em XML. Portanto, você pode copiar uma declaração de
namespace de um arquivo XML e usá-la em uma instrução Imports .

Prefixos de namespace de XML são úteis quando você deseja criar repetidamente
elementos XML que são do mesmo namespace. O prefixo de namespace de XML
declarado com a instrução Imports é global no sentido de que ele está disponível para
todo o código no arquivo. Você pode usá-lo quando cria literais de elemento XML e
quando acessa as propriedades do eixo XML. Para obter mais informações, confira
Literal do elemento XML e Propriedades do eixo XML.

Se você definir um namespace de XML global sem um prefixo de namespace (por


exemplo, Imports <xmlns="http://SomeNameSpace>" ), esse namespace será considerado o
namespace de XML padrão. O namespace de XML padrão é usado para literais de
elemento XML ou propriedades do eixo de atributo XML que não especificam
explicitamente um namespace. O namespace padrão também será usado se o
namespace especificado for o namespace vazio (ou seja, xmlns="" ). O namespace de
XML padrão não se aplica a atributos XML em literais do XML ou a propriedades do eixo
de atributo XML que não têm um namespace.

Namespaces de XML definidos em um literal do XML, que são chamados de namespaces


de XML locais, têm precedência sobre namespaces de XML definidos pela instrução
Imports como globais. Namespaces de XML definidos pela instrução Imports têm

precedência sobre namespaces de XML importados para um projeto do Visual Basic. Se


um literal do XML definir um namespace de XML, esse namespace local não se aplicará
a expressões inseridas.

Os namespaces de XML globais seguem as mesmas regras de escopo e definição que os


namespaces .NET Framework. Como resultado, você pode incluir uma instrução Imports
para definir um namespace de XML global em qualquer lugar que possa importar um
namespace .NET Framework. Isso inclui arquivos de código e namespaces importados
no nível do projeto. Para obter informações sobre namespaces importados no nível do
projeto, confira Página Referências, Designer de Projeto (Visual Basic).

Cada arquivo de origem pode conter qualquer número de instruções Imports . Elas
devem seguir declarações de opção, como a instrução Option Strict , e devem preceder
declarações de elemento de programação, como instruções Module ou Class .

Exemplo 1
O exemplo a seguir importa um namespace de XML padrão e um namespace de XML
identificado com o prefixo ns . Em seguida, ele cria literais do XML que usam ambos os
namespaces.

VB

' Place Imports statements at the top of your program.

Imports <xmlns="http://DefaultNamespace">

Imports <xmlns:ns="http://NewNamespace">

Module Module1

Sub Main()

' Create element by using the default global XML namespace.

Dim inner = <innerElement/>

' Create element by using both the default global XML namespace

' and the namespace identified with the "ns" prefix.

Dim outer = <ns:outer>

<ns:innerElement></ns:innerElement>

<siblingElement></siblingElement>

<%= inner %>

</ns:outer>

' Display element to see its final form.

Console.WriteLine(outer)

End Sub

End Module

Este código exibe o seguinte texto:

XML

<ns:outer xmlns="http://DefaultNamespace"

xmlns:ns="http://NewNamespace">

<ns:innerElement></ns:innerElement>

<siblingElement></siblingElement>

<innerElement />

</ns:outer>

Exemplo 2
O exemplo a seguir importa o prefixo ns de namespace de XML. Em seguida, ele cria
um literal do XML que usa o prefixo de namespace e exibe o formulário final do
elemento.

VB

' Place Imports statements at the top of your program.

Imports <xmlns:ns="http://SomeNamespace">

Class TestClass1

Shared Sub TestPrefix()

' Create test using a global XML namespace prefix.

Dim inner2 = <ns:inner2/>

Dim test =

<ns:outer>

<ns:middle xmlns:ns="http://NewNamespace">

<ns:inner1/>

<%= inner2 %>

</ns:middle>

</ns:outer>

' Display test to see its final form.

Console.WriteLine(test)

End Sub

End Class

Este código exibe o seguinte texto:

XML

<ns:outer xmlns:ns="http://SomeNamespace">

<ns:middle xmlns:ns="http://NewNamespace">

<ns:inner1 />

<inner2 xmlns="http://SomeNamespace" />

</ns:middle>

</ns:outer>

Observe que o compilador converteu o prefixo de namespace de XML de um prefixo


global em uma definição de prefixo local.

Exemplo 3
O exemplo a seguir importa o prefixo ns de namespace de XML. Em seguida, ele usa o
prefixo do namespace para criar um literal do XML e acessar o primeiro nó filho com o
nome qualificado ns:name .

VB

Imports <xmlns:ns = "http://SomeNamespace">

Class TestClass4

Shared Sub TestPrefix()

Dim contact = <ns:contact>

<ns:name>Patrick Hines</ns:name>

</ns:contact>

Console.WriteLine(contact.<ns:name>.Value)

End Sub

End Class

Este código exibe o seguinte texto:

Patrick Hines

Confira também
Literal do Elemento XML
Propriedades do eixo XML
Nomes de elementos e atributos XML declarados
Operador GetXmlNamespace
Instrução Inherits
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Faz com que a classe ou interface atual herde os atributos, variáveis, propriedades,
procedimentos e eventos de outra classe ou conjunto de interfaces.

Sintaxe
VB

Inherits basetypenames

Partes
Termo Definição

basetypenames Obrigatórios. O nome da classe da qual essa classe deriva.

-ou-

Os nomes das interfaces das quais essa interface deriva. Use vírgulas para
separar vários nomes.

Comentários
Se usada, a instrução Inherits deve ser a primeira linha não em branco e sem
comentários em uma definição de classe ou interface. Ela deve seguir imediatamente a
instrução Class ou Interface .

Você só pode usar Inherits em uma classe ou interface. Isso significa que o contexto
de declaração de uma herança não pode ser um arquivo de origem, namespace,
estrutura, módulo, procedimento ou bloco.

Regras
Herança de classe. Se uma classe usar a instrução Inherits , você poderá
especificar apenas uma classe base.

Uma classe não pode herdar de uma classe que está aninhada dentro dela.
Herança de interface. Se uma interface usar a instrução Inherits , você poderá
especificar uma ou mais interfaces base. Você pode herdar de duas interfaces
mesmo que elas definam um membro com o mesmo nome. Se você fizer isso, o
código de implementação deverá usar a qualificação de nome para especificar
qual membro ele está implementando.

Uma interface não pode herdar de outra interface que tenha um nível de acesso
mais restritivo. Por exemplo, uma interface Public não pode herdar de uma
interface Friend .

Uma interface não pode herdar de uma interface que esteja aninhada dentro dela.

Um exemplo de herança de classe no .NET Framework é a classe ArgumentException,


que herda da classe SystemException. Isso fornece a ArgumentException todas as
propriedades e procedimentos predefinidos exigidos por exceções do sistema, como a
propriedade Message e o método ToString.

Um exemplo de herança de interface no .NET Framework é a interface ICollection, que


herda da interface IEnumerable. Isso faz com que ICollection herde a definição do
enumerador necessário para percorrer uma coleção.

Exemplo 1
O exemplo a seguir usa a instrução Inherits para mostrar como uma classe chamada
thisClass pode herdar todos os membros de uma classe base chamada anotherClass .

VB

Public Class thisClass

Inherits anotherClass

' Add code to override, overload, or extend members

' inherited from the base class.

' Add new variable, property, procedure, and event declarations.

End Class

Exemplo 2
O exemplo a seguir mostra a herança de várias interfaces.

VB

Public Interface thisInterface

Inherits IComparable, IDisposable, IFormattable

' Add new property, procedure, and event definitions.

End Interface

A interface chamada thisInterface agora inclui todas as definições nas interfaces


IComparable, IDisposable e IFormattable que os membros herdados fornecem,
respectivamente, para comparação específica de tipo de dois objetos, liberando
recursos alocados e expressando o valor de um objeto como um String . Uma classe
que implementa thisInterface deve implementar cada membro de cada interface base.

Confira também
MustInherit
NotInheritable
Objetos e Classes
Noções básicas de herança
Interfaces
Instrução Interface (Visual Basic)
Artigo • 28/11/2022 • 6 minutos para o fim da leitura

Declara o nome de uma interface e apresenta as definições dos membros que a


interface compreende.

Sintaxe
VB

[ <attributelist> ] [ accessmodifier ] [ Shadows ] _

Interface name [ ( Of typelist ) ]

[ Inherits interfacenames ]

[ [ modifiers ] Property membername ]

[ [ modifiers ] Function membername ]

[ [ modifiers ] Sub membername ]

[ [ modifiers ] Event membername ]

[ [ modifiers ] Interface membername ]

[ [ modifiers ] Class membername ]

[ [ modifiers ] Structure membername ]

End Interface

Partes
Termo Definição

attributelist Opcional. Confira Lista de atributos.

accessmodifier Opcional. Um dos seguintes pode ser feito:

- Público

- Protegido

- Amigo

- Particular

- Amigo Protegido

- Protegido de forma particular

Confira Níveis de acesso no Visual Basic.

Shadows Opcional. Confira Sombras.

name Obrigatórios. Nome dessa interface. Confira Nomes de elemento declarados.

Of Opcional. Especifica que essa é uma interface genérica.


Termo Definição

typelist Obrigatório se você usar a palavra-chave De. Lista de parâmetros de tipo para
essa interface. Como opção, cada parâmetro de tipo pode ser declarado
variante usando os modificadores In e Out genéricos. Confira Lista de tipos.

Inherits Opcional. Indica que essa interface herda os atributos e os membros de outra
interface ou interfaces. Confira Instrução Inherits.

interfacenames Obrigatório se você usar a instrução Inherits . Os nomes das interfaces das
quais essa interface deriva.

modifiers Opcional. Modificadores apropriados para o membro da interface que está


sendo definido.

Property Opcional. Define uma propriedade que é um membro da interface.

Function Opcional. Define um procedimento Function que é um membro da interface.

Sub Opcional. Define um procedimento Sub que é um membro da interface.

Event Opcional. Define um evento que é um membro da interface.

Interface Opcional. Define uma interface aninhada dentro dessa interface. A definição de
interface aninhada deve ser encerrada com uma instrução End Interface .

Class Opcional. Define uma classe que é um membro da interface. A definição da


classe de membro deve ser encerrada com uma instrução End Class .

Structure Opcional. Define uma estrutura que é um membro da interface. A definição da


estrutura de membro deve ser encerrada com uma instrução End Structure .

membername Obrigatório para cada propriedade, procedimento, evento, interface, classe ou


estrutura definida como um membro da interface. O nome do membro.

End Interface Termina a definição do bloco Interface .

Comentários
Uma interface define um conjunto de membros, como propriedades e procedimentos,
que as classes e estruturas podem implementar. A interface define apenas as assinaturas
dos membros e não seus trabalhos internos.

Uma classe ou estrutura implementa a interface fornecendo código para cada membro
definido pela interface. Por fim, quando o aplicativo cria uma instância dessa classe ou
estrutura, um objeto existe e é executado na memória. Para obter mais informações,
confira Objetos e classes e Interfaces.
Você só pode usar Interface no namespace ou no nível do módulo. Isso significa que o
contexto de declaração de uma interface precisa ser um arquivo de origem, namespace,
classe, estrutura, módulo, ou interface, e não pode ser um procedimento ou bloco. Para
obter mais informações, consulte Contextos de declaração e níveis de acesso padrão.

As interfaces assumem o padrão de acesso Amigo. Você pode ajustar os níveis de


acesso com os modificadores de acesso. Para obter mais informações, confira Níveis de
acesso no Visual Basic.

Regras
Interfaces de aninhamento. Você pode definir uma interface dentro de outra. A
interface externa é chamada de interface independente, e a interface interna é
chamada de interface aninhada.

Declaração de membro. Quando você declara uma propriedade ou procedimento


como membro de uma interface, está definindo apenas a assinatura dessa
propriedade ou procedimento. Isso inclui o tipo de elemento (propriedade ou
procedimento), os parâmetros e tipos de parâmetro e o tipo de retorno. Devido a
isso, a definição de membro usa apenas uma linha de código, e instruções de
encerramento como End Function ou End Property não são válidas em uma
interface.

Por outro lado, quando você define uma enumeração ou estrutura, ou uma classe
ou interface aninhada, é necessário incluir os membros de dados.

Modificadores de membro. Você não pode usar nenhum modificador de acesso


ao definir membros do módulo nem pode especificar Compartilhado ou qualquer
modificador de procedimento, exceto Sobrecargas. Você pode declarar qualquer
membro com Sombras e usar Padrão ao definir uma propriedade, bem como
ReadOnly ou WriteOnly.

Herança. Se uma interface usar a instrução Inherits, você poderá especificar uma
ou mais interfaces base. Você pode herdar de duas interfaces mesmo que elas
definam um membro com o mesmo nome. Se você fizer isso, o código de
implementação deverá usar a qualificação de nome para especificar qual membro
ele está implementando.

Uma interface não pode herdar de outra interface que tenha um nível de acesso
mais restritivo. Por exemplo, uma interface Public não pode herdar de uma
interface Friend .
Uma interface não pode herdar de uma interface que esteja aninhada dentro dela.

Implementação. Quando uma classe usa a instrução Implements para


implementar essa interface, ela precisa implementar todos os membros definidos
dentro da interface. Além disso, cada assinatura no código de implementação
precisa corresponder exatamente à assinatura correspondente definida nessa
interface. No entanto, o nome do membro no código de implementação não
precisa corresponder ao nome do membro conforme definido na interface.

Quando uma classe está implementando um procedimento, ela não pode designar
o procedimento como Shared .

Propriedade padrão. Uma interface pode especificar no máximo uma propriedade


como propriedade padrão, que pode ser referenciada sem usar o nome da
propriedade. Especifique essa propriedade declarando-a com o modificador
Padrão.

Observe que isso significa que uma interface só pode definir uma propriedade
padrão se ela herdar nenhuma.

Comportamento
Nível de acesso. Todos os membros da interface têm acesso público
implicitamente. Você não pode usar nenhum modificador de acesso ao definir um
membro. No entanto, uma classe que implementa a interface pode declarar um
nível de acesso para cada membro implementado.

Se você atribuir uma instância de classe a uma variável, o nível de acesso dos
membros poderá depender de se o tipo de dados da variável é a interface
subjacente ou a classe de implementação. O exemplo a seguir ilustra essa situação.

VB

Public Interface IDemo

Sub DoSomething()

End Interface

Public Class implementIDemo

Implements IDemo

Private Sub DoSomething() Implements IDemo.DoSomething

End Sub

End Class

Dim varAsInterface As IDemo = New implementIDemo()

Dim varAsClass As implementIDemo = New implementIDemo()

Se você acessar os membros da classe pela varAsInterface , todos eles terão


acesso público. No entanto, se você acessar membros pela varAsClass , o Sub
procedimento doSomething terá acesso privado.

Escopo. Uma interface está no escopo em todo o namespace, classe, estrutura ou


módulo.

O escopo de cada membro de interface é a interface inteira.

Tempo de vida. Uma interface em si não tem um tempo de vida nem os membros
dela. Quando uma classe implementa uma interface e um objeto é criado como
uma instância dessa classe, o objeto tem um tempo de vida dentro do aplicativo
no qual está em execução. Para obter mais informações, confira "Tempo de vida"
na Instrução Class.

Exemplo
O exemplo a seguir usa a instrução Interface para definir uma interface chamada
thisInterface , que deve ser implementada com uma instrução Property e uma
instrução Function .

VB

Public Interface thisInterface

Property ThisProp(ByVal thisStr As String) As Char

Function ThisFunc(ByVal thisInt As Integer) As Integer

End Interface

Observe que as instruções Property e Function não introduzem blocos que terminam
com End Property e End Function dentro da interface. A interface define somente a
assinatura dos membros. Os blocos Property e Function completos aparecem em uma
classe que implementa thisInterface .

Confira também
Interfaces
Instrução Class
Instrução Module
Instrução Structure
Instrução Property
Instrução Function
Instrução Sub
Tipos genéricos no Visual Basic
Visão geral do sombreamento
Variação em interfaces genéricas
In
Saída
Instrução Mid
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Substitui um número especificado de caracteres em uma variável String com caracteres


de outra cadeia de caracteres.

Sintaxe
VB

Mid( _

ByRef Target As String, _

ByVal Start As Integer, _

Optional ByVal Length As Integer _

) = StringExpression

Partes
Target

Obrigatórios. Nome da variável String a ser modificada.

Start

Obrigatórios. Expressão Integer . Posição do caractere em Target onde começa a


substituição do texto. Start usa um único índice.

Length

Opcional. Expressão Integer . Número de caracteres a ser substituído. Se omitido, tudo


de String será usado.

StringExpression

Obrigatórios. expressão String que substitui parte de Target .

Exceções
Tipo de exceção Condição

ArgumentException Start <= 0 ou Length < 0.

Comentários
O número de caracteres substituídos é sempre menor ou igual ao número de caracteres
em Target .

O Visual Basic tem uma função Mid e uma instrução Mid . Esses elementos operam em
um número especificado de caracteres em uma cadeia de caracteres, mas a função Mid
retorna os caracteres enquanto a instrução Mid substitui os caracteres. Para obter mais
informações, consulte Mid.

7 Observação

A instrução MidB de versões anteriores do Visual Basic substitui uma substring de


caracteres em bytes, em vez de caracteres. Ela é usada principalmente para
converter cadeias de caracteres em aplicativos DBCS (conjunto de caracteres de
bytes duplos). Todas as cadeias de caracteres do Visual Basic estão no Unicode e
MidB não tem mais suporte.

Exemplo
Este exemplo usa a instrução Mid para substituir um número especificado de caracteres
em uma variável de cadeia de caracteres por caracteres de outra cadeia de caracteres.

VB

Dim testString As String

' Initializes string.

testString = "The dog jumps"

' Returns "The fox jumps".

Mid(testString, 5, 3) = "fox"

' Returns "The cow jumps".

Mid(testString, 5) = "cow"

' Returns "The cow jumpe".

Mid(testString, 5) = "cow jumped over"

' Returns "The duc jumpe".

Mid(testString, 5, 3) = "duck"

Requisitos
Namespace:Microsoft.VisualBasic

Módulo: Strings
Assembly: Biblioteca de Tempo de Execução do Visual Basic (em
Microsoft.VisualBasic.dll)

Confira também
Mid
Cadeias de caracteres
Introdução a cadeias de caracteres no Visual Basic
Instrução Module
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Declara o nome de um módulo e apresenta a definição das variáveis, propriedades,


eventos e procedimentos que o módulo abrange.

Sintaxe
VB

[ <attributelist> ] [ accessmodifier ] Module name

[ statements ]

End Module

Partes
attributelist

Opcional. Veja Lista de atributo.

accessmodifier

Opcional. Um dos seguintes pode ser feito:

Público

Friend

Confira Níveis de acesso no Visual Basic.

name

Obrigatórios. Nome desse módulo. Confira Nomes de elementos declarados.

statements

Opcional. Instruções que definem as variáveis, as propriedades, os eventos, os


procedimentos e os tipos aninhados deste módulo.

End Module

Termina a definição Module .

Comentários
Uma instrução Module define um tipo de referência disponível em todo o namespace.
Um módulo (às vezes chamado de módulo padrão) é semelhante a uma classe, mas com
algumas distinções importantes. Cada módulo tem exatamente uma instância e não
precisa ser criado nem atribuído a uma variável. Os módulos não dão suporte à herança
nem implementam interfaces. Observe que um módulo não é um tipo no sentido de
que uma classe ou estrutura é – você não pode declarar um elemento de programação
para ter o tipo de dados de um módulo.

Você só pode usar Module no nível do namespace. Isso significa que o contexto de
declaração de um módulo precisa ser um arquivo de origem ou namespace, e não pode
ser uma classe, uma estrutura, um módulo, uma interface, um procedimento nem um
bloco. Você não pode aninhar um módulo em outro módulo nem dentro de algum tipo.
Para obter mais informações, consulte Contextos de declaração e níveis de acesso
padrão.

Um módulo tem o mesmo tempo de vida que o programa. Como os membros são
todos Shared , eles também têm tempo de vida igual ao do programa.

Os módulos assumem o padrão de acesso Amigo. Você pode ajustar os níveis de acesso
com os modificadores de acesso. Para obter mais informações, confira Níveis de acesso
no Visual Basic.

Todos os membros de um módulo são implicitamente Shared .

Classes e módulos
Estes elementos têm muitas semelhanças, mas também há algumas diferenças
importantes.

Terminologia. As versões anteriores do Visual Basic reconhecem dois tipos de


módulos: módulos de classe (arquivos .cls) e módulos padrão (arquivos .bas). A
versão atual chama essas classes e módulos, respectivamente.

Membros compartilhados. Você pode controlar se um membro de uma classe é


um membro compartilhado ou de instância.

Orientação a objeto. As classes são orientadas a objetos, mas os módulos não são.
Portanto, somente classes podem ser instanciadas como objetos. Para obter mais
informações, confira Objetos e classes.

Regras
Modificadores. Todos os membros do módulo são implicitamente
Compartilhados. Você não pode usar a palavra-chave Shared ao declarar um
membro e não pode alterar o status compartilhado de nenhum membro.

Herança. Um módulo não pode herdar de nenhum tipo diferente de Object, do


qual todos os módulos herdam. Em particular, um módulo não pode herdar de
outro.

Você não pode usar a Instrução Inherits em uma definição de módulo, mesmo
para especificar Object.

Propriedade padrão. Você não pode definir nenhuma propriedade padrão em um


módulo. Para obter mais informações, confira Padrão.

Comportamento
Nível de acesso. Em um módulo, você pode declarar cada membro com o próprio
nível de acesso. Os membros do módulo assumem o padrão de acesso Público,
exceto variáveis e constantes, que assumem o padrão de acesso Privado. Quando
um módulo tem acesso mais restrito do que um dos membros dele, o nível de
acesso do módulo especificado tem precedência.

Escopo. Um módulo está no escopo em todo o namespace.

O escopo de cada membro do módulo é o módulo inteiro. Observe que todos os


membros passam por promoção de tipos, fazendo com que o escopo seja
promovido para o namespace que contém o módulo. Para obter mais informações,
confira Promoção de tipos.

Qualificação. Você pode ter vários módulos em um projeto e pode declarar


membros com o mesmo nome em dois ou mais módulos. No entanto, você
precisará qualificar qualquer referência a esse membro com o nome do módulo
apropriado se a referência for de fora desse módulo. Para obter mais informações,
confira Referências a elementos declarados.

Exemplo
VB

Public Module thisModule

Sub Main()

Dim userName As String = InputBox("What is your name?")

MsgBox("User name is " & userName)

End Sub

' Insert variable, property, procedure, and event declarations.

End Module

Confira também
Instrução Class
Instrução Namespace
Instrução Structure
Instrução Interface
Instrução Property
Tipo de promoção
Instrução Namespace
Artigo • 22/02/2023 • 4 minutos para o fim da leitura

Declara o nome de um namespace e faz com que o código-fonte que segue a


declaração seja compilado nesse namespace.

Sintaxe
VB

Namespace [Global.] { name | name.name }

[ componenttypes ]

End Namespace

Partes
Opcional Global. Permite definir um namespace fora do namespace raiz do projeto.
Confira Namespaces no Visual Basic.

name Necessário. Um nome exclusivo que identifica o namespace. Deve ser um

identificador válido do Visual Basic. Para obter mais informações, consulte Nomes do
Elemento Declarado.

componenttypes Opcional. Elementos que compõem o namespace. Eles incluem, entre


outros, enumerações, estruturas, interfaces, classes, módulos, delegados e outros
namespaces.

End Namespace Encerra um bloco Namespace .

Comentários
Namespaces são usados como um sistema organizacional. Eles fornecem uma forma de
classificar e apresentar elementos de programação expostos a outros programas e
aplicativos. Observe que um namespace não é um tipo no sentido de que uma classe ou
estrutura é — você não pode declarar que um elemento de programação tenha o tipo
de dados de um namespace.

Todos os elementos de programação declarados após uma Namespace instrução


pertencem a esse namespace. O Visual Basic continua compilando elementos no último
namespace declarado até encontrar uma instrução End Namespace ou Namespace .
Se um namespace já estiver definido, mesmo fora do projeto, você poderá adicionar
elementos de programação a ele. Para fazer isso, use uma instrução Namespace para
direcionar o Visual Basic e compilar elementos nesse namespace.

Você pode usar uma instrução Namespace somente no âmbito do arquivo ou do


namespace. Isso significa que o contexto de declaração para um namespace precisa ser
de um arquivo de origem ou outro namespace e não pode ser uma classe, uma
estrutura, um módulo, uma interface ou um procedimento. Para obter mais informações,
consulte Contextos de declaração e níveis de acesso padrão.

Você pode declarar um namespace dentro de outro. Não há um limite estrito para os
níveis de aninhamento que você pode declarar, mas lembre-se de que quando outro
código acessa os elementos declarados no namespace mais interno, ele deve usar uma
cadeia de caracteres de qualificação que contenha todos os nomes de namespace na
hierarquia de aninhamento.

Nível de acesso
Os namespaces são tratados como se tivessem um nível de acesso Public . Um
namespace pode ser acessado do código em qualquer lugar do mesmo projeto, de
outros projetos que fazem referência a ele e de qualquer assembly criado por meio do
projeto.

Elementos de programação declarados no nível do namespace, ou seja, em um


namespace, mas não dentro de qualquer outro elemento, podem ter Public ou acessar
Friend . Se não especificado, o nível de acesso desse elemento usa Friend por padrão.
Os elementos que você pode declarar no nível do namespace incluem classes,
estruturas, módulos, interfaces, enumerações e delegados. Para obter mais informações,
consulte Contextos de declaração e níveis de acesso padrão.

Namespace raiz
Todos os nomes de namespace no projeto são baseados em um namespace raiz. O
Visual Studio atribui o nome do projeto como o namespace raiz padrão para todos os
códigos no projeto. Por exemplo, se o projeto for nomeado Payroll , os elementos de
programação pertencem ao namespace Payroll . Se você declarar Namespace funding , o
nome completo desse namespace será Payroll.funding .

Se você quiser especificar um namespace existente em uma instrução Namespace , como


no exemplo de classe de lista genérica, poderá definir o namespace raiz como um valor
nulo. Para fazer isso, clique em Propriedades do Projeto no menu Projeto e desmarque
a entrada de namespace raiz para que a caixa esteja vazia. Se você não fez isso no
exemplo de classe de lista genérica, o compilador do Visual Basic assumiria
System.Collections.Generic como um novo namespace dentro do projeto Payroll ,

com o nome completo de Payroll.System.Collections.Generic .

Como alternativa, você pode usar a palavra-chave Global para se referir a elementos de
namespaces definidos fora do projeto. Isso permite manter o nome do projeto como o
namespace raiz. Isso reduz a chance de mesclar involuntariamente os elementos de
programação com os dos namespaces existentes. Para obter mais informações, confira a
seção "Palavra-chave global em nomes totalmente qualificados" em Namespaces no
Visual Basic.

A palavra-chave Global também pode ser usada em uma instrução Namespace. Isso
permite definir um namespace fora do namespace raiz do projeto. Para obter mais
informações, confira a seção "Palavra-chave nas declarações de Namespace global" em
Namespaces no Visual Basic.

Solução de problemas. O namespace raiz pode levar a concatenações inesperadas de


nomes de namespace. Se você fizer referência a namespaces definidos fora do projeto,
o compilador do Visual Basic poderá interpretá-los como aqueles aninhados no
namespace raiz. Nesse caso, o compilador não reconhece nenhum tipo que já tenha
sido definido nos namespaces externos. Para evitar isso, defina o namespace raiz como
um valor nulo, conforme descrito em "Namespace Raiz", ou use a palavra-chave Global
para acessar elementos de namespaces externos.

Atributos e Modificadores
Você não pode aplicar atributos a um namespace. Um atributo contribui com
informações para os metadados do assembly, o que não é significativo para
classificadores de origem, como namespaces.

Você não pode aplicar nenhum modificador de acesso ou procedimento, ou qualquer


outro modificador, a um namespace. Esses modificadores não são significativos, pois
não são um tipo.

Exemplo 1
O exemplo a seguir declara dois namespaces, um aninhado no outro.

VB
Namespace n1

Namespace n2

Class a

' Insert class definition.

End Class

End Namespace

End Namespace

Exemplo 2
O exemplo a seguir declara vários namespaces aninhados em uma linha única e é
equivalente ao exemplo anterior.

VB

Namespace n1.n2

Class a

' Insert class definition.

End Class

End Namespace

Exemplo 3
O exemplo a seguir acessa a classe definida nos exemplos anteriores.

VB

Dim instance As New n1.n2.a

Exemplo 4
O exemplo a seguir define o esqueleto de uma nova classe de lista genérica e o adiciona
ao namespace System.Collections.Generic.

VB

Namespace System.Collections.Generic

Class specialSortedList(Of T)

Inherits List(Of T)

' Insert code to define the special generic list class.

End Class

End Namespace

Confira também
Instrução Imports (tipo e namespace .NET)
Nomes de elementos declarados
Namespaces no Visual Basic
Instrução On Error (Visual Basic)
Artigo • 22/02/2023 • 8 minutos para o fim da leitura

Habilita uma rotina de tratamento de erros e especifica o local da rotina dentro de um


procedimento; também pode ser usada para desabilitar uma rotina de tratamento de
erros. A instrução On Error é usada no tratamento de erros não estruturados e pode ser
usada em vez de tratamento de exceção estruturada. O tratamento de exceção
estruturado é integrado ao .NET, geralmente é mais eficiente e, portanto, é
recomendável ao lidar com erros de runtime em seu aplicativo.

Sem tratamento de erro ou tratamento de exceção, qualquer erro em tempo de


execução que ocorra é fatal: uma mensagem de erro é exibida e a execução é
interrompida.

7 Observação

A palavra-chave Error também é usada na Instrução Error, que tem suporte para
compatibilidade com versões anteriores.

Sintaxe
VB

On Error { GoTo [ line | 0 | -1 ] | Resume Next }

Partes
Termo Definição

GoTo line Habilita a rotina de tratamento de erros que começa na linha especificada no
argumento line necessário. O argumento line é qualquer rótulo de linha ou número de
linha. Se ocorrer um erro em tempo de execução, controle branches para a linha
especificada, tornando o manipulador de erros ativo. A linha especificada deve estar
no mesmo procedimento que a instrução On Error ; caso contrário, ocorrerá um erro
em tempo de compilação.

GoTo 0 Desabilita o manipulador de erros habilitado no procedimento atual e o redefine como


Nothing .

GoTo -1 Desabilita a exceção habilitada no procedimento atual e a redefine como Nothing .


Termo Definição

Resume Especifica que, quando ocorre um erro em tempo de execução, o controle vai para a
Next instrução imediatamente após a instrução em que o erro ocorreu e a execução
continua desse ponto. Use esse formulário em vez de On Error GoTo ao acessar
objetos.

Comentários

7 Observação

Recomendamos que você use o tratamento de exceção estruturado em seu código


sempre que possível, em vez de usar o tratamento de exceção não estruturado e a
instrução On Error . Para obter mais informações, consulte Instrução
Try...Catch...Finally.

Um manipulador de erros "habilitado" é aquele que é ativado por uma instrução On


Error . Um manipulador de erros "ativo" é um manipulador habilitado que está em
processo de tratamento de um erro.

Se ocorrer um erro enquanto um manipulador de erros estiver ativo (entre a ocorrência


do erro e uma instrução Resume , Exit Sub , Exit Function ou Exit Property ), o
manipulador de erros do procedimento atual não poderá lidar com o erro. O controle
retorna ao procedimento de chamada.

Se o procedimento de chamada tiver um manipulador de erros habilitado, ele será


ativado para lidar com o erro. Se o manipulador de erros do procedimento de chamada
também estiver ativo, o controle passará por procedimentos de chamada anteriores até
que um manipulador de erros habilitado, mas inativo, seja encontrado. Se nenhum
manipulador de erros for encontrado, o erro será fatal no ponto em que ele realmente
ocorreu.

Cada vez que o manipulador de erros passa o controle de volta para um procedimento
de chamada, esse procedimento se torna o procedimento atual. Depois que um erro é
tratado por um manipulador de erros em qualquer procedimento, a execução é
retomada no procedimento atual no ponto designado pela instrução Resume .

7 Observação

Uma rotina de tratamento de erros não é um procedimento Sub nem um


procedimento Function . É uma seção de código marcada por um rótulo de linha
ou um número de linha.

Propriedade number
As rotinas de tratamento de erros dependem do valor na propriedade Number do objeto
Err para determinar a causa do erro. A rotina deve testar ou salvar valores de
propriedade relevantes no objeto Err antes que qualquer outro erro possa ocorrer ou
antes que um procedimento que possa causar um erro seja chamado. Os valores da
propriedade no objeto Err refletem apenas o erro mais recente. A mensagem de erro
associada a Err.Number está contida em Err.Description .

Instrução Throw
Um erro gerado com o método Err.Raise define a propriedade Exception como uma
instância recém-criada da classe Exception. Para dar suporte à criação de exceções de
tipos de exceção derivadas, há suporte para uma instrução Throw no idioma. Isso requer
um único parâmetro que é a instância de exceção a ser gerada. O seguinte exemplo
mostra como esses recursos podem ser usados com o suporte ao tratamento de
exceções existente:

VB

On Error GoTo Handler

Throw New DivideByZeroException()

Handler:

If (TypeOf Err.GetException() Is DivideByZeroException) Then

' Code for handling the error is entered here.

End If

Observe que a instrução On Error GoTo intercepta todos os erros, independentemente


da classe de exceção.

On Error Resume Next


On Error Resume Next faz com que a execução continue com a instrução imediatamente

após a instrução que causou o erro em tempo de execução ou com a instrução


imediatamente após a chamada mais recente do procedimento que contém a instrução
On Error Resume Next . Essa instrução permite que a execução continue apesar de um

erro em tempo de execução. Você pode colocar a rotina de tratamento de erros onde o
erro ocorreria em vez de transferir o controle para outro local dentro do procedimento.
Uma instrução On Error Resume Next fica inativa quando outro procedimento é
chamado, portanto, você deverá executar uma instrução On Error Resume Next em cada
rotina chamada se desejar tratamento de erro embutido dentro dessa rotina.

7 Observação

O constructo On Error Resume Next pode ser preferível a On Error GoTo ao


manipular erros gerados durante o acesso a outros objetos. Verificar Err após cada
interação com um objeto remove a ambiguidade sobre qual objeto foi acessado
pelo código. Você pode ter certeza de qual objeto colocou o código de erro em
Err.Number , bem como de qual objeto originalmente gerou o erro (o objeto
especificado em Err.Source ).

On Error GoTo 0
On Error GoTo 0 desabilita o tratamento de erros no procedimento atual. Ele não

especifica a linha 0 como o início do código de tratamento de erros, mesmo que o


procedimento contenha uma linha numerada 0. Sem uma instrução On Error GoTo 0 ,
um manipulador de erros é desabilitado automaticamente quando um procedimento é
encerrado.

On Error GoTo -1
On Error GoTo -1 desabilita a exceção no procedimento atual. Ele não especifica a linha
-1 como o início do código de tratamento de erros, mesmo que o procedimento
contenha uma linha numerada -1. Sem uma instrução On Error GoTo -1 , uma exceção é
desabilitada automaticamente quando um procedimento é encerrado.

Para impedir que o código de tratamento de erros seja executado quando nenhum erro
tiver ocorrido, coloque uma instrução Exit Sub , Exit Function ou Exit Property
imediatamente antes da rotina de tratamento de erros, como no seguinte fragmento:

VB

Public Sub InitializeMatrix(ByVal Var1 As Object, ByVal Var2 As Object)

On Error GoTo ErrorHandler

' Insert code that might generate an error here

Exit Sub

ErrorHandler:

' Insert code to handle the error here

Resume Next

End Sub

Aqui, o código de tratamento de erros segue a instrução Exit Sub e precede a instrução
End Sub para separá-la do fluxo de procedimento. Você pode colocar o código de
tratamento de erros em qualquer lugar em um procedimento.

Erros não mapeados


Erros não mapeados em objetos são retornados ao aplicativo controlador quando o
objeto está em execução como um arquivo executável. No ambiente de
desenvolvimento, os erros não mapeados são retornados ao aplicativo controlador
somente se as opções adequadas forem definidas. Consulte a documentação do
aplicativo host para obter uma descrição de quais opções devem ser definidas durante a
depuração, como defini-las e se o host pode criar classes.

Se você criar um objeto que acesse outros objetos, tente manipular os erros não
tratados que eles passarem de volta. Se não puder, mapeie os códigos de erro em
Err.Number para um dos próprios erros e passe-os de volta para o chamador do objeto.

Especifique o erro adicionando o código de erro à constante VbObjectError . Por


exemplo, se o código de erro for 1052, atribua-o da seguinte maneira:

VB

Err.Number = vbObjectError + 1052

U Cuidado

Os erros do sistema durante as chamadas para DLLs (bibliotecas de vínculo


dinâmico) do Windows não geram exceções e não podem ser capturados com a
captura de erro do Visual Basic. Ao chamar funções DLL, você deve verificar cada
valor retornado para obter êxito ou falha (de acordo com as especificações da API)
e, em caso de falha, verifique o valor na propriedade Err do objeto LastDLLError .

Exemplo
Este exemplo primeiro usa a instrução On Error GoTo para especificar o local de uma
rotina de tratamento de erros dentro de um procedimento. No exemplo, uma tentativa
de dividir por zero gera o erro número 6. O erro é tratado na rotina de tratamento de
erros e o controle é retornado para a instrução que causou o erro. A instrução On Error
GoTo 0 desativa a captura de erro. Em seguida, a instrução On Error Resume Next é
usada para adiar a captura de erros para que o contexto do erro gerado pela próxima
instrução possa ser conhecido com certeza. Observe que Err.Clear é usado para limpar
as propriedades do objeto Err depois que o erro é tratado.

VB

Public Sub OnErrorDemo()

On Error GoTo ErrorHandler ' Enable error-handling routine.

Dim x As Integer = 32

Dim y As Integer = 0

Dim z As Integer

z = x / y ' Creates a divide by zero error

On Error GoTo 0 ' Turn off error trapping.

On Error Resume Next ' Defer error trapping.

z = x / y ' Creates a divide by zero error again

If Err.Number = 6 Then

' Tell user what happened. Then clear the Err object.

Dim Msg As String

Msg = "There was an error attempting to divide by zero!"

MsgBox(Msg, , "Divide by zero error")

Err.Clear() ' Clear Err object fields.

End If

Exit Sub ' Exit to avoid handler.

ErrorHandler: ' Error-handling routine.

Select Case Err.Number ' Evaluate error number.

Case 6 ' Divide by zero error

MsgBox("You attempted to divide by zero!")

' Insert code to handle this error

Case Else

' Insert code to handle other situations here...

End Select

Resume Next ' Resume execution at the statement immediately

' following the statement where the error occurred.

End Sub

Requisitos
Namespace:Microsoft.VisualBasic

Assembly: Biblioteca de Tempo de Execução do Visual Basic (em


Microsoft.VisualBasic.dll)

Confira também
Err
Number
Description
LastDllError
Instrução End
Instrução Exit
Instrução Resume
Mensagens de Erro
Instrução Try...Catch...Finally
Instrução Operator
Artigo • 07/04/2023 • 5 minutos para o fim da leitura

Declara o símbolo do operador, operandos e código que definem um procedimento de


operador em uma classe ou estrutura.

Sintaxe
VB

[ <attrlist> ] Public [ Overloads ] Shared [ Shadows ] [ Widening |


Narrowing ]

Operator operatorsymbol ( operand1 [, operand2 ]) [ As [ <attrlist> ] type ]

[ statements ]

[ statements ]

Return returnvalue

[ statements ]

End Operator

Partes
attrlist

Opcional. Confira Lista de atributos.

Public

Obrigatórios. Indica que esse procedimento de operador tem acesso Público.

Overloads

Opcional. Confira Sobrecargas.

Shared

Obrigatórios. Indica que esse procedimento de operador é um procedimento


compartilhado.

Shadows

Opcional. Confira Sombras.

Widening

Necessário para um operador de conversão, a menos que você especifique Narrowing .


Indica que esse procedimento de operador define uma conversão de expansão.
Consulte "Conversões de Expansão e Restrição" nesta página de Ajuda.
Narrowing

Necessário para um operador de conversão, a menos que você especifique Widening .


Indica que esse procedimento de operador define uma conversão de restrição. Consulte
"Conversões de Expansão e Restrição" nesta página de Ajuda.

operatorsymbol

Obrigatórios. O símbolo ou identificador do operador definido por este procedimento


de operador.

operand1

Obrigatórios. O nome e o tipo do operando único de um operador unário (incluindo um


operador de conversão) ou o operando esquerdo de um operador binário.

operand2

Necessário para operadores binários. O nome e o tipo do operando direito de um


operador binário.

operand1 e operand2 têm a sintaxe e blocos a seguir:

[ ByVal ] operandname [ As operandtype ]

Parte Descrição

ByVal Opcional, mas o mecanismo de passagem deve ser ByVal.

operandname Obrigatórios. Nome da variável que representa esse operando. Confira Nomes de
elementos declarados.

operandtype Opcional a menos que Option Strict seja On . Tipo de dados desse operando.

type

Opcional a menos que Option Strict seja On . Tipo de dados do valor que o
procedimento do operador retorna.

statements

Opcional. Bloco de instruções que o procedimento do operador executa.

returnvalue

Obrigatórios. O valor que o procedimento do operador retorna para o código de


chamada.

End Operator

Obrigatórios. Termina a definição deste procedimento de operador.


Comentários
Você só pode usar Operator em uma classe ou estrutura. Isso significa que o contexto de
declaração para um operador não pode ser um arquivo de origem, namespace, módulo,
interface, procedimento ou bloco. Para obter mais informações, consulte Contextos de
declaração e níveis de acesso padrão.

Todos os operadores devem ser Public Shared . Você não pode especificar ByRef ,
Optional ou ParamArray para qualquer operando.

Não é possível usar o símbolo ou o identificador do operador para manter um valor


retornado. Você deve usar a instrução Return e ela deve especificar um valor. Qualquer
número de instruções Return pode aparecer em qualquer lugar do procedimento.

Definir um operador dessa forma é chamado de sobrecarga de operador, se você usa ou


não a palavra-chave Overloads . A tabela a seguir lista os operadores que você pode
definir.

Tipo Operadores

Unário + , - , IsFalse , IsTrue , Not

Binário + , - , * , / , \ , & , ^ , >> , << , = , <> , > , >= , < , <= , And , Like , Mod , Or , Xor

Conversão (unário) CType

Observe que o operador = na lista binária é o operador de comparação, não de


atribuição.

Ao definir CType , você deve especificar um Widening ou Narrowing .

Pares correspondentes
Você deve definir determinados operadores como pares correspondentes. Se você
definir um operador desse par, também deverá definir o outro. Os pares
correspondentes são os seguintes:

= e <>

> e <

>= e <=

IsTrue e IsFalse
Restrições de tipo de dados
Cada operador definido deve envolver a classe ou a estrutura na qual você a define. Isso
significa que a classe ou estrutura deve aparecer como o tipo de dados do seguinte:

O operando de um operador unário.

Pelo menos um dos operandos de um operador binário.

O operando ou o tipo de retorno de um operador de conversão.

Determinados operadores têm restrições adicionais de tipo de dados, da seguinte


maneira:

Se você definir os operadores IsTrue e IsFalse , ambos deverão retornar o tipo


Boolean .

Se você definir os operadores << e >> , ambos deverão retornar o tipo Integer
para o operandtype de operand2 .

O tipo de retorno não precisa corresponder ao tipo de nenhum dos operandos. Por
exemplo, um operador de comparação como = ou <> pode retornar Boolean mesmo
que nenhum operando seja Boolean .

Operadores lógicos e bit a bit


Os operadores And , Or , Not e Xor podem executar operações lógicas ou bit a bit no
Visual Basic. No entanto, se você definir um desses operadores em uma classe ou
estrutura, poderá definir apenas a operação bit a bit.

Você não pode definir o operador AndAlso diretamente com uma instrução Operator .
No entanto, você poderá usar AndAlso se tiver cumprido as condições a seguir:

Você definiu And com os mesmos tipos de operando que deseja usar para
AndAlso .

Sua definição de And retorna o mesmo tipo que a classe ou estrutura na qual você
a definiu.

Você definiu o operador IsFalse na classe ou estrutura na qual você definiu And .

Da mesma forma, você pode usar OrElse se tiver definido Or nos mesmos operandos,
com o tipo de retorno da classe ou estrutura e tiver definido IsTrue na classe ou
estrutura.

Conversões de Widening e Narrowing


Uma conversão de expansão é sempre bem-sucedida em tempo de execução, enquanto
uma conversão de restrição pode falhar em tempo de execução. Para obter mais
informações, consulte Ampliando e restringindo conversões.

Se você declarar um procedimento de conversão como Widening , seu código de


procedimento não deverá gerar nenhuma falha. Isso significa o seguinte:

Ele sempre deve retornar um valor válido do tipo type .

Ele deve tratar todas as exceções possíveis e outras condições de erro.

Deve tratar qualquer erro retornado de todos os procedimentos que ele chama.

Se houver alguma possibilidade de um procedimento de conversão não ter êxito ou que


possa causar uma exceção sem tratamento, você deverá declarar que é Narrowing .

Exemplo
O exemplo de código a seguir usa a instrução Operator para definir o contorno de uma
estrutura que inclui procedimentos de operador para os operadores And , Or , IsFalse e
IsTrue . And e Or usam cada um dois operandos do tipo abc e tipo de retorno abc .
IsFalse e IsTrue usam cada um, um operando simples do tipo abc e tipo de retorno

Boolean . Essas definições permitem que o código de chamada use And , AndAlso , Or e
OrElse com operandos do tipo abc .

VB

Public Structure abc

Dim d As Date

Public Shared Operator And(ByVal x As abc, ByVal y As abc) As abc

Dim r As New abc

' Insert code to calculate And of x and y.

Return r

End Operator

Public Shared Operator Or(ByVal x As abc, ByVal y As abc) As abc

Dim r As New abc

' Insert code to calculate Or of x and y.

Return r

End Operator

Public Shared Operator IsFalse(ByVal z As abc) As Boolean

Dim b As Boolean

' Insert code to calculate IsFalse of z.

Return b

End Operator

Public Shared Operator IsTrue(ByVal z As abc) As Boolean

Dim b As Boolean

' Insert code to calculate IsTrue of z.

Return b

End Operator

End Structure

Confira também
Operador IsFalse
Operador IsTrue
Widening
Narrowing
Conversões de Widening e Narrowing
Procedimentos do operador
Como definir um operador
Como definir um operador de conversão
Como chamar um procedimento de operador
Como usar uma classe que define operadores
Instrução Option <keyword>
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Apresenta uma declaração que especifica uma opção de compilador que se aplica a
todo o arquivo de origem.

Comentários
As opções do compilador podem controlar se todas as variáveis devem ser declaradas
explicitamente, se as conversões de tipo de estreitamento devem ser explícitas ou se as
cadeias de caracteres devem ser comparadas como texto ou como quantidades binárias.

A palavra-chave Option pode ser usada nestes dois contextos:

Instrução Option Compare

Instrução Option Explicit

Instrução Option Infer

Instrução Option Strict

Confira também
Palavras-chave
Instrução Option Compare
Artigo • 28/11/2022 • 3 minutos para o fim da leitura

Declara o método padrão de comparação a ser usado ao comparar dados da cadeia de


caracteres.

Sintaxe
VB

Option Compare { Binary | Text }

Partes
Termo Definição

Binary Opcional. Resulta em comparações de cadeias de caracteres com base em uma ordem
de classificação derivada das representações binárias internas dos caracteres.

Esse tipo de comparação é útil principalmente se as cadeias de caracteres puderem


conter caracteres que não serão interpretados como texto. Nesse caso, você não deseja
ajustar comparações com equivalentes em ordem alfabética, como maiúsculas e
minúsculas.

Text Opcional. Resulta em comparações de cadeias de caracteres com base em uma ordem
de classificação de texto com diferenciação de maiúsculas de minúsculas determinada
pela localidade do sistema.

Esse tipo de comparação é útil se suas cadeias de caracteres tiverem todos os caracteres
de texto e você desejar compará-las levando em conta equivalências alfabéticas como
maiúsculas e minúsculas e letras relacionadas. Por exemplo, você pode desejar
considerar que A e a sejam iguais, e que Ä e ä venham antes de B e b .

Comentários
Se usado, a instrução Option Compare deve aparecer em um arquivo antes de quaisquer
outras instruções de código-fonte.

A instrução Option Compare especifica o método de comparação de cadeia de caracteres


( Binary ou Text ). O método de comparação de texto padrão é Binary .
A comparação Binary compara o valor de Unicode numérico de cada caractere em
cadeia de caracteres. A comparação Text compara cada caractere Unicode com base
em seu sentido lexical na cultura atual.

No Microsoft Windows, a ordem de classificação é determinada pela página de código.


Para obter mais informações, consulte Páginas de Código.

No exemplo a seguir, os caracteres na página de código Inglês/Europeu (ANSI 1252) são


classificados usando Option Compare Binary , que produz uma ordem de classificação
binária típica.

A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø

Quando os mesmos caracteres na mesma página de código são classificados usando


Option Compare Text , a ordem de classificação a seguir é produzida.

(A=a) < (À = à) < (B=b) < (E=e) < (Ê = ê) < (Z=z) < (Ø = ø)

Quando uma Instrução Option Compare Não


Está Presente
Se o código-fonte não contiver uma instrução Option Compare , será usada a
configuração de Option Compare em Compilar Página, Designer de Projeto (Visual
Basic). Se você usar o compilador de linha de comando, a configuração especificada
pela opção do compilador -optioncompare é usada.

7 Observação

Seu computador pode mostrar diferentes nomes ou locais para alguns dos
elementos de interface do usuário do Visual Studio nas instruções a seguir. A
edição do Visual Studio que você possui e as configurações que você usa
determinam esses elementos. Para obter mais informações, consulte
Personalizando o IDE.

Para definir o Option Compare no IDE


1. No Gerenciador de Soluções, selecione um projeto. No menu Projeto , clique em
Propriedades.

2. Clique na guia Compilar.


3. Defina o valor na caixa Option Compare.

Ao criar um novo projeto, a configuração Option Compare na guia Compilar é definida


para a configuração Option Compare na caixa de diálogo Opções. Para alterar essa
configuração, no menu Ferramentas, clique em Opções. Na caixa de diálogo Opções,
expanda Projetos e Soluções e, em seguida, clique em Padrões de VB. A configuração
inicial padrão nos Padrões de VB é Binária.

Para definir o Option Compare na linha de comando


Inclua a opção -optioncompare do compilador no comando vbc.

Exemplo 1
O exemplo a seguir usa a instrução Option Compare para definir a comparação binária
como o método padrão de comparação de cadeia de caracteres. Para usar esse código,
retire os comentários da instrução Option Compare Binary e coloque-os na parte
superior do arquivo de origem.

VB

' Option Compare Binary

Console.WriteLine("A" < "a")

' Output: True

Exemplo 2
O exemplo a seguir usa a instrução Option Compare para definir a ordem de classificação
sem diferenciação de maiúsculas de minúsculas como o método padrão de comparação
de cadeia de caracteres. Para usar esse código, retire os comentários da instrução
Option Compare Text e coloque-os na parte superior do arquivo de origem.

VB

' Option Compare Text

Console.WriteLine("A" = "a")

' Output: True

Confira também
InStr
InStrRev
Replace
Split
StrComp
-optioncompare
Operadores de comparação
Operadores de comparação no Visual Basic
Operador Like
Funções de cadeia de caracteres
Instrução Option Explicit
Instrução Option Strict
Instrução Option Explicit (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Força a declaração explícita de todas as variáveis em um arquivo ou permite declarações


implícitas de variáveis.

Sintaxe
VB

Option Explicit { On | Off }

Partes
On

Opcional. Habilita a verificação Option Explicit . Se On ou Off não for especificado, o


padrão será On .

Off

Opcional. Desabilita a verificação de Option Explicit .

Comentários
Quando Option Explicit On ou Option Explicit aparece em um arquivo, você precisa
declarar explicitamente todas as variáveis usando a instrução Dim ou ReDim . Se você
tentar usar um nome de variável não declarado, ocorrerá um erro em tempo de
compilação. A instrução Option Explicit Off permite a declaração implícita de
variáveis.

Se usado, a instrução Option Explicit deve aparecer em um arquivo antes de


quaisquer outras instruções de código-fonte.

7 Observação

Configurar Option Explicit como Off geralmente não é uma boa prática. Você
poderia digitar incorretamente um nome de variável em um ou mais locais, o que
levaria a resultados inesperados na execução do programa.
Quando uma instrução Option Explicit não está
presente
Se o código-fonte não contiver uma instrução Option Explicit , será usada a
configuração de Option Explicit em Compilar Página, Designer de Projeto (Visual Basic).
Se for usado o compilador de linha de comando, será usada a opção do compilador -
optionexplicit.

Para definir Option Explicit no IDE

1. No Gerenciador de Soluções, selecione um projeto. No menu Projeto , clique em


Propriedades.

2. Clique na guia Compilar.

3. Defina o valor na caixa Option Explicit.

Quando você cria um novo projeto, a configuração de Option Explicit na guia Compilar
é definida para a configuração de Option Explicit na caixa de diálogo Padrões do VB.
Para acessar a caixa de diálogo Padrões do VB, no menu Ferramentas, clique em
Opções. Na caixa de diálogo Opções, expanda Projetos e Soluções e, em seguida,
clique em Padrões de VB. A configuração inicial padrão nos Padrões do VB é On .

Para definir Option Explicit na linha de comando

Inclua a opção -optionexplicit do compilador no comando vbc.

Exemplo
O exemplo a seguir usa a instrução Option Explicit para forçar a declaração explícita
de todas as variáveis. Tentar usar uma variável não declarada causa um erro em tempo
de compilação.

VB

' Force explicit variable declaration.

Option Explicit On

VB

Dim thisVar As Integer

thisVar = 10

' The following assignment produces a COMPILER ERROR because

' the variable is not declared and Option Explicit is On.

thisInt = 10 ' causes ERROR

Confira também
Instrução Dim
Instrução ReDim
Instrução Option Compare
Instrução Option Strict
-optioncompare
-optionexplicit
-optionstrict
Caixa de diálogo Padrões do Visual Basic, Projetos, Opções
Instrução Option Infer
Artigo • 28/11/2022 • 4 minutos para o fim da leitura

Permite o uso de inferência de tipo local ao declarar variáveis.

Sintaxe
VB

Option Infer { On | Off }

Partes
Termo Definição

On Opcional. Permite inferência de tipo local.

Off Opcional. Desabilita inferência de tipo local.

Comentários
Para definir Option Infer em um arquivo, digite Option Infer On ou Option Infer Off
na parte superior do arquivo, antes de qualquer outro código-fonte. Se o valor definido
para Option Infer em um arquivo entrar em conflito com o valor definido no IDE ou na
linha de comando, o valor no arquivo possui precedência.

Quando você define Option Infer para On , você pode declarar variáveis locais sem
especificar explicitamente um tipo de dados. O compilador infere o tipo de dados de
uma variável do tipo de sua expressão de inicialização.

Na ilustração a seguir, Option Infer está ativado. A variável na declaração Dim someVar
= 2 é declarada como um inteiro por inferência de tipo.

A captura de tela a seguir mostra o IntelliSense quando a instrução Option Infer está
ativada:
Na ilustração a seguir, o Option Infer está desativado. A variável na declaração Dim
someVar = 2 é declarada como um Object por inferência de tipo. Neste exemplo, a

configuração de Option Strict está definida como Desativada em Compilar Página,


Designer de Projeto (Visual Basic).

A captura de tela a seguir mostra o IntelliSense quando a instrução Option Infer está
desativada:

7 Observação

Quando uma variável é declarada como um Object , o tipo de tempo de execução


pode ser alterado enquanto o programa está sendo executado. O Visual Basic
executa operações denominadas boxing e unboxing para converter entre um
Object e um tipo de valor, o que torna a execução mais lenta. Para obter

informações sobre boxing e unboxing, consulte a Especificação de Linguagem do


Visual Basic.

A inferência de tipo aplica-se no nível do procedimento e não fora de um procedimento


em uma classe, estrutura, módulo ou interface.

Para obter mais informações, consulte Inferência de tipo local.

Quando uma Instrução Option Infer Não Está


Presente
Se o código-fonte não contiver uma instrução Option Infer , será usada a configuração
de Option Infer em Compilar Página, Designer de Projeto (Visual Basic). Se for usado o
compilador de linha de comando, será usada a opção do compilador -optioninfer.

Para definir o Option Infer no IDE


1. No Gerenciador de Soluções, selecione um projeto. No menu Projeto , clique em
Propriedades.

2. Clique na guia Compilar.

3. Defina o valor na caixa Option infer.

Quando você cria um novo projeto, a configuração de Option Infer na guia Compilar é
definida para a configuração de Option Infer na caixa de diálogo Padrões do VB. Para
acessar a caixa de diálogo Padrões de VB, no menu Ferramentas, clique em Opções. Na
caixa de diálogo Opções, expanda Projetos e Soluções e, em seguida, clique em
Padrões de VB. A configuração inicial padrão nos Padrões de VB é On .

Para definir o Option Infer na linha de comando

Inclua a opção -optioninfer do compilador no comando vbc.

Tipos de Dados e Valores Padrão


A tabela a seguir descreve os resultados de várias combinações de especificar o tipo de
dados e o inicializador em uma instrução Dim .

Tipo de Inicializador Exemplo Result


dados especificado?
especificado?

Não No Dim qty Se o Option Strict estiver desativado (padrão), a


variável é definida como Nothing .

Se Option Strict estiver ativado, ocorre um erro de


tempo de compilação.
Tipo de Inicializador Exemplo Result
dados especificado?
especificado?

No Yes Dim qty Se Option Infer estiver ativado (padrão), a variável


= 5 usa o tipo de dados do inicializador. Consulte
Inferência de tipo local.

Se Option Infer estiver desativado e Option Strict


estiver desativado, a variável usa o tipo de dados do
Object .

Se Option Infer estiver desativado e Option Strict


estiver ativado, ocorre um erro de tempo de
compilação.

Sim Não Dim qty A variável é inicializada para o valor padrão para o
As tipo de dados. Para obter mais informações,
Integer consulte Instrução Dim.

Sim Yes Dim qty Se o tipo de dados do inicializador não for


As conversível para o tipo de dados especificado,
Integer ocorrerá um erro de tempo de compilação.
= 5

Exemplo 1
Os exemplos a seguir demonstram como a instrução Option Infer habilita a inferência
de tipo local.

VB

' Enable Option Infer before trying these examples.

' Variable num is an Integer.

Dim num = 5

' Variable dbl is a Double.

Dim dbl = 4.113

' Variable str is a String.

Dim str = "abc"

' Variable pList is an array of Process objects.

Dim pList = Process.GetProcesses()

' Variable i is an Integer.

For i = 1 To 10

Console.WriteLine(i)

Next

' Variable item is a string.

Dim lst As New List(Of String) From {"abc", "def", "ghi"}

For Each item In lst

Console.WriteLine(item)

Next

' Variable namedCust is an instance of the Customer class.

Dim namedCust = New Customer With {.Name = "Blue Yonder Airlines",

.City = "Snoqualmie"}

' Variable product is an instance of an anonymous type.

Dim product = New With {Key .Name = "paperclips", .Price = 1.29}

' If customers is a collection of Customer objects in the following

' query, the inferred type of cust is Customer, and the inferred type

' of custs is IEnumerable(Of Customer).

Dim custs = From cust In customers

Where cust.City = "Seattle"

Select cust.Name, cust.ID

Exemplo 2
O exemplo a seguir demonstra o tipo de tempo de execução pode ser diferente quando
uma variável é identificada como um Object .

VB

' Disable Option Infer when trying this example.

Dim someVar = 5

Console.WriteLine(someVar.GetType.ToString)

' If Option Infer is instead enabled, the following

' statement causes a run-time error. This is because

' someVar was implicitly defined as an integer.

someVar = "abc"

Console.WriteLine(someVar.GetType.ToString)

' Output:

' System.Int32

' System.String

Confira também
Instrução Dim
Inferência de Tipo de Variável Local
Instrução Option Compare
Instrução Option Explicit
Instrução Option Strict
Caixa de diálogo Padrões do Visual Basic, Projetos, Opções
-optioninfer
Conversão boxing e unboxing
Instrução Option Strict
Artigo • 28/11/2022 • 9 minutos para o fim da leitura

Restringe as conversões de tipo de dados implícitas a somente conversões de expansão,


não permite associação tardia e não permite digitação implícita que resulte em um tipo
Object .

Sintaxe
VB

Option Strict { On | Off }

Partes
Termo Definição

On Opcional. Habilita a verificação de Option Strict .

Off Opcional. Desabilita a verificação de Option Strict .

Comentários
Quando Option Strict On ou Option Strict aparece em um arquivo, as seguintes
condições causam um erro em tempo de compilação:

Conversões de estreitamento implícitas

Associação tardia

Digitação implícita que resulta em um tipo Object

7 Observação

Nas configurações de aviso que você pode definir na Página Compilar, Designer
de Projeto (Visual Basic), existem três configurações que correspondem às três
condições que causam um erro em tempo de compilação. Para obter informações
sobre como usar essas configurações, confira Para definir configurações de aviso
no IDE mais adiante neste tópico.
A instrução Option Strict Off desativa a verificação de erros e avisos das três
condições, mesmo que as configurações associadas do IDE especifiquem para ativar
esses erros ou avisos. A instrução Option Strict On ativa a verificação de erros e avisos
das três condições, mesmo que as configurações associadas do IDE especifiquem para
desativar esses erros ou avisos.

Se usada, a instrução Option Strict deve ser exibida antes de quaisquer outras
instruções de código em um arquivo.

Quando você define Option Strict como On , o Visual Basic verifica se os tipos de
dados foram especificados para todos os elementos de programação. Os tipos de dados
podem ser especificados explicitamente ou usando a inferência de tipo de variável local.
É recomendável especificar os tipos de dados para todos os elementos de programação
pelos seguintes motivos:

Habilita o suporte do IntelliSense para as variáveis e os parâmetros. Permite que


você veja as propriedades e outros membros ao digitar o código.

Permite que o compilador execute a verificação de tipo. A verificação de tipo ajuda


a encontrar as instruções que podem falhar no tempo de execução, devido a erros
de conversão de tipo. Também identifica as chamadas a métodos nos objetos que
não são compatíveis com esses métodos.

Acelera a execução do código. Isso ocorre porque, se você não especificar um tipo
de dados para um elemento de programação, o compilador do Visual Basic
atribuirá a ele o tipo Object . O código compilado pode ter que alternar a
conversão entre Object e outros tipos de dados, o que reduz o desempenho.

Erros de Conversão de Restrição Implícita


Erros de conversão de redução implícita ocorrerem quando há uma conversão de tipo
de dados implícita que é uma conversão de redução.

O Visual Basic pode converter muitos tipos de dados em outros tipos de dados. Pode
ocorrer uma perda de dados, quando o valor de um tipo de dados é convertido em um
tipo de dados com menos precisão ou com menor capacidade. Ocorrerá um erro em
tempo de execução, se essa conversão de restrição falhar. Option Strict garante a
notificação do tempo de compilação dessas conversões de restrição para que você
possa evitá-las. Para obter mais informações, confira Conversões Implícitas e Explícitas e
Conversões de Expansão e de Restrição.
As conversões que podem causar erros incluem as conversões implícitas que ocorrem
nas expressões. Para obter mais informações, consulte estes tópicos:

Operador +

Operador +=

Operador \ (Visual Basic)

Operador /= (Visual Basic)

Tipo de Dados de Caractere

Quando você concatena as cadeias de caracteres usando o Operador &, todas as


conversões nas cadeias de caracteres são consideradas de expansão. Portanto, essas
conversões não geram um erro de conversão de restrição implícita, mesmo que Option
Strict esteja ativado.

Quando você chama um método que tem um argumento com um tipo de dados
diferente do parâmetro correspondente, uma conversão de restrição causa um erro em
tempo de compilação, se Option Strict estiver ativado. Você pode evitar o erro em
tempo de compilação, usando uma conversão de expansão ou uma conversão explícita.

Os erros de conversão de restrição implícita são suprimidos em tempo de compilação


para conversões dos elementos em uma coleção de For Each…Next para a variável de
controle de loop. Isso ocorre mesmo que Option Strict esteja ativado. Para obter mais
informações, confira a seção "Conversões de Restrição" em Para cada... Próxima
instrução.

Erros de Associação Tardia


Um objeto tem associação tardia quando é atribuído a uma propriedade ou a um
método de uma variável declarada como sendo do tipo Object . Para obter mais
informações, confira Associação Antecipada e Tardia.

Erros de Tipo de Objeto Implícito


Erros de tipo de objeto implícitos ocorrem quando um tipo apropriado não pode ser
inferido de uma variável declarada, portanto, um tipo de Object é inferido. Isso ocorre
principalmente quando você usa uma instrução Dim para declarar uma variável sem usar
uma cláusula As e Option Infer está desativado. Para obter mais informações, confira
Instrução Option Infer e a Especificação de Linguagem do Visual Basic.
Para parâmetros de método, a cláusula As será opcional se Option Strict estiver
desativado. No entanto, se qualquer parâmetro usar uma cláusula As , todos deverão
usá-la. Se Option Strict estiver ativado, a cláusula As será necessária para cada
definição de parâmetro.

Se você declarar uma variável sem usar uma cláusula As e defini-la como Nothing , a
variável terá um tipo de Object . Nenhum erro em tempo de compilação ocorre nesse
caso, quando Option Strict está ativado e Option Infer está ativado. Um exemplo
disso é o Dim something = Nothing .

Tipos de Dados e Valores Padrão


A tabela a seguir descreve os resultados de várias combinações da especificação do tipo
de dados e do inicializador em uma Instrução Dim.

Tipo de Inicializador Exemplo Result


dados especificado?
especificado?

Não Não Dim qty Se o Option Strict estiver desativado (padrão), a


variável é definida como Nothing .

Se Option Strict estiver ativado, ocorre um erro de


tempo de compilação.

No Yes Dim qty Se Option Infer estiver ativado (padrão), a variável


= 5 usa o tipo de dados do inicializador. Confira
Inferência de tipo de variável local.

Se Option Infer estiver desativado e Option Strict


estiver desativado, a variável usa o tipo de dados do
Object .

Se Option Infer estiver desativado e Option Strict


estiver ativado, ocorre um erro de tempo de
compilação.

Sim Não Dim qty A variável é inicializada para o valor padrão para o
As tipo de dados. Para obter mais informações, confira
Integer Instrução Dim.

Yes Sim Dim qty Se o tipo de dados do inicializador não for


As conversível para o tipo de dados especificado,
Integer ocorrerá um erro de tempo de compilação.
= 5
Quando uma Instrução Option Strict não está
presente
Se o código-fonte não contiver uma instrução Option Strict , será usada a configuração
de Option Strict em Compilar Página, Designer de Projeto (Visual Basic). A Página
Compilar tem as configurações que fornecem controle adicional sobre as condições que
geram um erro.

Se você estiver usando o compilador de linha de comando, pode usar a opção do


compilador -optionstrict para especificar uma configuração para Option Strict .

Para definir Option Strict no IDE

7 Observação

Seu computador pode mostrar diferentes nomes ou locais para alguns dos
elementos de interface do usuário do Visual Studio nas instruções a seguir. A
edição do Visual Studio que você possui e as configurações que você usa
determinam esses elementos. Para obter mais informações, consulte
Personalizando o IDE.

1. No Gerenciador de Soluções, selecione um projeto. No menu Projeto , clique em


Propriedades.

2. Na guia Compilar, modifique o valor na caixa Option Strict.

Para definir configurações de aviso no IDE


Quando você usa a Página Compilar, Designer de Projeto (Visual Basic), em vez de uma
instrução Option Strict , você tem controle adicional sobre as condições que geram
erros. A seção Configurações de aviso da Página Compilar tem as configurações que
correspondem às três condições que causam um erro em tempo de compilação, quando
Option Strict está ativado. A seguir estão estas configurações:

Conversão implícita

Associação tardia; a chamada poderia falhar no tempo de execução

Tipo implícito; objeto assumido


Quando você define Opção Estrita como Ativada, todas estas três definições de
configuração de aviso são definidas como Erro. Quando você define Opção Estrita
como Desativada, todas as três configurações são definidas como Nenhum.

Você pode alterar individualmente cada definição de configuração de aviso como


Nenhum, Aviso ou Erro. Se todas as três definições de configuração de aviso estiverem
definidas como Erro, On aparecerá na caixa Option strict . Se todas as três estiverem
definidas como Nenhum, Off será exibido nessa caixa. Para qualquer outra combinação
dessas configurações, (personalizado) será exibido.

Para definir a configuração padrão de Option Strict para


novos projetos
Ao criar um projeto, a configuração de Option Strict na guia Compilar é definida como
a configuração Option Strict na caixa de diálogo Opções.

Para definir Option Strict nesta caixa de diálogo, no menu Ferramentas, clique em
Opções. Na caixa de diálogo Opções, expanda Projetos e Soluções e, em seguida,
clique em Padrões de VB. A configuração inicial padrão nos Padrões do VB é Off .

Para definir Option Strict na linha de comando


Inclua a opção do compilador -optionstrict no comando vbc.

Exemplo 1
Os exemplos a seguir demonstram erros em tempo de compilação causados por
conversões de tipo implícito que restringem as conversões. Essa categoria de erros
corresponde à condição Conversão implícita na Página Compilar.

VB

' If Option Strict is on, this implicit narrowing

' conversion causes a compile-time error.

' The commented statements below use explicit

' conversions to avoid a compile-time error.

Dim cyclists As Long = 5

Dim bicycles As Integer = cyclists

'Dim bicycles As Integer = CType(cyclists, Integer)

'Dim bicycles As Integer = CInt(cyclists)

'Dim bicycles As Integer = Convert.ToInt32(cyclists)

' If Option Strict is on, this implicit narrowing

' conversion causes a compile-time error.

' The commented statements below use explicit

' conversions to avoid a compile-time error.

Dim charVal As Char = "a"

'Dim charVal As Char = "a"c

'Dim charVal As Char = CType("a", Char)

' If Option Strict is on, a compile-time error occurs.

' If Option Strict is off, the string is implicitly converted

' to a Double, and then is added to the other number.

Dim myAge As Integer = "34" + 6

' If Option Strict is on, a compile-time error occurs.

' If Option Strict is off, the floating-point number

' is implicitly converted to a Long.

Dim num = 123.45 \ 10

Exemplo 2
O exemplo a seguir demonstra um erro em tempo de compilação causado pela
associação tardia. Essa categoria de erros corresponde à condição Associação tardia; a
chamada pode falhar em tempo de execução na Página Compilar.

VB

' If Option Strict is on, this late binding

' causes a compile-time error. If Option Strict

' is off, the late binding instead causes a

' run-time error.

Dim punchCard As New Object

punchCard.Column = 5

Exemplo 3
Os exemplos a seguir demonstram os erros causados por variáveis declaradas com um
tipo implícito de Object . Essa categoria de erros corresponde à condição Conversão
implícita; objeto pressuposto na Página Compilar.

VB

' If Option Strict is on and Option Infer is off,

' this Dim statement without an As clause

' causes a compile-time error.

Dim cardReaders = 5

' If Option Strict is on, a compile-time error occurs.

' If Option Strict is off, the variable is set to Nothing.

Dim dryWall

VB

' If Option Strict is on, this parameter without an

' As clause causes a compile-time error.

Private Sub DetectIntergalacticRange(ByVal photonAttenuation)

End Sub

Confira também
Conversões de Widening e Narrowing
Conversões implícitas e explícitas
Página de Compilação, Designer de Projeto (Visual Basic)
Instrução Option Explicit
Funções de conversão do tipo
Como acessar membros de um objeto
Expressões inseridas no XML
Conversão de delegado reduzida
Associação tardia em soluções do Office
-optionstrict
Caixa de diálogo Padrões do Visual Basic, Projetos, Opções
Instrução Property
Artigo • 07/04/2023 • 6 minutos para o fim da leitura

Declara o nome de uma propriedade e os procedimentos de propriedade usados para


armazenar e recuperar o valor da propriedade.

Sintaxe
VB

[ <attributelist> ] [ Default ] [ accessmodifier ]

[ propertymodifiers ] [ Shared ] [ Shadows ] [ ReadOnly | WriteOnly ] [


Iterator ]

Property name ( [ parameterlist ] ) [ As returntype ] [ Implements


implementslist ]

[ <attributelist> ] [ accessmodifier ] Get

[ statements ]

End Get

[ <attributelist> ] [ accessmodifier ] Set ( ByVal value As returntype


[, parameterlist ] )

[ statements ]

End Set

End Property

- or -

[ <attributelist> ] [ Default ] [ accessmodifier ]

[ propertymodifiers ] [ Shared ] [ Shadows ] [ ReadOnly | WriteOnly ]

Property name ( [ parameterlist ] ) [ As returntype ] [ Implements


implementslist ]

Partes
attributelist

Opcional. Lista de atributos que se aplicam a essa propriedade ou procedimento


Get ou Set . Veja Lista de atributo.

Default

Opcional. Especifica que essa propriedade é a propriedade padrão para a classe ou


estrutura na qual ela está definida. As propriedades padrão devem aceitar
parâmetros, e podem ser definidas e recuperadas sem especificar o nome da
propriedade. Se você declarar a propriedade como Default , não poderá usar
Private na propriedade ou em qualquer um de seus procedimentos de

propriedade.
accessmodifier

Opcional na instrução Property e em no máximo uma das instruções Get e


instruções Set . Um dos seguintes pode ser feito:

Público

Protegido

Friend

Privado

Amigo Protegido

Particular Protegido

Consulte Níveis de acesso no Visual Basic.

propertymodifiers

Opcional. Um dos seguintes pode ser feito:

Sobrecargas

Substituições

Substituível

NotOverridable

MustOverride

MustOverride Overrides

NotOverridable Overrides

Shared

Opcional. Consulte Shared.

Shadows

Opcional. Confira Sombras.

ReadOnly

Opcional. Confira ReadOnly.


WriteOnly

Opcional. Consulte WriteOnly.

Iterator

Opcional. Consulte Iterator.

name

Obrigatórios. Nome da propriedade. Consulte Nomes de Elementos Declarados.

parameterlist

Opcional. Lista de nomes de variáveis locais que representam os parâmetros dessa


propriedade e possíveis parâmetros adicionais do procedimento Set . Consulte a
Lista de parâmetros.

returntype

Necessário se Option Strict for On . Tipo de dados do valor retornado por essa
propriedade.

Implements

Opcional. Indica que essa propriedade implementa uma ou mais propriedades,


cada uma definida em uma interface implementada pela classe ou estrutura que
contém essa propriedade. Consulte Instrução implementa.

implementslist

Necessário se Implements for fornecido. Lista de propriedades sendo


implementadas.

implementedproperty [ , implementedproperty ... ]

Cada implementedproperty tem a sintaxe e as partes a seguir:

interface.definedname

Parte Descrição

interface Obrigatórios. Nome de uma interface implementada pela classe ou estrutura


que contém essa propriedade.

definedname Obrigatórios. Nome pelo qual a propriedade é definida em interface .


Get

Opcional. Obrigatório se a propriedade estiver marcada ReadOnly . Inicia um


procedimento de propriedade Get usado para retornar o valor da propriedade. A
instrução Get não é usada com propriedades implementadas automaticamente.

statements

Opcional. Bloco de instruções a serem executadas no procedimento Get ou Set .

End Get

Encerra o procedimento de propriedade Get .

Set

Opcional. Obrigatório se a propriedade estiver marcada WriteOnly . Inicia um


procedimento de propriedade Set usado para retornar o valor da propriedade. A
instrução Set não é usada com propriedades implementadas automaticamente.

End Set

Encerra o procedimento de propriedade Set .

End Property

Encerra a definição desta propriedade.

Comentários
A instrução Property apresenta a declaração de uma propriedade. Uma propriedade
pode ter um procedimento Get (somente leitura), um procedimento Set (somente
gravação) ou ambos (leitura-gravação). Você pode omitir os procedimentos Get e Set
ao usar uma propriedade implementada automaticamente. Para obter mais
informações, consulte Propriedades autoimplementadas.

Você só pode usar Property no nível da classe. Isso significa que o contexto de
declaração de uma variável precisa ser uma classe, estrutura, módulo, procedimento ou
interface, e não pode ser um arquivo de origem, namespace, procedimento ou bloco.
Para obter mais informações, consulte Contextos de declaração e níveis de acesso
padrão.
Por padrão, as propriedades usam o acesso público. Você pode ajustar o nível de acesso
de uma propriedade com um modificador de acesso na instrução Property e,
opcionalmente, ajustar um dos procedimentos de propriedade a um nível de acesso
mais restritivo.

O Visual Basic passa um parâmetro para o procedimento Set durante as atribuições de


propriedade. Se você não fornecer um parâmetro para Set , o IDE (ambiente de
desenvolvimento integrado) usa um parâmetro implícito chamado value . Esse
parâmetro mantém o valor a ser atribuído à propriedade. Normalmente, você armazena
esse valor em uma variável local privada e o retorna sempre que o procedimento Get é
chamado.

Regras
Níveis de acesso mistos. Se você estiver definindo uma propriedade de
leitura/gravação, opcionalmente poderá especificar um nível de acesso diferente
para o procedimento Get ou o procedimento Set , mas não ambos. Se você fizer
isso, o nível de acesso ao procedimento deverá ser mais restritivo do que o nível
de acesso da propriedade. Por exemplo, se a propriedade for declarada Friend ,
você poderá declarar o procedimento Set Private , mas não Public .

Se você estiver definindo uma propriedade ReadOnly ou WriteOnly , o


procedimento de propriedade única ( Get ou Set , respectivamente) representa
toda a propriedade. Você não pode declarar um nível de acesso diferente para
esse procedimento, pois isso definiria dois níveis de acesso para a propriedade.

Tipo de retorno. A instrução Property pode declarar o tipo de dados do valor que
retorna. Você pode especificar qualquer tipo de dados ou o nome de uma
enumeração, estrutura, classe ou interface.

Se você não especificar returntype , a propriedade retornará Object .

Implementação. Se essa propriedade usar a palavra-chave Implements , a classe ou


estrutura que a contém deverá ter uma instrução Implements imediatamente após
a instrução Class ou Structure . A instrução Implements deve incluir cada interface
especificada em implementslist . No entanto, o nome pelo qual uma interface
define o Property (em definedname ) não precisa ser o mesmo nome dessa
propriedade (em name ).

Comportamento
Retorno de um procedimento de propriedade. Quando o procedimento Get ou
Set retorna ao código de chamada, a execução continua com a instrução após a
instrução que a invocou.

As instruções Exit Property e Return causam uma saída imediata de um


procedimento de propriedade. Qualquer número de instruções Exit Property e
Return podem aparecer em qualquer lugar no procedimento, e você pode

misturar instruções Exit Property e Return .

Valor de retorno. Para retornar um valor de um procedimento Get , você pode


atribuir o valor ao nome da propriedade ou incluí-lo em uma instrução Return . O
exemplo a seguir atribui o valor retornado ao nome da propriedade
quoteForTheDay e, em seguida, usa a instrução Exit Property a ser retornada.

VB

Private quoteValue As String = "No quote assigned yet."

VB

ReadOnly Property QuoteForTheDay() As String

Get

QuoteForTheDay = quoteValue

Exit Property

End Get

End Property

Se você usar Exit Property sem atribuir um valor a name , o procedimento Get
retornará o valor padrão para o tipo de dados da propriedade.

Ao mesmo tempo, a instrução Return atribui o valor de retorno do procedimento


Get e sai do procedimento. O exemplo a seguir mostra a isso.

VB

Private quoteValue As String = "No quote assigned yet."

VB

ReadOnly Property QuoteForTheDay() As String

Get

Return quoteValue

End Get

End Property

Exemplo
O exemplo a seguir declara uma propriedade em uma classe.

VB

Class Class1

' Define a local variable to store the property value.

Private propertyValue As String

' Define the property.

Public Property Prop1() As String

Get

' The Get property procedure is called when the value

' of a property is retrieved.

Return propertyValue

End Get

Set(ByVal value As String)

' The Set property procedure is called when the value

' of a property is modified. The value to be assigned


' is passed in the argument to Set.

propertyValue = value
End Set

End Property

End Class

Confira também
Propriedades autoimplementadas
Objetos e Classes
Instrução Get
Instrução Set
Lista de parâmetros
Default
Instruções Q-Z
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A tabela a seguir contém uma lista de instruções de linguagem do Visual Basic.

RaiseEvent

ReDim

REM

RemoveHandler

Retomar

Return

Select...Case

Configurar

Parar

Estrutura

Sub

SyncLock

Então

Throw

Try...Catch...Finally

Using

While...End While

With...End With

Yield

Confira também
Instruções A-E
Instruções F-P
Referência da linguagem Visual Basic
Instrução RaiseEvent
Artigo • 07/04/2023 • 4 minutos para o fim da leitura

Dispara um evento declarado no nível do módulo dentro de uma classe, formulário ou


documento.

Sintaxe
VB

RaiseEvent eventname[( argumentlist )]

Partes
eventname

Obrigatórios. O nome do evento a ser disparado.

argumentlist

Opcional. Lista delimitada por vírgulas de variáveis, matrizes ou expressões. O


argumento argumentlist deve ser delimitado por parênteses. Se não houver nenhum
argumento, os parênteses serão omitidos.

Comentários
O eventname necessário é o nome de um evento declarado dentro do módulo. Ele segue
as convenções de nomenclatura de variáveis do Visual Basic.

Se o evento não tiver sido declarado dentro do módulo no qual ele é acionado, ocorrerá
um erro. O fragmento de código a seguir ilustra uma declaração de evento e um
procedimento no qual o evento é acionado.

VB

' Declare an event at module level.

Event LogonCompleted(ByVal UserName As String)

Sub Logon(ByVal UserName As String)

' Raise the event.

RaiseEvent LogonCompleted(UserName)

End Sub

Você não pode usar RaiseEvent para acionar eventos que não são declarados
explicitamente no módulo. Por exemplo, todos os formulários herdam um evento Click
do System.Windows.Forms.Form; ele não pode ser acionado usando RaiseEvent em
uma forma derivada. Se você declarar um evento Click no módulo de formulário, ele
sombreará o próprio evento Click do formulário. Você ainda pode invocar o evento Click
do formulário chamando o método OnClick.

Por padrão, um evento definido no Visual Basic aciona seus manipuladores de eventos
na ordem em que as conexões são estabelecidas. Como os eventos podem ter
parâmetros ByRef , um processo que se conecta tardiamente pode receber parâmetros
que foram alterados por um manipulador de eventos anterior. Após a execução dos
manipuladores de eventos, o controle retorna para a sub-rotina que acionou o evento.

7 Observação

Eventos não compartilhados não devem ser acionados dentro do construtor da


classe em que são declarados. Embora esses eventos não causem erros em tempo
de execução, eles podem não ser capturados por manipuladores de eventos
associados. Use o modificador Shared para criar um evento compartilhado se
precisar acionar um evento de um construtor.

7 Observação

Você pode alterar o comportamento padrão dos eventos definindo um evento


personalizado. Para eventos personalizados, a instrução RaiseEvent invoca o
acessador do evento RaiseEvent . Para obter mais informações sobre eventos
personalizados, confira Instrução de evento.

Exemplo 1
O exemplo a seguir usa eventos para contagem regressiva de segundos de 10 para 0. O
código ilustra vários métodos, propriedades e instruções relacionados a evento,
incluindo a instrução RaiseEvent .

A classe que aciona um evento é a origem do evento, e os métodos que processam o


evento são os manipuladores de eventos. Uma origem do evento pode ter vários
manipuladores para os eventos gerados. Quando a classe aciona o evento, esse evento
é gerado em cada classe que optou por tratar eventos para essa instância do objeto.
O exemplo também usa um formulário ( Form1 ) com um botão ( Button1 ) e uma caixa de
texto ( TextBox1 ). Quando você clica no botão, a primeira caixa de texto exibe uma
contagem regressiva de 10 para 0 segundos. Quando o tempo integral (10 segundos)
tiver decorrido, a primeira caixa de texto exibirá "Concluído".

O código para Form1 especifica os estados iniciais e terminais do formulário. Ele


também contém o código executado quando os eventos são acionados.

Para usar este exemplo, abra um novo projeto de Aplicativo do Windows, adicione um
botão nomeado Button1 e uma caixa de texto nomeada TextBox1 ao formulário
principal, chamado Form1 . Em seguida, clique com o botão direito do mouse no
formulário e clique em Exibir Código para abrir o editor de código.

Adicione uma variável WithEvents à seção declarações da classe Form1 .

VB

Private WithEvents mText As TimerState

Exemplo 2
Adicione o código a seguir ao código de Form1 . Substitua todos os procedimentos
duplicados que possam existir, como Form_Load ou Button_Click .

VB

Private Sub Form1_Load() Handles MyBase.Load

Button1.Text = "Start"

mText = New TimerState

End Sub

Private Sub Button1_Click() Handles Button1.Click

mText.StartCountdown(10.0, 0.1)

End Sub

Private Sub mText_ChangeText() Handles mText.Finished

TextBox1.Text = "Done"

End Sub

Private Sub mText_UpdateTime(ByVal Countdown As Double

) Handles mText.UpdateTime

TextBox1.Text = Format(Countdown, "##0.0")

' Use DoEvents to allow the display to refresh.

My.Application.DoEvents()

End Sub

Class TimerState

Public Event UpdateTime(ByVal Countdown As Double)

Public Event Finished()

Public Sub StartCountdown(ByVal Duration As Double,

ByVal Increment As Double)

Dim Start As Double = DateAndTime.Timer

Dim ElapsedTime As Double = 0

Dim SoFar As Double = 0

Do While ElapsedTime < Duration

If ElapsedTime > SoFar + Increment Then

SoFar += Increment

RaiseEvent UpdateTime(Duration - SoFar)

End If

ElapsedTime = DateAndTime.Timer - Start

Loop

RaiseEvent Finished()

End Sub

End Class

Pressione F5 para executar o exemplo anterior e clique no botão de rótulo Iniciar. A


primeira caixa de texto começa a contar os segundos. Quando o tempo integral (10
segundos) tiver decorrido, a primeira caixa de texto exibirá "Concluído".

7 Observação

O método My.Application.DoEvents não processa eventos exatamente da mesma


forma que o formulário o faz. Para habilitar o formulário para manipular os eventos
diretamente, você pode usar o multithreading. Para obter mais informações, confira
Threading gerenciado.

Confira também
Eventos
Instrução Event
Instrução AddHandler
Instrução RemoveHandler
Alças
Instrução ReDim (Visual Basic)
Artigo • 07/04/2023 • 4 minutos para o fim da leitura

Realoca espaço de armazenamento para uma variável de matriz.

Sintaxe
VB

ReDim [ Preserve ] name(boundlist) [ , name(boundlist) [, ... ] ]

Partes
Termo Definição

Preserve Opcional. Modificador usado para preservar os dados na matriz existente quando é
alterado o tamanho apenas da última dimensão.

name Obrigatórios. Nome da variável da matriz. Confira Nomes de elementos declarados.

boundlist Obrigatórios. Lista de limites de cada dimensão da matriz redefinida.

Comentários
Você pode usar a instrução ReDim para alterar o tamanho de uma ou mais dimensões de
uma matriz que já foi declarada. Se tiver uma matriz grande e não precisar mais de
alguns de seus elementos, ReDim poderá liberar memória reduzindo o tamanho da
matriz. Por outro lado, se sua matriz precisar de mais elementos, ReDim poderá
adicioná-los.

A instrução ReDim destina-se apenas para matrizes. Não é válida em escalares (variáveis
que contêm apenas um único valor), coleções ou estruturas. Observe que, se declarar
uma variável como de tipo Array , a instrução ReDim não terá informações de tipo
suficientes para criar a nova matriz.

Você só pode usar ReDim no nível do procedimento. Portanto, o contexto de declaração


para a variável deve ser um procedimento; não pode ser um arquivo de origem, um
namespace, uma interface, uma classe, uma estrutura, um módulo ou um bloco. Para
obter mais informações, consulte Contextos de declaração e níveis de acesso padrão.
Regras
Múltiplas variáveis. Você pode redimensionar várias variáveis de matriz na mesma
instrução de declaração e especificar as partes name e boundlist para cada
variável. Múltiplas variáveis são separadas por vírgulas.

Limites da matriz. Cada entrada em boundlist pode especificar os limites inferior


e superior dessa dimensão. O limite inferior é sempre 0 (zero). O limite superior é o
valor de índice mais alto possível para a dimensão, não o comprimento da
dimensão (que é o limite superior mais um). O índice para cada dimensão pode
variar de 0 até seu valor de limite superior.

O número de dimensões em boundlist deve corresponder ao número original de


dimensões (classificação) da matriz.

Tipos de dados. A instrução ReDim não pode alterar o tipo de dados de uma
variável de matriz ou seus elementos.

Inicialização. A instrução ReDim não pode fornecer novos valores de inicialização


para os elementos da matriz.

Classificar. A instrução ReDim não pode alterar a classificação (o número de


dimensões) da matriz.

Redimensionamento com Preserve. Se você usar Preserve , poderá redimensionar


apenas a última dimensão da matriz. Para todas as outras dimensões, você deve
especificar o limite da matriz existente.

Por exemplo, se a matriz tiver apenas uma dimensão, você poderá redimensionar
essa dimensão e ainda preservar todo o conteúdo da matriz, pois você está
alterando a última e única dimensão. No entanto, se a matriz tiver duas ou mais
dimensões, você poderá alterar o tamanho apenas da última dimensão se usar
Preserve .

Propriedades. Você pode usar ReDim em uma propriedade que contém uma
matriz de valores.

Comportamento
Substituição de matriz. ReDim libera a matriz existente e cria uma nova matriz com
a mesma classificação. A nova matriz substitui a matriz liberada na variável de
matriz.
Inicialização sem Preserve. Se você não especificar Preserve , ReDim inicializará os
elementos da nova matriz usando o valor padrão para o tipo de dados.

Inicialização com Preserve. Se você especificar Preserve , o Visual Basic copiará os


elementos da matriz existente para a nova matriz.

Exemplo
O exemplo a seguir aumenta o tamanho da última dimensão de uma matriz dinâmica
sem perder dados existentes na matriz e, em seguida, diminui o tamanho com perda
parcial de dados. Por fim, ele diminui o tamanho de volta para seu valor original e
reinicializa todos os elementos da matriz.

VB

Dim intArray(10, 10, 10) As Integer

ReDim Preserve intArray(10, 10, 20)

ReDim Preserve intArray(10, 10, 15)

ReDim intArray(10, 10, 10)

A instrução Dim cria uma nova matriz com três dimensões. Cada dimensão é declarada
com um limite de 10, portanto, o índice de matriz para cada dimensão pode variar de 0
a 10. Na discussão a seguir, as três dimensões são conhecidas como camada, linha e
coluna.

O primeiro ReDim cria uma nova matriz que substitui a matriz existente na variável
intArray . ReDim copia todos os elementos da matriz existente para a nova matriz.

Também adiciona mais 10 colunas ao final de cada linha em cada camada e inicializa os
elementos nessas novas colunas com 0 (o valor padrão de Integer , que é o tipo de
elemento da matriz).

O segundo ReDim cria outra nova matriz e copia todos os elementos que se ajustam. No
entanto, cinco colunas são perdidas do final de cada linha em cada camada. Isso não
será um problema se tiver terminado de usar essas colunas. Reduzir o tamanho de uma
matriz grande pode liberar memória que não seja mais necessária.

O terceiro ReDim cria outra nova matriz e remove outras cinco colunas do final de cada
linha em cada camada. Desta vez, ele não copia nenhum elemento existente. Essa
instrução reverte a matriz para seu tamanho original. Como a instrução não inclui o
modificador Preserve , ela define todos os elementos de matriz para seus valores
padrão originais.
Para obter exemplos adicionais, consulte Matrizes.

Confira também
IndexOutOfRangeException
Instrução Const
Instrução Dim
Instrução Erase
Nothing
matrizes
Instrução REM (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Usada para incluir comentários explicativos no código-fonte de um programa.

Sintaxe
VB

REM comment

' comment

Partes
comment

Opcional. O texto de qualquer comentário que você deseja incluir. Um espaço é


necessário entre a palavra-chave REM e comment .

Comentários
Você pode colocar uma instrução REM sozinha em uma linha ou colocá-la em uma linha
após outra instrução. A instrução REM deve ser a última na linha. Se ela seguir outra
instrução, REM deverá ser separada daquela instrução por um espaço.

Você pode usar aspas simples ( ' ) em vez de REM . Isso é verdade se seu comentário
segue outra instrução na mesma linha ou fica sozinho em uma linha.

7 Observação

Você não pode continuar uma instrução REM usando uma sequência de
continuação de linha ( _ ). Quando um comentário é iniciado, o compilador não
examina os caracteres para um significado especial. Para um comentário de várias
linhas, use outra instrução REM ou um símbolo de comentário ( ' ) em cada linha.

Exemplo
O exemplo a seguir ilustra a instrução REM , que é usada para incluir comentários
explicativos em um programa. Ele também mostra a alternativa de usar o caractere de
aspas simples ( ' ) em vez de REM .

VB

Dim demoStr1, demoStr2 As String

demoStr1 = "Hello" REM Comment after a statement using REM.

demoStr2 = "Goodbye" ' Comment after a statement using the ' character.

REM This entire line is a comment.

' This entire line is also a comment.

Confira também
Comentários no código
Como: Quebrar e combinar instruções no código
Instrução RemoveHandler
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Remove a associação entre um evento e um manipulador de eventos.

Sintaxe
VB

RemoveHandler event, AddressOf eventhandler

Partes
Termo Definição

event O nome do evento que está sendo manipulado.

eventhandler O nome do procedimento que está manipulando o evento no momento.

Comentários
As instruções AddHandler e RemoveHandler permitem que você inicie e pare a
manipulação para um evento específico a qualquer momento durante a execução do
programa.

7 Observação

Para eventos personalizados, a instrução RemoveHandler invoca o acessador do


evento RemoveHandler . Para obter mais informações sobre eventos personalizados,
confira Instrução de evento.

Exemplo
VB

Sub TestEvents()

Dim Obj As New Class1

' Associate an event handler with an event.

AddHandler Obj.Ev_Event, AddressOf EventHandler

' Call the method to raise the event.

Obj.CauseSomeEvent()

' Stop handling events.

RemoveHandler Obj.Ev_Event, AddressOf EventHandler

' This event will not be handled.

Obj.CauseSomeEvent()

' Associate an event handler with an event, using a lambda.

' This handler cannot be removed.

AddHandler Obj.Ev_Event, Sub ()

MsgBox("Lambda caught event.")

End Sub

' This event will be handled by the lambda above.

Obj.CauseSomeEvent()

End Sub

Sub EventHandler()

' Handle the event.

MsgBox("EventHandler caught event.")

End Sub

Public Class Class1

' Declare an event.

Public Event Ev_Event()

Sub CauseSomeEvent()

' Raise an event.

RaiseEvent Ev_Event()

End Sub

End Class

Confira também
Instrução AddHandler
Alças
Instrução Event
Eventos
Instrução Resume
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Retoma a execução depois que uma rotina de tratamento de erros é concluída.

Sugerimos que você use o tratamento de exceção estruturado em seu código sempre
que possível, em vez de usar o tratamento de exceção não estruturado e as instruções
On Error e Resume . Para obter mais informações, consulte Instrução Try...Catch...Finally.

Sintaxe
VB

Resume [ Next | line ]

Partes
Resume

Obrigatórios. Se o erro ocorreu no mesmo procedimento que o manipulador de erros, a


execução será retomada com a instrução que causou o erro. Se o erro ocorreu em um
procedimento chamado, a execução será retomada na instrução que foi chamada pela
última vez para fora do procedimento que contém a rotina de tratamento de erros.

Next

Opcional. Se o erro ocorreu no mesmo procedimento que o manipulador de erros, a


execução será retomada com a instrução que segue imediatamente a instrução que
causou o erro. Se o erro ocorreu em um procedimento chamado, a execução será
retomada na instrução que segue imediatamente a instrução que foi chamada pela
última vez para fora do procedimento que contém a rotina de tratamento de erros (ou a
instrução On Error Resume Next ).

line

Opcional. A execução é retomada na linha especificada no argumento line exigido. O


argumento line é um rótulo de linha ou número de linha e deve estar no mesmo
procedimento que o manipulador de erros.

Comentários
7 Observação

Recomendamos que você use o tratamento de exceção estruturado em seu código


sempre que possível, em vez de usar o tratamento de exceção não estruturado e as
instruções On Error e Resume . Para obter mais informações, consulte Instrução
Try...Catch...Finally.

Se você usar uma instrução Resume em qualquer lugar diferente de uma rotina de
tratamento de erros, ocorrerá um erro.

A instrução Resume não pode ser usada em nenhum procedimento que contenha uma
instrução Try...Catch...Finally .

Exemplo
Este exemplo usa a instrução Resume para encerrar o tratamento de erros em um
procedimento e, em seguida, retomar a execução com a instrução que causou o erro. O
erro número 55 é gerado para ilustrar o uso da instrução Resume .

VB

Sub ResumeStatementDemo()

On Error GoTo ErrorHandler ' Enable error-handling routine.

Dim x As Integer = 32

Dim y As Integer = 0

Dim z As Integer

z = x / y ' Creates a divide by zero error

Exit Sub ' Exit Sub to avoid error handler.

ErrorHandler: ' Error-handling routine.

Select Case Err.Number ' Evaluate error number.

Case 6 ' "Divide by zero" error.

y = 1 ' Sets the value of y to 1 and tries the calculation again.

Case Else

' Handle other situations here....

End Select

Resume ' Resume execution at same line

' that caused the error.

End Sub

Requisitos
Namespace:Microsoft.VisualBasic
Assembly: Biblioteca de Tempo de Execução do Visual Basic (em
Microsoft.VisualBasic.dll)

Confira também
Instrução Try...Catch...Finally
Instrução Error
Instrução On Error
Instrução Return (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Retorna o controle para o código que chamou um procedimento Function , Sub , Get ,
Set ou Operator .

Sintaxe
VB

Return

' -or-

Return expression

Parte
expression

Obrigatório em um procedimento Function , Get ou Operator . Expressão que


representa o valor a ser retornado ao código de chamada.

Comentários
Em um procedimento Sub ou Set , a instrução Return é equivalente a uma instrução
Exit Sub ou Exit Property e expression não deve ser fornecida.

Em um procedimento Function , Get ou Operator , a instrução Return deve incluir


expression , e expression deve ser avaliada como um tipo de dados que seja
conversível no tipo de retorno do procedimento. Em um procedimento Function ou
Get , você também tem a alternativa de atribuir uma expressão ao nome do

procedimento para servir como o valor retornado e executar uma instrução Exit
Function ou Exit Property . Em um procedimento Operator , você deve usar Return

expression .

Você pode incluir quantas instruções Return forem apropriadas no mesmo


procedimento.

7 Observação
O código em um bloco Finally é executado depois que uma instrução Return em
um bloco Try ou Catch é encontrada, mas antes que essa instrução Return seja
executada. Uma instrução Return não pode ser incluída em um bloco Finally .

Exemplo
O exemplo a seguir usa a instrução Return várias vezes para retornar ao código de
chamada quando o procedimento não precisa fazer mais nada.

VB

Public Function GetAgePhrase(ByVal age As Integer) As String

If age > 60 Then Return "Senior"

If age > 40 Then Return "Middle-aged"

If age > 20 Then Return "Adult"

If age > 12 Then Return "Teen-aged"

If age > 4 Then Return "School-aged"

If age > 1 Then Return "Toddler"

Return "Infant"

End Function

Confira também
Instrução Function
Instrução Sub
Instrução Get
Instrução Set
Instrução Operator
Instrução Property
Instrução Exit
Instrução Try...Catch...Finally
Instrução Select...Case (Visual Basic)
Artigo • 28/11/2022 • 4 minutos para o fim da leitura

Executa um dos vários grupos de instruções, dependendo do valor de uma expressão.

Sintaxe
VB

Select [ Case ] testexpression

[ Case expressionlist

[ statements ] ]

[ Case Else

[ elsestatements ] ]

End Select

Partes
Termo Definição

testexpression Obrigatórios. Expressão. Deve ser avaliada como um dos tipos de dados
elementares ( Boolean , Byte , Char , Date , Double , Decimal , Integer , Long ,
Object , SByte , Short , Single , String , UInteger , ULong , e UShort ).
Termo Definição

expressionlist Obrigatória em uma instrução Case . Lista de cláusulas de expressão que


representam valores de correspondência para testexpression . Várias cláusulas
de expressão são separadas por vírgulas. Cada cláusula pode ter uma das
seguintes formas:

- expressão1 To expressão2

- [ Is ] operadordecomparaçãoexpressão

- expressão

Use a palavra-chave To para especificar os limites de um intervalo de valores


de correspondência para testexpression . O valor de expression1 deve ser
menor ou igual ao valor de expression2 .

Use a palavra-chave Is com um operador de comparação ( = , <> , < , <= , > ou


>= ) para especificar uma restrição nos valores de correspondência para
testexpression . Se a palavra-chave Is não for fornecida, ela será inserida
automaticamente antes do comparisonoperator.

A forma que especifica somente expression é tratado como um caso especial


da forma Is em que o comparisonoperator é o sinal de igual ( = ). Essa forma é
avaliada como testexpression = expression .

As expressões em expressionlist podem ser de qualquer tipo de dados, desde


que sejam implicitamente conversíveis para o tipo testexpression e o
comparisonoperator apropriado seja válido para os dois tipos com os quais está
sendo usado.

statements Opcional. Uma ou mais instruções após Case que são executadas se
testexpression corresponder a qualquer cláusula em expressionlist .

elsestatements Opcional. Uma ou mais instruções a seguir Case Else que são executadas se
testexpression não corresponderem a nenhuma cláusula expressionlist em
nenhuma das instruções Case .

End Select Termina a definição do constructo Select ... Case .

Comentários
Se testexpression corresponder a qualquer cláusula Case expressionlist , as instruções
após essa instrução Case serão executadas até a próxima instrução Case , Case Else ou
End Select . Em seguida, o controle passa para a instrução após End Select . Se
testexpression corresponder a uma cláusula expressionlist em mais de uma cláusula

Case , somente as instruções após a primeira correspondência serão executadas.


A instrução Case Else é usada para introduzir elsestatements para execução se
nenhuma correspondência for encontrada entre testexpression e uma cláusula
expressionlist em qualquer uma das outras instruções Case . Embora não seja

necessário, é uma boa ideia ter uma instrução Case Else em seu constructo Select
Case para lidar com valores imprevistos de testexpression . Se nenhuma cláusula

Case expressionlist corresponder a testexpression e não houver nenhuma instrução

Case Else , o controle passará para a instrução após End Select .

Você pode usar várias expressões ou intervalos em cada cláusula Case . Por exemplo, a
linha a seguir é válida.

Case 1 To 4, 7 To 9, 11, 13, Is > maxNumber

7 Observação

A palavra-chave Is usada nas instruções Case e Case Else não é a mesma que o
Operador Is, usado para comparação de referência de objeto.

Você pode especificar intervalos e várias expressões para cadeias de caracteres. No


exemplo a seguir, Case corresponde a qualquer cadeia de caracteres exatamente igual a
"maçãs", tem um valor entre "nozes" e "sopa" em ordem alfabética ou contém
exatamente o mesmo valor do valor atual de testItem .

Case "apples", "nuts" To "soup", testItem

A configuração de Option Compare pode afetar comparações de cadeia de caracteres.


Em Option Compare Text , as cadeias de caracteres "Maçãs" e "maçãs" se comparam
como iguais, o que não é o caso em Option Compare Binary .

7 Observação

Uma instrução Case com várias cláusulas pode exibir o comportamento conhecido
como curto-circuito. O Visual Basic avalia as cláusulas da esquerda para a direita e,
se uma delas produzir uma correspondência com testexpression , as cláusulas
restantes não serão avaliadas. O curto-circuito pode melhorar o desempenho, mas
pode produzir resultados inesperados se você espera que cada expressão
expressionlist seja avaliada. Para obter mais informações sobre curto-circuito,

consulte Expressões boolianas.


Se o código dentro de um bloco de instruções Case ou Case Else não precisar executar
mais instruções no bloco, ele poderá sair do bloco usando a instrução Exit Select . Isso
transfere o controle imediatamente para a instrução após End Select .

Construções Select Case podem ser aninhadas. Cada construção Select Case aninhada
deve ter uma instrução correspondente End Select e deve estar completamente
contida em um único bloco Case ou instrução Case Else da construção externa Select
Case na qual está aninhada.

Exemplo
O exemplo a seguir usa uma construção Select Case para gravar uma linha
correspondente ao valor da variável number . A segunda instrução Case contém o valor
que corresponde ao valor atual de number , portanto, a instrução que grava "Entre 6 e 8,
inclusive" é executada.

VB

Dim number As Integer = 8

Select Case number

Case 1 To 5

Debug.WriteLine("Between 1 and 5, inclusive")

' The following is the only Case clause that evaluates to True.

Case 6, 7, 8

Debug.WriteLine("Between 6 and 8, inclusive")

Case 9 To 10

Debug.WriteLine("Equal to 9 or 10")

Case Else

Debug.WriteLine("Not between 1 and 10, inclusive")

End Select

Confira também
Choose
Instrução End
Instrução If...Then...Else
Instrução Option Compare
Instrução Exit
Instrução Set (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Declara um procedimento de propriedade Set usado para atribuir o valor de uma


propriedade.

Sintaxe
VB

[ <attributelist> ] [ accessmodifier ] Set [([ByVal value [ As datatype ]])]

[ statements ]

End Set

Partes
attributelist

Opcional. Veja Lista de atributo.

accessmodifier

Opcional em no máximo uma das instruções Get e Set nesta propriedade. Um dos
seguintes pode ser feito:

Protegido

Friend

Privado

Protected Friend

Consulte Níveis de acesso no Visual Basic.

value

Opcional. Parâmetro que contém o novo valor da propriedade. Se não for fornecida (ou
seja, se a lista de parâmetros não estiver presente ou estiver vazia), um parâmetro
implícito nomeado value será definido. O tipo de dados desse parâmetro implícito é o
tipo de dados da propriedade em que essa Set instrução é declarada.

datatype

Obrigatório se value estiver presente e Option Strict for On . Não pode estar presente
se value não for dado. Tipo de dados do parâmetro value . O tipo de dados
especificado deve ser igual ao tipo de dados da propriedade em que esta instrução Set
é declarada.

statements

Opcional. Uma ou mais instruções que são executadas quando o procedimento de


propriedade Set é chamado.

End Set

Obrigatórios. Encerra a definição do procedimento de propriedade Set .

Comentários
Cada propriedade deve ter um procedimento de propriedade Set , a menos que a
propriedade seja marcada ReadOnly . O procedimento Set é usado para definir o valor
da propriedade.

O Visual Basic chama automaticamente o procedimento de Set uma propriedade


quando a instrução de atribuição fornece um valor a ser armazenado na propriedade.

O Visual Basic passa um parâmetro para o procedimento Set durante as atribuições de


propriedade. Se você não fornecer um parâmetro para Set , o IDE (ambiente de
desenvolvimento integrado) usa um parâmetro implícito chamado value . O parâmetro
mantém o valor a ser atribuído à propriedade. Normalmente, você armazena esse valor
em uma variável local privada e o retorna sempre que o procedimento Get é chamado.

O corpo da declaração de propriedade pode conter apenas os procedimentos Get e


Set da propriedade entre a Declaração de Propriedade e a instrução End Property . Ele
não pode armazenar nada além desses procedimentos. Em especial, ele não pode
armazenar o valor atual da propriedade. Você deve armazenar esse valor fora da
propriedade, porque se você armazená-lo dentro de qualquer um dos procedimentos
de propriedade, o outro procedimento de propriedade não poderá acessá-lo. A
abordagem usual é armazenar o valor em uma variável Privada declarada no mesmo
nível da propriedade. Você deve definir um procedimento Set dentro da propriedade à
qual ele se aplica.

O procedimento Set é padrão para o nível de acesso da propriedade que o contém, a


menos que você use accessmodifier na instrução Set .

Regras
Níveis de acesso mistos. Se você estiver definindo uma propriedade de
leitura/gravação, opcionalmente poderá especificar um nível de acesso diferente
para o procedimento Get ou o procedimento Set , mas não ambos. Se você fizer
isso, o nível de acesso ao procedimento deverá ser mais restritivo do que o nível
de acesso da propriedade. Por exemplo, se a propriedade for declarada Friend ,
você poderá declarar o procedimento Set Private , mas não Public .

Se você estiver definindo uma propriedade WriteOnly , o procedimento Set


representará toda a propriedade. Você não pode declarar um nível de acesso
diferente para Set , pois isso definiria dois níveis de acesso para a propriedade.

Comportamento
Retorno de um procedimento de propriedade. Quando o procedimento Set
retorna ao código de chamada, a execução continua seguindo a instrução que
forneceu o valor a ser armazenado.

Os procedimentos de propriedade Set podem retornar usando a Instrução Return


ou a Instrução Exit.

As instruções Exit Property e Return causam uma saída imediata de um


procedimento de propriedade. Qualquer número de instruções Exit Property e
Return podem aparecer em qualquer lugar no procedimento, e você pode

misturar instruções Exit Property e Return .

Exemplo
O exemplo a seguir usa a instrução Set para definir o valor de uma propriedade.

VB

Class propClass

Private propVal As Integer

Property Prop1() As Integer

Get

Return propVal

End Get

Set(ByVal value As Integer)

propVal = value

End Set

End Property

End Class

Confira também
Instrução Get
Instrução Property
Instrução Sub
Procedimentos de propriedade
Instrução Stop (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Suspende a execução.

Sintaxe
VB

Stop

Comentários
Você pode colocar instruções Stop em qualquer lugar nos procedimentos para
suspender a execução. O uso da instrução Stop é semelhante à configuração de um
ponto de interrupção no código.

A instrução Stop suspende a execução, mas, ao contrário de End , não fecha nenhum
arquivo ou limpa nenhuma variável, a menos que ela seja encontrada em um arquivo
executável compilado (.exe).

7 Observação

Se a instrução Stop for encontrada no código que está sendo executado fora do
IDE (ambiente de desenvolvimento integrado), o depurador será invocado. Isso é
verdadeiro, independentemente de o código ter sido compilado no modo de
depuração ou de varejo.

Exemplo
Este exemplo usa a instrução Stop para suspender a execução de cada iteração por
meio do loop For...Next .

VB

Dim i As Integer

For i = 1 To 10

Debug.WriteLine(i)

' Stop during each iteration and wait for user to resume.

Stop

Next i

Confira também
Instrução End
Instrução Structure
Artigo • 28/11/2022 • 6 minutos para o fim da leitura

Declara o nome de uma estrutura e apresenta a definição das variáveis, propriedades,


eventos e procedimentos que a estrutura abrange.

Sintaxe
VB

[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Partial ] _

Structure name [ ( Of typelist ) ]

[ Implements interfacenames ]

[ datamemberdeclarations ]

[ methodmemberdeclarations ]

End Structure

Partes
Termo Definição

attributelist Opcional. Confira Lista de atributos.

accessmodifier Opcional. Um dos seguintes pode ser feito:

- Público

- Protegido

- Amigo

- Particular

- Amigo Protegido

- Protegido de forma particular

Confira Níveis de acesso no Visual Basic.

Shadows Opcional. Confira Sombras.

Partial Opcional. Indica uma definição parcial da estrutura. Confira Parcial.

name Obrigatórios. Nome desta estrutura. Confira Nomes de elementos


declarados.

Of Opcional. Especifica que essa é uma estrutura genérica.

typelist Obrigatório se você usar a palavra-chave Of. Lista de parâmetros de


tipo para essa estrutura. Confira Lista de tipos.
Termo Definição

Implements Opcional. Indica que essa estrutura implementa os membros de uma


ou mais interfaces. Confira Instrução Implements.

interfacenames Obrigatório se você usar a instrução Implements . Os nomes das


interfaces que essa estrutura implementa.

datamemberdeclarations Obrigatórios. Zero ou mais instruções Const , Dim , Enum ou Event


declarando membros de dados da estrutura.

methodmemberdeclarations Opcional. Zero ou mais declarações de procedimentos Function ,


Operator , Property ou Sub , que servem como membros do método
da estrutura.

End Structure Obrigatórios. Termina a definição Structure .

Comentários
A instrução Structure define um tipo de valor composto que você pode personalizar.
Uma estrutura é uma generalização do UDT (tipo definido pelo usuário) de versões
anteriores do Visual Basic. Para obter mais informações, confira Estruturas.

As estruturas dão suporte a muitos dos mesmos recursos que as classes. Por exemplo,
as estruturas podem ter propriedades e procedimentos, podem implementar interfaces
e ter construtores parametrizados. No entanto, há diferenças significativas entre
estruturas e classes em áreas como herança, declarações e uso. Além disso, as classes
são tipos de referência e as estruturas são tipos de valor. Para obter mais informações,
confira Estruturas e classes.

Você só pode usar Structure no namespace ou no nível do módulo. Isso significa que o
contexto de declaração de uma interface precisa ser um arquivo de origem, namespace,
classe, estrutura, módulo ou interface, e não pode ser um procedimento ou bloco. Para
obter mais informações, consulte Contextos de declaração e níveis de acesso padrão.

As estruturas assumem o padrão de acesso Amigo. Você pode ajustar os níveis de


acesso com os modificadores de acesso. Para obter mais informações, confira Níveis de
acesso no Visual Basic.

Regras
Aninhamento. Você pode definir uma estrutura dentro de outra. A estrutura
externa é chamada de estrutura recipiente e a estrutura interna é chamada de
estrutura aninhada. No entanto, você não pode acessar os membros de uma
estrutura aninhada por meio da estrutura recipiente. Em vez disso, você precisa
declarar uma variável do tipo de dados da estrutura aninhada.

Declaração de membro. Você precisa declarar cada membro de uma estrutura. Um


membro da estrutura não pode ser Protegido ou Protected Friend porque nada
pode herdar de uma estrutura. No entanto, a estrutura em si pode ser Protected
ou Protected Friend .

Você pode declarar zero ou mais variáveis não compartilhadas ou eventos não
compartilhados e não personalizados em uma estrutura. Você não pode ter apenas
constantes, propriedades e procedimentos, mesmo que alguns deles não sejam
compartilhados.

Inicialização. Não é possível inicializar o valor de qualquer membro de dados não


compartilhados de uma estrutura como parte da declaração. É necessário inicializar
esse membro de dados por meio de um construtor parametrizado na estrutura ou
atribuir um valor ao membro depois de criar uma instância da estrutura.

Herança. Uma estrutura não pode herdar de nenhum tipo diferente de ValueType,
do qual todas as estruturas herdam. Em particular, uma estrutura não pode herdar
de outra.

Você não pode usar a Instrução Inherits em uma definição de estrutura, mesmo
para especificar ValueType.

Implementação. Se a estrutura usar a Instrução Implements, você deverá


implementar todos os membros definidos por cada interface especificada em
interfacenames .

Propriedade padrão. Uma estrutura pode especificar no máximo uma propriedade


como a propriedade padrão, usando o modificador Padrão. Para obter mais
informações, confira Padrão.

Comportamento
Nível de acesso. Em uma estrutura, você pode declarar cada membro com o
próprio nível de acesso. Todos os membros da estrutura assumem o padrão de
acesso Público. Observe que, se a estrutura em si tiver um nível de acesso mais
restrito, isso restringirá automaticamente o acesso aos membros dela, mesmo que
você ajuste os níveis de acesso com os modificadores de acesso.
Escopo. Uma estrutura está no escopo em todo o namespace, classe, estrutura ou
módulo que a contém.

O escopo de cada membro da estrutura é toda a estrutura.

Tempo de vida. Uma estrutura em si não tem tempo de vida. Em vez disso, cada
instância dessa estrutura tem um tempo de vida independente de todas as outras
instâncias.

O tempo de vida de uma instância começa quando é criado por uma cláusula New
Operator. Ele termina quando o tempo de vida da variável que a mantém termina.

Não é possível estender o tempo de vida de uma instância de estrutura. Uma


aproximação à funcionalidade de estrutura estática é fornecida por um módulo.
Para obter mais informações, confira Instrução Module.

Os membros da estrutura têm tempo de vida dependendo de como e onde são


declarados. Para obter mais informações, confira "Tempo de vida" na Instrução
Class.

Qualificação. O código fora de uma estrutura deve qualificar o nome de um


membro com o nome dessa estrutura.

Se o código dentro de uma estrutura aninhada fizer uma referência não qualificada
a um elemento de programação, o Visual Basic procurará o elemento primeiro na
estrutura aninhada e, em seguida, na estrutura recipiente e assim por diante até o
elemento recipiente mais externo. Para obter mais informações, confira Referências
a elementos declarados.

Consumo de memória. Assim como acontece com todos os tipos de dados


compostos, você não pode calcular com segurança o consumo total de memória
de uma estrutura adicionando as alocações de armazenamento nominais de seus
membros. Além disso, você não pode supor com segurança que a ordem de
armazenamento na memória seja a mesma que sua ordem de declaração. Se você
precisar controlar o layout de armazenamento de uma estrutura, poderá aplicar o
atributo StructLayoutAttribute à instrução Structure .

Exemplo
O exemplo a seguir usa a instrução Structure para definir um conjunto de dados
relacionados para um funcionário. Ele mostra o uso de membros Public , Friend e
Private para refletir a confidencialidade dos itens de dados. Ele também mostra os

membros do procedimento, da propriedade e do evento.


VB

Public Structure employee

' Public members, accessible from throughout declaration region.

Public firstName As String

Public middleName As String

Public lastName As String

' Friend members, accessible from anywhere within the same assembly.

Friend employeeNumber As Integer

Friend workPhone As Long

' Private members, accessible only from within the structure itself.

Private homePhone As Long

Private level As Integer

Private salary As Double

Private bonus As Double

' Procedure member, which can access structure's private members.

Friend Sub CalculateBonus(ByVal rate As Single)

bonus = salary * CDbl(rate)

End Sub

' Property member to return employee's eligibility.

Friend ReadOnly Property Eligible() As Boolean

Get

Return level >= 25

End Get

End Property

' Event member, raised when business phone number has changed.
Public Event ChangedWorkPhone(ByVal newPhone As Long)

End Structure

Para obter mais informações sobre como usar Structure s, confira Variável de estrutura.

Confira também
Instrução Class
Instrução Interface
Instrução Module
Instrução Dim
Instrução Const
Instrução Enum
Instrução Event
Instrução Operator
Instrução Property
Estruturas e classes
Instrução Sub (Visual Basic)
Artigo • 07/04/2023 • 6 minutos para o fim da leitura

Declara o nome, os parâmetros e o código que definem um procedimento Sub .

Sintaxe
VB

[ <attributelist> ] [ Partial ] [ accessmodifier ] [ proceduremodifiers ] [


Shared ] [ Shadows ] [ Async ]

Sub name [ (Of typeparamlist) ] [ (parameterlist) ] [ Implements


implementslist | Handles eventlist ]

[ statements ]

[ Exit Sub ]

[ statements ]

End Sub

Partes
attributelist

Opcional. Veja Lista de atributo.

Partial

Opcional. Indica a definição de um método parcial. Confira métodos parciais.

accessmodifier

Opcional. Um dos seguintes pode ser feito:

Público

Protegido

Friend

Privado

Amigo Protegido

Particular Protegido
Consulte Níveis de acesso no Visual Basic.

proceduremodifiers

Opcional. Um dos seguintes pode ser feito:

Sobrecargas

Substituições

Substituível

NotOverridable

MustOverride

MustOverride Overrides

NotOverridable Overrides

Shared

Opcional. Consulte Shared.

Shadows

Opcional. Confira Sombras.

Async

Opcional. Confira Async.

name

Obrigatórios. O nome do procedimento. Confira Nomes de elementos declarados.


Para criar um procedimento de construtor para uma classe, defina o nome de um
procedimento Sub como a palavra-chave New . Para obter mais informações,
confira Tempo de vida do objeto: como os objetos são criados e destruídos.

typeparamlist

Opcional. Lista de parâmetros de tipo para um procedimento genérico. Confira


Lista de tipos.

parameterlist

Opcional. Lista de nomes de variáveis locais que representam os parâmetros deste


procedimento. Confira a Lista de parâmetros.
Implements

Opcional. Indica que este procedimento implementa um ou mais procedimentos


Sub , cada um definido em uma interface implementada pela classe ou estrutura

que contém esse procedimento. Consulte Instrução Implements.

implementslist

Necessário se Implements for fornecido. Lista de procedimentos Sub que estão


sendo implementados.

implementedprocedure [ , implementedprocedure ... ]

Cada implementedprocedure tem a sintaxe e as partes a seguir:

interface.definedname

Parte Descrição

interface Obrigatórios. Nome de uma interface implementada pela classe ou estrutura


que contém este procedimento.

definedname Obrigatórios. Nome pelo qual o procedimento é definido em interface .

Handles

Opcional. Indica que esse procedimento pode lidar com um ou mais eventos
específicos. Consulte Identificadores.

eventlist

Necessário se Handles for fornecido. Lista de eventos que este procedimento


manipula.

eventspecifier [ , eventspecifier ... ]

Cada eventspecifier tem a sintaxe e as partes a seguir:

eventvariable.event

Parte Descrição

eventvariable Obrigatórios. Variável de objeto declarada com o tipo de dados da classe


ou estrutura que gera o evento.

event Obrigatórios. Nome do evento que este procedimento manipula.


statements

Opcional. Bloco de instruções a serem executadas dentro deste procedimento.

End Sub

Encerra a definição deste procedimento.

Comentários
Todo código executável deve estar dentro de um procedimento. Use um procedimento
Sub quando não quiser retornar um valor para o código de chamada. Use um

procedimento Function quando quiser retornar um valor.

Definindo um procedimento Sub


Você pode definir um procedimento Sub somente no nível do módulo. O contexto de
declaração de um procedimento Sub deve, portanto, ser uma classe, uma estrutura, um
módulo ou uma interface e não pode ser um arquivo de origem, um namespace, um
procedimento ou um bloco. Para obter mais informações, consulte Contextos de
declaração e níveis de acesso padrão.

Os procedimentos Sub têm como padrão o acesso público. Você pode ajustar seus
níveis de acesso usando os modificadores de acesso.

Se o procedimento usar a palavra-chave Implements , a classe ou estrutura que contém


deverá ter uma instrução Implements que siga imediatamente sua instrução Class ou
Structure . A instrução Implements deve incluir cada interface especificada em

implementslist . No entanto, o nome pelo qual uma interface define o Sub (em

definedname ) não precisa corresponder ao nome desse procedimento (em name ).

Retornando de um procedimento Sub


Quando um procedimento Sub retorna ao código de chamada, a execução continua
com a instrução após a instrução que o chamou.

O exemplo a seguir mostra um retorno de um procedimento Sub .

VB

Sub mySub(ByVal q As String)

Return

End Sub

As instruções Exit Sub e Return causam uma saída imediata de um procedimento Sub .
Qualquer número de instruções Exit Sub e Return podem aparecer em qualquer lugar
no procedimento, e você pode misturar instruções Exit Sub e Return .

Chamando um procedimento Sub


Você chama um procedimento Sub usando o nome do procedimento em uma instrução
e, em seguida, segue esse nome com sua lista de argumentos em parênteses. Você só
poderá omitir os parênteses se não fornecer argumentos. No entanto, seu código será
mais legível se você sempre incluir os parênteses.

Um procedimento Sub e um procedimento Function podem ter parâmetros e executar


uma série de instruções. No entanto, um procedimento Function retorna um valor e um
procedimento Sub não. Portanto, você não pode usar um procedimento Sub em uma
expressão.

Você pode usar a palavra-chave Call ao chamar um procedimento Sub , mas essa
palavra-chave não é recomendada para a maioria dos usos. Para obter mais
informações, confira Instrução Call.

Às vezes, o Visual Basic reorganiza expressões aritméticas para aumentar a eficiência


interna. Por esse motivo, se sua lista de argumentos incluir expressões que chamam
outros procedimentos, você não deve assumir que essas expressões serão chamadas em
uma ordem específica.

Procedimentos Sub assíncronos


Usando o recurso async, você pode invocar funções assíncronas sem usar retornos de
chamada explícitos ou dividir manualmente seu código entre várias funções ou
expressões lambda.

Se marcar um procedimento com o modificador Async, você poderá usar o operador


Await no procedimento. Quando o controle atinge uma expressão Await no
procedimento Async , o controle retorna para o chamador e o progresso no
procedimento é suspenso até a tarefa aguardada ser concluída. Quando a tarefa for
concluída, a execução poderá ser retomada no procedimento.

7 Observação
Um procedimento Async retorna para o chamador quando o primeiro objeto
esperado que ainda não está completo é encontrado ou quando é atingido o fim
do procedimento Async , o que ocorrer primeiro.

Você também pode marcar uma Instrução de Função com o modificador Async . Uma
função Async pode ter um tipo de retorno de Task<TResult> ou Task. Um exemplo mais
adiante neste tópico mostra uma função Async que tem um tipo de retorno de
Task<TResult>.

Os procedimentos Async Sub são usados principalmente para manipuladores de


eventos, em que um valor não pode ser retornado. Um procedimento Async Sub não
pode ser aguardado e o chamador de um procedimento Async Sub não pode capturar
exceções que o procedimento Sub gera.

Um procedimento Async não pode declarar nenhum parâmetro ByRef.

Para obter mais informações sobre os procedimentos Async , confira Programação


assíncrona com async e await, Fluxo de controle em programas assíncronos e Tipos de
retorno assíncronos.

Exemplo 1
O exemplo a seguir usa a instrução Sub para definir o nome, os parâmetros e o código
que formam o corpo de um procedimento Sub .

VB

Sub ComputeArea(ByVal length As Double, ByVal width As Double)

' Declare local variable.

Dim area As Double

If length = 0 Or width = 0 Then

' If either argument = 0 then exit Sub immediately.

Exit Sub

End If

' Calculate area of rectangle.

area = length * width

' Print area to Immediate window.

Debug.WriteLine(area)

End Sub

Exemplo 2
No exemplo a seguir, DelayAsync é um Async Function que tem um tipo de retorno de
Task<TResult>. DelayAsync tem uma instrução Return que retorna um número inteiro.
Portanto, a declaração da função de Task(Of Integer) deve ter um tipo de retorno de
DelayAsync . Como o tipo de retorno é Task(Of Integer) , a avaliação da expressão
Await em DoSomethingAsync produz um inteiro, como a instrução a seguir demonstra:

Dim result As Integer = Await delayTask .

O procedimento startButton_Click é um exemplo de um procedimento Async Sub .


Como DoSomethingAsync é uma função Async , a tarefa para a chamada para
DoSomethingAsync deve ser colocada em espera, como mostra a seguinte instrução:
Await DoSomethingAsync() . O procedimento startButton_Click Sub deve ser definido

com o modificador Async porque ele tem uma expressão Await .

VB

' Imports System.Diagnostics

' Imports System.Threading.Tasks

' This Click event is marked with the Async modifier.

Private Async Sub startButton_Click(sender As Object, e As RoutedEventArgs)


Handles startButton.Click

Await DoSomethingAsync()

End Sub

Private Async Function DoSomethingAsync() As Task

Dim delayTask As Task(Of Integer) = DelayAsync()

Dim result As Integer = Await delayTask

' The previous two statements may be combined into

' the following statement.

' Dim result As Integer = Await DelayAsync()

Debug.WriteLine("Result: " & result)

End Function

Private Async Function DelayAsync() As Task(Of Integer)

Await Task.Delay(100)

Return 5

End Function

' Output:

' Result: 5

Confira também
Instrução Implements
Instrução Function
Lista de parâmetros
Instrução Dim
Instrução Call
Of
Matrizes de Parâmetros
Como: Usar uma classe genérica
Solucionando problemas de procedimentos
Métodos Parciais
Instrução SyncLock
Artigo • 07/04/2023 • 5 minutos para o fim da leitura

Adquire um bloqueio exclusivo para um bloco de instruções, antes de executar o bloco.

Sintaxe
VB

SyncLock lockobject

[ block ]

End SyncLock

Partes
lockobject

Obrigatórios. Expressão que avalia uma referência de objeto.

block

Opcional. Bloco de instruções que devem ser executadas quando o bloqueio é


adquirido.

End SyncLock

Termina um bloco SyncLock .

Comentários
A instrução SyncLock garante que vários threads não executam o bloco de instruções ao
mesmo tempo. SyncLock impede que cada thread entre no bloco até que nenhum outro
thread o esteja executando.

O uso mais comum de SyncLock é proteger os dados para que não sejam atualizados
por mais de um thread simultaneamente. Se as instruções que manipulam os dados
precisarem ir para a conclusão sem interrupção, coloque-as dentro de um bloco
SyncLock .

Um bloco de instruções protegido por um bloqueio exclusivo, às vezes, é chamado de


seção crítica.
Regras
Ramificação. Você não pode ramificar em um bloco SyncLock de fora do bloco.

Valor do Objeto de Bloqueio. O valor de lockobject não pode ser Nothing . Você
deve criar o objeto de bloqueio, antes de usá-lo em uma instrução SyncLock .

Não é possível alterar o valor de lockobject durante a execução de um bloco


SyncLock . O mecanismo exige que o objeto de bloqueio permaneça inalterado.

Você não pode usar o operador Await em um bloco SyncLock .

Comportamento
Mecanismo. Quando um thread acessa a instrução SyncLock , ele avalia a expressão
lockobject e suspende a execução até que ela adquira um bloqueio exclusivo no

objeto retornado pela expressão. Quando outro thread acessa a instrução


SyncLock , ele não adquire um bloqueio até que o primeiro thread execute a

instrução End SyncLock .

Dados Protegidos. Se lockobject for uma variável Shared , o bloqueio exclusivo


impedirá que um thread em qualquer instância da classe execute o bloco
SyncLock , enquanto qualquer outro thread o estiver executando. Isso protege os
dados compartilhados em todas as instâncias.

Se lockobject for uma variável de instância (não Shared ), o bloqueio impedirá que
um thread em execução na instância atual execute o bloco SyncLock , ao mesmo
tempo que outro thread na mesma instância. Isso protege os dados mantidos pela
instância individual.

Aquisição e Liberação. Um bloco SyncLock se comporta como uma construção


Try...Finally em que o bloco Try adquire um bloqueio exclusivo no lockobject
e o bloco Finally o libera. Por isso, o bloco SyncLock garante a liberação do
bloco, independentemente de como você sai dele. Isso é verdade mesmo no caso
de uma exceção não tratada.

Chamadas de Estrutura. O bloco SyncLock adquire e libera o bloqueio exclusivo


chamando os métodos Enter e Exit da classe Monitor no namespace
System.Threading.
Práticas de Programação
A expressão lockobject sempre deve ser avaliada para um objeto que pertence
exclusivamente à classe. Você deve declarar uma variável de objeto Private para
proteger os dados pertencentes à instância atual ou uma variável de objeto Private
Shared para proteger os dados comuns a todas as instâncias.

Você não deve usar a palavra-chave Me para fornecer um objeto de bloqueio para
dados de instância. Se o código externo à sua classe tiver uma referência a uma
instância da sua classe, ele pode usar essa referência como objeto de bloqueio para um
bloco SyncLock completamente diferente do seu, protegendo dados diferentes. Dessa
forma, sua classe e a outra classe podem impedir uma à outra de executar os blocos
SyncLock não relacionados. Da mesma forma, o bloqueio em uma cadeia de caracteres
pode ser problemático, pois qualquer outro código no processo, que use a mesma
cadeia de caracteres, compartilhará o mesmo bloqueio.

Você também não deve usar o método Me.GetType para fornecer um objeto de
bloqueio para dados compartilhados. Isso ocorre porque GetType sempre retorna o
mesmo objeto Type para determinado nome de classe. O código externo pode chamar
GetType na classe e obter o mesmo objeto de bloqueio que você está usando. Isso

resultaria em duas classes bloqueando uma à outra nos blocos SyncLock .

Exemplos

Descrição
O exemplo a seguir mostra uma classe que mantém uma lista simples de mensagens.
Ele retém as mensagens em uma matriz e o último elemento usado dessa matriz em
uma variável. O procedimento addAnotherMessage incrementa o último elemento e
armazena a nova mensagem. Essas duas operações são protegidas pelas instruções
SyncLock e End SyncLock , visto que depois que o último elemento tiver sido

incrementado, a nova mensagem deve ser armazenada antes que qualquer outro thread
incremente o último elemento novamente.

Se a classe simpleMessageList compartilhasse uma lista de mensagens entre todas as


instâncias, as variáveis messagesList e messagesLast seriam declaradas como Shared .
Nesse caso, a variável messagesLock também deve ser Shared , para que haja um único
objeto de bloqueio usado por cada instância.
Código
VB

Class simpleMessageList

Public messagesList() As String = New String(50) {}

Public messagesLast As Integer = -1

Private messagesLock As New Object

Public Sub addAnotherMessage(ByVal newMessage As String)

SyncLock messagesLock

messagesLast += 1

If messagesLast < messagesList.Length Then

messagesList(messagesLast) = newMessage

End If

End SyncLock

End Sub

End Class

Descrição
O exemplo a seguir usa threads e SyncLock . Contanto que a instrução SyncLock esteja
presente, o bloco de instruções será uma seção crítica e balance nunca se tornará um
número negativo. Você pode comentar as instruções SyncLock e End SyncLock para ver
o efeito de não usar a palavra-chave SyncLock .

Código
VB

Imports System.Threading

Module Module1

Class Account

Dim thisLock As New Object

Dim balance As Integer

Dim r As New Random()

Public Sub New(ByVal initial As Integer)

balance = initial

End Sub

Public Function Withdraw(ByVal amount As Integer) As Integer

' This condition will never be true unless the SyncLock


statement

' is commented out:

If balance < 0 Then

Throw New Exception("Negative Balance")

End If

' Comment out the SyncLock and End SyncLock lines to see

' the effect of leaving out the SyncLock keyword.

SyncLock thisLock

If balance >= amount Then

Console.WriteLine("Balance before Withdrawal : " &


balance)

Console.WriteLine("Amount to Withdraw : -" &


amount)

balance = balance - amount

Console.WriteLine("Balance after Withdrawal : " &


balance)

Return amount

Else

' Transaction rejected.

Return 0

End If

End SyncLock

End Function

Public Sub DoTransactions()

For i As Integer = 0 To 99

Withdraw(r.Next(1, 100))

Next

End Sub

End Class

Sub Main()

Dim threads(10) As Thread

Dim acc As New Account(1000)

For i As Integer = 0 To 9

Dim t As New Thread(New ThreadStart(AddressOf


acc.DoTransactions))

threads(i) = t

Next

For i As Integer = 0 To 9

threads(i).Start()

Next

End Sub

End Module

Comentários

Confira também
System.Threading.Monitor
System.Threading.Interlocked
Visão geral dos primitivos de sincronização
Instrução Then
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Apresenta um bloco de instrução a ser compilado ou executado se uma condição


testada for verdadeira.

Comentários
A palavra-chave Then pode ser usada nestes dois contextos:

Diretiva #If...Then...#Else

Instrução If...Then...Else

Confira também
Palavras-chave
Instrução Throw (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Gera uma exceção dentro de um procedimento.

Sintaxe
VB

Throw [ expression ]

Parte
expression

Fornece informações sobre a exceção a ser gerada. Opcional ao residir em uma


instrução Catch , caso contrário, necessário.

Comentários
A instrução Throw gera uma exceção que você pode manipular com código estruturado
de tratamento de exceções ( Try ... Catch ... Finally ) ou código de tratamento de exceção
não estruturado ( On Error GoTo ). Você pode usar a instrução Throw para capturar erros
em seu código porque o Visual Basic move a pilha de chamadas até encontrar o código
de tratamento de exceção apropriado.

Uma instrução Throw sem expressão só pode ser usada em uma instrução Catch . Nesse
caso, a instrução gera novamente a exceção que está sendo tratada pela instrução
Catch .

A instrução Throw redefine a pilha de chamadas para a exceção expression . Se


expression não for fornecido, a pilha de chamadas permanecerá inalterada. Você pode
acessar a pilha de chamadas para a exceção por meio da propriedade StackTrace.

Exemplo
O código a seguir usa a instrução Throw para gerar uma exceção:

VB
' Throws a new exception.

Throw New System.Exception("An exception has occurred.")

Confira também
Instrução Try...Catch...Finally
Instrução On Error
Instrução Try...Catch...Finally (Visual
Basic)
Artigo • 07/04/2023 • 14 minutos para o fim da leitura

Oferece uma forma de lidar com alguns ou com todos os possíveis erros que podem
ocorrer em um determinado bloco de código e, ainda assim, executar o código.

Sintaxe
VB

Try

[ tryStatements ]

[ Exit Try ]

[ Catch [ exception [ As type ] ] [ When expression ]

[ catchStatements ]

[ Exit Try ] ]

[ Catch ... ]

[ Finally

[ finallyStatements ] ]

End Try

Partes
Termo Definição

tryStatements Opcional. Instruções em que um erro pode ocorrer. Pode ser uma instrução
composta.

Catch Opcional. Vários blocos Catch permitidos. Se ocorrer uma exceção ao


processar o bloco Try , cada instrução Catch será examinada em ordem
textual para determinar se ela manipula a exceção, sendo que exception
representa a exceção que foi gerada.

exception Opcional. Qualquer nome de variável. O valor inicial de exception é o valor


do erro gerado. Usado com Catch para especificar o erro capturado. Se
omitida, a instrução Catch captura qualquer exceção.

type Opcional. Especifica o tipo de filtro de classe. Se o valor de exception for do


tipo especificado por type ou de um tipo derivado, o identificador ficará
associado ao objeto de exceção.
Termo Definição

When Opcional. Uma instrução Catch com uma cláusula When captura exceções
somente quando expression é avaliada como True . Uma cláusula When é
aplicada somente depois de verificar o tipo da exceção e expression pode
se referir ao identificador que representa a exceção.

expression Opcional. Deve ser implicitamente conversível para Boolean . Qualquer


expressão que descreva um filtro genérico. Normalmente usado para filtrar
por número de erro. Usado com a palavra-chave When para especificar as
circunstâncias sob as quais o erro é capturado.

catchStatements Opcional. Instruções para lidar com erros que ocorrem no bloco Try
associado. Pode ser uma instrução composta.

Exit Try Opcional. Palavra-chave que sai da estrutura Try...Catch...Finally . A


execução é retomada com o código imediatamente após a instrução End
Try . A instrução Finally ainda será executada. Não permitido em blocos
Finally .

Finally Opcional. Um bloco Finally sempre é executado quando a execução deixa


qualquer parte da instrução Try...Catch .

finallyStatements Opcional. Instruções executadas após a conclusão de todos os outros


processamentos de erros.

End Try Termina a estrutura Try...Catch...Finally .

Comentários
Se você espera que uma exceção específica possa ocorrer durante uma determinada
seção de código, coloque o código em um bloco Try e use um bloco Catch para
manter o controle e manipular a exceção se ocorrer.

A instrução Try…Catch consiste em um bloco Try seguido por uma ou mais cláusulas
Catch , que especificam os manipuladores para diferentes exceções. Quando uma
exceção é lançada em um bloco Try , o Visual Basic procura a instrução Catch que
manipula a exceção. Se uma instrução Catch correspondente não for encontrada, o
Visual Basic examinará o método que chamou o método atual e assim por diante na
pilha de chamadas. Se nenhum bloco Catch for encontrado, o Visual Basic exibirá uma
mensagem de exceção sem tratamento para o usuário e interromperá a execução do
programa.

Você pode usar mais de uma instrução Catch em uma instrução Try…Catch . Se você
fizer isso, a ordem das cláusulas Catch será significativa porque elas são examinadas em
ordem. Capture as exceções mais específicas antes das menos específicas.

As condições da instrução Catch a seguir são as menos específicas e vão capturar todas
as exceções derivadas da classe Exception. Normalmente, você deve usar uma dessas
variações como o último bloco Catch da estrutura Try...Catch...Finally , depois de
capturar todas as exceções específicas esperadas. O fluxo de controle nunca pode
alcançar um bloco Catch que siga qualquer uma dessas variações.

O type é Exception , por exemplo: Catch ex As Exception

A instrução não tem nenhuma variável exception , por exemplo: Catch

Quando uma instrução Try…Catch…Finally é aninhada em outro bloco Try , o Visual


Basic examina primeiro cada instrução Catch no bloco Try mais interno. Se nenhuma
instrução Catch correspondente for encontrada, a pesquisa prosseguirá para as
instruções Catch do bloco Try…Catch…Finally externo.

As variáveis locais de um bloco Try não estão disponíveis em um bloco Catch porque
são blocos separados. Se você quiser usar uma variável em mais de um bloco, declare a
variável fora da estrutura Try...Catch...Finally .

 Dica

A instrução Try…Catch…Finally está disponível como um snippet de código do


IntelliSense. No Gerenciador de Snippets de Código, expanda Padrões de Código –
If, For Each, Try Catch, Property etc. e Tratamento de Erros (Exceções). Para obter
mais informações, consulte Snippets de Código.

Bloco Finally
Se você tiver uma ou mais instruções que precisam ser executadas antes que você saia
da estado Try , use um bloco Finally . O controle passa para o bloco Finally pouco
antes de ele sair da estrutura Try…Catch . Isso é verdadeiro mesmo se ocorrer uma
exceção em qualquer lugar dentro da estrutura Try .

Um bloco Finally é útil para executar qualquer código que precise ser executado
mesmo se houver uma exceção. O controle é passado para o bloco Finally ,
independentemente de como o bloco Try...Catch sai.

O código em um bloco Finally é executado mesmo que seu código encontre uma
instrução Return em um bloco Try ou Catch . O controle não passa de um bloco Try
ou Catch para o bloco Finally correspondente nos seguintes casos:

Uma Instrução End é encontrada no bloco Try ou Catch .

Um StackOverflowException é lançado no bloco Try ou Catch .

Não é válido transferir explicitamente a execução para um bloco Finally . A


transferência da execução de um bloco Finally não é válida, exceto por meio de uma
exceção.

Se uma instrução Try não contiver pelo menos um bloco Catch , ela deverá conter um
bloco Finally .

 Dica

Se você não precisar capturar exceções específicas, a instrução Using se


comportará como um bloco Try…Finally e garantirá o descarte dos recursos,
independentemente de como você sair do bloco. Isso é verdadeiro mesmo com
uma exceção sem tratamento. Para obter mais informações, consulte Instrução
using.

Argumento de exceção
O argumento exception do bloco Catch é uma instância da classe Exception ou uma
classe que deriva da classe Exception . A instância da classe Exception corresponde ao
erro que ocorreu no bloco Try .

As propriedades do objeto Exception ajudam a identificar a causa e o local de uma


exceção. Por exemplo, a propriedade StackTrace lista os métodos chamados que
levaram à exceção, ajudando você a encontrar onde o erro ocorreu no código. Message
retorna uma mensagem que descreve a exceção. HelpLink retorna um link para um
arquivo de Ajuda associado. InnerException retorna o objeto Exception que causou a
exceção atual ou retorna Nothing se não houver nenhum Exception original.

Considerações ao usar uma instrução Try…


Catch
Use uma instrução Try…Catch apenas para sinalizar a ocorrência de eventos de
programa incomuns ou inesperados. Os motivos para isso incluem o seguinte:
Capturar exceções em tempo de execução cria sobrecarga adicional e
provavelmente será mais lento do que a pré-verificação para evitar exceções.

Se um bloco Catch não for tratado corretamente, a exceção poderá não ser
relatada corretamente aos usuários.

O tratamento de exceções torna um programa mais complexo.

Nem sempre você precisa de uma instrução Try…Catch para verificar se há uma
condição que provavelmente ocorrerá. O exemplo a seguir verifica se um arquivo existe
antes de tentar abri-lo. Isso reduz a necessidade de capturar uma exceção gerada pelo
método OpenText.

VB

Private Sub TextFileExample(ByVal filePath As String)

' Verify that the file exists.

If System.IO.File.Exists(filePath) = False Then

Console.Write("File Not Found: " & filePath)

Else

' Open the text file and display its contents.

Dim sr As System.IO.StreamReader =

System.IO.File.OpenText(filePath)

Console.Write(sr.ReadToEnd)

sr.Close()

End If

End Sub

Verifique se o código em blocos Catch pode relatar corretamente exceções aos


usuários, seja por meio do registro em log thread-safe ou de mensagens apropriadas.
Caso contrário, as exceções podem permanecer desconhecidas.

Métodos assíncronos
Se marcar um método com o modificador Async, você poderá usar o operador Await no
método. Uma instrução com o operador Await suspende a execução do método até
que a tarefa aguardada seja concluída. A tarefa representa um trabalho em andamento.
Quando a tarefa que está associada ao operador Await for concluída, a execução será
retomada no mesmo método. Para obter mais informações, confira Fluxo de controle
em programas assíncronos.
Uma tarefa retornada por um método Async pode terminar em um estado com falha,
indicando que ela foi concluída devido a uma exceção sem tratamento. Uma tarefa
também pode terminar em um estado cancelado, o que resulta na expulsão de
OperationCanceledException da expressão await. Para capturar qualquer tipo de
exceção, coloque a expressão Await associada à tarefa em um bloco Try e capture a
exceção no bloco Catch . Um exemplo é fornecido posteriormente neste tópico.

Uma tarefa pode estar em um estado com falha porque várias exceções foram
responsáveis pela falha. Por exemplo, a tarefa pode ser o resultado de uma chamada
para Task.WhenAll. Quando você espera uma tarefa, a exceção capturada é somente
uma das exceções e não é possível prever qual exceção será capturada. Um exemplo é
fornecido posteriormente neste tópico.

Uma expressão Await não pode estar dentro de um bloco Catch ou Finally .

Iterators
Uma função iteradora ou um acessador Get realiza uma iteração personalizada em uma
coleção. Um iterador usa uma instrução Yield para retornar um elemento da coleção por
vez. Você chama uma função iteradora usando uma instrução For Each...Next.

Uma instrução Yield pode estar dentro de um bloco Try . Um bloco Try que contém
uma instrução Yield pode ter blocos Catch e pode ter um bloco Finally . Confira a
seção "Experimentar blocos no Visual Basic" de Iteradores para obter um exemplo.

Uma instrução Yield não pode estar dentro de um bloco Catch ou bloco Finally .

Se o corpo For Each (fora da função iteradora) lançar uma exceção, um bloco Catch na
função iteradora não será executado, mas um bloco Finally na função iteradora será
executado. Um bloco Catch dentro de uma função iteradora captura apenas exceções
que ocorrem dentro da função iteradora.

Situações de confiança parcial


Em situações de confiança parcial, como um aplicativo hospedado em um
compartilhamento de rede, Try...Catch...Finally não captura exceções de segurança
que ocorrem antes do método que contém a chamada ser invocado. O exemplo a
seguir, ao colocá-lo em um compartilhamento de servidor e executar desse local,
produz o erro "System.Security.SecurityException: Request Failed". Para obter mais
informações sobre exceções de segurança, confira a classe SecurityException.
VB

Try

Process.Start("http://www.microsoft.com")

Catch ex As Exception

Console.WriteLine("Can't load Web page" & vbCrLf & ex.Message)


End Try

Em uma situação de confiança parcial, você precisa colocar a instrução Process.Start


em um Sub separado. A chamada inicial para o Sub falhará. Isso permite que
Try...Catch o capture antes que o Sub que contém Process.Start seja iniciado e a
exceção de segurança seja produzida.

Exemplos

A estrutura de Try...Catch...Finally
O exemplo a seguir ilustra a estrutura da instrução Try...Catch...Finally .

VB

Public Sub TryExample()


' Declare variables.

Dim x As Integer = 5

Dim y As Integer = 0

' Set up structured error handling.

Try

' Cause a "Divide by Zero" exception.

x = x \ y

' This statement does not execute because program

' control passes to the Catch block when the

' exception occurs.

Console.WriteLine("end of Try block")

Catch ex As Exception

' Show the exception's message.

Console.WriteLine(ex.Message)

' Show the stack trace, which is a list of methods

' that are currently executing.

Console.WriteLine("Stack Trace: " & vbCrLf & ex.StackTrace)

Finally

' This line executes whether or not the exception occurs.

Console.WriteLine("in Finally block")

End Try

End Sub

Exceção em um método chamado de um bloco Try


No exemplo a seguir, o método CreateException gera um NullReferenceException . O
código que gera a exceção não está em um bloco Try . Portanto, o método
CreateException não manipula a exceção. O método RunSample manipula a exceção

porque a chamada para o método CreateException está em um bloco Try .

O exemplo inclui instruções Catch para diversos tipos de exceções, ordenadas da mais
específica para a mais geral.

VB

Public Sub RunSample()

Try

CreateException()

Catch ex As System.IO.IOException

' Code that reacts to IOException.

Catch ex As NullReferenceException

Console.WriteLine("NullReferenceException: " & ex.Message)


Console.WriteLine("Stack Trace: " & vbCrLf & ex.StackTrace)

Catch ex As Exception

' Code that reacts to any other exception.

End Try

End Sub

Private Sub CreateException()

' This code throws a NullReferenceException.

Dim obj = Nothing

Dim prop = obj.Name

' This code also throws a NullReferenceException.

'Throw New NullReferenceException("Something happened.")

End Sub

A instrução Catch When


O exemplo a seguir mostra como usar uma instrução Catch When para filtrar em uma
expressão condicional. Se a expressão condicional for avaliada como True , o código no
bloco Catch será executado.

VB

Private Sub WhenExample()

Dim i As Integer = 5

Try

Throw New ArgumentException()

Catch e As OverflowException When i = 5

Console.WriteLine("First handler")

Catch e As ArgumentException When i = 4

Console.WriteLine("Second handler")

Catch When i = 5

Console.WriteLine("Third handler")

End Try

End Sub

' Output: Third handler

Instruções Try aninhadas


O exemplo a seguir tem uma instrução Try…Catch contida em um bloco Try . O bloco
Catch interno gera uma exceção que tem a propriedade InnerException definida como

a exceção original. O bloco Catch externo relata a própria exceção e a exceção interna.

VB

Private Sub InnerExceptionExample()

Try

Try

' Set a reference to a StringBuilder.

' The exception below does not occur if the commented

' out statement is used instead.

Dim sb As System.Text.StringBuilder

'Dim sb As New System.Text.StringBuilder

' Cause a NullReferenceException.

sb.Append("text")

Catch ex As Exception

' Throw a new exception that has the inner exception

' set to the original exception.

Throw New ApplicationException("Something happened :(", ex)

End Try

Catch ex2 As Exception

' Show the exception.

Console.WriteLine("Exception: " & ex2.Message)

Console.WriteLine(ex2.StackTrace)

' Show the inner exception, if one is present.

If ex2.InnerException IsNot Nothing Then

Console.WriteLine("Inner Exception: " &


ex2.InnerException.Message)

Console.WriteLine(ex2.StackTrace)

End If

End Try

End Sub

Tratamento de exceções para métodos assíncronos


O exemplo a seguir ilustra o tratamento de exceção para métodos assíncronos. Para
capturar uma exceção que se aplica a uma tarefa assíncrona, a expressão Await está em
um bloco Try do chamador e a exceção é capturada no bloco Catch .

Remova a marca de comentário da linha Throw New Exception no exemplo para


demonstrar o tratamento de exceção. A exceção é capturada no bloco Catch , a
propriedade IsFaulted da tarefa é definida como True e a propriedade
Exception.InnerException da tarefa é definida como a exceção.

Remova a marca de comentário da linha Throw New OperationCancelledException para


demonstrar o que acontece quando você cancela um processo assíncrono. A exceção é
capturada no bloco Catch e a propriedade IsCanceled da tarefa é definida como True .
No entanto, em algumas condições que não se aplicam a este exemplo, a propriedade
IsFaulted é definida como True e IsCanceled é definido como False .

VB

Public Async Function DoSomethingAsync() As Task

Dim theTask As Task(Of String) = DelayAsync()

Try

Dim result As String = Await theTask

Debug.WriteLine("Result: " & result)

Catch ex As Exception

Debug.WriteLine("Exception Message: " & ex.Message)

End Try

Debug.WriteLine("Task IsCanceled: " & theTask.IsCanceled)

Debug.WriteLine("Task IsFaulted: " & theTask.IsFaulted)

If theTask.Exception IsNot Nothing Then

Debug.WriteLine("Task Exception Message: " &

theTask.Exception.Message)

Debug.WriteLine("Task Inner Exception Message: " &

theTask.Exception.InnerException.Message)

End If

End Function

Private Async Function DelayAsync() As Task(Of String)

Await Task.Delay(100)

' Uncomment each of the following lines to

' demonstrate exception handling.

'Throw New OperationCanceledException("canceled")

'Throw New Exception("Something happened.")

Return "Done"

End Function

' Output when no exception is thrown in the awaited method:

' Result: Done

' Task IsCanceled: False

' Task IsFaulted: False

' Output when an Exception is thrown in the awaited method:

' Exception Message: Something happened.

' Task IsCanceled: False

' Task IsFaulted: True

' Task Exception Message: One or more errors occurred.

' Task Inner Exception Message: Something happened.

' Output when an OperationCanceledException or TaskCanceledException

' is thrown in the awaited method:

' Exception Message: canceled

' Task IsCanceled: True

' Task IsFaulted: False

Tratamento de várias exceções em métodos assíncronos


O exemplo a seguir ilustra a manipulação de exceção em que várias tarefas podem
resultar em várias exceções. O bloco Try tem a expressão Await da tarefa retornada por
Task.WhenAll. A tarefa é concluída quando as três tarefas às quais Task.WhenAll se aplica
são concluídas.

Cada uma das três tarefas causa uma exceção. O bloco Catch itera por meio de
exceções, que são encontradas na propriedade Exception.InnerExceptions da tarefa
retornada por Task.WhenAll .

VB

Public Async Function DoMultipleAsync() As Task

Dim theTask1 As Task = ExcAsync(info:="First Task")

Dim theTask2 As Task = ExcAsync(info:="Second Task")


Dim theTask3 As Task = ExcAsync(info:="Third Task")

Dim allTasks As Task = Task.WhenAll(theTask1, theTask2, theTask3)

Try

Await allTasks

Catch ex As Exception

Debug.WriteLine("Exception: " & ex.Message)

Debug.WriteLine("Task IsFaulted: " & allTasks.IsFaulted)

For Each inEx In allTasks.Exception.InnerExceptions

Debug.WriteLine("Task Inner Exception: " + inEx.Message)

Next

End Try

End Function

Private Async Function ExcAsync(info As String) As Task

Await Task.Delay(100)

Throw New Exception("Error-" & info)

End Function

' Output:

' Exception: Error-First Task

' Task IsFaulted: True

' Task Inner Exception: Error-First Task

' Task Inner Exception: Error-Second Task

' Task Inner Exception: Error-Third Task

Confira também
Err
Exception
Instrução Exit
Instrução On Error
Melhores práticas para usar snippets de código
Tratamento de exceção
Instrução Throw
Instrução Using (Visual Basic)
Artigo • 22/02/2023 • 4 minutos para o fim da leitura

Declara o início de um bloco Using e, opcionalmente, adquire os recursos do sistema


que o bloco controla.

Sintaxe
VB

Using { resourcelist | resourceexpression }

[ statements ]

End Using

Partes
Termo Definição

resourcelist Obrigatório se você não fornecer resourceexpression . Lista de um ou mais


recursos do sistema que este bloco Using controla, separados por vírgulas.

resourceexpression Obrigatório se você não fornecer resourcelist . Variável ou expressão de


referência referente a um recurso do sistema a ser controlado por este
bloco Using .

statements Opcional. Bloco de instruções que Using executa.

End Using Obrigatórios. Encerra a definição do bloco Using e descarta todos os


recursos que ele controla.

Cada recurso na parte resourcelist tem as seguintes sintaxe e partes:

resourcename As New resourcetype [ ( [ arglist ] ) ]

-ou-

resourcename As resourcetype = resourceexpression

Partes da lista de recursos


Termo Definição
Termo Definição

resourcename Obrigatórios. Variável de referência que se refere a um recurso do sistema


que o bloco Using controla.

New Obrigatório se a instrução Using adquirir o recurso. Se você já adquiriu o


recurso, use a segunda alternativa de sintaxe.

resourcetype Obrigatórios. A classe do recurso. A classe precisa implementar a interface


IDisposable.

arglist Opcional. Lista de argumentos que você está passando para o construtor
para criar uma instância de resourcetype . Consulte a Lista de parâmetros.

resourceexpression Obrigatórios. Variável ou expressão referente a um recurso do sistema que


atende aos requisitos de resourcetype . Se você usar a segunda alternativa
de sintaxe, deverá adquirir o recurso antes de passar o controle para a
instrução Using .

Comentários
Às vezes, o código requer um recurso não gerenciado, como um identificador de
arquivo, um wrapper COM ou uma conexão SQL. Um bloco Using garante o descarte de
um ou mais desses recursos quando o código for concluído com eles. Isso os
disponibiliza para que outros códigos sejam usados.

Os recursos gerenciados são descartados pelo GC (coletor de lixo) do .NET Framework


sem qualquer codificação extra de sua parte. Você não precisa de um bloco Using para
recursos gerenciados. No entanto, você ainda pode usar um bloco Using para forçar o
descarte de um recurso gerenciado em vez de aguardar o coletor de lixo.

Um bloco Using tem três partes: aquisição, uso e descarte.

Aquisição significa criar uma variável e inicializá-la para fazer referência ao recurso
do sistema. A instrução Using pode adquirir um ou mais recursos, ou você pode
adquirir exatamente um recurso antes de inserir o bloco e fornecê-lo à instrução
Using . Se você fornecer resourceexpression , deverá adquirir o recurso antes de

passar o controle para a instrução Using .

Uso significa acessar os recursos e realizar ações com eles. As instruções entre
Using e End Using representam o uso dos recursos.

Descarte significa chamar o método Dispose no objeto em resourcename . Isso


permite que o objeto encerre os recursos de maneira limpa. A instrução End Using
descarta os recursos sob o controle do bloco Using .

Comportamento
Um bloco Using se comporta como uma construção Try ... Finally na qual Try usa os
recursos e Finally os descarta. Por isso, o bloco Using garante o descarte dos recursos,
independentemente de como você sai dele. Isso é verdade mesmo no caso de uma
exceção não tratada, exceto para StackOverflowException.

O escopo de cada variável de recurso adquirida pela instrução Using é limitado ao


bloco Using .

Se você especificar mais de um recurso do sistema na instrução Using , o efeito será o


mesmo que se você aninhasse blocos Using um dentro do outro.

Se resourcename for Nothing , nenhuma chamada para Dispose será feita e nenhuma
exceção será lançada.

Manipulação de Exceções Estruturadas em um


Bloco de Uso
Caso seja necessário tratar uma exceção que possa ocorrer dentro do bloco Using , você
pode adicionar uma construção Try ... Finally completa a ele. Se você precisar lidar com
o caso em que a instrução Using não for bem-sucedida na aquisição de um recurso,
poderá testar para ver se resourcename é Nothing .

Manipulação de Exceções Estruturadas em vez


de um Bloco de Uso
Se você precisar de um controle mais preciso sobre a aquisição dos recursos ou precisar
de código adicional no bloco Finally , poderá reescrever Using como uma construção
Try ... Finally . O exemplo a seguir mostra construções de esqueleto Try e Using que
são equivalentes na aquisição e alienação de resource .

VB

Using resource As New resourceType

' Insert code to work with resource.

End Using

' For the acquisition and disposal of resource, the following

' Try construction is equivalent to the Using block.

Dim resource As New resourceType

Try

' Insert code to work with resource.

Finally

If resource IsNot Nothing Then

resource.Dispose()

End If

End Try

7 Observação

O código dentro do bloco Using não deve atribuir o objeto resourcename a outra
variável. Quando você sai do bloco Using , o recurso é descartado e a outra variável
não pode acessar o recurso ao qual ele aponta.

Exemplo
O exemplo a seguir cria um arquivo chamado log.txt e grava duas linhas de texto no
arquivo. O exemplo também lê esse mesmo arquivo e exibe as linhas de texto:

Como as classes TextWriter e TextReader implementam a interface IDisposable, o código


pode usar instruções Using para garantir que o arquivo seja fechado corretamente após
as operações de gravação e leitura.

VB

Private Sub WriteFile()


Using writer As System.IO.TextWriter =
System.IO.File.CreateText("log.txt")

writer.WriteLine("This is line one.")

writer.WriteLine("This is line two.")

End Using

End Sub

Private Sub ReadFile()

Using reader As System.IO.TextReader =


System.IO.File.OpenText("log.txt")

Dim line As String

line = reader.ReadLine()

Do Until line Is Nothing

Console.WriteLine(line)

line = reader.ReadLine()

Loop

End Using

End Sub

Confira também
IDisposable
Instrução Try...Catch...Finally
Como descartar um recurso do sistema
Instrução While...End While (Visual
Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Executa uma série de instruções desde que a condição determinada seja True .

Sintaxe
VB

While condition

[ statements ]

[ Continue While ]

[ statements ]

[ Exit While ]

[ statements ]

End While

Partes
Termo Definição

condition Obrigatórios. Expressão Boolean . Se condition for Nothing , o Visual Basic o


tratará como False .

statements Opcional. Uma ou mais instruções após While , que são executadas sempre que
condition é True .

Continue Opcional. Transfere o controle para a próxima iteração do bloco While .


While

Exit While Opcional. Transfere o controle para fora do bloco While .

End While Obrigatórios. Finaliza a definição do bloco While .

Comentários
Use uma estrutura While...End While quando quiser repetir um conjunto de instruções
um número indefinido de vezes, desde que uma condição permaneça True . Se você
deseja mais flexibilidade com o local de teste da condição ou o resultado do teste,
talvez prefira a Instrução Do...Loop. Se você quiser repetir as instruções um número
definido de vezes, a instrução For...Next geralmente é uma opção melhor.

7 Observação

A palavra-chave While também é usada na Instrução Do...Loop, na Cláusula Skip


While e na Cláusula Take While.

Se condition for True , todos os statements serão executados até que a instrução End
While seja encontrada. Em seguida, o controle retorna para a instrução While e
condition é verificado novamente. Se condition ainda for True , o processo é repetido.

Se for False , o controle passa para a instrução que segue a instrução End While .

A instrução While sempre verifica a condição antes de iniciar o loop. O looping continua
enquanto a condição permanece True . Se condition for False quando você entrar no
loop pela primeira vez, ele não será executado.

A condition geralmente resulta de uma comparação de dois valores, mas pode ser
qualquer expressão avaliada como um valor de Tipo de dados booliano ( True ou
False ). Essa expressão pode incluir um valor de outro tipo de dados, como um tipo

numérico, que foi convertido em Boolean .

Você pode aninhar While loops colocando um loop dentro de outro. Você também
pode aninhar diferentes tipos de estruturas de controle entre eles. Para obter mais
informações, confira Estruturas de controle aninhadas.

Exit While
A instrução Exit While pode fornecer outra maneira de sair de um loop While . Exit
While transfere imediatamente o controle imediatamente para a instrução que segue

End While .

Exit While geralmente é usado após avaliação de alguma condição (por exemplo, em
uma estrutura If...Then...Else ). Talvez você queira sair de um loop se detectar uma
condição que torna desnecessário ou impossível continuar iterando, como um valor
errôneo ou uma solicitação de encerramento. Você pode usar Exit While ao testar uma
condição que pode causar um loop sem fim, que pode ser executado várias vezes ou até
mesmo infinitamente. Você pode usar Exit While para ignorar o loop.
Você pode colocar qualquer número de instruções Exit While em qualquer lugar no
loop While .

Quando usado em loops While aninhados, Exit While transfere o controle para fora do
loop mais interno e para dentro do próximo nível mais alto de aninhamento.

A instrução Continue While transfere o controle para a próxima iteração do loop. Para
obter mais informações, confira Instrução Continue.

Exemplo 1
No exemplo a seguir, as instruções no loop continuam a ser executadas até que a
variável index seja maior que 10.

VB

Dim index As Integer = 0

While index <= 10

Debug.Write(index.ToString & " ")

index += 1

End While

Debug.WriteLine("")

' Output: 0 1 2 3 4 5 6 7 8 9 10

Exemplo 2
O exemplo a seguir ilustra o uso das instruções Continue While e Exit While .

VB

Dim index As Integer = 0

While index < 100000

index += 1

' If index is between 5 and 7, continue

' with the next iteration.

If index >= 5 And index <= 8 Then

Continue While

End If

' Display the index.

Debug.Write(index.ToString & " ")

' If index is 10, exit the loop.

If index = 10 Then

Exit While

End If

End While

Debug.WriteLine("")

' Output: 1 2 3 4 9 10

Exemplo 3
O exemplo a seguir lê todas as linhas em um arquivo de texto. O método OpenText abre
o arquivo e retorna um StreamReader que lê os caracteres. Na condição While , o
método Peek do StreamReader determina se o arquivo contém caracteres adicionais.

VB

Private Sub ShowText(ByVal textFilePath As String)

If System.IO.File.Exists(textFilePath) = False Then

Debug.WriteLine("File Not Found: " & textFilePath)

Else

Dim sr As System.IO.StreamReader =
System.IO.File.OpenText(textFilePath)

While sr.Peek() >= 0

Debug.WriteLine(sr.ReadLine())

End While

sr.Close()

End If

End Sub

Confira também
Estruturas de Loop
Instrução Do...Loop
Instrução For...Next
Tipo de dados booliano
Estruturas de Controle Aninhadas
Instrução Exit
Instrução Continue
Instrução With...End With (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Executa uma série de instruções que referenciam repetidamente um único objeto ou


estrutura de modo que as instruções possam usar uma sintaxe simplificada para acessar
membros do objeto ou estrutura. Ao usar uma estrutura, você só poderá ler os valores
dos membros ou invocar métodos, e obterá um erro se tentar atribuir valores aos
membros de uma estrutura usada em uma instrução With...End With .

Sintaxe
VB

With objectExpression

[ statements ]

End With

Partes
Termo Definição

objectExpression Obrigatórios. Uma expressão que avalia como um objeto. A expressão pode
ser arbitrariamente complexa e é avaliada apenas uma vez. A expressão pode
ser avaliada como qualquer tipo de dados, inclusive tipos elementares.

statements Opcional. Uma ou mais instruções entre With e End With que podem fazer
referência a membros de um objeto que é gerado pela avaliação de
objectExpression .

End With Obrigatórios. Finaliza a definição do bloco With .

Comentários
Usando With...End With , você pode executar uma série de instruções em um objeto
especificado sem especificar o nome do objeto várias vezes. Dentro de um bloco de
instrução With , você pode especificar um membro do objeto que começa com um
ponto, como se o objeto de instrução With o precedesse.

Por exemplo, para alterar várias propriedades diferentes em um único objeto, coloque
as instruções de atribuição de propriedade dentro do bloco With...End With , fazendo
referência ao objeto apenas uma vez em vez de uma vez para cada atribuição de
propriedade.

Se seu código acessar o mesmo objeto em várias instruções, você ganhará os seguintes
benefícios usando a instrução With :

Você não precisa avaliar várias vezes uma expressão complexa ou atribuir o
resultado a uma variável temporária para fazer referência a seus membros várias
vezes.

Você torna seu código mais legível eliminando expressões aplicáveis repetitivas.

O tipo de dados de objectExpression pode ser qualquer tipo de classe ou estrutura, ou


até mesmo um tipo elementar do Visual Basic, como Integer . Se objectExpression
resultar em algo diferente de um objeto, você só poderá ler os valores de seus membros
ou invocar métodos, e obterá um erro se tentar atribuir valores aos membros de uma
estrutura usada em uma instrução With...End With . Esse é o mesmo erro que você
obteria se invocasse um método que retornasse uma estrutura e imediatamente
acessasse e atribuísse um valor a um membro do resultado da função, como
GetAPoint().x = 1 . O problema em ambos os casos é que a estrutura só existe na pilha

de chamadas, e não há como um membro da estrutura alterada nessas situações gravar


em um local de modo que qualquer outro código no programa possa observar a
alteração.

objectExpression é avaliada uma vez, ao entrar no bloco. Você não pode reatribuir

objectExpression de dentro do bloco With .

Dentro de um bloco With , você pode acessar os métodos e as propriedades de apenas


o objeto especificado sem qualificá-los. Você pode usar métodos e propriedades de
outros objetos, mas deverá qualificá-los com seus nomes de objeto.

Você pode colocar uma instrução With...End With dentro de outra. As instruções
With...End With aninhadas podem ser confusas se os objetos que estão sendo
referidos não são claros em termos de contexto. Você deve fornecer uma referência
totalmente qualificada a um objeto que esteja em um bloco With externo quando o
objeto é referenciado dentro de um bloco With interno.

Você não pode ramificar em uma instrução With de fora do bloco.

A menos que o bloco contenha um loop, as instruções são executadas somente uma
vez. Você pode aninhar diferentes tipos de estruturas de controle. Para obter mais
informações, confira Estruturas de controle aninhadas.
7 Observação

Você também pode usar a palavra-chave With em inicializadores de objetos. Para


obter mais informações e exemplos, consulte Inicializadores de objeto: tipos
nomeados e anônimos e Tipos anônimos.

Se você estiver usando um bloco With somente para inicializar as propriedades ou


os campos de um objeto que acabou de instanciar, considere usar um inicializador
do objeto como alternativa.

Exemplo 1
No exemplo a seguir, cada bloco With executa uma série de instruções em um único
objeto.

VB

Private Sub AddCustomer()

Dim theCustomer As New Customer

With theCustomer

.Name = "Coho Vineyard"

.URL = "http://www.cohovineyard.com/"

.City = "Redmond"

End With

With theCustomer.Comments

.Add("First comment.")

.Add("Second comment.")

End With

End Sub

Public Class Customer

Public Property Name As String

Public Property City As String

Public Property URL As String

Public Property Comments As New List(Of String)

End Class

Exemplo 2
O exemplo a seguir aninha instruções With…End With . Na instrução With aninhada, a
sintaxe faz referência ao objeto interno.
VB

Dim theWindow As New EntryWindow

With theWindow

With .InfoLabel

.Content = "This is a message."

.Foreground = Brushes.DarkSeaGreen

.Background = Brushes.LightYellow

End With

.Title = "The Form Title"

.Show()

End With

Confira também
List<T>
Estruturas de Controle Aninhadas
Inicializadores de objeto: tipos nomeados e anônimos
Tipos anônimos
Instrução Yield (Visual Basic)
Artigo • 07/04/2023 • 4 minutos para o fim da leitura

Envia o próximo elemento de uma coleção para uma instrução For Each...Next .

Sintaxe
VB

Yield expression

Parâmetros
Termo Definição

expression Obrigatórios. Uma expressão implicitamente conversível para o tipo da função


iteradora ou acessador Get que contém a instrução Yield .

Comentários
A instrução Yield retorna um elemento de uma coleção por vez. A instrução Yield é
incluída em uma função iteradora ou acessador Get , que executa iterações
personalizadas em uma coleção.

Você consome uma função iteradora usando um Instrução For Each...Next ou uma
consulta LINQ. Cada iteração do loop For Each chama a função iteradora. Quando uma
instrução Yield é alcançada na função iteradora, expression é retornado e o local atual
no código é mantido. A execução será reiniciada desse local na próxima vez que a
função iteradora for chamada.

Uma conversão implícita deve existir do tipo de expression na instrução Yield para o
tipo de retorno do iterador.

Você pode usar uma instrução Exit Function ou Return para terminar a iteração.

"Yield" não é uma palavra reservada e tem um significado especial somente quando é
usado em uma função Iterator ou acessador Get .
Para obter mais informações sobre funções iteradoras e acessadores Get , confira
Iteradores.

Funções iteradoras e obter acessadores


A declaração de uma função iteradora ou acessador Get deve atender aos seguintes
requisitos:

Ele deve incluir um modificador do Iterador.

O tipo de retorno deve ser IEnumerable, IEnumerable<T>, IEnumerator ou


IEnumerator<T>.

Ele não pode ter parâmetro ByRef .

Uma função iteradora não pode ocorrer em um evento, construtor de instância,


construtor estático ou destruidor estático.

Uma função iteradora pode ser uma função anônima. Para obter mais informações,
consulte Iteradores.

Tratamento de exceção
Uma instrução Yield pode estar dentro de um bloco Try de uma Instrução
Try...Catch...Finally. Um bloco Try que tem uma instrução Yield pode ter blocos Catch
e pode ter um bloco Finally .

Uma instrução Yield não pode estar dentro de um bloco Catch ou bloco Finally .

Se o corpo For Each (fora da função iteradora) lançar uma exceção, um bloco Catch na
função iteradora não será executado, mas um bloco Finally na função iteradora será
executado. Um bloco Catch dentro de uma função iteradora captura apenas exceções
que ocorrem dentro da função iteradora.

Implementação Técnica
O código a seguir retorna um IEnumerable (Of String) de uma função iteradora e, em
seguida, itera pelos elementos do IEnumerable (Of String) .

VB
Dim elements As IEnumerable(Of String) = MyIteratorFunction()

For Each element As String In elements

Next

A chamada a MyIteratorFunction não executa o corpo da função. Em vez disso, a


chamada retorna IEnumerable(Of String) na variável elements .

Em uma iteração do loop For Each , o método MoveNext é chamado para elements .
Essa chamada executará o corpo de MyIteratorFunction até que a próxima instrução
Yield seja atingida. A instrução Yield retorna uma expressão que determina não

apenas o valor da variável element para consumo pelo corpo do loop, mas também a
propriedade Current dos elementos, que é um IEnumerable (Of String) .

Em cada iteração subsequente do loop For Each , a execução do corpo do iterador


continuará de onde parou, parando novamente quando atingir uma instrução Yield . O
loop For Each é concluído quando o final da função do iterador ou uma instrução
Return ou Exit Function é atingida.

Exemplo 1
O exemplo a seguir tem uma instrução Yield que está dentro de um loop For…Next.
Cada iteração do corpo da instrução For Each em Main cria uma chamada para a
Power função de iterador. Cada chamada à função iteradora prossegue para a próxima

execução da instrução Yield que ocorre durante a próxima iteração do loop For…Next .

O tipo de retorno do método iterador é IEnumerable<T>, um tipo de interface de


iterador. Quando o método iterador é chamado, ele retorna um objeto enumerável que
contém as potências de um número.

VB

Sub Main()

For Each number In Power(2, 8)

Console.Write(number & " ")

Next

' Output: 2 4 8 16 32 64 128 256

Console.ReadKey()

End Sub

Private Iterator Function Power(

ByVal base As Integer, ByVal highExponent As Integer) _

As System.Collections.Generic.IEnumerable(Of Integer)

Dim result = 1

For counter = 1 To highExponent

result = result * base

Yield result

Next

End Function

Exemplo 2
O exemplo a seguir demonstra um acessador Get que é um iterador. A declaração de
propriedade inclui um modificador Iterator .

VB

Sub Main()

Dim theGalaxies As New Galaxies

For Each theGalaxy In theGalaxies.NextGalaxy

With theGalaxy

Console.WriteLine(.Name & " " & .MegaLightYears)

End With

Next

Console.ReadKey()

End Sub

Public Class Galaxies

Public ReadOnly Iterator Property NextGalaxy _

As System.Collections.Generic.IEnumerable(Of Galaxy)

Get

Yield New Galaxy With {.Name = "Tadpole", .MegaLightYears = 400}

Yield New Galaxy With {.Name = "Pinwheel", .MegaLightYears = 25}

Yield New Galaxy With {.Name = "Milky Way", .MegaLightYears = 0}

Yield New Galaxy With {.Name = "Andromeda", .MegaLightYears = 3}

End Get

End Property

End Class

Public Class Galaxy

Public Property Name As String

Public Property MegaLightYears As Integer

End Class

Para obter mais exemplos adicionais, consulte Iteradores.

Confira também
Instruções
Cláusulas (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os tópicos nesta seção documentam cláusulas em tempo de execução do Visual Basic.

Nesta seção
Alias

As

Alças

Implementações

In

Into

Of

Seções relacionadas
Referência da linguagem Visual Basic
Cláusula Alias (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Indica que um procedimento externo tem outro nome em sua DLL.

Comentários
A palavra-chave Alias pode ser usada neste contexto:

Instrução Declare

No exemplo a seguir, a palavra-chave Alias é usada para fornecer o nome da função


no advapi32.dll, GetUserNameA , que getUserName é usada no lugar deste exemplo. A
função getUserName é chamada no sub getUser , que exibe o nome do usuário atual.

VB

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (

ByVal lpBuffer As String, ByRef nSize As Integer) As Integer

Sub GetUser()

Dim buffer As String = New String(CChar(" "), 25)

Dim retVal As Integer = GetUserName(buffer, 25)

Dim userName As String = Strings.Left(buffer, InStr(buffer, Chr(0)) - 1)

MsgBox(userName)

End Sub

Confira também
Palavras-chave
Cláusula As (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Introduz uma cláusula As , que identifica um tipo de dados em uma instrução de


declaração ou uma lista de restrições em um parâmetro de tipo genérico.

Comentários
A palavra-chave As pode ser usada nestes dois contextos:

Cláusula Aggregate

Instrução Class

Instrução Const

Instrução Declare

Instrução Delegate

Instrução Dim

Instrução Enum

Instrução Event

Instruções For...Next

Instruções For Each...Next

Cláusula From

Instrução Function

Cláusula Group Join

Instrução Interface

Instrução Operator

Instrução Property

Instrução Structure

Instrução Sub
Instruções Try...Catch...Finally

Confira também
Como criar uma nova variável
Data Types
Declaração de Variável
Lista de Tipos
Tipos genéricos no Visual Basic
Palavras-chave
Cláusula Handles (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Declara se um procedimento manipula um evento especificado.

Sintaxe
VB

proceduredeclaration Handles eventlist

Partes
proceduredeclaration A declaração de procedimento Sub para o procedimento que

tratará o evento.

eventlist Lista dos eventos para proceduredeclaration tratar, separados por vírgulas.

Os eventos devem ser gerados pela classe base da classe atual ou por um objeto
declarado usando a palavra-chave WithEvents .

Comentários
Use a palavra-chave Handles no final de uma declaração de procedimento para fazer
com que ela lide com eventos gerados por uma variável de objeto declarada usando a
palavra-chave WithEvents . A palavra-chave Handles também pode ser usada em uma
classe derivada para manipular eventos de uma classe base.

A palavra-chave Handles e a instrução AddHandler permitem que você especifique que


procedimentos específicos manipulem eventos específicos, mas há diferenças. Use a
palavra-chave Handles ao definir um procedimento para especificar que ele manipula
um evento específico. A instrução AddHandler conecta procedimentos a eventos em
tempo de execução. Para obter mais informações, confira a Instrução AddHandler.

Para eventos personalizados, o aplicativo invoca o acessador AddHandler do evento


quando adiciona o procedimento como um manipulador de eventos. Para obter mais
informações sobre eventos personalizados, confira Instrução de evento.

Exemplo 1
VB

Public Class ContainerClass

' Module or class level declaration.

WithEvents Obj As New Class1

Public Class Class1


' Declare an event.

Public Event Ev_Event()

Sub CauseSomeEvent()

' Raise an event.

RaiseEvent Ev_Event()

End Sub

End Class

Sub EventHandler() Handles Obj.Ev_Event

' Handle the event.

MsgBox("EventHandler caught event.")

End Sub

' Call the TestEvents procedure from an instance of the ContainerClass

' class to test the Ev_Event event and the event handler.

Public Sub TestEvents()

Obj.CauseSomeEvent()

End Sub

End Class

O exemplo a seguir demonstra como uma classe derivada pode usar a instrução
Handles para manipular um evento de uma classe base.

VB

Public Class BaseClass

' Declare an event.

Event Ev1()

End Class

Class DerivedClass

Inherits BaseClass

Sub TestEvents() Handles MyBase.Ev1

' Add code to handle this event.

End Sub

End Class

Exemplo 2
O exemplo a seguir contém dois manipuladores de eventos de botão para um projeto
do Aplicativo WPF.

VB
Private Sub Button1_Click(sender As System.Object, e As
System.Windows.RoutedEventArgs) Handles Button1.Click

MessageBox.Show(sender.Name & " clicked")

End Sub

Private Sub Button2_Click(sender As System.Object, e As


System.Windows.RoutedEventArgs) Handles Button2.Click

MessageBox.Show(sender.Name & " clicked")

End Sub

Exemplo 3
O exemplo a seguir é equivalente ao exemplo anterior. A eventlist na cláusula Handles
contém os eventos para ambos os botões.

VB

Private Sub Button_Click(sender As System.Object, e As


System.Windows.RoutedEventArgs) Handles Button1.Click, Button2.Click

MessageBox.Show(sender.Name & " clicked")

End Sub

Confira também
WithEvents
Instrução AddHandler
Instrução RemoveHandler
Instrução Event
Instrução RaiseEvent
Eventos
Cláusula Implements (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Indica que um membro de classe ou estrutura está fornecendo a implementação para


um membro definido em uma interface.

Comentários
A palavra-chave Implements não é a mesma que a Instrução Implements. Você usa a
instrução Implements para especificar que uma classe ou estrutura implementa uma ou
mais interfaces e, em seguida, para cada membro, você usa a palavra-chave Implements
para especificar qual interface e qual membro ela implementa.

Se uma classe ou estrutura implementar uma interface, ela deverá incluir a instrução
Implements imediatamente após a Instrução Class ou a Instrução Structure e deve

implementar todos os membros definidos pela interface.

Reimplementação
Em uma classe derivada, você pode reimplementar um membro de interface que a
classe base já implementou. Isso é diferente de substituir o membro da classe base nos
seguintes aspectos:

O membro da classe base não precisa ser Substituível para ser reimplementado.
Você pode reimplementar o membro com outro nome.

A palavra-chave Implements pode ser usada nos seguintes contextos:

Instrução Event
Instrução Function
Instrução Property
Instrução Sub

Confira também
Instrução Implements
Instrução Interface
Instrução Class
Instrução Structure
Cláusula In (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica o grupo que a variável de loop deve percorrer em um loop For Each ou
especifica a coleção a ser consultada em uma cláusula From , Join ou Group Join .

Comentários
A palavra-chave In pode ser usada nos seguintes contextos:

Instrução For Each...Next

Cláusula From

Cláusula Join

Cláusula Group Join

Confira também
Palavras-chave
Cláusula Into (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Identifica funções de agregação ou agrupamentos a serem aplicados a uma coleção.

Comentários
A palavra-chave Each é usada nos seguintes contextos:

Cláusula Aggregate

Cláusula Group By

Cláusula Group Join

Confira também
Palavras-chave
Cláusula Of (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Introduz uma cláusula Of , que identifica um parâmetro de tipo em uma classe, uma
estrutura, uma interface, um delegado ou um procedimento genérico. Para obter
informações sobre tipos genéricos, confira Tipos Genéricos no Visual Basic.

Uso da palavra-chave
O exemplo de código a seguir usa a palavra-chave Of para definir a estrutura de tópicos
de uma classe que usa dois parâmetros de tipo. Ele restringe o parâmetro keyType pela
interface IComparable, o que significa que o código de consumo deve fornecer um
argumento de tipo que implementa IComparable. Isso é necessário para que o
procedimento add possa chamar o método IComparable.CompareTo. Para obter mais
informações sobre restrições, consulte Tipo de lista.

VB

Public Class Dictionary(Of entryType, keyType As IComparable)

Public Sub add(ByVal e As entryType, ByVal k As keyType)

Dim dk As keyType

If k.CompareTo(dk) = 0 Then

End If

End Sub

Public Function find(ByVal k As keyType) As entryType

End Function

End Class

Se você concluir a definição de classe anterior, poderá construir uma variedade de


classes dictionary com base nela. Os tipos que você fornece a entryType e keyType
determina que tipo de entrada a classe contém e que tipo de chave ela associa a cada
entrada. Devido à restrição, você deve fornecer a keyType um tipo que implementa
IComparable.

O exemplo de código a seguir cria um objeto que contém String entradas e associa
uma chave Integer a cada uma delas. Integer implementa IComparable e, portanto,
satisfaz a restrição em keyType .

VB

Dim d As New dictionary(Of String, Integer)

A palavra-chave Of pode ser usada nestes dois contextos:

Instrução Class

Instrução Delegate

Instrução Function

Instrução Interface

Instrução Structure

Instrução Sub

Confira também
IComparable
Lista de Tipos
Tipos genéricos no Visual Basic
In
Saída
Contextos de declaração e níveis de
acesso padrão (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Este tópico descreve quais tipos do Visual Basic podem ser declarados dentro de quais
outros tipos e qual o nível padrão deles, caso não sejam especificados.

Níveis de Contexto da declaração


O contexto de declaração de um elemento de programação é a região do código em
que ele é declarado. Geralmente, esse é outro elemento de programação, que é
chamado de elemento que contém.

Os níveis para contextos de declaração são os seguintes:

Nível do namespace – dentro de um arquivo de origem ou namespace, mas não


dentro de uma classe, estrutura, módulo ou interface

Nível do módulo – dentro de uma classe, estrutura, módulo ou interface, mas não
dentro de um procedimento ou bloco

Nível de procedimento – dentro de um procedimento ou bloco (como If ou For )

A tabela a seguir mostra os níveis de acesso padrão para vários elementos de


programação declarados, dependendo de seus contextos de declaração.

Elemento declarado Nível de Nível de módulo Nível de


namespace procedimento

Variável (Instrução Dim) Não Private ( Public em Structure , Public


permitido não permitido em Interface )

Constante (Instrução Const) Não Private ( Public em Structure , Public


permitido não permitido em Interface )

Enumeração (Instrução Friend Public Não permitido


Enum)

Classe (Instrução Class) Friend Public Não permitido

Estrutura (Instrução Friend Public Não permitido


Structure)

Módulo (Instrução Module) Friend Não permitido Não permitido


Elemento declarado Nível de Nível de módulo Nível de
namespace procedimento

Interface (Instrução Friend Public Não permitido


Interface)

Procedimento (Instrução Não Public Não permitido


Function, Instrução Sub) permitido

Referência externa Não Public (não permitido em Não permitido


(Instrução Declare) permitido Interface )

Operador (Instrução Não Public (não permitido em Não permitido


Operator) permitido Interface or Module )

Propriedade (Instrução Não Public Não permitido


Property) permitido

Propriedade padrão Não Public (não permitido em Module ) Não permitido


(Default) permitido

Evento (Instrução Event) Não Public Não permitido


permitido

Delegado (Instrução Friend Public Não permitido


Delegate)

Para obter mais informações, consulte Níveis de acesso no Visual Basic.

Confira também
Friend
Privado
Público
Lista de atributos (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Especifica os atributos a serem aplicados a um elemento de programação declarado.


Vários atributos são separados por vírgulas. A seguir está a sintaxe de um atributo.

Sintaxe
VB

[ attributemodifier ] attributename [ ( attributearguments |


attributeinitializer ) ]

Partes
Parte Descrição

attributemodifier Necessário para atributos aplicados no início de um arquivo de origem.


Pode ser Assembly ou Módulo.

attributename Obrigatórios. Nome do atributo.

attributearguments Opcional. Lista de argumentos posicionais para esse atributo. Vários


argumentos são separados por vírgulas.

attributeinitializer Opcional. Lista de inicializadores de propriedades ou variáveis para esse


atributo. Vários inicializadores são separados por vírgulas.

Comentários
Você pode aplicar um ou mais atributos a quase qualquer elemento de programação
(tipos, procedimentos, propriedades e assim por diante). Os atributos aparecem nos
metadados do assembly e podem ajudar você a anotar o código ou especificar como
usar um determinado elemento de programação. Você pode aplicar atributos definidos
pelo Visual Basic e pelo .NET Framework e pode definir os próprios atributos.

Para obter mais informações sobre quando usar atributos, confira a visão geral de
Atributos. Para obter informações sobre nomes de atributos, confira Nomes de
Elementos Declarados.
Regras
Posicionamento. Você pode aplicar atributos à maioria dos elementos de
programação declarados. Para aplicar um ou mais atributos, você coloca um bloco
de atributo no início da declaração do elemento. Cada entrada na lista de atributos
especifica um atributo que você deseja aplicar e o modificador e os argumentos
que você está usando para essa invocação do atributo.

Colchetes angulares. Se você fornecer uma lista de atributos, deverá colocá-la


entre colchetes angulares (" < " e " > ").

Parte da Declaração. O atributo deve fazer parte da declaração do elemento, não


uma instrução separada. Você pode usar a sequência de continuação de linha ("
_ ") para estender a instrução de declaração para várias linhas de código-fonte.

Modificadores. Um modificador de atributo ( Assembly ou Module ) é necessário em


cada atributo aplicado a um elemento de programação no início de um arquivo de
origem. Modificadores de atributo não são permitidos em atributos aplicados a
elementos que não estão no início de um arquivo de origem.

Argumentos. Todos os argumentos posicionais para um atributo devem preceder


qualquer inicializador de propriedade ou de variável.

Exemplo
O exemplo a seguir aplica o atributo DllImportAttribute a uma definição de esqueleto
de um procedimento Function .

VB

<DllImportAttribute("kernel32.dll", EntryPoint:="MoveFileW",

SetLastError:=True, CharSet:=CharSet.Unicode,

ExactSpelling:=True,

CallingConvention:=CallingConvention.StdCall)>

Public Shared Function MoveFile(ByVal src As String,

ByVal dst As String) As Boolean

' This function copies a file from the path src to the path dst.

' Leave this function empty. The DLLImport attribute forces calls

' to MoveFile to be forwarded to MoveFileW in KERNEL32.DLL.

End Function

DllImportAttribute indica que o procedimento atribuído representa um ponto de


entrada em uma BBL (biblioteca de vínculo dinâmico) não gerenciada. O atributo
fornece o nome da DLL como um argumento posicional e as outras informações como
inicializadores de variáveis.

Confira também
Assembly
Palavra-chave <Module>
Visão geral de atributos
Como: Quebrar e combinar instruções no código
Lista de parâmetros (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Especifica os parâmetros que um procedimento espera quando é chamado. Vários


parâmetros são separados por vírgulas. A sintaxe de um parâmetro está apresentada a
seguir.

Sintaxe
VB

[ <attributelist> ] [ Optional ] [{ ByVal | ByRef }] [ ParamArray ]

parametername[( )] [ As parametertype ] [ = defaultvalue ]

Partes
attributelist

Opcional. Lista de atributos que se aplicam a esse parâmetro. Você deve colocar a Lista
de atributos entre colchetes angulares (" < " e " > ").

Optional

Opcional. Especifica que esse parâmetro não é necessário quando o procedimento é


chamado.

ByVal

Opcional. Especifica que o procedimento não pode substituir ou reatribuir o elemento


variável subjacente ao argumento correspondente no código de chamada.

ByRef

Opcional. Especifica que o procedimento pode modificar o elemento de variável


subjacente no código de chamada da mesma forma que o próprio código de chamada
pode.

ParamArray

Opcional. Especifica que o último parâmetro na lista de parâmetros é uma matriz


opcional de elementos do tipo de dados especificado. Isso permite que o código de
chamada passe um número arbitrário de argumentos para o procedimento.

parametername

Obrigatórios. Nome da variável local que representa o parâmetro.


parametertype

Necessário se Option Strict for On . Tipo de dados da variável local que representa o
parâmetro.

defaultvalue

Necessário para parâmetros Optional . Qualquer expressão constante ou constante que


seja avaliada para o tipo de dados do parâmetro. Se o tipo for Object , ou uma classe,
interface, matriz ou estrutura, o valor padrão só poderá ser Nothing .

Comentários
Os parâmetros são cercados por parênteses e separados por vírgulas. Um parâmetro
pode ser declarado com qualquer tipo de dados. Se você não especificar parametertype ,
o padrão será Object .

Quando o código de chamada chama o procedimento, ele passa um argumento para


cada parâmetro necessário. Para obter mais informações, consulte Diferenças entre
parâmetros e argumentos.

O argumento que o código de chamada passa para cada parâmetro é um ponteiro para
um elemento subjacente no código de chamada. Se esse elemento for invariável (uma
constante, literal, enumeração ou expressão), é impossível para qualquer código alterá-
lo. Se ele for um elemento variável (uma variável declarada, campo, propriedade,
elemento de matriz ou elemento de estrutura), o código de chamada poderá alterá-lo.
Para obter mais informações, confira Diferenças entre argumentos modificáveis e não
modificáveis.

Se um elemento variável for passado ByRef , o procedimento também poderá alterá-lo.


Para obter mais informações, confira Diferenças entre passar um argumento por valor e
por referência.

Regras
Parênteses. Se você especificar uma lista de parâmetros, deverá colocá-la entre
parênteses. Se não houver parâmetros, você ainda poderá usar parênteses que
incluem uma lista vazia. Isso melhora a legibilidade do código esclarecendo que o
elemento é um procedimento.

Parâmetros opcionais. Se você usar o modificador Optional em um parâmetro,


todos os parâmetros subsequentes na lista também deverão ser opcionais e ser
declarados usando o modificador Optional .
Cada declaração de parâmetro opcional deve fornecer a cláusula defaultvalue .

Para obter mais informações, confira Parâmetros opcionais.

Matrizes de parâmetros. Você deve especificar ByVal para um parâmetro


ParamArray .

Você não pode usar Optional e ParamArray na mesma lista de parâmetros.

Para obter mais informações, confira Matriz de parâmetros.

Mecanismo para passar argumentos. O mecanismo padrão para cada argumento


é ByVal , o que significa que o procedimento não pode alterar o elemento de
variável subjacente. No entanto, se o elemento for um tipo de referência, o
procedimento poderá modificar o conteúdo ou os membros do objeto subjacente,
mesmo que ele não possa substituir ou reatribuir o objeto em si.

Nomes de parâmetros. Se o tipo de dados do parâmetro for uma matriz,


parametername deve estar imediatamente entre parênteses. Para obter mais

informações sobre nomes de parâmetro, confira Nomes de Elementos Declarados.

Exemplo
O exemplo a seguir mostra um procedimento Function que define dois parâmetros.

VB

Public Function HowMany(ByVal ch As Char, ByVal st As String) As Integer

End Function

Dim howManyA As Integer = HowMany("a"c, "How many a's in this string?")

Confira também
DllImportAttribute
Instrução Function
Instrução Sub
Instrução Declare
Instrução Structure
Instrução Option Strict
Visão geral de atributos
Como: Quebrar e combinar instruções no código
Lista de tipos (Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Especifica os parâmetros de tipo para um elemento de programação genérico. Vários


parâmetros são separados por vírgulas. A sintaxe de um parâmetro de tipo está
apresentada a seguir.

Sintaxe
VB

[genericmodifier] typename [ As constraintlist ]

Partes
Termo Definição

genericmodifier Opcional. Pode ser usado somente em interfaces genéricas e delegados. Você
pode declarar um tipo covariante usando a palavra-chave Out ou
contravariante usando a palavra-chave In. Consulte Covariância e
contravariância.

typename Obrigatórios. Nome do parâmetro de tipo. Esse é um espaço reservado, a ser


substituído por um tipo definido fornecido pelo argumento de tipo
correspondente.

constraintlist Opcional. Lista de requisitos que restringem o tipo de dados que pode ser
fornecido para typename . Se você tiver várias restrições, coloque-as entre
chaves ( { } ) e separe-as com vírgulas. Você deve introduzir a lista de
restrições com a palavra-chave As. Você usa As apenas uma vez, no início da
lista.

Comentários
Cada elemento de programação genérico deve ter pelo menos um parâmetro de tipo.
Um parâmetro de tipo é um espaço reservado para um tipo específico (um elemento
construído) que o código do cliente especifica quando cria uma instância do tipo
genérico. Você pode definir uma classe genérica, estrutura, interface, procedimento ou
delegado.
Para obter mais informações sobre quando definir um tipo genérico, confira Tipos
Genéricos no Visual Basic. Para obter mais informações sobre nomes de parâmetro de
tipo, confira Nomes de Elementos Declarados.

Regras
Parênteses. Se você fornecer uma lista de parâmetros de tipo, deverá colocá-la
entre parênteses e apresentar a lista com a palavra-chave Of. Você usa Of apenas
uma vez, no início da lista.

Restrições. Uma lista de restrições em um parâmetro de tipo pode incluir os


seguintes itens em qualquer combinação:

Qualquer número de interfaces. O tipo fornecido deve implementar todas as


interfaces nesta lista.

No máximo uma classe. O tipo fornecido deve herdar dessa classe.

A palavra-chave New . O tipo fornecido deve expor um construtor sem


parâmetros que o tipo genérico pode acessar. Isso será útil se você restringir
um parâmetro de tipo por uma ou mais interfaces. Um tipo que implementa
interfaces não necessariamente expõe um construtor e, dependendo do nível
de acesso de um construtor, o código dentro do tipo genérico pode não ser
capaz de acessá-lo.

A palavra-chave Class ou Structure . A palavra-chave Class restringe um


parâmetro de tipo genérico para exigir que o argumento de tipo passado para
ele seja um tipo de referência, como cadeia de caracteres, matriz ou delegado
ou um objeto criado por meio de uma classe. A palavra-chave Structure
restringe um parâmetro de tipo genérico para exigir que o argumento de tipo
passado para ele seja um tipo de valor, como estrutura, enumeração ou tipo de
dados elementar. Você não pode incluir Class e Structure no mesmo
constraintlist .

O tipo fornecido deve atender a todos os requisitos que você incluir em


constraintlist .

Restrições em cada parâmetro de tipo são independentes de restrições em outros


parâmetros de tipo.

Comportamento
Substituição do tempo de compilação. Ao criar um tipo construído por meio de
um elemento de programação genérico, você fornece um tipo definido para cada
parâmetro de tipo. O compilador do Visual Basic substitui o tipo fornecido para
cada ocorrência de typename dentro do elemento genérico.

Ausência de restrições. Se você não especificar nenhuma restrição em um


parâmetro de tipo, o código será limitado às operações e aos membros
compatíveis com o Tipo de Dados de Objeto para esse parâmetro de tipo.

Exemplo 1
O exemplo a seguir mostra uma definição de esqueleto de uma classe de dicionário
genérica, incluindo uma função de esqueleto para adicionar uma nova entrada ao
dicionário.

VB

Public Class dictionary(Of entryType, keyType As {IComparable, IFormattable,


New})

Public Sub add(ByVal et As entryType, ByVal kt As keyType)

Dim dk As keyType

If kt.CompareTo(dk) = 0 Then

End If

End Sub

End Class

Exemplo 2
Como dictionary é genérico, o código que o usa pode criar uma variedade de objetos
com base nele, cada um com a mesma funcionalidade, mas atuando em um tipo de
dados distinto. O exemplo a seguir mostra uma linha de código que cria um objeto
dictionary com entradas String e chaves Integer .

VB

Dim dictInt As New dictionary(Of String, Integer)

Exemplo 3
O exemplo a seguir mostra a definição de esqueleto equivalente gerada pelo exemplo
anterior.
VB

Public Class dictionary


Public Sub Add(ByVal et As String, ByVal kt As Integer)

Dim dk As Integer

If kt.CompareTo(dk) = 0 Then

End If

End Sub

End Class

Confira também
Of
Novo Operador
Níveis de acesso no Visual Basic
Tipo de dados Object
Instrução Function
Instrução Structure
Instrução Sub
Como: Usar uma classe genérica
Covariância e Contravariância
In
Saída
marcações XML recomendadas para
comentários da documentação (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O compilador do Visual Basic pode processar comentários de documentação em seu


código para um arquivo XML. Você pode usar ferramentas adicionais para processar o
arquivo XML na documentação.

Os comentários XML são processados em constructos de código tais como tipos e


membros de tipo. Para tipos parciais, apenas uma parte do tipo pode ter comentários
XML, embora não haja restrição para comentar seus membros.

7 Observação

Os comentários de documentação não podem ser aplicados a namespaces. O


motivo é que um namespace pode abranger vários assemblies e nem todos eles
precisam ser carregados ao mesmo tempo.

O compilador processará qualquer marca que seja um XML válido. As seguintes marcas
fornecem as funcionalidades geralmente usadas na documentação do usuário.

<c>
<code>
<example>
<exception>1
<include>1
<list>
<para>
<param>1
<paramref>
<permission>1
<remarks>
<returns>
<see>1
<seealso>1
<summary>
<typeparam>1
<value>
(1 O compilador verifica a sintaxe.)

7 Observação

Se você quiser que sejam exibidos colchetes angulares no texto de um comentário


de documentação, use &lt; e &gt; . Por exemplo, a cadeia de caracteres "&lt;text
in angle brackets&gt;" será exibida como <text in angle brackets> .

Confira também
Documentando o código com XML
-doc
Como criar documentação XML
<c> (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Indica que o texto dentro de uma descrição é código.

Sintaxe
XML

<c>text</c>

Parâmetros
Parâmetro Descrição

text O texto que você deseja indicar como código.

Comentários
A marca <c> oferece uma forma de indicar que o texto em uma descrição deve ser
marcado como código. Use <code> para indicar várias linhas como código.

Compile com -doc para processar comentários de documentação em um arquivo.

Exemplo
Este exemplo usa a marca <c> na seção resumo para indicar que Counter é código.

VB

''' <summary>

''' Resets the value of the <c>Counter</c> field.

''' </summary>

Public Sub ResetCounter()

counterValue = 0

End Sub

Private counterValue As Integer = 0

''' <summary>

''' Returns the number of times Counter was called.

''' </summary>

''' <value>Number of times Counter was called.</value>

Public ReadOnly Property Counter() As Integer

Get

counterValue += 1

Return counterValue

End Get

End Property

Confira também
Marcações de Comentário XML
<code> (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Indica que o texto tem várias linhas de código.

Sintaxe
XML

<code>content</code>

Parâmetros
content

O texto a ser marcado como código.

Comentários
Use a marca <code> para indicar várias linhas como código. Use <c> para indicar que o
texto dentro uma descrição deve ser marcado como código.

Compile com -doc para processar comentários de documentação em um arquivo.

Exemplo
Este exemplo usa a marca <code> para incluir o código de exemplo para usar o campo
ID .

VB

Public Class Employee

''' <remarks>

''' <example> This sample shows how to set the <c>ID</c> field.

''' <code>

''' Dim alice As New Employee

''' alice.ID = 1234

''' </code>

''' </example>

''' </remarks>

Public ID As Integer

End Class

Confira também
Marcações de Comentário XML
<example> (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica um exemplo do membro.

Sintaxe
XML

<example>description</example>

Parâmetros
description

Uma descrição do exemplo de código.

Comentários
A marca <example> permite especificar um exemplo de como usar um método ou outro
membro da biblioteca. Normalmente, isso envolve o uso da marca <code>.

Compile com -doc para processar comentários de documentação em um arquivo.

Exemplo
Este exemplo usa a marca <example> para incluir um exemplo de uso do campo ID .

VB

Public Class Employee

''' <remarks>

''' <example> This sample shows how to set the <c>ID</c> field.

''' <code>

''' Dim alice As New Employee

''' alice.ID = 1234

''' </code>

''' </example>

''' </remarks>

Public ID As Integer

End Class

Confira também
Marcações de Comentário XML
<exception> (Visual Basic)
Artigo • 06/04/2023 • 2 minutos para o fim da leitura

Especifica quais exceções podem ser geradas.

Sintaxe
XML

<exception cref="member">description</exception>

Parâmetros
member

Uma referência a uma exceção que está disponível no ambiente de compilação atual. O
compilador verifica se a exceção apresentada existe e move o member para o nome de
elemento canônico no XML de saída. member deve ser exibido entre aspas duplas (" ").

description

Uma descrição.

Comentários
Use a marca <exception> para especificar quais exceções podem ser geradas. Essa
marcação é aplicada a uma definição de método.

Compile com -doc para processar comentários de documentação em um arquivo.

Exemplo
Este exemplo usa a marca <exception> para descrever uma exceção que a função
IntDivide pode gerar.

VB

''' <exception cref="System.OverflowException">

''' Thrown when <paramref name="denominator"/><c> = 0</c>.

''' </exception>

Public Function IntDivide(

ByVal numerator As Integer,

ByVal denominator As Integer

) As Integer

Return numerator \ denominator

End Function

Confira também
Marcações de Comentário XML
<include> (Visual Basic)
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Refere-se a outro arquivo que descreve os tipos e membros em seu código-fonte.

Sintaxe
XML

<include file="filename" path="tagpath[@name='id']" />

Parâmetros
filename

Obrigatórios. O nome do arquivo que contém a documentação. O nome do arquivo


pode ser qualificado com um caminho. Coloque filename entre aspas duplas (" ").

tagpath

Obrigatórios. O caminho das marcas em filename que leva à marca name . Coloque o
caminho entre aspas duplas (" ").

name

Obrigatórios. O especificador de nome na marca que precede os comentários. Name terá


um id .

id

Obrigatórios. A ID da marca que precede os comentários. Coloque a ID entre aspas


simples (' ').

Comentários
Use a marca <include> para consultar comentários em outro arquivo que descreve os
tipos e membros em seu código-fonte. Essa é uma alternativa para inserir comentários
de documentação diretamente em seu arquivo de código-fonte.

A marca <include> usa a recomendação da linguagem XPath do W3C versão 1.0. Para
obter mais informações sobre formas de personalizar o uso do seu <include> , confira
https://www.w3.org/TR/xpath .
Exemplo
Este exemplo usa a marca <include> para importar comentários da documentação do
membro de um arquivo chamado commentFile.xml .

VB

''' <include file="commentFile.xml"

''' path="Docs/Members[@name='Open']/*" />

Public Sub Open(ByVal filename As String)

' Code goes here.

End Sub

''' <include file="commentFile.xml"

''' path="Docs/Members[@name='Close']/*" />

Public Sub Close(ByVal filename As String)

' Code goes here.

End Sub

O formato do commentFile.xml é o seguinte.

XML

<Docs>

<Members name="Open">

<summary>Opens a file.</summary>

<param name="filename">File name to open.</param>

</Members>

<Members name="Close">

<summary>Closes a file.</summary>

<param name="filename">File name to close.</param>

</Members>

</Docs>

Confira também
Marcações de Comentário XML
<list> (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Define uma lista ou tabela.

Sintaxe
XML

<list type="type">

<listheader>

<term>term</term>

<description>description</description>

</listheader>

<item>

<term>term</term>

<description>description</description>

</item>

</list>

Parâmetros
type

O tipo da lista. Deve ser um "marcador" para uma lista com marcadores, "número" para
uma lista numerada ou "tabela" para uma tabela de duas colunas.

term

Usado somente quando type é "tabela". Um termo a ser definido, que é definido na
marca de descrição.

description

Quando type é "marcador" ou "número", description é um item na lista Quando type


é "tabela", description é a definição de term .

Comentários
O bloco <listheader> define o título de uma tabela ou lista de definições. Ao definir
uma tabela, é necessário fornecer uma entrada para term no título.

Cada item na lista é especificado com um bloco <item> . Ao criar uma lista de definições,
é necessário especificar term e description . No entanto, para uma tabela, lista com
marcadores ou lista numerada, será necessário fornecer apenas uma entrada para
description .

Uma lista ou tabela pode ter quantos blocos <item> forem necessários.

Compile com -doc para processar comentários de documentação em um arquivo.

Exemplo
Este exemplo usa a marca <list> para definir uma lista com marcadores na seção de
comentários.

VB

''' <remarks>Before calling the <c>Reset</c> method, be sure to:

''' <list type="bullet">

''' <item><description>Close all connections.</description></item>

''' <item><description>Save the object state.</description></item>

''' </list>

''' </remarks>

Public Sub Reset()

' Code goes here.

End Sub

Confira também
Marcações de Comentário XML
<para> (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica que o conteúdo é formatado como um parágrafo.

Sintaxe
XML

<para>content</para>

Parâmetros
content

O texto do parágrafo.

Comentários
A marca <para> é para ser usada dentro de uma marca, como <summary>, <remarks>
ou <returns>, e permite adicionar estrutura ao texto.

Compile com -doc para processar comentários de documentação em um arquivo.

Exemplo
Este exemplo usa a marca <para> para dividir a seção de comentários do método
UpdateRecord em dois parágrafos.

VB

''' <param name="id">The ID of the record to update.</param>

''' <remarks>Updates the record <paramref name="id"/>.

''' <para>Use <see cref="DoesRecordExist"/> to verify that

''' the record exists before calling this method.</para>

''' </remarks>

Public Sub UpdateRecord(ByVal id As Integer)

' Code goes here.

End Sub

''' <param name="id">The ID of the record to check.</param>

''' <returns><c>True</c> if <paramref name="id"/> exists,

''' <c>False</c> otherwise.</returns>

''' <remarks><seealso cref="UpdateRecord"/></remarks>

Public Function DoesRecordExist(ByVal id As Integer) As Boolean

' Code goes here.

End Function

Confira também
Marcações de Comentário XML
<param> (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Define um nome de parâmetro e uma descrição.

Sintaxe
XML

<param name="name">description</param>

Parâmetros
name

O nome do parâmetro de um método. Coloque o nome entre aspas duplas (" ").

description

Uma descrição do parâmetro.

Comentários
A marca <param> deve ser usada no comentário para uma declaração de método para
descrever um dos parâmetros do método.

O texto da marca <param> será exibido nos seguintes locais:

Informações de parâmetro do IntelliSense. Para obter mais informações, veja


Usando o IntelliSense.

Pesquisador de Objetos. Para obter mais informações, consulte Exibindo a


estrutura do código.

Compile com -doc para processar comentários de documentação em um arquivo.

Exemplo
Este exemplo usa a marca <param> para descrever o parâmetro id .

VB
''' <param name="id">The ID of the record to update.</param>

''' <remarks>Updates the record <paramref name="id"/>.

''' <para>Use <see cref="DoesRecordExist"/> to verify that

''' the record exists before calling this method.</para>

''' </remarks>

Public Sub UpdateRecord(ByVal id As Integer)

' Code goes here.

End Sub

''' <param name="id">The ID of the record to check.</param>

''' <returns><c>True</c> if <paramref name="id"/> exists,

''' <c>False</c> otherwise.</returns>

''' <remarks><seealso cref="UpdateRecord"/></remarks>

Public Function DoesRecordExist(ByVal id As Integer) As Boolean

' Code goes here.

End Function

Confira também
Marcações de Comentário XML
<paramref> (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Formata uma palavra como um parâmetro.

Sintaxe
XML

<paramref name="name"/>

Parâmetros
name

O nome do parâmetro ao qual você deseja se referir. Coloque o nome entre aspas
duplas (" ").

Comentários
A marca <paramref> fornece uma forma de indicar que uma palavra é um parâmetro. O
arquivo XML pode ser processado para formatar esse parâmetro de uma forma distinta.

Compile com -doc para processar comentários de documentação em um arquivo.

Exemplo
Este exemplo usa a marca <paramref> para se referir ao parâmetro id .

VB

''' <param name="id">The ID of the record to update.</param>

''' <remarks>Updates the record <paramref name="id"/>.

''' <para>Use <see cref="DoesRecordExist"/> to verify that

''' the record exists before calling this method.</para>

''' </remarks>

Public Sub UpdateRecord(ByVal id As Integer)

' Code goes here.

End Sub

''' <param name="id">The ID of the record to check.</param>

''' <returns><c>True</c> if <paramref name="id"/> exists,

''' <c>False</c> otherwise.</returns>

''' <remarks><seealso cref="UpdateRecord"/></remarks>

Public Function DoesRecordExist(ByVal id As Integer) As Boolean

' Code goes here.

End Function

Confira também
Marcações de Comentário XML
<permission> (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica uma permissão necessária para o membro.

Sintaxe
XML

<permission cref="member">description</permission>

Parâmetros
member

Uma referência a um membro ou campo disponível para ser chamado do ambiente de


compilação atual. O compilador verifica se o elemento de código fornecido existe e
converte member no nome de elemento canônico no XML de saída. Coloque member
entre aspas (" ").

description

Uma descrição do acesso ao membro.

Comentários
Use a marca <permission> para documentar o acesso de um membro. Use a classe
PermissionSet para especificar o acesso a um membro.

Compile com -doc para processar comentários de documentação em um arquivo.

Exemplo
Este exemplo usa a marca <permission> para descrever que FileIOPermission é exigido
pelo método ReadFile .

VB

''' <permission cref="System.Security.Permissions.FileIOPermission">

''' Needs full access to the specified file.

''' </permission>

Public Sub ReadFile(ByVal filename As String)

' Code goes here.

End Sub

Confira também
Marcações de Comentário XML
<remarks> (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica uma seção de comentários para o membro.

Sintaxe
XML

<remarks>description</remarks>

Parâmetros
description

Uma descrição do membro.

Comentários
Use a marca <remarks> para adicionar informações sobre um tipo, complementando as
informações especificadas com <summary>.

Essas informações são exibidas no Pesquisador de Objetos. Para obter mais informações
sobre o Pesquisador de Objetos, consulte Exibir a estrutura do código.

Compile com -doc para processar comentários de documentação em um arquivo.

Exemplo
Este exemplo usa a marca <remarks> para explicar o que o método UpdateRecord faz.

VB

''' <param name="id">The ID of the record to update.</param>

''' <remarks>Updates the record <paramref name="id"/>.

''' <para>Use <see cref="DoesRecordExist"/> to verify that

''' the record exists before calling this method.</para>

''' </remarks>

Public Sub UpdateRecord(ByVal id As Integer)

' Code goes here.

End Sub

''' <param name="id">The ID of the record to check.</param>

''' <returns><c>True</c> if <paramref name="id"/> exists,

''' <c>False</c> otherwise.</returns>

''' <remarks><seealso cref="UpdateRecord"/></remarks>

Public Function DoesRecordExist(ByVal id As Integer) As Boolean

' Code goes here.

End Function

Confira também
Marcações de Comentário XML
<returns> (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica o valor retornado da propriedade ou da função.

Sintaxe
XML

<returns>description</returns>

Parâmetros
description

Uma descrição do valor retornado.

Comentários
Use a marca <returns> no comentário para uma declaração de método descrever o
valor retornado.

Compile com -doc para processar comentários de documentação em um arquivo.

Exemplo
Este exemplo usa a marca <returns> para explicar o que a função DoesRecordExist
retorna.

VB

''' <param name="id">The ID of the record to update.</param>

''' <remarks>Updates the record <paramref name="id"/>.

''' <para>Use <see cref="DoesRecordExist"/> to verify that

''' the record exists before calling this method.</para>

''' </remarks>

Public Sub UpdateRecord(ByVal id As Integer)

' Code goes here.

End Sub

''' <param name="id">The ID of the record to check.</param>

''' <returns><c>True</c> if <paramref name="id"/> exists,

''' <c>False</c> otherwise.</returns>

''' <remarks><seealso cref="UpdateRecord"/></remarks>

Public Function DoesRecordExist(ByVal id As Integer) As Boolean

' Code goes here.

End Function

Confira também
Marcações de Comentário XML
<see> (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica um link para outro membro.

Sintaxe
XML

<see cref="member"/>

Parâmetros
member

Uma referência a um membro ou campo disponível para ser chamado do ambiente de


compilação atual. O compilador verifica se o elemento de código fornecido existe e
passa member para o nome de elemento no XML de saída. member deve ser exibido entre
aspas duplas (" ").

Comentários
Use a marca <see> para especificar um link de dentro do texto. Use <seealso> para
indicar o texto que você deseja exibir em uma seção "Confira também".

Compile com -doc para processar comentários de documentação em um arquivo.

Exemplo
Este exemplo usa a marca <see> na seção de comentários UpdateRecord para fazer
referência ao método DoesRecordExist .

VB

''' <param name="id">The ID of the record to update.</param>

''' <remarks>Updates the record <paramref name="id"/>.

''' <para>Use <see cref="DoesRecordExist"/> to verify that

''' the record exists before calling this method.</para>

''' </remarks>

Public Sub UpdateRecord(ByVal id As Integer)

' Code goes here.

End Sub

''' <param name="id">The ID of the record to check.</param>

''' <returns><c>True</c> if <paramref name="id"/> exists,

''' <c>False</c> otherwise.</returns>

''' <remarks><seealso cref="UpdateRecord"/></remarks>

Public Function DoesRecordExist(ByVal id As Integer) As Boolean

' Code goes here.

End Function

Confira também
Marcações de Comentário XML
<seealso> (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica um link que aparece na seção Consulte Também.

Sintaxe
XML

<seealso cref="member"/>

Parâmetros
member

Uma referência a um membro ou campo disponível para ser chamado do ambiente de


compilação atual. O compilador verifica se o elemento de código fornecido existe e
passa member para o nome de elemento no XML de saída. member deve ser exibido entre
aspas duplas (" ").

Comentários
A marca <seealso> permite especificar o texto que você quer que seja exibido na seção
Confira também. Use <see> para especificar um link de dentro do texto.

Compile com -doc para processar comentários de documentação em um arquivo.

Exemplo
Este exemplo usa a marca <seealso> na seção de comentários DoesRecordExist para
fazer referência ao método UpdateRecord .

VB

''' <param name="id">The ID of the record to update.</param>

''' <remarks>Updates the record <paramref name="id"/>.

''' <para>Use <see cref="DoesRecordExist"/> to verify that

''' the record exists before calling this method.</para>

''' </remarks>

Public Sub UpdateRecord(ByVal id As Integer)

' Code goes here.

End Sub

''' <param name="id">The ID of the record to check.</param>

''' <returns><c>True</c> if <paramref name="id"/> exists,

''' <c>False</c> otherwise.</returns>

''' <remarks><seealso cref="UpdateRecord"/></remarks>

Public Function DoesRecordExist(ByVal id As Integer) As Boolean

' Code goes here.

End Function

Confira também
Marcações de Comentário XML
<summary> (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica o resumo do membro.

Sintaxe
XML

<summary>description</summary>

Parâmetros
description

Um resumo do objeto.

Comentários
Use a marca <summary> para descrever um tipo ou um membro de tipo. Use <remarks>
para adicionar mais informações a uma descrição de tipo.

O texto da marca <summary> é a única fonte de informações sobre o tipo no IntelliSense


e também é exibido no Pesquisador de objetos. Para obter mais informações sobre o
Pesquisador de Objetos, consulte Exibir a estrutura do código.

Compile com -doc para processar comentários de documentação em um arquivo.

Exemplo
Este exemplo usa a marca <summary> para descrever o método ResetCounter e a
propriedade Counter .

VB

''' <summary>

''' Resets the value of the <c>Counter</c> field.

''' </summary>

Public Sub ResetCounter()

counterValue = 0

End Sub

Private counterValue As Integer = 0

''' <summary>

''' Returns the number of times Counter was called.

''' </summary>

''' <value>Number of times Counter was called.</value>

Public ReadOnly Property Counter() As Integer

Get

counterValue += 1

Return counterValue

End Get

End Property

Confira também
Marcações de Comentário XML
<typeparam> (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Define um nome de parâmetro de tipo e uma descrição.

Sintaxe
XML

<typeparam name="name">description</typeparam>

Parâmetros
name

O nome do parâmetro de tipo. Coloque o nome entre aspas duplas (" ").

description

Uma descrição do parâmetro de tipo.

Comentários
Use a marca <typeparam> no comentário para um tipo genérico ou declaração de
membro genérico para descrever um dos parâmetros de tipo.

Compile com -doc para processar comentários de documentação em um arquivo.

Exemplo
Este exemplo usa a marca <typeparam> para descrever o parâmetro id .

VB

''' <typeparam name="T">

''' The base item type. Must implement IComparable.

''' </typeparam>

Public Class itemManager(Of T As IComparable)

' Insert code that defines class members.

End Class

Confira também
Marcações de Comentário XML
<value> (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica a descrição de uma propriedade.

Sintaxe
XML

<value>property-description</value>

Parâmetros
property-description

Uma descrição da propriedade.

Comentários
Use a marca <value> para descrever uma propriedade. Observe que quando você
adiciona uma propriedade usando o assistente de código no ambiente de
desenvolvimento do Visual Studio, ele adicionará uma marca <resumo> para a nova
propriedade. Então, você deve adicionar manualmente uma marca <value> para
descrever o valor que a propriedade representa.

Compile com -doc para processar comentários de documentação em um arquivo.

Exemplo
Este exemplo usa a marca <value> para descrever qual valor a propriedade Counter
contém.

VB

''' <summary>

''' Resets the value of the <c>Counter</c> field.

''' </summary>

Public Sub ResetCounter()

counterValue = 0

End Sub

Private counterValue As Integer = 0

''' <summary>

''' Returns the number of times Counter was called.

''' </summary>

''' <value>Number of times Counter was called.</value>

Public ReadOnly Property Counter() As Integer

Get

counterValue += 1

Return counterValue

End Get

End Property

Confira também
Marcações de Comentário XML
Propriedades do eixo XML (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os tópicos desta seção documentam a sintaxe de propriedades do eixo XML no Visual


Basic. As propriedades do eixo XML facilitam o acesso ao XML diretamente no seu
código.

Nesta seção
Tópico Descrição

Propriedade de Eixo do Descreve como acessar os atributos de um objeto XElement.


Atributo XML

Propriedade do Eixo Descreve como acessar os filhos de um objeto XElement.


Filho XML

Propriedade de Eixo Descreve como acessar os descendentes de um objeto XElement.


Descendente XML

Propriedade do Descreve como acessar elementos individuais em uma coleção de


Indexador de Extensão objetos XElement ou XAttribute.

Propriedade do Valor Descreve como acessar o valor do primeiro elemento de uma coleção
XML de objetos XElement ou XAttribute.

Confira também
XML
Propriedade de eixo do atributo XML
(Visual Basic)
Artigo • 07/04/2023 • 3 minutos para o fim da leitura

Fornece acesso ao valor de um atributo para um objeto XElement ou para o primeiro


elemento em uma coleção de objetos XElement.

Sintaxe
VB

object.@attribute

' -or-

object.@<attribute>

Partes
object Necessário. Um objeto XElement ou uma coleção de objetos XElement.

.@ Obrigatório. Denota o início de uma propriedade do eixo de atributo.

< Opcional. Denota o início do nome do atributo quando attribute não é um


identificador válido no Visual Basic.

attribute Necessário. Nome do atributo a ser acessado, do formulário [ prefix :] name .

Parte Descrição

prefix Opcional. O prefixo do namespace XML para o atributo. Deve ser um namespace XML
global definido com uma instrução Imports .

name Obrigatórios. Nome do Atributo local. Confira Nomes de elementos e atributos XML
declarados.

> Opcional. Denota o fim do nome do atributo quando attribute não é um


identificador válido no Visual Basic.

Valor Retornado
Uma cadeia de caracteres que contém o valor de attribute . Se o nome do atributo não
existir, Nothing será retornado.

Comentários
Você pode usar uma propriedade do eixo de atributo XML para acessar o valor de um
atributo por nome de um objeto XElement ou do primeiro elemento em uma coleção de
objetos XElement. Você pode recuperar um valor de atributo por nome ou adicionar um
novo atributo a um elemento especificando um novo nome precedido pelo identificador
@.

Quando você se refere ao atributo XML usando o identificador @, o valor do atributo é


retornado como uma cadeia de caracteres, e você não precisa especificar explicitamente
a propriedade Value.

As regras de nomenclatura para atributos XML diferem das regras de nomenclatura para
identificadores do Visual Basic. Para acessar um atributo XML que tenha um nome que
não seja um identificador válido do Visual Basic, coloque o nome entre colchetes
angulares (< e >).

Namespaces de XML
O nome em uma propriedade de eixo de atributo pode usar apenas prefixos de
namespace de XML declarados globalmente usando a instrução Imports . Ele não pode
usar prefixos de namespace de XML declarados localmente em literais de elemento
XML. Para obter mais informações, confira Instrução Imports (namespace de XML).

Exemplo 1
O exemplo a seguir mostra como obter os valores dos atributos XML nomeados type
de uma coleção de elementos XML nomeados phone .

VB

' Topic: XML Attribute Axis Property

Dim phones As XElement =

<phones>

<phone type="home">206-555-0144</phone>

<phone type="work">425-555-0145</phone>

</phones>

Dim phoneTypes As XElement =

<phoneTypes>

<%= From phone In phones.<phone>

Select <type><%= phone.@type %></type>

%>

</phoneTypes>

Console.WriteLine(phoneTypes)

Este código exibe o seguinte texto:

<phoneTypes>

<type>home</type>

<type>work</type>

</phoneTypes>

Exemplo 2
O exemplo a seguir mostra como criar atributos para um elemento XML
declarativamente, como parte do XML e dinamicamente adicionando um atributo a uma
instância de um objeto XElement. O atributo type é criado declarativamente e o
atributo owner é criado dinamicamente.

VB

Dim phone2 As XElement = <phone type="home">206-555-0144</phone>

phone2.@owner = "Harris, Phyllis"

Console.WriteLine(phone2)

Este código exibe o seguinte texto:

XML

<phone type="home" owner="Harris, Phyllis">206-555-0144</phone>

Exemplo 3
O exemplo a seguir usa a sintaxe de colchete angular para obter o valor do atributo
XML nomeado number-type , que não é um identificador válido no Visual Basic.

VB
Dim phone As XElement =

<phone number-type=" work">425-555-0145</phone>

Console.WriteLine("Phone type: " & phone.@<number-type>)

Este código exibe o seguinte texto:

Phone type: work

Exemplo 4
O exemplo a seguir declara ns como um prefixo de namespace de XML. Em seguida, ele
usa o prefixo do namespace para criar um literal XML e acessar o primeiro nó filho com
o nome qualificado " ns:name ".

VB

Imports <xmlns:ns = "http://SomeNamespace">

Class TestClass3

Shared Sub TestPrefix()

Dim phone =

<ns:phone ns:type="home">206-555-0144</ns:phone>

Console.WriteLine("Phone type: " & phone.@ns:type)

End Sub

End Class

Este código exibe o seguinte texto:

Phone type: home

Confira também
XElement
Propriedades do eixo XML
Literais XML
Criando XML no Visual Basic
Nomes de elementos e atributos XML declarados
Propriedade do eixo filho XML (Visual
Basic)
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Fornece acesso aos descendentes de um dos seguintes: um objeto de XElement , um


objeto de XDocument , uma coleção de objetos XElement , ou uma coleção de
XDocument objeto.

Sintaxe
VB

object.<child>

Partes
Termo Definição

object Obrigatórios. Um objeto XElement, um objeto XDocument, uma coleção de objetos


XElement ou uma coleção de objetos XDocument.

.< Obrigatórios. Denota o início de uma propriedade do eixo filho.

child Obrigatórios. Nome dos nós filhos a serem acessados, no formato [prefix:]name .

- Prefix - Opcional. Prefixo de namespace de XML para o nó filho. Deve ser um


namespace de XML global definido com uma instrução Imports .

- Name - Obrigatório. Nome do nó filho local. Confira Nomes de elementos e atributos


XML declarados.

> Obrigatórios. Denota o fim de uma propriedade do eixo filho.

Valor Retornado
Uma coleção de objetos XElement .

Comentários
Você pode usar uma propriedade de eixo filho XML para acessar nós filhos por nome de
um objeto XElement ou XDocument ou de uma coleção de objetos XElement ou
XDocument. Use a propriedade Value XML para acessar o valor do primeiro nó filho na
coleção retornada. Para obter mais informações, consulte Propriedade do Valor XML.

O compilador do Visual Basic converte as propriedades do eixo filho em chamadas para


o método Elements.

Namespaces de XML
O nome em uma propriedade de eixo filho pode usar apenas prefixos de namespace de
XML declarados globalmente com a instrução Imports . Ele não pode usar prefixos de
namespace de XML declarados localmente em literais de elemento XML. Para obter mais
informações, confira Instrução Imports (namespace de XML).

Exemplo 1
O exemplo a seguir mostra como acessar os nós filhos denominados phone do objeto
contact .

VB

Dim contact As XElement =

<contact>

<name>Patrick Hines</name>

<phone type="home">206-555-0144</phone>

<phone type="work">425-555-0145</phone>

</contact>

Dim homePhone = From hp In contact.<phone>

Where contact.<phone>.@type = "home"

Select hp

Console.WriteLine("Home Phone = {0}", homePhone(0).Value)

Este código exibe o seguinte texto:

Home Phone = 206-555-0144

Exemplo 2
O exemplo a seguir mostra como acessar os nós filhos nomeados phone da coleção
retornada pela propriedade do eixo filho contact do objeto contacts .

VB
Dim contacts As XElement =

<contacts>

<contact>

<name>Patrick Hines</name>

<phone type="home">206-555-0144</phone>

</contact>

<contact>

<name>Lance Tucker</name>

<phone type="work">425-555-0145</phone>

</contact>

</contacts>

Dim homePhone = From contact In contacts.<contact>

Where contact.<phone>.@type = "home"

Select contact.<phone>

Console.WriteLine("Home Phone = {0}", homePhone(0).Value)

Este código exibe o seguinte texto:

Home Phone = 206-555-0144

Exemplo 3
O exemplo a seguir declara ns como um prefixo de namespace de XML. Em seguida, ele
usa o prefixo do namespace para criar um literal do XML e acessar o primeiro nó filho
com o nome qualificado ns:name .

VB

Imports <xmlns:ns = "http://SomeNamespace">

Class TestClass4

Shared Sub TestPrefix()

Dim contact = <ns:contact>

<ns:name>Patrick Hines</ns:name>

</ns:contact>

Console.WriteLine(contact.<ns:name>.Value)

End Sub

End Class

Este código exibe o seguinte texto:

Patrick Hines
Confira também
XElement
Propriedades do eixo XML
Literais XML
Criando XML no Visual Basic
Nomes de elementos e atributos XML declarados
Propriedade de eixo descendente XML
(Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece acesso aos descendentes de um dos seguintes: um objeto de XElement, um


objeto de XDocument, uma coleção de objetos XElement, ou uma coleção de objetos
XDocument.

Sintaxe
VB

object...<descendant>

Partes
object Necessário. Um objeto XElement, um objeto XDocument, uma coleção de
objetos XElement ou uma coleção de objetos XDocument.

...< Necessário. Indica o início de uma propriedade de eixo descendente.

descendant Necessário. Nome dos nós descendentes a serem acessados, do formulário

[ prefix:]name .

Parte Descrição

prefix Opcional. Prefixo de namespace de XML para o nó descendente. Deve ser um


namespace de XML global definido usando uma instrução Imports .

name Obrigatórios. Nome local do nó descendente. Confira Nomes de elementos e atributos


XML declarados.

> Necessário. Indica o final de uma propriedade de eixo descendente.

Valor Retornado
Uma coleção de objetos XElement .

Comentários
Você pode usar uma propriedade de eixo descendente XML para acessar nós
descendentes por nome de um objeto XElement ou XDocument ou de uma coleção de
objetos XElement ou XDocument. Use a propriedade Value XML para acessar o valor do
primeiro nó descendente na coleção retornada. Para obter mais informações, consulte
Propriedade do Valor XML.

O compilador do Visual Basic converte propriedades do eixo descendente em chamadas


para o método Descendants.

Namespaces de XML
O nome em uma propriedade de eixo descendente pode usar apenas namespaces de
XML declarados globalmente com a instrução Imports . Ele não pode usar namespaces
de XML declarados localmente em literais de elemento XML. Para obter mais
informações, confira Instrução Imports (namespace de XML).

Exemplo 1
O exemplo a seguir mostra como acessar o valor do primeiro nó descendente
denominado name e os valores de todos os nós descendentes denominados phone do
objeto contacts .

VB

Dim contacts As XElement =

<contacts>

<contact>

<name>Patrick Hines</name>

<phone type="home">206-555-0144</phone>

<phone type="work">425-555-0145</phone>

</contact>

</contacts>

Console.WriteLine("Name: " & contacts...<name>.Value)

Dim homePhone = From phone In contacts...<phone>

Select phone.Value

Console.WriteLine("Home Phone = {0}", homePhone(0))

Este código exibe o seguinte texto:

Name: Patrick Hines


Home Phone = 206-555-0144

Exemplo 2
O exemplo a seguir declara ns como um prefixo de namespace de XML. Em seguida, ele
usa o prefixo do namespace para criar um literal do XML e acessar o valor do primeiro
nó filho com o nome qualificado ns:name .

VB

Imports <xmlns:ns = "http://SomeNamespace">

Class TestClass2

Shared Sub TestPrefix()

Dim contacts =

<ns:contacts>

<ns:contact>

<ns:name>Patrick Hines</ns:name>

</ns:contact>

</ns:contacts>

Console.WriteLine("Name: " & contacts...<ns:name>.Value)

End Sub

End Class

Este código exibe o seguinte texto:

Name: Patrick Hines

Confira também
XElement
Propriedades do eixo XML
Literais XML
Criando XML no Visual Basic
Nomes de elementos e atributos XML declarados
Propriedade do indexador de extensão
(Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece acesso aos elementos individuais em uma coleção.

Sintaxe
VB

object(index)

Partes
Termo Definição

object Obrigatórios. Uma coleção consultável. Ou seja, uma coleção que implementa
IEnumerable<T> ou IQueryable<T>.

( Obrigatórios. Denota o início da propriedade do indexador.

index Obrigatórios. Uma expressão inteira que especifica a posição baseada em zero de um
elemento da coleção.

) Obrigatórios. Denota o fim da propriedade do indexador.

Valor Retornado
O objeto do local especificado na coleção ou Nothing se o índice estiver fora do
intervalo.

Comentários
Você pode usar a propriedade indexador de extensão para acessar elementos
individuais em uma coleção. Essa propriedade indexador normalmente é usada na saída
das propriedades do eixo XML. As propriedades do eixo filho XML e XML descendente
retornam coleções de objetos XElement ou um valor de atributo.
O compilador do Visual Basic converte as propriedades do indexador de extensão em
chamadas para o método ElementAtOrDefault . Ao contrário de um indexador de matriz,
o método ElementAtOrDefault retornará Nothing se o índice estiver fora do intervalo.
Esse comportamento é útil quando você não pode determinar facilmente o número de
elementos em uma coleção.

Essa propriedade do indexador é como uma propriedade de extensão para coleções


que implementam IEnumerable<T> ou IQueryable<T>: ela é usada somente se a
coleção não tiver um indexador ou uma propriedade padrão.

Para acessar o valor do primeiro elemento em uma coleção de objetos XElement ou


XAttribute, você pode usar a propriedade do Value XML. Para obter mais informações,
consulte Propriedade do Valor XML.

Exemplo
O exemplo a seguir mostra como usar o indexador de extensão para acessar o segundo
nó filho em uma coleção de objetos XElement. A coleção é acessada usando a
propriedade do eixo filho, que obtém todos os elementos filho nomeados phone no
objeto contact .

VB

Dim contact As XElement =

<contact>

<name>Patrick Hines</name>

<phone type="home">206-555-0144</phone>

<phone type="work">425-555-0145</phone>

</contact>

Console.WriteLine("Second phone number: " & contact.<phone>(1).Value)

Este código exibe o seguinte texto:

Second phone number: 425-555-0145

Confira também
XElement
Propriedades do eixo XML
Literais XML
Criando XML no Visual Basic
Propriedade do Valor XML
Propriedade do valor XML (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Fornece acesso ao valor do primeiro elemento de uma coleção de objetos XElement.

Sintaxe
VB

object.Value

Partes
Termo Definição

object Obrigatórios. Coleção de objetos XElement.

Valor Retornado
Um String que contém o valor do primeiro elemento da coleção ou Nothing se a
coleção estiver vazia.

Comentários
A propriedade Value facilita o acesso ao valor do primeiro elemento em uma coleção de
objetos XElement. Essa propriedade verifica primeiro se a coleção contém pelo menos
um objeto. Se a coleção estiver vazia, essa propriedade retornará Nothing . Caso
contrário, essa propriedade retornará o valor da propriedade Value do primeiro
elemento na coleção.

7 Observação

Quando você acessa o valor de um atributo XML usando o identificador '@', o valor
do atributo é retornado como um String e você não precisa especificar
explicitamente a propriedade Value.
Para acessar outros elementos em uma coleção, você pode usar a propriedade do
indexador de extensão XML. Para obter mais informações, consulte Propriedade do
indexador de extensão.

Herança
A maioria dos usuários não precisará implementar IEnumerable<T> e, portanto, pode
ignorar esta seção.

A propriedade Value é uma propriedade de extensão para tipos que implementam


IEnumerable(Of XElement) . A associação dessa propriedade de extensão é como a

associação de métodos de extensão: se um tipo implementa uma das interfaces e define


uma propriedade que tem o nome "Value", essa propriedade tem precedência sobre a
propriedade de extensão. Em outras palavras, essa propriedade Value pode ser
substituída definindo uma nova propriedade em uma classe que implementa
IEnumerable(Of XElement) .

Exemplo 1
O exemplo a seguir mostra como usar a propriedade Value para acessar o primeiro nó
em uma coleção de objetos XElement. O exemplo usa a propriedade do eixo filho para
obter a coleção de todos os nós filho chamados phone que estão no objeto contact .

VB

Dim contact As XElement =

<contact>

<name>Patrick Hines</name>

<phone type="home">206-555-0144</phone>

<phone type="work">425-555-0145</phone>

</contact>

Console.WriteLine("Phone number: " & contact.<phone>.Value)

Este código exibe o seguinte texto:

Phone number: 206-555-0144

Exemplo 2
O exemplo a seguir mostra como obter o valor de um atributo XML de uma coleção de
objetos XAttribute. O exemplo usa a propriedade do eixo do atributo para exibir o valor
do atributo type para todos os elementos phone .

VB

Dim contact As XElement =

<contact>

<name>Patrick Hines</name>

<phone type="home">206-555-0144</phone>

<phone type="work">425-555-0145</phone>

</contact>

Dim types = contact.<phone>.Attributes("type")

For Each attr In types

Console.WriteLine(attr.Value)

Next

Este código exibe o seguinte texto:

Console

home

work

Confira também
XElement
IEnumerable<T>
Propriedades do eixo XML
Literais XML
Criando XML no Visual Basic
Métodos de Extensão
Propriedade do Indexador de Extensão
Propriedade do Eixo Filho XML
Propriedade de Eixo do Atributo XML
Literais XML (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os tópicos desta seção documentam a sintaxe de literais do XML no Visual Basic. A


sintaxe de literal do XML permite incorporar XML diretamente ao código.

Nesta seção
Tópico Descrição

Literal do Elemento XML Descreve a sintaxe de literais que representam objetos


XElement.

Literal de Documento XML Descreve a sintaxe de literais que representam objetos


XDocument.

Literal CDATA XML Descreve a sintaxe de literais que representam objetos


XCData.

Literal de Comentário XML Descreve a sintaxe de literais que representam objetos


XComment.

Literal de Instrução de Descreve a sintaxe de literais que representam objetos


Processamento XML XProcessingInstruction.

Confira também
XML
Literal do elemento XML (Visual Basic)
Artigo • 12/12/2022 • 5 minutos para o fim da leitura

Um literal que representa um objeto XElement.

Sintaxe
XML

<name [ attributeList ] />

-or-

<name [ attributeList ] > [ elementContents ] </[ name ]>

Partes
<

Obrigatórios. Abre a marca de elemento inicial.

name

Obrigatórios. Nome do elemento. O formato é um dos seguintes:

Texto literal para o nome do elemento, do formulário [ePrefix:]eName , em que:

Parte Descrição

ePrefix Opcional. O prefixo do namespace XML para o elemento. Deve ser um


namespace XML global definido com uma instrução Imports no arquivo ou
no nível do projeto, ou um namespace XML local definido neste elemento ou
um elemento pai.

eName Obrigatórios. Nome do elemento. O formato é um dos seguintes:

- Texto literal. Confira Nomes de elementos e atributos XML declarados.

- A expressão inserida da forma <%= eNameExp %> . O tipo de eNameExp deve


ser String ou um tipo de dados implicitamente conversível para XName.

Expressão inserida da forma <%= nameExp %> . O tipo de nameExp deve ser
String ou um tipo de dados implicitamente conversível para XName. Uma
expressão inserida não é permitida em uma marca de fechamento de um
elemento.
attributeList

Opcional. Lista de atributos declarados no literal.

attribute [ attribute ... ]

Cada attribute uma tem uma das seguintes sintaxes:

Atribuição de atributo, da forma [aPrefix:]aName=aValue , em que:

Parte Descrição

aPrefix Opcional. O prefixo do namespace XML para o atributo. Deve ser um


namespace XML global definido por uma instrução Imports , ou um
namespace XML local definido neste elemento ou um elemento pai.

aName Obrigatórios. Nome do atributo. O formato é um dos seguintes:

- Texto literal. Confira Nomes de elementos e atributos XML declarados.

- A expressão inserida da forma <%= aNameExp %> . O tipo de aNameExp deve


ser String ou um tipo de dados implicitamente conversível para XName.

aValue Opcional. Valor do atributo. O formato é um dos seguintes:

- Texto literal, entre aspas.

- A expressão inserida da forma <%= aValueExp %> . Qualquer tipo é permitido.

Expressão inserida da forma <%= aExp %> .

/>

Opcional. Indica que o elemento é um elemento vazio, sem conteúdo.

>

Obrigatórios. Termina a marca de elemento inicial ou vazia.

elementContents

Opcional. O conteúdo do elemento.

content [ content ... ]

Cada content pode ser uma destas opções:

Texto literal. Todo o espaço em branco elementContents se torna significativo se


houver algum texto literal.
Expressão inserida da forma <%= contentExp %> .

Literal do elemento XML.

Literal de comentário XML. Consulte Literal de comentário XML.

Literal de instrução de processamento XML. Consulte Literal de instrução de


processamento XML.

Literal CDATA XML. Consulte Literal CDATA XML.

</[name]>

Opcional. Representa a marca de fechamento do elemento. O parâmetro opcional


name não é permitido quando é o resultado de uma expressão inserida.

Valor Retornado
Um objeto XElement.

Comentários
Você pode usar a sintaxe literal do elemento XML para criar objetos XElement em seu
código.

7 Observação

Um literal do XML pode abranger várias linhas sem usar caracteres de continuação
de linha. Essa funcionalidade permite que você copie o conteúdo de um
documento XML e cole-o diretamente em um programa do Visual Basic.

Expressões inseridas do formulário <%= exp %> permitem adicionar informações


dinâmicas a um literal do elemento XML. Para obter mais informações, consulte
Expressões Inseridas em XML.

O compilador do Visual Basic converte o literal do elemento XML em chamadas para o


construtor XElement e, se for necessário, para o construtor XAttribute.

Namespaces de XML
Prefixos de namespace de XML são úteis quando você precisa criar literais do XML com
elementos do mesmo namespace muitas vezes no código. Você pode usar prefixos de
namespace de XML globais, que você define usando a instrução Imports , ou prefixos
locais, que você define usando a sintaxe do atributo xmlns:xmlPrefix="xmlNamespace" .
Para obter mais informações, confira Instrução Imports (namespace de XML).

De acordo com as regras de escopo para namespaces de XML, os prefixos locais têm
precedência sobre os prefixos globais. No entanto, se um literal do XML definir um
namespace de XML, esse namespace não estará disponível para expressões que
aparecem em uma expressão inserida. A expressão inserida pode acessar apenas o
namespace de XML global.

O compilador do Visual Basic converte cada namespace de XML global usado por um
literal do XML em uma definição de namespace local no código gerado. Namespaces de
XML globais que não são usados não aparecem no código gerado.

Exemplo 1
O exemplo a seguir mostra como criar um elemento XML simples que tenha dois
elementos vazios aninhados.

VB

Dim test1 As XElement =

<outer>

<inner1></inner1>

<inner2/>

</outer>

Console.WriteLine(test1)

O exemplo exibe o texto a seguir. Observe que o literal preserva a estrutura dos
elementos vazios.

XML

<outer>

<inner1></inner1>

<inner2 />

</outer>

Exemplo 2
O exemplo a seguir mostra como usar expressões inseridas para nomear um elemento e
criar atributos.
VB

Dim elementType = "book"

Dim authorName = "My Author"

Dim attributeName1 = "year"

Dim attributeValue1 = 1999

Dim attributeName2 = "title"

Dim attributeValue2 = "My Book"

Dim book As XElement =


<<%= elementType %>

isbn="1234"

author=<%= authorName %>

<%= attributeName1 %>=<%= attributeValue1 %>

<%= New XAttribute(attributeName2, attributeValue2) %>

/>

Console.WriteLine(book)

Este código exibe o seguinte texto:

XML

<book isbn="1234" author="My Author" year="1999" title="My Book" />

Exemplo 3
O exemplo a seguir declara ns como um prefixo de namespace de XML. Em seguida, ele
cria um literal do XML que usa o prefixo de namespace e exibe a forma final do
elemento.

VB

' Place Imports statements at the top of your program.

Imports <xmlns:ns="http://SomeNamespace">

Class TestClass1

Shared Sub TestPrefix()

' Create test using a global XML namespace prefix.

Dim inner2 = <ns:inner2/>

Dim test =

<ns:outer>

<ns:middle xmlns:ns="http://NewNamespace">

<ns:inner1/>

<%= inner2 %>

</ns:middle>

</ns:outer>

' Display test to see its final form.

Console.WriteLine(test)

End Sub

End Class

Este código exibe o seguinte texto:

XML

<ns:outer xmlns:ns="http://SomeNamespace">

<ns:middle xmlns:ns="http://NewNamespace">

<ns:inner1 />

<inner2 xmlns="http://SomeNamespace" />

</ns:middle>

</ns:outer>

Observe que o compilador converteu o prefixo do namespace de XML global em uma


definição de prefixo para o namespace de XML. O elemento <ns:middle> redefine o
prefixo de namespace de XML para o elemento <ns:inner1>. No entanto, o elemento
<ns:inner2> usa o namespace definido pela instrução Imports .

Confira também
XElement
Nomes de elementos e atributos XML declarados
Literal de Comentário XML
Literal CDATA XML
Literais XML
Criando XML no Visual Basic
Expressões inseridas no XML
Instrução Imports (namespace XML)
Literal de documento XML (Visual Basic)
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Um literal que representa um objeto XDocument.

Sintaxe
XML

<?xml version="1.0" [encoding="encoding"] [standalone="standalone"] ?>

[ piCommentList ]

rootElement

[ piCommentList ]

Partes
Termo Definição

encoding Opcional. Texto literal declarando qual codificação o documento usa.

standalone Opcional. Texto literal. Deve ser "sim" ou "não".

piCommentList Opcional. Lista de instruções de processamento XML e comentários XML. Tem o


seguinte formato:

piComment [ piComment ... ]

Cada piComment pode ser uma destas opções:

- Literal de instrução de processamento XML.

- Literal de comentário XML.

rootElement Obrigatórios. Elemento raiz do documento. O formato é um dos seguintes:

Literal do elemento XML.


Expressão inserida da forma <%= elementExp %> . O elementExp retornará
um dos seguintes:

Um objeto XElement.
Uma coleção que contém um objeto XElement e qualquer número de
objetos XProcessingInstruction e XComment.

Para obter mais informações, confira Expressões inseridas em XML.


Valor Retornado
Um objeto XDocument.

Comentários
Um literal de documento XML é identificado pela declaração XML no início do literal.
Embora cada literal de documento XML precise ter exatamente um elemento XML raiz,
ele pode ter qualquer número de instruções de processamento XML e comentários XML.

Um literal de documento XML não pode aparecer em um elemento XML.

7 Observação

Um literal do XML pode abranger várias linhas sem usar caracteres de continuação
de linha. Isso permite que você copie o conteúdo de um documento XML e cole-o
diretamente em um programa do Visual Basic.

O compilador do Visual Basic converte o literal do documento XML em chamadas para


os construtores XDocument e XDeclaration.

Exemplo
O exemplo a seguir cria um documento XML que tem uma declaração XML, uma
instrução de processamento, um comentário e um elemento que contém outro
elemento.

VB

Dim libraryRequest As XDocument =

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>

<?xml-stylesheet type="text/xsl" href="show_book.xsl"?>

<!-- Tests that the application works. -->

<books>

<book/>

</books>

Console.WriteLine(libraryRequest)

Confira também
XElement
XProcessingInstruction
XComment
XDocument
Literal de Instrução de Processamento XML
Literal de Comentário XML
Literal do Elemento XML
Literais XML
Criando XML no Visual Basic
Expressões inseridas no XML
Literal CDATA XML (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um literal que representa um objeto XCData.

Sintaxe
XML

<![CDATA[content]]>

Partes
<![CDATA[

Obrigatórios. Denota o início da seção CDATA XML.

content

Obrigatórios. Conteúdo de texto a ser exibido na seção CDATA XML.

]]>

Obrigatórios. Indica o final da seção.

Valor Retornado
Um objeto XCData.

Comentários
As seções CDATA XML contêm texto bruto que deve ser incluído, mas não analisado,
com o XML que o contém. Uma seção CDATA XML pode conter qualquer texto. Isso
inclui caracteres XML reservados. A seção CDATA XML termina com a sequência "]]>".
Isso significa o seguinte:

Você não pode usar uma expressão inserida em um literal CDATA XML porque os
delimitadores de expressão inseridos são conteúdo CDATA XML válido.

As seções CDATA XML não podem ser aninhadas, porque content não podem
conter o valor "]]>".
Você pode atribuir um literal CDATA XML a uma variável ou incluí-lo em um literal de
elemento XML.

7 Observação

Um literal XML pode abranger várias linhas, mas não usa caracteres de continuação
de linha. Isso permite que você copie o conteúdo de um documento XML e cole-o
diretamente em um programa do Visual Basic.

O compilador do Visual Basic converte o literal de CDATA XML em uma chamada para o
construtor XCData.

Exemplo
O exemplo a seguir cria uma seção CDATA que contém o texto "Pode conter marcas
<XML> literais".

VB

Dim cdata As XCData = <![CDATA[Can contain literal <XML> tags]]>

Confira também
XCData
Literal do Elemento XML
Literais XML
Criando XML no Visual Basic
Literal de comentário XML (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um literal que representa um objeto XComment.

Sintaxe
XML

<!-- content -->

Partes
Termo Definição

<!-- Obrigatórios. Indica o início do comentário XML.

content Obrigatórios. Texto a ser exibido no comentário XML. Não é possível conter uma série
de dois hifens (--) ou terminar com um hífen adjacente à marca de fechamento.

--> Obrigatórios. Indica o fim do comentário XML.

Valor Retornado
Um objeto XComment.

Comentários
Literais de comentário XML não contêm conteúdo de documento. Eles contêm
informações sobre o documento. A seção comentário XML termina com a sequência "--
>". Isso significa o seguinte:

Você não pode usar uma expressão inserida em um literal de comentário XML
porque os delimitadores de expressão inseridos são conteúdo de comentário XML
válido.

As seções de comentário XML não podem ser aninhadas, porque content não
podem conter o valor "-->".
Você pode atribuir um literal de comentário XML a uma variável ou incluí-lo em um
literal de elemento XML.

7 Observação

Um literal do XML pode abranger várias linhas sem usar caracteres de continuação
de linha. Essa funcionalidade permite que você copie o conteúdo de um
documento XML e cole-o diretamente em um programa do Visual Basic.

O compilador do Visual Basic converte o literal de comentário XML em uma chamada


para o construtor XComment.

Exemplo
O exemplo a seguir cria um comentário XML que contém o texto "Isso é um
comentário".

VB

Dim com As XComment = <!-- This is a comment -->

Confira também
XComment
Literal do Elemento XML
Literais XML
Criando XML no Visual Basic
Literal de instrução de processamento
XML (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um literal que representa um objeto XProcessingInstruction.

Sintaxe
XML

<?piName [ = piData ] ?>

Partes
<?

Obrigatórios. Denota o início do literal de instrução de processamento XML.

piName

Obrigatórios. Nome que indica qual aplicativo a instrução de processamento tem como
destino. Não é possível começar com "xml" ou "XML".

piData

Opcional. Cadeia de caracteres que indica como o aplicativo direcionado por piName
deve processar o documento XML.

?>

Obrigatórios. Indica o fim da instrução de processamento.

Valor Retornado
Um objeto XProcessingInstruction.

Comentários
Literais de instrução de processamento XML indicam como os aplicativos devem
processar um documento XML. Quando um aplicativo carrega um documento XML, o
aplicativo pode verificar as instruções de processamento XML para determinar como
processar o documento. O aplicativo interpreta o significado de piName e piData .
O literal do documento XML usa sintaxe semelhante à da instrução de processamento
XML. Para saber mais, confira Literal de documento XML.

7 Observação

O elemento piName não pode começar com as cadeias de caracteres "xml" ou


"XML", porque a especificação XML 1.0 reserva esses identificadores.

Você pode atribuir um literal de instrução de processamento XML a uma variável ou


incluí-lo em um literal de documento XML.

7 Observação

Um literal do XML pode abranger várias linhas, mas não usa caracteres de
continuação de linha. Isso permite que você copie o conteúdo de um documento
XML e cole-o diretamente em um programa do Visual Basic.

O compilador do Visual Basic converte o literal de instrução de processamento XML em


uma chamada para o construtor XProcessingInstruction.

Exemplo
O exemplo a seguir cria uma instrução de processamento que identifica uma folha de
estilos para um documento XML.

VB

Dim pi As XProcessingInstruction =

<?xml-stylesheet type="text/xsl" href="show_book.xsl"?>

Confira também
XProcessingInstruction
Literal de Documento XML
Literais XML
Criando XML no Visual Basic
Mensagens de erro no Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Quando você compila ou executa um aplicativo do Visual Basic, podem ocorrer os


seguintes tipos de erros:

Erros em tempo de compilação, que ocorrem quando você compila um aplicativo.

Erros em tempo de execução, que ocorrem quando um aplicativo está em


execução.

Para obter informações sobre como solucionar um erro específico, consulte Recursos
adicionais para programadores do Visual Basic.

Erros de tempo de execução


Se um aplicativo do Visual Basic tentar realizar uma ação que o sistema não pode
executar, ocorrerá um erro em tempo de execução, e o Visual Basic gerará um objeto
Exception. O Visual Basic pode gerar erros personalizados de qualquer tipo de dados,
inclusive objetos Exception usando a instrução Throw . Um aplicativo pode identificar o
erro exibindo o número do erro e a mensagem de uma exceção capturada. Se não for
detectado um erro, o aplicativo será encerrado.

O código pode interceptar e examine os erros em tempo de execução. Se você colocar


o código que produz o erro em um bloco Try , você poderá capturar qualquer erro
gerado em um bloco Catch correspondente. Para obter informações sobre como
interceptar erros em tempo de execução e responder a eles em seu código, consulte
Instrução Try... Catch... Finally.

Erros em tempo de compilação


Se o compilador do Visual Basic encontrar um problema no código, ocorrerá um erro
em tempo de compilação. No editor de código do Visual Studio, você pode identificar
facilmente qual linha de código causou o erro, pois aparece uma linha ondulada sob
essa linha. A mensagem de erro será exibida se você apontar para a linha ondulada ou
abrir a Lista de Erros, que também mostra outras mensagens.

Se um identificador tiver uma linha ondulada e um sublinhado curto exibidos abaixo do


caractere mais à direita, você poderá gerar um stub para tal classe, construtor, método,
propriedade, campo ou enumeração. Para obter mais informações, consulte Gerar do
Uso (Visual Studio).

Ao resolver os avisos do compilador do Visual Basic, você poderá escrever um código


que é executado mais rápido e com menos erros. Esses avisos identificam códigos que
podem causar erros quando o aplicativo é executado. Por exemplo, o compilador
avisará se você tentar invocar um membro de uma variável de objeto não atribuída,
retornar de uma função sem definir o valor retornado ou executar um bloco Try com
erros na lógica para capturar exceções. Para obter mais informações sobre avisos,
incluindo como ativar e desativar, consulte Configurando avisos no Visual Basic.
BC30663: o atributo '<attributename>'
não pode ser aplicado várias vezes
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O atributo só pode ser aplicado a uma vez. O atributo AttributeUsage determina se ele
pode ser aplicado mais de uma vez.

ID do erro: BC30663

Para corrigir este erro


1. Verifique se o atributo só é aplicado uma vez.

2. Se você estiver usando atributos personalizados desenvolvidos, considere alterar


AttributeUsage para permitir o uso de vários deles, como no exemplo a seguir.

VB

<AttributeUsage(AllowMultiple := True)>

Confira também
AttributeUsageAttribute
Criando atributos personalizados
AttributeUsage
BC32500: '<attribute>' não pode ser
aplicado porque o formato '<number>'
do GUID não está correto
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um bloco de atributo COMClassAttribute especifica um GUID (identificador global


exclusivo) que não está em conformidade com o formato adequado para um GUID.
COMClassAttribute usa GUIDs para identificar exclusivamente a classe, a interface e o

evento de criação.

Um GUID consiste em 16 bytes, dos quais os oito primeiros são numéricos e os oito
últimos são binários. Ele é gerado por utilitários da Microsoft, como uuidgen.exe e tem a
garantia de ser exclusivo no espaço e no tempo.

ID do erro: BC32500

Para corrigir este erro


1. Determine o GUID ou GUIDs corretos necessários para identificar o objeto COM.

2. Verifique se as cadeias de caracteres GUID apresentadas ao bloco do atributo


COMClassAttribute são copiadas corretamente.

Confira também
Guid
Visão geral de atributos
BC30014: '#ElseIf' deve ser precedido
por um '#If' ou '#ElseIf' correspondente
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

#ElseIf é uma diretiva de compilação condicional. Uma cláusula #ElseIf deve ser
precedida por uma cláusula #If ou #ElseIf correspondente.

ID do erro: BC30014

Para corrigir este erro


1. Verifique se uma diretiva #If ou #ElseIf precedente não foi separada de #ElseIf
por um bloco de compilação condicional intermediário ou de #End If colocada
incorretamente.

2. Se o valor #ElseIf for precedido por uma diretiva #Else , remova o #Else ou
altere-o para um #ElseIf .

3. Se todo o resto estiver em ordem, adicione uma diretiva #If ao início do bloco de
compilação condicional.

Confira também
Diretivas #If...Then...#Else
BC32025: as instruções '#Region' e
'#End Region' não são válidas dentro
dos corpos/lambdas de várias linhas do
método
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O bloco #Region deve ser declarado em um nível de classe, de módulo ou de


namespace. Uma região recolhível pode incluir um ou mais procedimentos, mas não
pode começar ou terminar dentro de um deles.

ID do erro: BC32025

Para corrigir este erro


1. Verifique se o procedimento anterior foi terminado corretamente com uma
instrução End Function ou End Sub .

2. Verifique se as diretivas #Region e #End Region estão no mesmo bloco de código.

Confira também
Diretiva #Region
BC40029: '<classname>' não é
compatível com CLS porque a interface
'<interfacename>' implementada não é
compatível com CLS
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma classe ou interface é marcada como <CLSCompliant(True)> quando deriva ou


implementa um tipo marcado como <CLSCompliant(False)> ou não é marcada.

Para que uma classe ou interface esteja em conformidade com o CLS (Independência de
Linguagem e Componentes Independente de Linguagem), toda a hierarquia de herança
precisa estar em conformidade. Isso significa que todos os tipos dos quais herdam,
direta ou indiretamente, precisam estar em conformidade. Da mesma maneira, se uma
classe implementar uma ou mais interfaces, todas elas deverão estar em conformidade
em todas as hierarquias de herança.

Quando você aplica o CLSCompliantAttribute a um elemento de programação, define o


parâmetro isCompliant do atributo como True ou False para indicar conformidade ou
não conformidade. Não há nenhum padrão para esse parâmetro e você precisa fornecer
um valor.

Se você não aplicar o CLSCompliantAttribute a um elemento, ele será considerado que


não está em conformidade.

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratar os avisos como erros, consulte Configurar avisos no Visual Basic.

ID do Erro: BC40029

Para corrigir este erro


Se você precisar de conformidade com CLS, defina esse tipo dentro de uma
hierarquia de herança ou um esquema de implementação diferente.

Se você exigir que esse tipo permaneça dentro de sua hierarquia de herança ou
esquema de implementação atual, remova o CLSCompliantAttribute da definição
ou marque-o como <CLSCompliant(False)> .
BC40008: '<elementname>' está
obsoleto (aviso do Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma instrução tenta acessar um elemento de programação que foi marcado com o
atributo ObsoleteAttribute e a diretiva para tratá-lo como um aviso.

Você pode marcar qualquer elemento de programação como não mais em uso
aplicando ObsoleteAttribute a ele. Se você fizer isso, poderá definir a propriedade
IsError do atributo como True ou False . Se você definir como True , o compilador
tratará uma tentativa de usar o elemento como um erro. Se você definir como False ou
deixar como padrão de False , o compilador emitirá um aviso se houver uma tentativa
de usar o elemento.

Por padrão, essa mensagem é um aviso, pois a propriedade IsError de ObsoleteAttribute


é False . Para obter mais informações sobre como ocultar avisos ou tratar avisos como
erros, consulte Configurar avisos no Visual Basic.

ID do Erro: BC40008

Para corrigir este erro


Verifique se a referência de código-fonte está soletrando o nome do elemento
corretamente.

Confira também
Visão geral de atributos
BC32022: '<eventname>' é um evento e
não pode ser chamado diretamente
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

'< eventname >' é um evento; por isso, não pode ser chamado diretamente. Use uma
instrução RaiseEvent para gerar um evento.

Uma chamada de procedimento especifica um evento para o nome do procedimento.


Um manipulador de eventos é um procedimento, mas o evento em si é um dispositivo
de sinalização que deve ser gerado e manipulado.

ID do Erro: BC32022

Para corrigir este erro


Use uma instrução RaiseEvent para sinalizar um evento e invocar o procedimento
ou os procedimentos que a manipulam.

Confira também
Instrução RaiseEvent
BC32061: '<expression>' não pode ser
usado como uma restrição de tipo
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma lista de restrições inclui uma expressão que não representa uma restrição válida
em um parâmetro de tipo.

Uma lista de restrições impõe requisitos ao argumento de tipo passado para o


parâmetro de tipo. Você pode especificar os seguintes requisitos em qualquer
combinação:

O argumento de tipo deve implementar uma ou mais interfaces

O argumento de tipo deve herdar de uma classe, no máximo

O argumento de tipo deve expor um construtor sem parâmetros que o código de


criação possa acessar (incluir a restrição New )

Se você não incluir nenhuma classe ou interface específica na lista de restrições, poderá
impor um requisito mais geral especificando um dos seguintes itens:

O argumento de tipo deve ser um tipo de valor (incluir a restrição Structure )

O argumento de tipo deve ser um tipo de referência (incluir a restrição Class )

Você não pode especificar Structure e Class no mesmo parâmetro de tipo, nem
especificar uma delas mais de uma vez.

ID do erro: BC32061

Para corrigir este erro


Verifique se a expressão e seus elementos estão escritos corretamente.

Se a expressão não se qualificar para a lista anterior de requisitos, remova-a da


lista de restrições.

Se a expressão se referir a uma interface ou classe, verifique se o compilador tem


acesso a essa interface ou classe. Talvez seja necessário qualificar seu nome e pode
seja necessário adicionar uma referência ao seu projeto. Para obter mais
informações, confira "Referências a Projetos" em Referências a Elementos
Declarados.
Confira também
Tipos genéricos no Visual Basic
Tipos de Valor e Tipos de Referência
Referências a elementos declarados
BC30766: '<functionname>' não está
declarado (dispositivo inteligente/erro
de compilador do Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

< functionname > não está declarado. A funcionalidade de E/S do arquivo normalmente
está disponível no namespace Microsoft.VisualBasic , mas a versão de destino do .NET
Compact Framework não dá suporte a ela.

ID do erro: BC30766

Para corrigir este erro


Execute operações de arquivo com funções definidas no namespace System.IO .

Confira também
System.IO
Access de arquivo com o Visual Basic
BC42015: '<interfacename>.
<membername>' já está implementado
pela classe base '<baseclassname>'.
Reimplementação de <type> presumida
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma propriedade, um procedimento ou evento em uma classe derivada usa uma


cláusula Implements que especifica um membro de interface já implementado na classe
base.

Uma classe derivada pode reimplementar um membro de interface implementado por


sua classe base. Isso não é o mesmo que substituir a implementação da classe base.
Para obter mais informações, consulte "Implementações".

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratá-los como erros, consulte Configurar Avisos no Visual Basic.

ID do erro BC42015

Para corrigir este erro


Se você pretende reimplementar o membro da interface, não precisa adotar
nenhuma ação. O código na sua classe derivada acessa o membro
reimplementado, a menos que você use a palavra-chave MyBase para acessar a
implementação da classe base.

Se você não pretende reimplementar o membro da interface, remova a cláusula


Implements da propriedade, do procedimento ou da declaração de evento.

Confira também
Interfaces
BC30043: '<keyword>' é válido somente
em um método de instância
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As palavras-chave Me , MyClass e MyBase fazem referência a instâncias de classe


específicas. Você não pode usá-las dentro de um procedimento ou Function
compartilhado Sub .

ID do erro:* BC30043

Para corrigir este erro


Remova a palavra-chave do procedimento ou remova a palavra-chave Shared da
declaração de procedimento.

Confira também
Atribuição de variável do objeto
Me, My, MyBase e MyClass
Noções básicas de herança
BC30909: '<membername>' não pode
expor o tipo '<typename>' fora do
projeto por meio <containertype>
'<containertypename>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma variável, parâmetro de procedimento ou retorno de função é exposta fora de seu


contêiner, mas é declarada como um tipo que não deve ser exposto fora do contêiner.

O código esqueleto a seguir mostra uma situação que gera esse erro.

VB

Private Class privateClass

End Class

Public Class mainClass

Public exposedVar As New privateClass

End Class

Um tipo declarado Protected , Friend , Protected Friend ou Private que se destina a ter
acesso limitado fora do contexto de declaração. Usá-la como o tipo de dados de uma
variável com acesso menos restrito eliminaria essa finalidade. No código esqueleto
anterior, exposedVar é Public e exporia privateClass ao código que não deve ter
acesso a ele.

ID do erro: BC30909

Para corrigir este erro


Altere o nível de acesso da variável, parâmetro de procedimento ou função para
ser pelo menos tão restritivo quanto o nível de acesso de seu tipo de dados.

Confira também
Níveis de acesso no Visual Basic
BC30685: '<membername>' é ambíguo
nas interfaces herdadas
'<interfacename1>' e
'<interfacename2>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A interface herda dois ou mais membros com o mesmo nome de várias interfaces.

ID do Erro: BC30685

Para corrigir este erro


Converta o valor para a interface base que você deseja usar; por exemplo:

VB

Interface Left

Sub MySub()

End Interface

Interface Right

Sub MySub()

End Interface

Interface LeftRight

Inherits Left, Right

End Interface

Module test

Sub Main()

Dim x As LeftRight

' x.MySub() 'x is ambiguous.

CType(x, Left).MySub() ' Cast to base type.

CType(x, Right).MySub() ' Call the other base type.

End Sub

End Module

Confira também
Interfaces
BC30971: <message> Este erro também
poderia ocorrer devido à mistura de
uma referência de arquivo com uma
referência de projeto ao assembly
'<assemblyname>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

<message> Este erro também poderia ocorrer devido à mistura de uma referência de
arquivo com uma referência de projeto ao assembly '<assemblyname>'. Nesse caso,
tente substituir a referência de arquivo a '<assemblyfilename>' no projeto
'<projectname1>' por uma referência de projeto a '<projectname2>'.

O código em seu projeto acessa um membro de outro projeto, mas a configuração da


sua solução não permite que o compilador do Visual Basic resolva a referência.

Para acessar um tipo definido em outro assembly, o compilador do Visual Basic deve ter
uma referência a esse assembly. Essa deve ser uma referência única e inequívoca que
não cause referências circulares entre projetos.

ID do Erro: BC30971

Para corrigir este erro


1. Determine qual projeto produz o melhor assembly para o seu projeto fazer
referência. Para essa decisão, você pode usar critérios como facilidade de acesso a
arquivos e frequência de atualizações.

2. Nas propriedades do projeto, adicione uma referência ao projeto que contém o


assembly que define o tipo que você está usando.

Confira também
Gerenciando referências em um projeto

Referências a elementos declarados

Gerenciando propriedades de solução e de projeto

Solução de Problemas de Referências Quebradas


BC30269: '<methodname>' tem várias
definições com assinaturas idênticas
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma declaração de procedimento Function ou Sub usa o nome do procedimento


idêntico e a lista de argumentos como uma declaração anterior. Uma possível causa é
uma tentativa de sobrecarregar o procedimento original. Os procedimentos
sobrecarregados devem ter listas de argumentos diferentes.

ID do erro: BC30269

Para corrigir este erro


Altere o nome do procedimento ou a lista de argumentos ou remova a declaração
duplicada.

Confira também
Referências a elementos declarados
Considerações sobre procedimentos de sobrecarga
BC30560: '<name>' é ambíguo no
namespace '<namespacename>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você forneceu um nome ambíguo que, portanto, entra em conflito com outro nome. O
compilador do Visual Basic não tem regras de resolução de conflitos; você deve eliminar
a ambiguidade dos nomes por conta própria.

ID do erro: BC30560

Para corrigir este erro


Qualifique totalmente o nome.

Confira também
Namespaces no Visual Basic
Instrução Namespace
BC30561: '<name1>' é ambíguo,
importado dos namespaces ou tipos
<name2>'
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Você forneceu um nome ambíguo que, portanto, entra em conflito com outro nome. O
compilador do Visual Basic não tem regras de resolução de conflitos; você deve eliminar
a ambiguidade dos nomes por conta própria.

ID do erro: BC30561

Para corrigir este erro


Elimine a ambiguidade do nome removendo importações de namespace.

Qualifique totalmente o nome.

Confira também
Instrução Imports (tipo e namespace .NET)
Namespaces no Visual Basic
Instrução Namespace
BC40035: <proceduresignature1> não
está em conformidade com CLS porque
sobrecarrega <proceduresignature2>
que difere dele somente pelos tipos de
matriz e parâmetro de matriz ou pela
classificação dos tipos de parâmetro da
matriz
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um procedimento ou propriedade é marcado como <CLSCompliant(True)> quando


substitui outro procedimento ou propriedade e a única diferença entre suas listas de
parâmetros é o nível de aninhamento de uma matriz irregular ou a classificação de uma
matriz.

Nas seguintes declarações, a segunda e terceira delas geram este erro:

Overloads Sub ProcessArray(arrayParam() As Integer)

Overloads Sub ProcessArray(arrayParam()() As Integer)

Overloads Sub ProcessArray(arrayParam(,) As Integer)

A segunda declaração altera o parâmetro unidimensional original arrayParam para uma


matriz de matrizes. A terceira declaração muda arrayParam para uma matriz
bidimensional (classificação 2). Embora o Visual Basic permita que as sobrecargas sejam
diferentes apenas por uma dessas alterações, essa sobrecarga não é compatível com o
CLS (Independência da Linguagem e Componentes Independentes da Linguagem).

Quando você aplica o CLSCompliantAttribute a um elemento de programação, define o


parâmetro isCompliant do atributo como True ou False para indicar conformidade ou
não conformidade. Não há nenhum padrão para esse parâmetro e você precisa fornecer
um valor.

Se você não aplicar o CLSCompliantAttribute a um elemento, ele será considerado que


não está em conformidade.

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratar os avisos como erros, consulte Configurar avisos no Visual Basic.
ID do Erro: BC40035

Para corrigir este erro


Se você precisar de conformidade com CLS, defina as sobrecargas para serem
diferentes umas das outras de mais modos do que apenas as alterações citadas
nesta página de Ajuda.
Se você precisar que as sobrecargas diferem apenas pelas alterações citadas nesta
página de Ajuda, remova o CLSCompliantAttribute das definições ou marque-os
como <CLSCompliant(False)> .

Confira também
Sobrecarga de procedimento
Sobrecargas
BC30154: <type1>'<typename>' deve
implementar '<membername>' para
interface '<interfacename>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

'<typename>' deve implementar '<membername>' para a interface '<interfacename>'.


A implementação da propriedade deve ter especificadores 'ReadOnly'/'WriteOnly'
correspondentes.

Uma classe ou estrutura afirma implementar uma interface, mas não implementa um
procedimento, uma propriedade ou um evento definido pela interface. Todos os
membros da interface devem ser implementados.

ID do Erro: BC30154

Para corrigir este erro


1. Declare um membro com os mesmos nome e assinatura definidos na interface.
Certifique-se de incluir pelo menos a instrução End Function , End Sub ou End
Property .

2. Adicione uma cláusula Implements ao final da instrução Function , Sub , Property


ou Event . Por exemplo:

VB

Public Event ItHappened() Implements IBaseInterface.ItHappened

3. Ao implementar uma propriedade, verifique se ReadOnly ou WriteOnly é usada da


mesma forma que na definição de interface.

4. Ao implementar uma propriedade, declare os procedimentos Get e Set , conforme


apropriado.

Confira também
Instrução Implements
Interfaces
BC30149: <type1>'<typename>' deve
implementar '<methodname>' para a
interface '<interfacename>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma classe ou estrutura afirma implementar uma interface, mas não implementa um
procedimento definido pela interface. Todos os membros da interface devem ser
implementados.

ID do erro: BC30149

Para corrigir este erro


1. Declare um procedimento com o mesmo nome e assinatura, conforme definidos
na interface. Certifique-se de incluir pelo menos a instrução End Function ou End
Sub .

2. Adicione uma cláusula Implements ao final da instrução Function ou Sub . Por


exemplo:

VB

Public Sub DoSomething() Implements IBaseInterface.DoSomething

Confira também
Instrução Implements
Interfaces
BC30910: '<typename>' não pode
herdado de <type> '<basetypename>'
porque ele expande o acesso do <type>
base fora do assembly
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma classe ou interface herda de uma classe base ou interface, mas tem um nível de
acesso menos restritivo.

Por exemplo, uma interface Public herda de Friend ou uma classe Protected herda de
Private . Isso expõe a classe base ou a interface para o acesso além do nível pretendido.

ID do erro: BC30910

Para corrigir este erro


Altere o nível de acesso da interface ou da classe derivada para ser, pelo menos,
tão restritivo quanto o da interface ou da classe básica.

-ou-

Se você precisar do nível de acesso menos restritivo, remova a instrução Inherits .


Você não pode herdar de uma interface ou classe base mais restrita.

Confira também
Instrução Class
Instrução Interface
Instrução Inherits
Níveis de acesso no Visual Basic
BC32008: '<typename>' é um tipo
delegado
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

'<typename>' é um tipo delegado. A construção do delegado permite apenas uma


expressão única AddressOf como uma lista de argumentos. Muitas vezes, uma
expressão AddressOf pode ser usada em vez de uma construção de delegado.

A cláusula New que cria uma instância de uma classe delegada fornece uma lista de
argumentos inválida para o construtor delegado.

Você pode fornecer apenas uma expressão AddressOf única ao criar uma nova instância
delegada.

Esse erro poderá resultar se você não passar nenhum argumento para o construtor
delegado, se passar mais de um argumento ou se passar um argumento único que não
seja uma expressão AddressOf válida.

ID do erro: BC32008

Para corrigir este erro


Use uma expressão AddressOf única na lista de argumentos para a classe delegada
na cláusula New .

Confira também
Novo Operador
Operador AddressOf
Representantes
Como invocar um método delegado
BC30108: '<typename>' é um tipo e não
pode ser usado como uma expressão
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um nome de tipo ocorre quando uma expressão é necessária. Uma expressão deve
consistir em uma combinação de variáveis, constantes, literais, propriedades e chamadas
de procedimento Function .

ID do error: BC30108

Para corrigir este erro


Remova o nome do tipo e construa a expressão usando elementos válidos.

Confira também
Operadores e Expressões
Aspas duplas não formam um token de
comentário válido para campos
delimitados em que EscapeQuote esteja
definido como True
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma aspa foi fornecida como o delimitador para o TextFieldParser , mas EscapeQuotes
está definido como True .

Para corrigir este erro


Defina EscapeQuotes como False .

Confira também
SetDelimiters
Delimiters
TextFieldParser
Como: ler de arquivos de texto separados por vírgula
Uma chamada de propriedade ou
método não pode incluir uma referência
a um objeto particular, como um
argumento ou um valor de retorno
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Algumas possíveis causas desse erro são:

Um cliente invocou uma propriedade ou um método de um componente fora de


processo e tentou passar uma referência para um objeto privado como um dos
argumentos.

Um componente fora do processo invocou um método de retorno de chamada em


seu cliente e tentou passar uma referência para um objeto privado.

Um componente fora do processo tentou passar uma referência para um objeto


privado como um argumento de um evento que ele estava acionando.

Um cliente tentou atribuir uma referência de objeto privado a um argumento


ByRef de um evento que estava processando.

Para corrigir este erro


Remova a referência.

Confira também
Privado
BC40059: Foi criada uma referência para
o assembly de interoperabilidade
inserido '<assembly1>' devido a uma
referência indireta a esse assembly a
partir do assembly '<assembly2>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Foi criada uma referência para o assembly de interoperabilidade inserido '<assembly1>'


devido a uma referência indireta a esse assembly a partir do assembly '<assembly2>'.
Considere alterar a propriedade 'Inserir Tipos de Interoperabilidade' em um dos
assemblies.

Você adicionou uma referência a um assembly (assembly1) que tem a propriedade


Embed Interop Types definida como True . Isso instrui o compilador a inserir

informações de tipo de interoperabilidade desse assembly. No entanto, o compilador


não pode inserir informações de tipo de interoperabilidade desse assembly, porque
outro assembly que você referenciou (assembly2) também faz referência a esse
assembly (assembly1) e tem a propriedade Embed Interop Types definida como False .

7 Observação

Configurar a propriedade Embed Interop Types em uma referência de assembly


como True é equivalente à referenciar o assembly usando a opção -link para o
compilador de linha de comando.

ID do erro: BC40059

Para resolver este aviso


Para inserir informações de tipo de interoperabilidade para os dois assemblies,
defina a propriedade Embed Interop Types em todas as referências ao assembly1
como True .

Para remover o aviso, você pode definir a propriedade Embed Interop Types do
assembly1 como False . Nesse caso, as informações de tipo de interoperabilidade
são fornecidas por um PIA (assembly de interoperabilidade primário).
Confira também
-link (Visual Basic)
Interoperação com código não gerenciado
Não foi especificado um formulário de
inicialização
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O aplicativo usa a classe WindowsFormsApplicationBase, mas não especifica o


formulário de inicialização.

Isso poderá ocorrer se a caixa de seleção Habilitar estrutura do aplicativo estiver


marcada no designer do projeto, mas o Formulário de inicialização não for
especificado. Para obter mais informações, consulte Página de aplicativo, Designer de
Projeto (Visual Basic).

Para corrigir este erro


1. Especifique um objeto de inicialização para o aplicativo.

Para obter mais informações, consulte Página de aplicativo, Designer de Projeto


(Visual Basic).

2. Substitua o método OnCreateMainForm para definir a propriedade MainForm


como o formulário de inicialização.

Confira também
WindowsFormsApplicationBase
OnCreateMainForm
MainForm
Visão geral do modelo de aplicativo do Visual Basic
BC42025: acesso de membro
compartilhado, membro constante,
membro enum ou tipo aninhado por
meio de uma instância; a expressão de
qualificação não será avaliada
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma variável de instância de uma classe ou estrutura é usada para acessar uma variável,
propriedade, procedimento ou evento Shared definido nessa classe ou estrutura. Esse
aviso também pode ocorrer se uma variável de instância for usada para acessar um
membro compartilhado implicitamente de uma classe ou estrutura, como uma
constante ou enumeração, ou uma classe ou estrutura aninhada.

A finalidade de compartilhar um membro é criar apenas uma única cópia desse membro
e disponibilizar essa única cópia para todas as instâncias da classe ou estrutura na qual
ela é declarada. É consistente com esse propósito acessar um membro Shared por meio
do nome de sua classe ou estrutura, em vez de por meio de uma variável que contém
uma instância individual dessa classe ou estrutura.

Acessar um membro Shared por meio de uma variável de instância pode dificultar a
compreensão do código, obscurecendo o fato de que o membro é Shared . Além disso,
se esse acesso for parte de uma expressão que executa outras ações, como um
procedimento Function que retorna uma instância do membro compartilhado, o Visual
Basic ignora a expressão e quaisquer outras ações que ele executaria.

Para obter mais informações e um exemplo, confira Compartilhado.

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratar avisos como erros, consulte Configurar avisos no Visual Basic.

ID do erro: BC42025

Exemplo
O seguinte exemplo gera o erro bc42025:

VB
Public Class TestClass

Public Shared Sub SayHello()

Console.WriteLine("Hello")

End Sub

End Class

Module Program

Public Sub Main()

Dim tc As New TestClass()

tc.SayHello() ' BC42025.

End Sub

End Module

Para resolver este aviso


Use o nome da classe ou estrutura que define o membro Shared para acessá-lo,
conforme mostrado no seguinte exemplo:

VB

Public Class TestClass

Public Shared Sub SayHello()

Console.WriteLine("Hello")

End Sub

End Class

Module Program

Public Sub Main()

TestClass.SayHello()

End Sub

End Module

7 Observação

Esteja alerta para os efeitos do escopo quando dois elementos de programação


têm o mesmo nome. No exemplo anterior, se você declarar uma instância usando
Dim testClass As TestClass = Nothing , o compilador tratará uma chamada para

testClass.SayHello() como um acesso ao método por meio do nome da classe e


nenhum aviso ocorrerá.

Confira também
Compartilhado
Escopo no Visual Basic
BC30577: o operando 'AddressOf' deve
ter o mesmo nome de um método (sem
parênteses)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O operador AddressOf cria uma instância de delegado de procedimento que faz


referência a um procedimento específico. A sintaxe dela é a seguinte:

VB

AddressOf procedurename

Você inseriu parênteses ao redor do argumento a seguir AddressOf , no qual nenhum


deles é necessário.

ID do erro: BC30577

Exemplo
O seguinte exemplo gera o erro bc30577:

VB

Public Sub CountZeroToTen()

For i = 0 To 10

Console.WriteLine($"Counted: {i}")

Threading.Thread.Sleep(500)

Next

End Sub

Sub Main()

' Any of the following two lines generates bc30577.

'Dim t As New Threading.Thread(AddressOf(CountZeroToTen))

'Dim t As New Threading.Thread(AddressOf CountZeroToTen())

t.Start()

End Sub

Para corrigir este erro


1. Remova os parênteses ao redor do argumento após AddressOf conforme
mostrado no exemplo a seguir:
VB

Public Sub CountZeroToTen()

For i = 0 To 10

Console.WriteLine($"Counted: {i}")

Threading.Thread.Sleep(500)

Next

End Sub

Sub Main()

Dim t As New Threading.Thread(AddressOf CountZeroToTen)

t.Start()

End Sub

2. Verifique se o argumento é um nome de método.

Confira também
Operador AddressOf
Representantes
Ocorreu um erro inesperado porque não
foi possível adquirir um recurso do
sistema operacional obrigatório para a
inicialização de instância única
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O aplicativo não pôde adquirir um recurso do sistema operacional necessário. Algumas


das causas possíveis para esse problema são:

O aplicativo não possui permissão para criar objetos nomeados do sistema


operacional.

O Common Language Runtime não tem permissões para criar arquivos de


memória mapeada.

O aplicativo precisa acessar um objeto do sistema operacional, mas outro processo


o está usando.

Para corrigir este erro


1. Verifique se o aplicativo possui permissões suficientes para criar objetos nomeados
do sistema operacional.

2. Verifique se o Common Language Runtime possui permissões suficientes para criar


arquivos de memória mapeada.

3. Reinicie o computador para limpar qualquer processo que possa estar usando os
recursos necessários para se conectar ao aplicativo da instância original.

4. Observe as circunstâncias sob as quais ocorreu o erro e chame o Microsoft Product


Support Services

Confira também
Página de Aplicativo, Designer de Projeto (Visual Basic)
Noções básicas do depurador
Opções de comentários do Visual Studio
BC36556: o nome do membro de tipo
anônimo só pode ser inferido a partir de
um nome simples ou qualificado sem
argumentos
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você não pode inferir um nome de membro de tipo anônimo usando uma expressão
complexa.

ID do erro: BC36556

Exemplo
O seguinte exemplo gera o erro BC36556:

VB

Dim numbers() As Integer = { 1, 2, 3, 4, 5 }

Dim instanceName = New With {numbers(3)}

Para obter mais informações sobre fontes das quais tipos anônimos podem e não
podem inferir nomes e tipos de membros, confira Como inferir nomes e tipos de
propriedade em declarações de tipo anônimo.

Para corrigir este erro


Atribua a expressão a um nome de membro, conforme mostrado no seguinte código:

VB

Dim numbers() As Integer = { 1, 2, 3, 4, 5 }

Dim instanceName = New With { .number = numbers(3) }

Confira também
Tipos anônimos
Como inferir nomes e tipos de propriedade na declaração de tipo anônimo
Argumento não opcional (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O número e os tipos de argumentos devem corresponder àqueles previstos. Há um


número incorreto de argumentos ou um argumento omitido não é opcional. Um
argumento só poderá ser omitido de uma chamada para um procedimento definido
pelo usuário se ele tiver sido declarado como Optional na definição do procedimento.

Para corrigir este erro


1. Forneça todos os argumentos necessários.

2. Verifique se os argumentos omitidos são opcionais. Caso não sejam, forneça o


argumento na chamada ou declare o parâmetro Optional na definição.

Confira também
Tipos de Erro
BC30638: os limites de matriz não
podem ser exibidos em especificadores
de tipo
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os tamanhos da matriz não podem ser declarados como parte de um especificador de


tipo de dados.

ID do erro: BC30638

Exemplo
O seguinte exemplo gera o erro BC30638:

VB

Dim array As Integer(8)

Para corrigir este erro


Especifique o tamanho da matriz imediatamente após o nome da variável em vez
de colocar o tamanho da matriz após o tipo, conforme mostrado no seguinte
exemplo:

VB

Dim array(8) As Integer

Defina uma matriz e inicialize-a com o número desejado de elementos, conforme


mostrado no seguinte exemplo:

VB

Dim array() As Integer = New Integer(8) {}

Confira também
matrizes
BC32039: A matriz declarada para a
variável de controle do loop não pode
ser declarada com um tamanho inicial
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um loop For Each usa uma matriz como sua variável de iteração, mas inicializa essa
matriz.

ID do Erro: BC32039

Exemplo
O exemplo a seguir gera o erro bc32039:

VB

Dim arrayList As New List(Of Integer())

For Each listElement(1) As Integer In arrayList

Next

Para corrigir este erro


Remova a inicialização da declaração da variável de iteração, conforme mostrado no
exemplo a seguir:

VB

Dim arrayList As New List(Of Integer())

For Each listElement() As Integer In arrayList

Next

ou você pode usar inferência de tipos:

VB

Dim arrayList As New List(Of Integer())

For Each listElement In arrayList

Next

Confira também
Instrução For...Next
matrizes
Coleções
BC30306: Expressão de subscrito de
matriz ausente
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma inicialização de matriz deixa de fora um ou mais dos subscritos que definem os
limites da matriz. Por exemplo, a instrução pode conter a expressão myArray (5,5,,10) ,
que deixa de fora o terceiro subscrito.

ID do erro: BC30306

Para corrigir este erro


Forneça o subscrito ausente.

Confira também
matrizes
BC31043: matrizes declaradas como
membros de estrutura não podem ser
declaradas com um tamanho inicial
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma matriz em uma estrutura é declarada com um tamanho inicial. Você não pode
inicializar nenhum elemento de estrutura, e declarar um tamanho de matriz é uma
forma de inicialização.

ID do erro: BC31043

Exemplo
O seguinte exemplo gera o erro BC31043:

VB

Structure DemoStruct

Public demoArray(9) As Integer

End Structure

Para corrigir este erro


1. Defina a matriz na estrutura como dinâmica (sem tamanho inicial).

2. Se você precisar de um determinado tamanho de matriz, poderá redimensionar a


matriz dinâmica com uma Instrução ReDim quando o código estiver em execução.
O exemplo a seguir ilustra isso:

VB

Structure DemoStruct

Public demoArray() As Integer

End Structure

Sub UseStruct()

Dim struct As DemoStruct

ReDim struct.demoArray(9)

Struct.demoArray(2) = 777

End Sub

Confira também
matrizes
Como: Declarar uma estrutura
BC30828: 'As Any' não é suportado em
instruções 'Declare'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O tipo de dados Any foi usado com instruções Declare no Visual Basic 6.0 e versões
anteriores para permitir o uso de argumentos que poderiam conter qualquer tipo de
dados. No entanto, o Visual Basic dá suporte à sobrecarga e, portanto, torna o tipo de
dados Any obsoleto.

ID do erro: BC30828

Para corrigir este erro


1. Declare parâmetros do tipo específico que você deseja usar; por exemplo.

VB

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (

ByVal lpBuffer As String,

ByRef nSize As Integer) As Integer

2. Use o atributo MarshalAsAttribute para especificar As Any quando Void* é


esperado pelo procedimento que está sendo chamado.

VB

Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" (

ByVal x As Short,

<System.Runtime.InteropServices.MarshalAsAttribute(

System.Runtime.InteropServices.UnmanagedType.AsAny)>

ByVal o As Object)

Confira também
MarshalAsAttribute
Passo a passo: Fazer chamadas de APIs do Windows
Instrução Declare
Criando protótipos em código gerenciado
Erro de automação
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Ocorreu um erro ao executar um método ou ao obter ou configurar uma propriedade


de uma variável de objeto. O erro foi relatado pelo aplicativo que criou o objeto.

Para corrigir este erro


1. Verifique as propriedades do objeto Err para determinar a origem e a natureza do
erro.

2. Use a instrução On Error Resume Next imediatamente antes de acessar a instrução


e, em seguida, verifique se há erros imediatamente após acessar a instrução.

Confira também
Tipos de Erro
Opções de comentários do Visual Studio
BC42033: Valor de soma de verificação
incorreto, dígitos não hexadecimais ou
número ímpar de dígitos hexadecimais
Artigo • 21/02/2023 • 2 minutos para o fim da leitura

Um valor de soma de verificação contém dígitos hexadecimais inválidos ou um número


ímpar de dígitos.

Quando o ASP.NET gera um arquivo de origem do Visual Basic (extensão .vb), ele calcula
uma soma de verificação e a coloca em um arquivo de origem oculto identificado por
#externalchecksum . Um usuário também pode gerar um arquivo .vb para isso, mas é

melhor deixar esse processo para uso interno.

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratar os avisos como erros, consulte Configurar avisos no Visual Basic.

ID do erro: BC42033

Para corrigir este erro


1. Se o ASP.NET estiver gerando o arquivo de origem do Visual Basic, reinicie a
compilação do projeto.

2. Se esse aviso persistir após a reinicialização, reinstale o ASP.NET e tente compilar


novamente.

3. Se o aviso ainda persistir, ou se você não estiver usando o ASP.NET, reúna


informações sobre as circunstâncias e notifique o Microsoft Product Support
Services.

Confira também
Visão geral do ASP.NET
Opções de comentários do Visual Studio
Convenção de chamada de DLL inválida
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os argumentos passados para uma DLL (biblioteca de vínculo dinâmico) devem


corresponder exatamente aos esperados pela rotina. As convenções de chamada lidam
com número, tipo e ordem de argumentos. Seu programa pode estar chamando uma
rotina em uma DLL que esteja sendo passada para o tipo ou número errado de
argumentos.

Para corrigir este erro


1. Verifique se todos os tipos de argumento concordam com aqueles especificados
na declaração da rotina que você está chamando.

2. Verifique se você está passando o mesmo número de argumentos indicados na


declaração da rotina que você está chamando.

3. Se a rotina de DLL esperar argumentos por valor, verifique se ByVal é especificado


para esses argumentos na declaração para a rotina.

Confira também
Tipos de Erro
Instrução Call
Instrução Declare
Modo de arquivo inválido
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Instruções usadas na manipulação de conteúdo de arquivo devem ser apropriadas ao


modo em que o arquivo foi aberto. As possíveis causas incluem:

Uma instrução FilePutObject ou FileGetObject especifica um arquivo sequencial.

Uma instrução Print especifica um arquivo aberto para um modo de acesso


diferente Output ou Append .

Uma instrução Input especifica um arquivo aberto para um modo de acesso


diferente Input

Tentativa de gravar em um arquivo do tipo somente leitura.

Para corrigir este erro


Verifique se FilePutObject e FileGetObject referem-se apenas a arquivos abertos
para acesso Random a Binary .

Verifique se Print especifica um arquivo aberto para o modo de acesso Output ou


Append . Caso contrário, use outra instrução para colocar dados no arquivo ou
reabra-o em um modo apropriado.

Verifique se Input especifica um arquivo aberto para Input . Caso contrário, use
outra instrução para colocar dados no arquivo ou reabra-o em um modo
apropriado.

Se você estiver gravando em um arquivo somente leitura, mude o status de


leitura/gravação do arquivo ou não tente gravar nele.

Use a funcionalidade disponível no objeto My.Computer.FileSystem .

Confira também
FileSystem
Solução de problemas: ler e gravar em arquivos de texto
Nome ou número de arquivo inválido
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Ocorreu um erro ao tentar acessar o arquivo especificado. Dentre as possíveis causas


para esse erro estão:

Uma instrução refere-se a um arquivo com um nome de arquivo ou número que


não foi especificado em FileOpen ou que foi especificado em FileOpen , mas foi
posteriormente fechado.

Uma instrução refere-se a um arquivo com um número que está fora do intervalo
de números de arquivo.

Uma instrução refere-se a um nome de arquivo ou número que não é válido.

Para corrigir este erro


1. Verifique se o nome do arquivo está especificado em uma instrução FileOpen .
Observe que, se você invocou a instrução FileClose sem argumentos, talvez tenha
fechado inadvertidamente todos os arquivos abertos.

2. Se o código estiver gerando números de arquivo algoritmoticamente, verifique se


eles são válidos.

3. Verifique os nomes de arquivo para verificar se eles estão em conformidade com


as convenções do sistema operacional.

Confira também
FileOpen
Convenções de nomenclatura do Visual Basic
Comprimento de registro inválido
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Algumas possíveis causas desse erro são:

O comprimento de uma variável de registro especificada em uma instrução


FileGet , FileGetObject , FilePut ou FilePutObject difere do comprimento
especificado na instrução FileOpen correspondente.

A variável em uma instrução FilePut ou FilePutObject é ou inclui uma cadeia de


caracteres de comprimento variável.

A variável em um FilePut ou FilePutObject é ou inclui um tipo Variant .

Para corrigir este erro


1. Certifique-se de que a soma dos tamanhos das variáveis de comprimento fixo no
tipo definido pelo usuário que define o tipo da variável de registro seja igual ao
valor declarado na cláusula Len da instrução FileOpen .

2. Se a variável em uma instrução FilePut ou FilePutObject for ou incluir uma


cadeia de caracteres de comprimento variável, certifique-se de que ela tenha pelo
menos 2 caracteres a menos do que o comprimento do registro especificado na
cláusula Len da instrução FileOpen .

3. Se a variável em FilePut ou FilePutObject for ou incluir Variant , certifique-se de


que ela tenha pelo menos 4 bytes a menos do que o comprimento do registro
especificado na cláusula Len da instrução FileOpen .

Confira também
FileGet
FileGetObject
FilePut
FilePutObject
BC42358: Como esta chamada não era
esperada, a execução do método atual
continua antes da chamada ser
concluída
Artigo • 07/04/2023 • 6 minutos para o fim da leitura

Como esta chamada não era esperada, a execução do método atual continua antes da
chamada ser concluída. Considere aplicar o operador Await ao resultado da chamada.

O método atual chama um método assíncrono que retorna uma classe Task ou
Task<TResult> e não aplica o operador Await ao resultado. A chamada ao método
assíncrono inicia uma tarefa assíncrona. No entanto, como nenhum operador Await é
aplicado, o programa continua sem esperar que a tarefa seja concluída. Na maioria dos
casos, esse comportamento não é o que você deseja. Geralmente, os outros aspectos do
método de chamada dependem dos resultados da chamada ou, no mínimo, é esperado
que o método chamado seja concluído antes de retornar do método que contém a
chamada.

Igualmente importante é o que acontece com as exceções geradas no método


assíncrono chamado. Uma exceção gerada em um método que retorna Task ou
Task<TResult> é armazenada na tarefa retornada. Se você não aguardar a tarefa ou
verificar explicitamente se há exceções, a exceção será perdida. Se você aguardar a
tarefa, a exceção será relançada.

Como uma melhor prática, você sempre deve aguardar a chamada.

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratá-los como erros, consulte Configurar Avisos no Visual Basic.

ID do erro: BC42358

Para resolver este aviso


Considere suprimir o aviso somente se você tiver certeza de que não deseja aguardar
que a chamada assíncrona seja concluída e que o método chamado não gerará
nenhuma exceção. Nesse caso, você pode suprimir o aviso atribuindo o resultado da
tarefa da chamada a uma variável.
O exemplo a seguir mostra como causar o aviso, suprimi-lo e como aguardar a
chamada:

VB

Async Function CallingMethodAsync() As Task

ResultsTextBox.Text &= vbCrLf & " Entering calling method."

' Variable delay is used to slow down the called method so that you

' can distinguish between awaiting and not awaiting in the program's
output.

' You can adjust the value to produce the output that this topic shows

' after the code.

Dim delay = 5000

' Call #1.

' Call an async method. Because you don't await it, its completion isn't

' coordinated with the current method, CallingMethodAsync.

' The following line causes the warning.

CalledMethodAsync(delay)

' Call #2.

' To suppress the warning without awaiting, you can assign the
' returned task to a variable. The assignment doesn't change how

' the program runs. However, the recommended practice is always to

' await a call to an async method.

' Replace Call #1 with the following line.

'Task delayTask = CalledMethodAsync(delay)

' Call #3

' To contrast with an awaited call, replace the unawaited call


' (Call #1 or Call #2) with the following awaited call. The best

' practice is to await the call.

'Await CalledMethodAsync(delay)

' If the call to CalledMethodAsync isn't awaited, CallingMethodAsync

' continues to run and, in this example, finishes its work and returns

' to its caller.

ResultsTextBox.Text &= vbCrLf & " Returning from calling method."

End Function

Async Function CalledMethodAsync(howLong As Integer) As Task

ResultsTextBox.Text &= vbCrLf & " Entering called method, starting


and awaiting Task.Delay."

' Slow the process down a little so you can distinguish between awaiting

' and not awaiting. Adjust the value for howLong if necessary.
Await Task.Delay(howLong)

ResultsTextBox.Text &= vbCrLf & " Task.Delay is finished--returning


from called method."

End Function

No exemplo, se você escolher a Chamada nº 1 ou Chamada nº 2, o método assíncrono


não aguardado ( CalledMethodAsync ) será concluído após o chamador
( CallingMethodAsync ) e o chamador do chamador ( StartButton_Click ) serem
concluídos. A última linha na saída a seguir mostra quando o método chamado termina.
A entrada e a saída do manipulador de eventos que chama CallingMethodAsync no
exemplo completo estão marcadas na saída.

Console

Entering the Click event handler.


Entering calling method.

Entering called method, starting and awaiting Task.Delay.

Returning from calling method.

Exiting the Click event handler.

Task.Delay is finished--returning from called method.

Exemplo
O seguinte aplicativo do WPF (Windows Presentation Foundation) contém os métodos
do exemplo anterior. As etapas a seguir configuram o aplicativo:

1. Crie um aplicativo WPF e nomeie-o AsyncWarning .

2. No Editor do Visual Studio Code, escolha a guia MainWindow.xaml.

Se a guia não estiver visível, abra o menu de atalho para MainWindow.xaml no


Gerenciador de Soluções e, em seguida, escolha Exibir Código.

3. Substitua o código na exibição XAML de MainWindow.xaml pelo código a seguir:

XAML

<Window x:Class="MainWindow"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Title="MainWindow" Height="350" Width="525">

<Grid>

<Button x:Name="StartButton" Content="Start"


HorizontalAlignment="Left" Margin="214,28,0,0" VerticalAlignment="Top"
Width="75" HorizontalContentAlignment="Center" FontWeight="Bold"
FontFamily="Aharoni" Click="StartButton_Click" />

<TextBox x:Name="ResultsTextBox" Margin="0,80,0,0"


TextWrapping="Wrap" FontFamily="Lucida Console"/>

</Grid>

</Window>

Uma janela simples, contendo um botão e uma caixa de texto, aparecerá no modo
de exibição de Design de MainWindow.xaml.

Para obter mais informações sobre o Designer XAML, consulte Criando uma
interface do usuário usando o Designer XAML. Para obter informações sobre como
criar sua própria interface do usuário simples, consulte as seções "Para criar um
aplicativo WPF" e "Para criar uma simples MainWindow do WPF" do Passo a passo:
acessando a Web usando async e await.

4. Substitua o código em MainWindow.xaml.vb pelo código a seguir.

VB

Class MainWindow

Private Async Sub StartButton_Click(sender As Object, e As


RoutedEventArgs)

ResultsTextBox.Text &= vbCrLf & "Entering the Click event


handler."

Await CallingMethodAsync()

ResultsTextBox.Text &= vbCrLf & "Exiting the Click event


handler."

End Sub

Async Function CallingMethodAsync() As Task

ResultsTextBox.Text &= vbCrLf & " Entering calling method."

' Variable delay is used to slow down the called method so that
you

' can distinguish between awaiting and not awaiting in the


program's output.

' You can adjust the value to produce the output that this
topic shows

' after the code.

Dim delay = 5000

' Call #1.

' Call an async method. Because you don't await it, its
completion isn't

' coordinated with the current method, CallingMethodAsync.

' The following line causes the warning.

CalledMethodAsync(delay)

' Call #2.

' To suppress the warning without awaiting, you can assign the

' returned task to a variable. The assignment doesn't change


how

' the program runs. However, the recommended practice is always


to

' await a call to an async method.

' Replace Call #1 with the following line.

'Task delayTask = CalledMethodAsync(delay)

' Call #3

' To contrast with an awaited call, replace the unawaited call

' (Call #1 or Call #2) with the following awaited call. The
best

' practice is to await the call.

'Await CalledMethodAsync(delay)

' If the call to CalledMethodAsync isn't awaited,


CallingMethodAsync

' continues to run and, in this example, finishes its work and
returns

' to its caller.

ResultsTextBox.Text &= vbCrLf & " Returning from calling


method."

End Function

Async Function CalledMethodAsync(howLong As Integer) As Task

ResultsTextBox.Text &= vbCrLf & " Entering called method,


starting and awaiting Task.Delay."

' Slow the process down a little so you can distinguish between
awaiting

' and not awaiting. Adjust the value for howLong if necessary.

Await Task.Delay(howLong)
ResultsTextBox.Text &= vbCrLf & " Task.Delay is finished--
returning from called method."

End Function

End Class

' Output

' Entering the Click event handler.

' Entering calling method.

' Entering called method, starting and awaiting Task.Delay.

' Returning from calling method.

' Exiting the Click event handler.

' Task.Delay is finished--returning from called method.

' Output

' Entering the Click event handler.

' Entering calling method.

' Entering called method, starting and awaiting Task.Delay.

' Task.Delay is finished--returning from called method.

' Returning from calling method.

' Exiting the Click event handler.

5. Escolha a tecla F5 para executar o programa e, em seguida, o botão Iniciar.


A saída esperada será exibida no final do código.

Confira também
Operador Await
Programação assíncrona com Async e Await
BC36548: não é possível converter o
tipo anônimo em uma árvore de
expressão porque uma propriedade de
tipo é usada para inicializar outra
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O compilador não aceita a conversão de um tipo anônimo em uma árvore de expressão


quando uma propriedade do tipo anônimo é usada para inicializar outra. Por exemplo,
no código a seguir, Prop1 é declarado na lista de inicialização e, em seguida, usado
como o valor inicial para Prop2 .

ID do erro: BC36548

Exemplo
VB

Module M2

Sub ExpressionExample(Of T)(x As Expressions.Expression(Of Func(Of T)))

End Sub

Sub Main()

' The following line causes the error.

ExpressionExample(Function() New With {.Prop1 = 2, .Prop2 = .Prop1})

End Sub

End Module

Para corrigir este erro


Atribua o valor inicial para uma variável local Prop1 . Atribua essa variável a Prop1 e
Prop2 , conforme mostrado no seguinte código:

VB

Sub Main()

Dim temp = 2

ExpressionExample(Function() New With {.Prop1 = temp, .Prop2 = temp})

End Sub

Confira também
Tipos anônimos (Visual Basic)
Árvores de expressão (Visual Basic)
Como usar árvores de expressão para criar consultas dinâmicas (Visual Basic)
Não é possível criar o componente
ActiveX
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você tentou colocar um controle ActiveX em um formulário em tempo de design ou


adicionar um formulário a um projeto com um controle ActiveX, mas as informações
associadas no registro não foram encontradas.

Para corrigir este erro


As informações no registro podem ter sido excluídas ou corrompidas. Reinstale o
controle ActiveX ou entre em contato com o fornecedor do controle.

Confira também
Tipos de Erro
Opções de comentários do Visual Studio
BC30310: Não é possível fazer referência
a "<name>" porque ele é um membro
do campo de tipo de valor "<name>"
da classe "<classname>" que tem
'System.MarshalByRefObject' como uma
classe base
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A classe System.MarshalByRefObject habilita aplicativos que dão suporte ao acesso


remoto a objetos entre os limites de domínio do aplicativo. Os tipos devem herdar da
classe MarshalByRejectObject quando o tipo é usado entre os limites de domínio do
aplicativo. O estado do objeto não deve ser copiado porque os membros do objeto não
podem ser utilizáveis fora do domínio do aplicativo no qual foram criados.

ID do erro: BC30310

Para corrigir este erro


1. Confira a referência para verificar se o membro que está sendo referenciado é
válido.

2. Qualifique explicitamente o membro com a palavra-chave Me .

Confira também
MarshalByRefObject
Instrução Dim
BC30369: não é possível fazer referência
a um membro da instância de uma
classe de dentro de um método
compartilhado ou inicializador de
membro compartilhado sem uma
instância explícita da classe
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você tentou se referir a um membro não compartilhado de uma classe de dentro de um


procedimento compartilhado. O seguinte exemplo demonstra tal situação:

VB

Class Sample

Public x as Integer

Public Shared Sub SetX()

x = 10

End Sub

End Class

No exemplo anterior, a instrução de atribuição x = 10 gera essa mensagem de erro.


Isso ocorre porque um procedimento compartilhado está tentando acessar uma variável
de instância.

A variável x é um membro de instância porque não é declarada como Compartilhada.


Cada instância de classe Sample contém sua própria variável x individual. Quando uma
instância define ou altera o valor de x , ela não afeta o valor de x em nenhuma outra
instância.

No entanto, o procedimento SetX é Shared entre todas as instâncias da classe Sample .


Isso significa que ela não está associada a nenhuma instância da classe, mas opera
independentemente de instâncias individuais. Como não tem conexão com uma
instância específica, setX não pode acessar uma variável de instância. Ele deve operar
apenas em variáveis Shared . Quando SetX define ou altera o valor de uma variável
compartilhada, esse novo valor está disponível para todas as instâncias da classe.

ID do erro: BC30369
Para corrigir este erro
1. Decida se deseja que o membro seja compartilhado entre todas as instâncias da
classe ou mantido individualmente para cada instância.

2. Se você quiser que uma cópia única do membro seja compartilhada entre todas as
instâncias, adicione a palavra-chave Shared à declaração de membro. Mantenha a
palavra-chave Shared na declaração de procedimento.

3. Se você quiser que cada instância tenha sua própria cópia individual do membro,
não especifique Shared para a declaração de membro. Remova a palavra-chave
Shared na declaração de procedimento.

Confira também
Compartilhado
Não é possível criar arquivo temporário
necessário
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A unidade está completa que contém o diretório especificado pela variável de ambiente
TEMP, ou a variável de ambiente TEMP especifica uma unidade ou diretório inválido ou
somente leitura.

Para corrigir este erro


1. Exclua arquivos da unidade se ela estiver cheia.

2. Especifique uma unidade diferente na variável de ambiente TEMP.

3. Especifique uma unidade válida para a variável de ambiente TEMP.

4. Remova a restrição somente leitura da unidade ou diretório especificado no


momento.

Confira também
Tipos de Erro
BC2012: não é possível abrir
'<filename>' para gravação
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O arquivo especificado não pode ser aberto para gravação, talvez porque isso já tenha
ocorrido.

ID do erro: BC2012

Para corrigir este erro


1. Feche o arquivo e reabra-o.

2. Verifique as permissões do arquivo.

Confira também
WriteAllText
WriteAllBytes
Gravar em arquivos
BC31098: não foi possível encontrar a
classe '<classname>'.
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Não foi possível encontrar a classe '<classname>'. Essa condição é geralmente o


resultado de um 'Microsoft.VisualBasic.dll' incompatível.

Não foi possível localizar um membro definido.

ID do erro: BC31098

Para corrigir este erro


1. Compile o programa novamente para verificar se o erro persiste.

2. Se o erro persistir, salve o trabalho e reinicie o Visual Studio.

3. Se o erro persistir, reinstale o Visual Basic.

4. Se o erro persistir após a reinstalação, notifique o Microsoft Product Support


Services.

Confira também
Opções de comentários do Visual Studio
A classe não dá suporte à automação ou
à interface esperada
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A classe especificada na chamada de função GetObject ou CreateObject não expôs uma


interface de programação ou você alterou um projeto de .dll para .exe, ou vice-versa.

Para corrigir este erro


1. Verifique a documentação do aplicativo que criou o objeto para obter as
limitações sobre o uso de automação com esta classe de objeto.

2. Se você alterou um projeto de .dll para .exe, ou vice-versa, deverá cancelar o


registro manualmente do .dll ou do .exe antigo.

Confira também
Tipos de Erro
Opções de comentários do Visual Studio
BC30481: Instrução 'Class' deve finalizar
com 'End Class' correspondente
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Class é usada para iniciar um bloco Class ; portanto, ela só pode aparecer no início
dele e uma instrução correspondente End Class deve finalizá-lo. É necessário ter uma
instrução Class redundante ou não conseguirá finalizar o bloco Class com End Class .

ID do erro: BC30481

Para corrigir este erro


Localize e remova a instrução Class desnecessária.

Conclua o bloco Class com End Class correspondente.

Confira também
Instrução End <keyword>
Instrução Class
Formato inválido de área de
transferência
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O formato de área de transferência especificado é incompatível com o método que está


sendo executado. Dentre as possíveis causas para esse erro estão:

Usando o método SetText da área de transferência GetText com um formato de


área de transferência diferente de vbCFText ou vbCFLink .

Usando o método SetData da área de transferência GetData com um formato de


área de transferência diferente de vbCFBitmap , vbCFDIB ou vbCFMetafile .

Usando os métodos GetData ou SetData de um formato de área de transferência


DataObject no intervalo reservado pelo Microsoft Windows para formatos

registrados (&HC000-HFFFF&), quando esse formato de área de transferência não


tiver sido registrado no Microsoft Windows.

Para corrigir este erro


Remova o formato inválido e especifique um válido.

Confira também
Área de transferência: adicionando outros formatos
BC30439: Expressão de constante não
representável no tipo '<typename>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você está tentando avaliar uma constante que não se ajusta ao tipo de destino,
geralmente porque ultrapassa o intervalo.

ID do erro: BC30439

Para corrigir este erro


1. Altere o tipo de destino para um que possa lidar com a constante.

Confira também
Visão geral de constantes
Constantes e Enumerações
BC30424: As constantes devem ser do
tipo intrínseco ou enumerado, e não
classe, estrutura, parâmetro de tipo ou
tipo de matriz
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você tentou declarar uma constante como uma classe, estrutura ou tipo de matriz ou
como um parâmetro de tipo definido por um tipo genérico contido.

As constantes devem ser de um tipo intrínseco ( Boolean , Byte , Date , Decimal , Double ,
Integer , Long , Object , SByte , Short , Single , String , UInteger , ULong ou UShort ) ou,
um tipo Enum com base em um tipo de dados integrais.

ID do erro: BC30424

Para corrigir este erro


1. Declare a constante como um tipo Enum ou intrínseco.

2. Uma constante também pode ser um valor especial, como True , False ou
Nothing . O compilador considera esses valores predefinidos como do tipo

intrínseco apropriado.

Confira também
Constantes e Enumerações
Data Types
Data Types
BC30298: o construtor '<name>' não
pode se chamar
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um procedimento Sub New em uma classe ou estrutura chama a si mesmo.

A finalidade do construtor é inicializar a instância de uma classe ou estrutura quando ela


for criada pela primeira vez. Uma classe ou estrutura pode ter vários construtores, desde
que todos tenham listas de parâmetros distintas. Um construtor tem permissão para
chamar outro construtor para executar a funcionalidade além da sua própria. Mas não
faz sentido para um construtor chamar a si mesmo e, na verdade, resultaria em recursão
infinita, se permitido.

ID do erro: BC30298

Para corrigir este erro


1. Verifique a lista de parâmetros do construtor que está sendo chamado. Ele deve
ser diferente do construtor que está fazendo a chamada.

2. Se você não pretende chamar um construtor diferente, remova totalmente a


chamada Sub New .

Confira também
Tempo de vida do objeto: como os objetos são criados e destruídos
BC32053: Copiar o valor
“<parametername>” do parâmetro
'ByRef' de volta para o argumento
correspondente é restrita do tipo
“<typename1>” para o tipo
“<typename2>”
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um procedimento é chamado com um argumento que expande para o tipo de


parâmetro correspondente e a conversão do parâmetro para o argumento é restrita.

Ao definir uma classe ou estrutura, você pode definir um ou mais operadores de


conversão para converter esse tipo de classe ou estrutura em outros tipos. Você
também pode definir operadores de conversão reversa para converter esses outros
tipos de volta para sua classe ou tipo de estrutura. Quando você usa seu tipo de classe
ou estrutura em uma chamada de procedimento, o Visual Basic pode usar esses
operadores de conversão para converter o tipo de um argumento para o tipo de
parâmetro correspondente.

Se você passar o argumento ByRef, o Visual Basic às vezes copia o valor do argumento
em uma variável local no procedimento em vez de passar uma referência. Nesse caso,
quando o procedimento retorna, o Visual Basic deve copiar o valor da variável local de
volta para o argumento no código de chamada.

Se um valor de argumento ByRef for copiado no procedimento e o argumento e o


parâmetro forem do mesmo tipo, nenhuma conversão será necessária. Mas se os tipos
forem diferentes, o Visual Basic deverá converter em ambas as direções. Se um dos tipos
for seu tipo de classe ou estrutura, o Visual Basic deverá fazer a conversão do outro tipo
para o seu, e do seu tipo para o outro. Se uma dessas conversões for de expansão, a
conversão inversa poderá ser de restrição.

ID do Erro: BC32053

Para corrigir este erro


Se possível, use um argumento de chamada do mesmo tipo que o parâmetro de
procedimento, para que o Visual Basic não precise fazer nenhuma conversão.
Se você precisar chamar o procedimento com um tipo de argumento diferente do
tipo de parâmetro, mas não precisar retornar um valor para o argumento de
chamada, defina o parâmetro como ByVal em vez de ByRef .

Se você precisar retornar um valor para o argumento de chamada, defina o


operador de conversão reversa como Expansão, se possível.

Confira também
Procedimentos
Parâmetros e Argumentos de Procedimento
Passar argumentos por valor e por referência
Procedimentos do operador
Instrução Operator
Como definir um operador
Como definir um operador de conversão
Conversões de tipo no Visual Basic
Conversões de Widening e Narrowing
BC31122: O modificador 'Custom' não é
válido em eventos declarados sem tipos
delegados explícitos
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Ao contrário de um evento não personalizado, uma declaração Custom Event requer


uma cláusula As após o nome do evento que especifica explicitamente o tipo de
delegado para o evento.

Eventos não personalizados podem ser definidos com uma cláusula As e um tipo de
delegado explícito ou com uma lista de parâmetros imediatamente após o nome do
evento.

ID de erro: BC31122

Para corrigir este erro


1. Defina um delegado com a mesma lista de parâmetros do evento personalizado.

Por exemplo, se o Custom Event foi definido por Custom Event Test(ByVal sender
As Object, ByVal i As Integer) , o delegado correspondente seria o seguinte.

VB

Delegate Sub TestDelegate(ByVal sender As Object, ByVal i As Integer)

2. Substitua a lista de parâmetros do evento personalizado por uma cláusula As que


especifica o tipo de delegado.

Continuando com o exemplo, a declaração Custom Event seria reescrita da


seguinte maneira.

VB

Custom Event Test As TestDelegate

Exemplo
Esse exemplo declara um Custom Event e especifica a cláusula necessária As com um
tipo de delegado.

VB

Delegate Sub TestDelegate(ByVal sender As Object, ByVal i As Integer)


Custom Event Test As TestDelegate

AddHandler(ByVal value As TestDelegate)

' Code for adding an event handler goes here.

End AddHandler

RemoveHandler(ByVal value As TestDelegate)

' Code for removing an event handler goes here.

End RemoveHandler

RaiseEvent(ByVal sender As Object, ByVal i As Integer)

' Code for raising an event goes here.

End RaiseEvent

End Event

Confira também
Instrução Event
Instrução Delegate
Eventos
BC36647 e BC36644: Não é possível
inferir o(s) tipo(s) de dados do(s)
parâmetro(s) de tipo a partir destes
argumentos
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Não é possível inferir o(s) tipo(s) de dados do(s) parâmetro(s) de tipo a partir destes
argumentos. Especificar os tipos de dados explicitamente pode corrigir esse erro.

Esse erro ocorre quando há falha na resolução de sobrecarga. Ele ocorre como
mensagem subordinada que indica por que um candidato de sobrecarga específico foi
eliminado. A mensagem de erro explica que o compilador não pode usar a inferência de
tipo para encontrar tipos de dados para os parâmetros de tipo.

7 Observação

Quando não é possível especificar argumentos (por exemplo, para operadores de


consulta em expressões de consulta), a mensagem de erro é exibida sem a segunda
frase.

O código a seguir demonstra o erro.

VB

Module Module1

Sub Main()

'' Not Valid.

'OverloadedGenericMethod("Hello", "World")

End Sub

Sub OverloadedGenericMethod(Of T)(ByVal x As String,

ByVal y As InterfaceExample(Of T))

End Sub

Sub OverloadedGenericMethod(Of T, R)(ByVal x As T,

ByVal y As InterfaceExample(Of R))

End Sub

End Module

Interface InterfaceExample(Of T)

End Interface

ID de erro: BC36647 e BC36644

Para corrigir este erro


Você pode conseguir especificar um tipo de dados para o parâmetro (ou parâmetros) de
tipo em vez de depender da inferência de tipo.

Confira também
Conversão de delegado reduzida
Procedimentos genéricos no Visual Basic
Conversões de tipo no Visual Basic
BC30188: declaração esperada
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma instrução nãodeclarativa, como uma instrução de atribuição ou loop, ocorre fora
de qualquer procedimento. Somente declarações são permitidas fora dos
procedimentos.

Como alternativa, um elemento de programação é declarado sem uma palavra-chave de


declaração, como Dim ou Const .

ID do erro: BC30188

Para corrigir este erro


Mova a instrução nãodeclarativa para o corpo de um procedimento.

Inicie a declaração com uma palavra-chave de declaração apropriada.

Verifique se uma palavra-chave de declaração não está escrita incorretamente.

Confira também
Procedimentos
Instrução Dim
BC40007: A propriedade padrão
'<propertyname1>' está em conflito
com a propriedade padrão
'<propertyname2>' em '<classname>' e
por isso deve ser declarada como
'Shadows'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma propriedade é declarada com o mesmo nome de uma definida na classe base.
Nessa situação, a propriedade nessa classe deve sombrear aquela de classe base.

Esta mensagem é um aviso. Shadows será considerado por padrão. Para obter mais
informações sobre como ocultar avisos ou tratar avisos como erros, consulte Configurar
avisos no Visual Basic.

ID do Erro: BC40007

Para corrigir este erro


Adicione a palavra-chave Shadows à declaração ou altere o nome da propriedade
que está sendo declarada.

Confira também
Sombras
Sombreamento no Visual Basic
BC30686: o acesso à propriedade
padrão é ambíguo entre os membros de
interface herdada
'<defaultpropertyname>' da interface
'<interfacename1>' e
'<defaultpropertyname>' da interface
'<interfacename2>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma interface herda de duas interfaces, cada uma delas declara uma propriedade
padrão com o mesmo nome. O compilador não pode resolver um acesso a essa
propriedade padrão sem qualificação. O exemplo a seguir ilustra essa situação.

VB

Public Interface Iface1


Default Property prop(ByVal arg As Integer) As Integer

End Interface

Public Interface Iface2


Default Property prop(ByVal arg As Integer) As Integer

End Interface

Public Interface Iface3


Inherits Iface1, Iface2

End Interface

Public Class testClass

Public Sub accessDefaultProperty()

Dim testObj As Iface3

Dim testInt As Integer = testObj(1)

End Sub

End Class

Quando você especifica testObj(1) , o compilador tenta resolvê-lo para a propriedade


padrão. No entanto, há duas propriedades padrão possíveis devido às interfaces
herdadas, portanto, o compilador sinaliza esse erro.

ID do erro: BC30686

Para corrigir este erro


Evite herdar membros com o mesmo nome. No exemplo anterior, se testObj não
precisar de nenhum dos membros de Iface2 , por exemplo, declare-o da seguinte
maneira:

VB

Dim testObj As Iface1

-ou-

Implemente a interface herdada em uma classe. Em seguida, você pode


implementar cada uma das propriedades herdadas com nomes diferentes. No
entanto, apenas uma delas pode ser a propriedade padrão da classe de
implementação. O exemplo a seguir ilustra essa situação.

VB

Public Class useIface3

Implements Iface3

Default Public Property prop1(ByVal arg As Integer) As Integer


Implements Iface1.prop

' Insert code to define Get and Set procedures for prop1.

End Property

Public Property prop2(ByVal arg As Integer) As Integer Implements


Iface2.prop

' Insert code to define Get and Set procedures for prop2.

End Property

End Class

Confira também
Interfaces
BC30220: classe Delegate '<classname>'
não tem nenhum método Invoke.
Portanto, uma expressão desse tipo não
pode ser o destino de uma chamada de
método
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma chamada para Invoke por meio de um delegado falhou porque Invoke não está
implementada na classe de delegado.

ID do erro: BC30220

Para corrigir este erro


1. Verifique se uma instância da classe delegada foi criada com uma instrução Dim e
se um procedimento foi atribuído à instância delegada com o operador AddressOf .

2. Localize o código que implementa a classe delegada e verifique se ele implementa


o procedimento Invoke .

Confira também
Representantes
Instrução Delegate
Operador AddressOf
Instrução Dim
BC30029: As classes derivadas não
podem gerar eventos de classe base
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um evento pode ser acionado somente do espaço de declaração no qual ele é


declarado. Portanto, uma classe não pode acionar eventos de nenhuma outra classe,
mesmo uma da qual ela é derivada.

ID do erro: BC30029

Para corrigir este erro


Mova a instrução Event ou a instrução RaiseEvent para que elas estejam na
mesma classe.

Confira também
Instrução Event
Instrução RaiseEvent
Erro de E/S do dispositivo
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Ocorreu um erro de entrada ou saída enquanto o programa estava usando um


dispositivo, como uma impressora ou uma unidade de disco.

Para corrigir este erro


Verifique se o dispositivo está funcionando corretamente e tente novamente a
operação.

Confira também
Tipos de Erro
A função 'Dir' deve ser chamada
primeiro com um argumento
'PathName'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma chamada inicial para a função Dir não inclui o argumento PathName . A primeira
chamada para Dir deve incluir um PathName , mas chamadas subsequentes para Dir
não precisam incluir parâmetros para recuperar o próximo item.

Para corrigir este erro


Forneça um argumento PathName na chamada de função.

Confira também
Dir
BC30205: fim de instrução esperado
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A instrução está sintaticamente concluída, mas um elemento de programação adicional


segue o elemento que a conclui. Um terminador de linha é necessário no final de cada
instrução.

Um terminador de linha divide os caracteres de um arquivo de origem do Visual Basic


em linhas. Exemplos de terminadores de linha são o caractere de retorno de carro
Unicode (&HD), o caractere de avanço de linha Unicode (&HA) e o caractere de retorno
de carro Unicode seguido pelo caractere de avanço de linha Unicode. Para obter mais
informações sobre terminadores de linha, confira a Especificação de Linguagem do
Visual Basic.

ID do erro: BC30205

Para corrigir este erro


1. Verifique se duas instruções diferentes foram colocadas inadvertidamente na
mesma linha.

2. Insira um terminador de linha após o elemento que conclui a instrução.

Confira também
Como: Quebrar e combinar instruções no código
Instruções
BC30140: Erro ao criar manifesto do
assembly: <mensagem de erro>
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O compilador do Visual Basic chama o Assembly Linker (Al.exe, também conhecido


como Alink) para gerar um assembly com um manifesto. O vinculador reportou um erro
no estágio de pré-emissão da criação do assembly.

Isso pode ocorrer se houver problemas com o arquivo de chave ou o contêiner de chave
especificado. Para marcar totalmente um assembly, é necessário fornecer um arquivo de
chave válido que contenha informações sobre as chaves públicas e privadas. Para
marcar um atraso em um assembly, é necessário marcar a caixa de seleção Somente
sinal de atraso e fornecer um arquivo de chave válido que contenha informações sobre
as informações de chave pública. A chave privada não é necessária quando um
assembly estiver marcado com atraso. Para obter mais informações, confira Como
assinar um assembly com um nome forte.

ID do Erro: BC30140

Para corrigir este erro


1. Examine a mensagem de erro e consulte o tópico Al.exe. do erro AL1019 para
obter mais explicações e recomendações.

2. Se o erro persistir, reúna informações sobre as circunstâncias e notifique o


Microsoft Product Support Services.

Confira também
Como assinar um assembly com um nome forte
Página de Assinatura, Designer de Projeto
Al.exe
Opções de comentários do Visual Studio
BC30136: Erro na criação de recursos
Win32: <mensagem de erro>
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O compilador do Visual Basic chama o Assembly Linker (Al.exe, também conhecido


como Alink) para gerar um assembly com um manifesto. O vinculador relatou um erro
ao criar um recurso em memória. Isso pode ser um problema com o ambiente ou o
computador pode estar com pouca memória.

ID do erro: BC30136

Para corrigir este erro


1. Examine a mensagem de erro e consulte o tópico Al.exe. para obter mais
explicações e conselhos.

2. Se o erro persistir, reúna informações sobre as circunstâncias e notifique o


Microsoft Product Support Services.

Confira também
Al.exe
Opções de comentários do Visual Studio
Erro no carregamento da DLL (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma DLL (biblioteca de vínculo dinâmico) é uma biblioteca especificada na cláusula Lib
de uma instrução Declare . Possíveis causas desse erro incluem:

O arquivo não é do tipo executável em DLL.

O arquivo não é uma DLL do Microsoft Windows.

A DLL faz referência a outra DLL que não está presente.

A DLL ou DLL referenciada não está em um diretório especificado no caminho.

Para corrigir este erro


Se o arquivo for um arquivo de texto fonte e, portanto, não for executável em DLL,
deverá ser compilado e vinculado a um formulário executável em DLL.

Se o arquivo não for uma DLL do Microsoft Windows, obtenha o equivalente do


Microsoft Windows.

Se a DLL referenciar outra DLL que não esteja presente, obtenha e disponibilize a
DLL referenciada.

Se a DLL ou DLL referenciada não estiver em um diretório especificado pelo


caminho, mova a DLL para um diretório referenciado.

Confira também
Instrução Declare
BC30137: Erro ao salvar o arquivo de
recurso Win32 temporário '<filename>':
<error message>
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O compilador do Visual Basic chama o Assembly Linker (Al.exe, também conhecido


como Alink) para gerar um assembly com um manifesto. O vinculador relatou um erro
ao obter um nome de arquivo para uso na gravação de um recurso na memória.

ID do erro: BC30137

Para corrigir este erro


1. Examine a mensagem de erro e consulte o tópico Al.exe. para obter mais
explicações e conselhos.

2. Se o erro persistir, reúna informações sobre as circunstâncias e notifique o


Microsoft Product Support Services.

Confira também
Al.exe
Opções de comentários do Visual Studio
BC36810: ocorreram erros na
compilação dos esquemas XML no
projeto
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Ocorreram erros na compilação dos esquemas XML no projeto. Por isso, o IntelliSense
XML não está disponível.

Há um erro em um esquema XSD (Definição de Esquema XML) incluído no projeto. Esse


erro ocorre quando você adiciona um arquivo de esquema XSD (.xsd) que entra em
conflito com o esquema XSD existente definido para o projeto.

ID do erro: BC36810

Para corrigir este erro


Clique duas vezes no aviso na janela Lista de Erros. O Visual Basic levará você ao
local no arquivo XSD que é a origem do aviso. Corrija o erro no esquema XSD.

Verifique se todos os arquivos de esquema XSD (.xsd) necessários estão incluídos


no projeto. Talvez seja necessário clicar em Mostrar Todos os Arquivos no menu
Projeto para ver os arquivos .xsd no Gerenciador de Soluções. Clique com o botão
direito do mouse em um arquivo .xsd e clique em Incluir no Projeto para incluir o
arquivo no projeto.

Se você estiver usando o Assistente de XML no Esquema, esse erro poderá ocorrer
se você inferir esquemas mais de uma vez da mesma origem. Nesse caso, você
pode remover os arquivos de esquema XSD existentes do projeto, adicionar um
novo modelo de item do XML no Esquema e, em seguida, fornecer o Assistente de
XML no Esquema com todas as fontes de XML aplicáveis para o projeto.

Se nenhum erro for identificado no esquema XSD, o compilador XML poderá não
ter informações suficientes para fornecer uma mensagem de erro detalhada. Você
poderá obter informações de erro mais detalhadas se garantir que os namespaces
de XML para os arquivos .xsd incluídos no projeto correspondam aos namespaces
de XML identificados para o Esquema de XML definido no Visual Studio.

Confira também
Janela Lista de Erros
XML
BC30722: A avaliação da expressão ou
da instrução atingiu o tempo limite
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A avaliação de uma expressão não foi concluída em tempo hábil.

ID do erro: BC30722

Para corrigir este erro


1. Verifique se o código inserido está correto.

2. Simplifique sua expressão para que leve menos tempo para ser executada.

Confira também
Depurando no Visual Studio
BC31423: o evento '<eventname1>' não
pode implementar o evento
'<eventname2>' na interface
'<interface>' porque seus tipos
delegados '<delegate1>' e
'<delegate2>' não correspondem
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O Visual Basic não pode implementar um evento porque o tipo delegado do evento não
corresponde àquele na interface. Esse erro pode ocorrer quando você define vários
eventos em uma interface e tenta implementá-los junto com o mesmo evento. Um
evento só poderá implementar dois ou mais eventos se todos os eventos
implementados forem declarados usando a sintaxe As e especificar o mesmo tipo de
delegado.

ID do Erro: BC31423

Para corrigir este erro


Implemente os eventos separadamente.

— ou —

Defina os eventos na interface usando a sintaxe As e especifique o mesmo tipo de


delegado.

Confira também
Instrução Event
Instrução Delegate
Eventos
BC31084: Os eventos não podem ser
declarados com um tipo delegado que
tenha um tipo de retorno
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um delegado foi especificado para um procedimento Function.

ID do Erro: BC31084

Para corrigir este erro


Especifique um delegado para um procedimento Sub .

Confira também
Eventos
BC30594: Eventos de variáveis
WithEvents compartilhadas não podem
ser manipulados por métodos não
compartilhados
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma variável declarada com o modificador Shared é uma variável compartilhada. Uma
variável compartilhada identifica exatamente um local de armazenamento. Uma variável
declarada com o modificador WithEvents afirma que o tipo ao qual ela pertence
manipula o conjunto de eventos gerados por ela. Quando um valor é atribuído à
variável, a propriedade criada pela declaração WithEvents desvinculará qualquer
manipulador de eventos existente e vinculará o novo manipulador de eventos por meio
do método Add .

ID do Erro: BC30594

Para corrigir este erro


Declare seu manipulador de eventos Shared .

Confira também
Compartilhado
WithEvents
BC30491: A expressão não produz um
valor
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você tentou usar uma expressão que não produz um valor em um contexto de
produção de valor, como chamar Sub em um contexto no qual Function é esperada.

ID do erro: BC30491

Para corrigir este erro


Altere a expressão para uma que produza valor.

Confira também
Tipos de Erro
BC31393: a expressão tem o tipo
'<typename>', que é um tipo restrito e
não pode ser usado para acessar
membros herdados de 'Object' ou
'ValueType'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma expressão é avaliada como um tipo que não pode ser demarcado pelo CLR
(Common Language Runtime), mas acessa um membro que requer conversão boxing.

Conversão Boxing refere-se ao processamento necessário para converter um tipo em


Object ou, em algumas ocasiões, em ValueType. O Common Language Runtime não

pode converter determinados tipos, por exemplo ArgIterator, RuntimeArgumentHandle


e TypedReference.

Essa expressão tenta usar o tipo restrito para chamar um método herdado de Object ou
ValueType, como GetHashCode ou ToString. Para acessar esse método, o Visual Basic
tentou uma conversão de boxing implícita que causa esse erro.

ID do erro: BC31393

Para corrigir este erro


1. Localize a expressão avaliada para o tipo citado.

2. Localize a parte da instrução que tenta chamar o método herdado de Object ou


ValueType.

3. Reescreva a instrução para evitar a chamada de método.

Confira também
Conversões implícitas e explícitas
BC30068: expressão é um valor e, por
isso, não pode ser o destino de uma
atribuição
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma instrução tenta atribuir um valor a uma expressão. Você pode atribuir um valor
apenas a uma variável gravável, propriedade ou elemento de matriz em tempo de
execução. O exemplo a seguir ilustra como esse erro pode ocorrer.

VB

Dim yesterday As Integer

ReadOnly maximum As Integer = 45

yesterday + 1 = DatePart(DateInterval.Day, Now)

' The preceding line is an ERROR because of an expression on the left.

maximum = 50

' The preceding line is an ERROR because maximum is declared ReadOnly.

Exemplos semelhantes podem ser aplicados a propriedades e elementos de matriz.

Acesso indireto. O acesso indireto por meio de um tipo de valor também pode gerar
esse erro. Considere o exemplo de código a seguir, que tenta definir o valor de Point
acessando-o indiretamente por meio de Location.

VB

' Assume this code runs inside Form1.

Dim exitButton As New System.Windows.Forms.Button()

exitButton.Text = "Exit this form"

exitButton.Location.X = 140

' The preceding line is an ERROR because of no storage for Location.

A última instrução do exemplo anterior falha porque cria apenas uma alocação
temporária para a estrutura Point retornada pela propriedade Location. Uma estrutura é
um tipo de valor e a estrutura temporária não é mantida após a execução da instrução.
O problema é resolvido declarando e usando uma variável para Location, o que cria
uma alocação mais permanente para a estrutura Point. O exemplo a seguir mostra o
código que pode substituir a última instrução do exemplo anterior.

VB

Dim exitLocation as New System.Drawing.Point(140, exitButton.Location.Y)

exitButton.Location = exitLocation

ID do erro: BC30068

Para corrigir este erro


Se a instrução atribuir um valor a uma expressão, substitua a expressão por uma
variável gravável, uma propriedade ou um elemento de matriz único.

Se a instrução fizer acesso indireto por meio de um tipo de valor (geralmente uma
estrutura), crie uma variável para manter o tipo de valor.

Atribua a estrutura apropriada (ou outro tipo de valor) à variável.

Use a variável para acessar a propriedade para atribuir um valor a ela.

Confira também
Operadores e Expressões
Instruções
Solucionando problemas de procedimentos
BC36593: a expressão do tipo <type>
não pode ser consultada
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

A expressão do tipo <type> não pode ser consultada. Verifique se você não está
perdendo uma referência de assembly e/ou importação de namespace para o provedor
LINQ.

Os tipos passíveis de consulta são definidos nos namespaces System.Linq,


System.Data.Linq, e System.Xml.Linq. Você deve importar um ou mais desses
namespaces para executar consultas LINQ.

O namespace System.Linq permite que você consulte objetos como coleções e matrizes
usando LINQ.

O namespace System.Data.Linq permite consultar conjuntos de dados ADO.NET e


bancos de dados SQL Server usando LINQ.

O namespace System.Xml.Linq permite que você consulte XML usando LINQ e use
recursos XML no Visual Basic.

ID do erro: BC36593

Para corrigir este erro


1. Adicione uma instrução Import para o namespace System.Linq, System.Data.Linq
ou System.Xml.Linq ao arquivo de código. Você também pode importar
namespaces para o projeto usando a página Referências do Designer de Projeto
(Meu Projeto).

2. Verifique se o tipo que você identificou como a origem da consulta pode ser
passível de consulta. Ou seja, um tipo que implementa IEnumerable<T> ou
IQueryable<T>.

Confira também
System.Linq
System.Data.Linq
System.Xml.Linq
Introdução a LINQ no Visual Basic
LINQ
XML
Referências e a instrução Imports
Instrução Imports (tipo e namespace .NET)
Página Referências, Designer de Projeto (Visual Basic)
BC42026: a expressão chama
recursivamente a propriedade que
contém '<propertyname>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma instrução no procedimento Set de uma definição de propriedade armazena um


valor no nome da propriedade.

A abordagem recomendada para manter o valor de uma propriedade é definir uma


variável Private no contêiner da propriedade e usá-la nos procedimentos Get e Set .
Em seguida, o procedimento Set deve armazenar o valor de entrada nessa variável
Private .

O procedimento Get se comporta como Function , para que ele possa atribuir um valor
ao nome da propriedade e retornar o controle encontrando a instrução End Get . A
abordagem recomendada, no entanto, incluir a variável Private como o valor em uma
Instrução Return.

O procedimento Set se comporta como Sub , que não retorna um valor. Portanto, o
procedimento ou o nome da propriedade não tem um significado especial dentro de
um procedimento Set e você não pode armazenar um valor nele.

O exemplo a seguir ilustra a abordagem que pode causar esse erro, seguida pela
abordagem recomendada.

VB

Public Class illustrateProperties

' The code in the following property causes this error.

Public Property badProp() As Char

Get

Dim charValue As Char

' Insert code to update charValue.

badProp = charValue

End Get

Set(ByVal Value As Char)

' The following statement causes this error.

badProp = Value

' The value stored in the local variable badProp

' is not used by the Get procedure in this property.

End Set

End Property

' The following code uses the recommended approach.

Private propValue As Char

Public Property goodProp() As Char

Get

' Insert code to update propValue.

Return propValue

End Get

Set(ByVal Value As Char)

propValue = Value

End Set

End Property

End Class

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou como tratar avisos como erros, consulte Configurar Avisos no Visual
Basic.

ID do erro: BC42026

Para corrigir este erro


Reescreva a definição de propriedade para usar a abordagem recomendada
conforme ilustrado no exemplo anterior.

Confira também
Procedimentos de propriedade
Instrução Property
Instrução Set
Expressão muito complexa
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma expressão de ponto flutuante contém muitas subexpressões aninhadas.

Para corrigir este erro


Divida a expressão em quantas expressões distintas forem necessárias para evitar
que o erro ocorra.

Confira também
Operadores e Expressões
BC36550: O atributo 'Extension' pode
ser aplicado apenas às declarações
'Module', 'Sub' ou 'Function'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A única maneira de estender um tipo de dados no Visual Basic é definir um método de


extensão dentro de um módulo padrão. O método de extensão pode ser um
procedimento Sub ou Function . Todos os métodos de extensão precisam ser marcados
com o atributo de extensão, <Extension()> , do namespace
System.Runtime.CompilerServices. Opcionalmente, um módulo que contém um método
de extensão pode ser marcado da mesma maneira. Nenhum outro uso do atributo de
extensão é válido.

ID do erro: BC36550

Para corrigir este erro


Remova os atributos de extensão.

Reprojete sua extensão como um método, definido em um módulo de integração.

Exemplo
O exemplo a seguir define um método Print para o tipo de dados String .

VB

Imports StringUtility

Imports System.Runtime.CompilerServices

Namespace StringUtility

<Extension()>

Module StringExtensions

<Extension()>

Public Sub Print (ByVal str As String)


Console.WriteLine(str)

End Sub

End Module

End Namespace

Confira também
Visão geral de atributos
Métodos de Extensão
Instrução Module
Arquivo já aberto
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Às vezes, um arquivo deve ser fechado antes que FileOpen ou outra operação possa
ocorrer. Entre as possíveis causas desse erro estão:

Uma operação sequencial do modo de saída FileOpen foi executada para um


arquivo que já está aberto

Uma instrução refere-se a um arquivo aberto.

Para corrigir este erro


Feche o arquivo antes de executar a instrução.

Confira também
FileOpen
O arquivo é muito grande para ser lido
em um array de bytes
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

O tamanho do arquivo que você está tentando ler em um array de bytes excede 4 GB. O
método My.Computer.FileSystem.ReadAllBytes não pode ler um arquivo que exceda
esse tamanho.

Para corrigir este erro


Use StreamReader para ler o arquivo. Para mais informações, confira Noções
básicas de E/S de arquivo do .NET Framework e o sistema de arquivos (Visual
Basic).

Confira também
ReadAllBytes
StreamReader
Access de arquivo com o Visual Basic
Como: ler texto usando arquivos com um StreamReader
O nome do arquivo ou da classe não foi
localizado durante a operação de
automação (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O nome especificado para nome ou classe de arquivo em uma chamada para a função
GetObject não foi encontrado.

Para corrigir este erro


Verifique os nomes e tente de novo. Verifique se o nome usado para o parâmetro
class corresponde ao registrado com o sistema.

Confira também
Tipos de Erro
Arquivo não localizado (erro de tempo
de execução do Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Arquivo não foi encontrado onde especificado. O erro tem as seguintes causas
possíveis:

Uma instrução refere-se a um arquivo que não existe.

Foi feita uma tentativa de chamar um procedimento em uma DLL (biblioteca de


vínculo dinâmico), mas a biblioteca especificada na Lib cláusula da Declare
instrução não pode ser encontrada.

Você tentou abrir um projeto ou carregar um arquivo de texto que não existe.

Para corrigir este erro


Verifique o ortografia do nome do arquivo e o caminho especificado.

Confira também
Instrução Declare
BC33107: o primeiro operando em uma
expressão 'If' binária deve ser um tipo
anulável ou um tipo de referência
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma expressão If pode usar dois ou três argumentos. Quando você envia apenas dois
argumentos, o primeiro argumento deve ser um tipo de referência ou um tipo de valor
anulável. Se o primeiro argumento for avaliado para qualquer outra coisa que não seja
Nothing , seu valor será retornado. Se o primeiro argumento for avaliado para Nothing ,
o segundo argumento será avaliado e retornado.

Por exemplo, o código a seguir contém duas expressões If , uma com três argumentos
e outra com dois argumentos. As expressões calculam e retornam o mesmo valor.

VB

' firstChoice is a nullable value type.

Dim firstChoice? As Integer = Nothing

Dim secondChoice As Integer = 1128

' If expression with three arguments.

Console.WriteLine(If(firstChoice IsNot Nothing, firstChoice, secondChoice))

' If expression with two arguments.

Console.WriteLine(If(firstChoice, secondChoice))

As seguintes expressões causam este erro:

VB

Dim choice1 = 4

Dim choice2 = 5

Dim booleanVar = True

' Not valid.

'Console.WriteLine(If(choice1 < choice2, 1))

' Not valid.

'Console.WriteLine(If(booleanVar, "Test returns True."))

ID do erro: BC33107

Para corrigir este erro


Se você não puder alterar o código para que o primeiro argumento seja um tipo
de valor anulável ou um tipo de referência, considere converter em uma expressão
de três argumentos If ou em uma instrução If...Then...Else .

VB

Console.WriteLine(If(choice1 < choice2, 1, 2))

Console.WriteLine(If(booleanVar, "Test returns True.", "Test returns


False."))

Confira também
Operador If
Instrução If...Then...Else
Tipos de Valor Anulável
BC30148: A primeira instrução deste '
Sub New ' deve ser uma chamada para
'MyBase.New' ou 'MyClass.New' (Não
há nenhum construtor acessível sem
parâmetros)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Primeira instrução deste "Sub New" deve ser uma chamada para "MyBase.New" ou
"MyClass.New" porque a classe base "<basename>" de "<derivedname>" não tem um
"Sub New" acessível que pode ser chamado sem argumentos.

Em uma classe derivada, cada construtor deve chamar um construtor de classe base
( MyBase.New ). Se a classe base tiver um construtor sem parâmetros acessível a classes
derivadas, MyBase.New poderá ser chamado automaticamente. Caso contrário, um
construtor de classe base deve ser chamado com parâmetros e isso não pode ser feito
automaticamente. Nesse caso, a primeira instrução de cada construtor de classe
derivada deve chamar um construtor parametrizado na classe base ou chamar outro
construtor na classe derivada que faz uma chamada de construtor de classe base.

ID do erro: BC30148

Para corrigir este erro


Chame MyBase.New fornecendo os parâmetros necessários ou chame um
construtor par que faça essa chamada.

Por exemplo, se a classe base tiver um construtor declarado como Public Sub
New(ByVal index as Integer) , a primeira instrução no construtor de classe derivada

poderá ser MyBase.New(100) .

Confira também
Noções básicas de herança
BC30920: a primeira instrução deste
'Sub New' deve ser uma chamada
explícita para MyBase.New' ou
'MyClass.New' porque
'<constructorname>' na classe base
'<baseclassname>' de
'<derivedclassname>' está marcado
como obsoleto: '<errormessage>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um construtor de classe não chama explicitamente um construtor de classe base e o


construtor implícito de classe base é marcado com o atributo ObsoleteAttribute e a
diretiva para tratá-lo como aviso.

Quando um construtor de classe derivada não chama um construtor de classe base, o


Visual Basic tenta gerar uma chamada implícita para um construtor de classe base sem
parâmetros. Se não houver nenhum construtor acessível na classe base que possa ser
chamado sem argumentos, o Visual Basic não poderá gerar uma chamada implícita.
Nesse caso, o construtor necessário é marcado com o atributo ObsoleteAttribute,
portanto, o Visual Basic não pode chamá-lo.

Você pode marcar qualquer elemento de programação como não mais em uso
aplicando ObsoleteAttribute a ele. Se você fizer isso, poderá definir a propriedade
IsError do atributo como True ou False . Se você definir como True , o compilador
tratará uma tentativa de usar o elemento como um erro. Se você definir como False ou
deixar como padrão de False , o compilador emitirá um aviso se houver uma tentativa
de usar o elemento.

ID do erro: BC30920

Para corrigir este erro


1. Examine a mensagem de erro entre aspas e tome as medidas apropriadas.
2. Inclua uma chamada para MyBase.New() ou MyClass.New() como a primeira
instrução da Sub New classe derivada.

Confira também
Visão geral de atributos
BC32096: 'For Each' no tipo
'<typename>' é ambíguo porque o tipo
implementa várias instâncias de
'System.Collections.Generic.IEnumerable
(Of T)'
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Uma instrução For Each especifica uma variável de iterador que tem mais de um
método GetEnumerator.

A variável de iterador deve ser de um tipo que implementa a interface


System.Collections.IEnumerable ou System.Collections.Generic.IEnumerable<T> em um
dos namespaces Collections do .NET Framework. É possível que uma classe
implemente mais de uma interface genérica construída, usando um argumento de tipo
diferente para cada construção. Se uma classe que faz isso for usada para a variável de
iterador, essa variável terá mais de um método GetEnumerator. Nesse caso, o Visual
Basic não pode escolher qual método chamar.

ID do erro: BC32096

Para corrigir este erro


Use o Operador DirectCast ou o Operador TryCast para converter o tipo de variável
de iterador na interface que define o método GetEnumerator que você deseja usar.

Confira também
Instrução For Each...Next
Interfaces
BC31535: A referência de assembly
amigável <reference> é inválida
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A referência de assembly amigável <reference> é inválida. O nome forte assinado em


assemblies deve especificar uma chave pública em suas declarações InternalsVisibleTo.

O nome do assembly passado para o construtor de atributo InternalsVisibleToAttribute


identifica um assembly de nome forte, mas não inclui um atributo PublicKey .

ID do erro: BC31535

Para corrigir este erro


1. Determine a chave pública para o assembly amigável de nome forte. Inclua a chave
pública como parte do nome do assembly passado para o construtor de atributo
InternalsVisibleToAttribute usando o atributo PublicKey .

Confira também
AssemblyName
Assemblies Amigáveis
BC42105: A função '<procedurename>'
não retorna um valor em todos os
caminhos do código
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A função '<procedurename>' não retorna um valor em todos os caminhos do código.


Uma instrução "Return" está ausente?

Um procedimento Function tem pelo menos um caminho possível por meio do seu
código que não retorna um valor.

Você pode retornar um valor de um procedimento Function de qualquer uma destas


formas:

Inclua o valor em uma Instrução Return.

Atribua o valor ao nome do procedimento Function e execute uma instrução Exit


Function .

Atribua o valor ao nome do procedimento Function e execute a instrução End


Function .

Se o controle for passado a Exit Function ou End Function e você não tiver atribuído
nenhum valor ao nome do procedimento, esse procedimento retornará o valor padrão
do tipo de dados de retorno. Para obter mais informações, consulte "Comportamento"
em Instrução Function.

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratá-los como erros, consulte Configurar Avisos no Visual Basic.

ID do Erro: BC42105

Para corrigir este erro


Verifique sua lógica de fluxo de controle e não deixe de atribuir um valor antes de
cada instrução que cause retorno.

É mais fácil garantir que cada retorno do procedimento informe um valor se você
sempre usar a instrução Return . Se você fizer isso, a última instrução antes de End
Function deve ser uma Return .
Confira também
Procedimentos de função
Instrução Function
Página de Compilação, Designer de Projeto (Visual Basic)
BC30957: a avaliação de função está
desabilitada porque uma avaliação de
função anterior atingiu o tempo limite
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A avaliação de função está desabilitada porque o tempo limite de uma avaliação de


função anterior foi alcançado. Para habilitar novamente a avaliação de função, execute a
etapa outra vez ou reinicie a depuração.

No depurador do Visual Studio, uma expressão especifica uma chamada de


procedimento, mas outra avaliação atingiu o tempo limite.

As possíveis causas para uma chamada de procedimento para o tempo limite incluem
um loop infinito ou um loop sem fim. Para obter mais informações, confira Instrução
For...Next.

Um caso especial de um loop infinito é a recursão. Para obter mais informações, confira
Procedimentos Recursivos.

ID do erro: BC30957

Para corrigir este erro


1. Se possível, determine o que era a avaliação da função anterior e o que causou o
tempo limite. Caso contrário, você poderá encontrar esse erro novamente.

2. Execute o depurador em etapas novamente ou encerre e reinicie a depuração.

Confira também
Depurando no Visual Studio
Navegar pelo Código com o Depurador
BC32124: parâmetros genéricos usados
como tipos de parâmetro opcionais
devem ter a classe restrita
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um procedimento é declarado com um parâmetro opcional que usa um parâmetro de


tipo, que não está limitado a ser um tipo de referência.

Você deve sempre fornecer um valor padrão para cada parâmetro opcional. Se o
parâmetro for de um tipo de referência, o valor opcional deverá ser Nothing , um valor
válido para qualquer tipo de referência. No entanto, se o parâmetro for de um tipo de
valor, esse último será um tipo de dados elementar predefinido pelo Visual Basic. Isso
ocorre porque um tipo de valor composto, como uma estrutura definida pelo usuário,
não tem valor padrão válido.

Ao usar um parâmetro de tipo para um opcional, você deve garantir que ele seja de um
tipo de referência para evitar a possibilidade de um tipo de valor sem valor padrão
válido. Isso significa que você deve restringir o parâmetro de tipo com a palavra-chave
Class ou com o nome de uma classe específica.

ID do erro: BC32124

Para corrigir este erro


Restrinja o parâmetro de tipo para aceitar apenas um tipo de referência ou não o
use para o parâmetro opcional.

Confira também
Tipos genéricos no Visual Basic
Lista de Tipos
Instrução Class
Parâmetros Opcionais
Estruturas
Nothing
BC31103: o acessador 'Get' da
propriedade '<propertyname>' não está
acessível
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma instrução tenta recuperar o valor de uma propriedade quando ela não tem acesso
ao procedimento da propriedade Get .

Se a Instrução Get for marcada com um nível de acesso mais restritivo do que sua
Instrução Property, uma tentativa de ler o valor da propriedade poderá falhar nos
seguintes casos:

A instrução Get está marcada como Private e o código de chamada está fora da
classe ou estrutura na qual a propriedade está definida.

A instrução Get está marcada como Protected e o código de chamada não está na
classe ou estrutura na qual a propriedade está definida, nem em uma classe
derivada.

A instrução Get está marcada como Friend e o código de chamada não está no
mesmo assembly no qual a propriedade está definida.

ID do erro: BC31103

Para corrigir este erro


Se você tiver o controle do código-fonte que define a propriedade, considere
declarar o procedimento Get com o mesmo nível de acesso que o da própria
propriedade.

Se você não tiver controle do código-fonte que define a propriedade ou deve


restringir o nível de acesso do procedimento Get mais do que a própria
propriedade, tente mover a instrução que lê o valor da propriedade para uma
região de código que tenha melhor acesso à propriedade.

Confira também
Procedimentos de propriedade
Como declarar uma propriedade com níveis de acesso mistos
BC30506: A cláusula de identificadores
requer uma variável WithEvents definida
no tipo recipiente ou em um de seus
tipos base
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você não forneceu uma WithEvents variável em sua Handles cláusula. A Handles
palavra-chave no final de uma declaração de procedimento faz com que ela manipule
eventos gerados por uma variável de objeto declarada usando a WithEvents palavra-
chave.

ID do erro: BC30506

Para corrigir este erro


Forneça a variável necessária WithEvents .

Exemplo
No exemplo a seguir, o Visual Basic gera um erro BC30506 do compilador porque a
palavra-chave WithEvents não é usada na definição da System.Timers.Timer instância.

VB

Imports System.Timers

Module Module1

Private _timer1 As New Timer() With {.Interval = 1000, .Enabled = True}

Sub Main()

Console.WriteLine("Press any key to start the timer...")

Console.ReadKey()

_timer1.Start()

Console.ReadKey()

End Sub

Private Sub Timer1_Tick(sender As Object, args As EventArgs) Handles


_timer1.Elapsed

Console.WriteLine("Press any key to terminate...")

End Sub

End Module

O exemplo a seguir é compilado com êxito porque a _timer1 variável é definida com a
WithEvents palavra-chave:

VB

Imports System.Timers

Module Module1

Private WithEvents _timer1 As New Timer() With {.Interval = 1000}

Sub Main()

Console.WriteLine("Press any key to start the timer...")

Console.ReadKey()

_timer1.Start()

Console.ReadKey()

End Sub

Private Sub Timer1_Tick(sender As Object, args As EventArgs) Handles


_timer1.Elapsed

Console.WriteLine("Press any key to terminate...")

End Sub

End Module

Confira também
Alças
BC30203: Identificador esperado
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um elemento de programação que não é um nome de elemento declarado reconhecível


ocorre quando o contexto requer um nome de elemento. Uma possível causa é que um
atributo foi especificado em algum lugar diferente no início da instrução.

ID do erro: BC30203

Para corrigir este erro


Verifique se todos os atributos na instrução estão colocados no início.

Verifique se todos os nomes de elemento na instrução estão escritos corretamente.

Confira também
Nomes de elementos declarados
Visão geral de atributos
BC30033: O identificador é muito longo
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O nome, ou identificador, de cada elemento de programação é limitado a 1023


caracteres. Além disso, um nome totalmente qualificado não pode exceder 1023
caracteres. Isso significa que toda a cadeia de caracteres do identificador ( <namespace>.
<...>.<namespace>.<class>.<element> ) não pode ter mais de 1.023 caracteres, incluindo

os caracteres do operador de acesso de membro ( . ).

ID do erro: BC30033

Para corrigir este erro


Reduza o comprimento do identificador.

Confira também
Nomes de elementos declarados
BC30996: Inicializador esperado
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você tentou declarar uma instância de uma classe usando um inicializador de objeto no
qual a lista de inicialização está vazia, como mostra o exemplo a seguir.

' Not valid.

' Dim aStudent As New Student With {}

Pelo menos um campo ou propriedade deve ser inicializado na lista de inicializadores,


como mostra o exemplo a seguir.

Dim aStudent As New Student With {.year = "Senior"}

ID do Erro: BC30996

Para corrigir este erro


Inicialize pelo menos um campo ou propriedade no inicializador ou não use um
inicializador de objeto.

Confira também
Inicializadores de objeto: tipos nomeados e anônimos
Como declarar um objeto usando um inicializador de objeto
Entrada passou do final do arquivo
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Ou uma instrução Input está fazendo a leitura de um arquivo vazio ou de um no qual


todos os dados são usados, ou você usou a função EOF com um arquivo aberto para
acesso binário.

Para corrigir este erro


1. Use a função EOF imediatamente antes da instrução Input para detectar o final do
arquivo.

2. Se o arquivo for aberto para acesso binário, use Seek e Loc .

Confira também
Input
EOF
Seek
Loc
Erro interno ocorrido em <location>
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Ocorreu um erro interno. A linha na qual ocorreu está contida na mensagem de erro.

Para corrigir este erro


Verifique se esse erro não foi gerado pela instrução Error ou pelo método Raise ;
se não foi gerado, entre em contato com Microsoft Product Support Services para
relatar as condições sob as quais a mensagem apareceu.

Confira também
Noções básicas do depurador
BC41999: Conversão implícita de
'<typename1>' em '<typename2>' ao
copiar o valor do parâmetro 'ByRef'
'<parametername>' de volta para o
argumento correspondente.
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um procedimento é chamado com um argumento ByRef de um tipo diferente daquele


do seu parâmetro correspondente.

Se você passar um argumento ByRef , o Visual Basic às vezes copia o valor do


argumento em uma variável local no procedimento em vez de passar uma referência.
Nesse caso, quando o procedimento retorna, o Visual Basic deve copiar o valor da
variável local de volta para o argumento no código de chamada.

Se um valor de argumento ByRef for copiado no procedimento e o argumento e o


parâmetro forem do mesmo tipo, nenhuma conversão será necessária. Mas se os tipos
forem diferentes, o Visual Basic deverá ser convertido em ambas as direções. Como
você não pode usar CType ou nenhuma das outras palavras-chave de conversão em um
argumento ou parâmetro de procedimento, essa conversão é sempre implícita.

Por padrão, esta mensagem é um aviso. Para obter informações sobre como ocultar
avisos ou tratá-los como erros, consulte Configurar Avisos no Visual Basic.

ID do Erro: BC41999

Para corrigir este erro


Se possível, use um argumento de chamada do mesmo tipo que o parâmetro de
procedimento, para que o Visual Basic não precise fazer nenhuma conversão.

Se você precisar chamar o procedimento com um tipo de argumento diferente do


tipo de parâmetro, mas não precisar retornar um valor para o argumento de
chamada, defina o parâmetro como ByVal em vez de ByRef .

Confira também
Procedimentos
Parâmetros e Argumentos de Procedimento
Passar argumentos por valor e por referência
Conversões implícitas e explícitas
BC30020: 'Is' requer operandos que
tenham tipos de referência, mas este
operando tem o tipo de valor
'<typename>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O operador de comparação Is determina se duas variáveis de objeto se referem à


mesma instância. Essa comparação não é definida para tipos de valor.

ID do erro: BC30020

Para corrigir este erro


Use o operador de comparação aritmética apropriado ou o operador Like para
comparar dois tipos de valor.

Confira também
Operador Is
Operador Like
Operadores de comparação
BC32128: o operando 'IsNot' do tipo
'typename' só pode ser comparado a
'Nothing', porque 'typename' é um tipo
que permite valor nulo
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma variável declarada como valor de tipo anulável foi comparada a uma expressão
diferente de Nothing usando o operador IsNot .

ID do erro: BC32128

Para corrigir este erro


Para comparar um tipo anulável a uma expressão diferente de Nothing usando o
operador IsNot , chame o método GetType no tipo anulável e compare o resultado com
a expressão, conforme mostrado no exemplo a seguir.

VB

Dim number? As Integer = 5

If number IsNot Nothing Then

If number.GetType() IsNot Type.GetType("System.Int32") Then

End If

End If

Confira também
Tipos de Valor Anulável
Operador IsNot
BC30801: rótulos que são números são
seguidos de dois pontos
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os números de linha seguem as mesmas regras que outros tipos de rótulos e devem
conter dois pontos.

ID do erro: BC30801

Para corrigir este erro


Coloque o número seguido por dois pontos no início de uma linha de código; por
exemplo:

VB

400: X += 1

Confira também
Instrução GoTo
BC42326: a expressão lambda não será
removida deste manipulador de eventos
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A expressão lambda não será removida deste manipulador de eventos. Atribua a


expressão lambda a uma variável e use essa última para adicionar e remover o evento.

Quando expressões lambda são usadas com manipuladores de eventos, talvez você não
veja o comportamento esperado. O compilador gera um novo método para cada
definição de expressão lambda, mesmo que elas sejam idênticas. Portanto, o código a
seguir exibe False .

VB

Module Module1

Sub Main()

Dim fun1 As ChangeInteger = Function(p As Integer) p + 1

Dim fun2 As ChangeInteger = Function(p As Integer) p + 1

Console.WriteLine(fun1 = fun2)

End Sub

Delegate Function ChangeInteger(ByVal x As Integer) As Integer

End Module

Quando expressões lambda são usadas com manipuladores de eventos, isso pode
causar resultados inesperados. No exemplo a seguir, a expressão lambda adicionada por
AddHandler não é removida pela instrução RemoveHandler .

VB

Module Module1

Event ProcessInteger(ByVal x As Integer)

Sub Main()

' The following line adds one listener to the event.

AddHandler ProcessInteger, Function(m As Integer) m

' The following statement searches the current listeners

' for a match to remove. However, this lambda is not the same

' as the previous one, so nothing is removed.

RemoveHandler ProcessInteger, Function(m As Integer) m

End Sub

End Module

Por padrão, esta mensagem é um aviso. Para obter informações sobre como ocultar
avisos ou como tratar avisos como erros, consulte Configurar avisos no Visual Basic.

ID do erro: BC42326

Para corrigir este erro


Para evitar o aviso e remover a expressão lambda, ela deve ser atribuída a uma variável,
que deve ser usada nas instruções AddHandler e RemoveHandler , conforme mostrado no
exemplo a seguir.

VB

Module Module1

Event ProcessInteger(ByVal x As Integer)

Dim PrintHandler As ProcessIntegerEventHandler

Sub Main()

' Assign the lambda expression to a variable.

PrintHandler = Function(m As Integer) m

' Use the variable to add the listener.

AddHandler ProcessInteger, PrintHandler

' Use the variable again when you want to remove the listener.

RemoveHandler ProcessInteger, PrintHandler

End Sub

End Module

Confira também
Expressões Lambda
Conversão de delegado reduzida
Eventos
BC36635: as expressões lambda não são
válidas na primeira expressão de uma
instrução 'Select Case'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você não pode usar uma expressão lambda para a expressão de teste em uma instrução
Select Case . As definições de expressão lambda retornam funções, e a expressão de
teste de uma instrução Select Case deve ser um tipo de dados elementar.

O seguinte código causa este erro:

VB

' Select Case (Function(arg) arg Is Nothing)

' List of the cases.

' End Select

ID do erro: BC36635

Para corrigir este erro


Examine seu código para determinar se uma construção condicional diferente,
como uma instrução If...Then...Else , funcionaria para você.

Talvez você tenha a intenção de chamar a função, conforme mostrado no seguinte


código:

VB

Dim num? As Integer

Select Case ((Function(arg? As Integer) arg Is Nothing)(num))

' List of the cases

End Select

Confira também
Expressões Lambda
Instrução If...Then...Else
Instrução Select...Case
BC42017: resolução de associação tardia;
poderiam ocorrer erros de runtime
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um objeto é atribuído a uma variável declarada como sendo do Tipo de Dados de


Objeto.

Quando você declara uma variável como Object , o compilador deve executar a
associação tardia, o que causa operações extras em tempo de execução. Ela também
expõe seu aplicativo a possíveis erros em tempo de execução. Por exemplo, se você
atribuir Form à variável Object e tentar acessar a propriedade
XmlDocument.NameTable, o runtime gerará MemberAccessException porque a classe
Form não expõe uma propriedade NameTable .

Se você declarar que a variável é de um tipo específico, o compilador poderá executar a


associação antecipada em tempo de compilação. Isso resulta em melhor desempenho,
acesso controlado aos membros do tipo específico e melhor legibilidade do código.

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratar os avisos como erros, consulte Configurar avisos no Visual Basic.

ID do erro: BC42017

Para corrigir este erro


Se possível, declare a variável como de um tipo específico.

Confira também
Associação Antecipada e Tardia
Declaração de Variável do Objeto
BC30933: Não é possível aplicar a
resolução de sobrecarga com associação
tardia a “<procedurename>” porque a
instância de acesso é um tipo de
interface
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O compilador está tentando resolver uma referência a uma propriedade ou


procedimento sobrecarregado, mas a referência falha porque um argumento é do tipo
Object e o objeto de referência tem o tipo de dados de uma interface. O argumento

Object força o compilador a resolver a referência como associação tardia.

Nessas circunstâncias, o compilador resolve a sobrecarga por meio da classe de


implementação em vez de por meio da interface subjacente. Se a classe renomear uma
das versões sobrecarregadas, o compilador não considerará essa versão uma sobrecarga
porque seu nome é diferente. Isso, por sua vez, faz com que o compilador ignore a
versão renomeada quando, na verdade, poderia ter sido a escolha correta para resolver
a referência.

ID do erro: BC30933

Para corrigir este erro


Use CType para converter o argumento de Object para o tipo especificado pela
assinatura da sobrecarga que você deseja chamar.

Observe que ele não ajuda a converter o objeto de referência para a interface
subjacente. Você deve converter o argumento para evitar esse erro.

Exemplo
O exemplo a seguir mostra uma chamada para um procedimento Sub sobrecarregado
que causa esse erro em tempo de compilação.

VB

Module m1

Interface i1

Sub s1(ByVal p1 As Integer)

Sub s1(ByVal p1 As Double)

End Interface

Class c1

Implements i1

Public Overloads Sub s1(ByVal p1 As Integer) Implements i1.s1


End Sub

Public Overloads Sub s2(ByVal p1 As Double) Implements i1.s1

End Sub

End Class

Sub Main()

Dim refer As i1 = New c1

Dim o1 As Object = 3.1415

' The following reference is INVALID and causes a compiler error.

refer.s1(o1)

End Sub

End Module

No exemplo anterior, se o compilador permitisse que a chamada para s1 fosse gravada,


a resolução ocorreria por meio da classe c1 em vez da interface i1 . Isso significaria que
o compilador não consideraria s2 porque seu nome é diferente no c1 , embora seja a
escolha correta conforme definido pelo i1 .

Você pode corrigir o erro alterando a chamada para qualquer uma das seguintes linhas
de código:

VB

refer.s1(CType(o1, Integer))

refer.s1(CType(o1, Double))

Cada uma das linhas de código anteriores converte explicitamente a variável Object o1
em um dos tipos de parâmetro definidos para as sobrecargas.

Confira também
Sobrecarga de procedimento
Resolução de Sobrecarga
Função CType
BC30157: '.' ou '!' à esquerda só podem
aparecer dentro de uma instrução 'With'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um ponto final (.) ou ponto de exclamação (!) que não está dentro de um bloco With
ocorre sem uma expressão à esquerda. O acesso de membro ( . ) e o acesso de membro
do dicionário ( ! ) exigem uma expressão especificando o elemento que contém o
membro. Isso deve aparecer imediatamente à esquerda do acessador ou como o
destino de um bloco With que contém o acesso do membro.

ID do erro: BC30157

Para corrigir este erro


1. Verifique se esse bloco With está formatado corretamente.

2. Se não houver nenhum bloco With , adicione uma expressão à esquerda do


acessador que seja avaliada como um elemento definido que contém o membro.

Confira também
Caracteres especiais no código
Instrução With...End With
BC30494: A linha é muito longa
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As linhas de texto de origem não podem exceder 65535 caracteres.

ID do erro: BC30494

Para corrigir este erro


Reduza o comprimento da linha para 65535 caracteres ou menos.

Confira também
Tipos de Erro
BC30830: As instruções 'Line' não são
mais compatíveis
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As instruções Line não são mais compatíveis. A funcionalidade de E/S do arquivo está
disponível como Microsoft.VisualBasic.FileSystem.LineInput e a funcionalidade
gráfica está disponível como System.Drawing.Graphics.DrawLine .

ID do erro: BC30830

Para corrigir este erro


Se estiver executando o acesso ao arquivo, use
Microsoft.VisualBasic.FileSystem.LineInput .

Se estiver executando grafos, use System.Drawing.Graphics.Drawline .

Confira também
System.IO
System.Drawing
Access de arquivo com o Visual Basic
BC36563: O método não tem uma
assinatura compatível com o delegado
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Há uma incompatibilidade entre as assinaturas do método e o delegado que você está


tentando usar. A instrução Delegate define os tipos de parâmetro e os tipos de retorno
de uma classe delegada. Qualquer procedimento que tenha parâmetros
correspondentes de tipos compatíveis e tipos de retorno pode ser usado para criar uma
instância desse tipo delegado.

ID do erro: BC36563

Confira também
Operador AddressOf
Instrução Delegate
Resolução de Sobrecarga
Tipos genéricos no Visual Basic
BC32126: Os métodos de
'System.Nullable(Of T)' não podem ser
usados como operandos do operador
'AddressOf'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma instrução usa o operador AddressOf com um operando que representa um


procedimento da estrutura Nullable<T>.

ID do erro: BC32126

Para corrigir este erro


Substitua o nome do procedimento na cláusula AddressOf por um operando que
não seja membro de Nullable<T>.

Escreva uma classe que encapsula o método de Nullable<T> que você deseja usar.
No exemplo a seguir, a classe NullableWrapper define um novo método chamado
GetValueOrDefault . Como esse novo método não é um membro de Nullable<T>,
ele pode ser aplicado a nullInstance , uma instância de um tipo que permite valor
nulo, para formar um argumento para AddressOf .

VB

Module Module1

Delegate Function Deleg() As Integer

Sub Main()

Dim nullInstance As New Nullable(Of Integer)(1)

Dim del As Deleg

' GetValueOrDefault is a method of the Nullable generic

' type. It cannot be used as an operand of AddressOf.

' del = AddressOf nullInstance.GetValueOrDefault

' The following line uses the GetValueOrDefault method

' defined in the NullableWrapper class.

del = AddressOf (New NullableWrapper(

Of Integer)(nullInstance)).GetValueOrDefault

Console.WriteLine(del.Invoke())

End Sub

Class NullableWrapper(Of T As Structure)

Private m_Value As Nullable(Of T)

Sub New(ByVal Value As Nullable(Of T))


m_Value = Value

End Sub

Public Function GetValueOrDefault() As T

Return m_Value.Value

End Function

End Class

End Module

Confira também
Nullable<T>
Operador AddressOf
Tipos de Valor Anulável
Tipos genéricos no Visual Basic
BC30617: instruções 'Module' só podem
ocorrer no nível de namespace ou
arquivo
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As instruções Module devem aparecer na parte superior do arquivo de origem


imediatamente após Option e Imports , atributos globais e declarações de namespace,
mas antes de todas as outras declarações.

ID do erro: BC30617

Para corrigir este erro


Mova a instrução Module para a parte superior da declaração de namespace ou do
arquivo de origem.

Confira também
Instrução Module
BC40031: o nome <membername> não
é compatível com CLS
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um assembly é marcado como <CLSCompliant(True)> , mas expõe um membro com um


nome que começa com um sublinhado ( _ ).

Um elemento de programação pode conter um ou mais sublinhados, mas para estar em


conformidade com o CLS (Language Independence and Language-Independent
Components ), não deve começar com sublinhado. Consulte Nomes de elemento
declarados.

Quando você aplica o CLSCompliantAttribute a um elemento de programação, define o


parâmetro isCompliant do atributo como True ou False para indicar conformidade ou
não conformidade. Não há nenhum padrão para esse parâmetro e você precisa fornecer
um valor.

Se você não aplicar o CLSCompliantAttribute a um elemento, ele será considerado que


não está em conformidade.

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratar os avisos como erros, consulte Configurar avisos no Visual Basic.

ID do Erro: BC40031

Para corrigir este erro


Se você tiver controle sobre o código-fonte, altere o nome do membro para que
ele não comece com um sublinhado.

Se você exigir que o nome do membro permaneça inalterado, remova


CLSCompliantAttribute de sua definição ou marque-o como
<CLSCompliant(False)> . Você ainda pode marcar o assembly como
<CLSCompliant(True)> .

Confira também
Nomes de elementos declarados
Convenções de nomenclatura do Visual Basic
BC30451: o nome '<name>' não foi
declarado
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma instrução faz referência a um elemento de programação, mas o compilador não


pode encontrar um elemento com esse nome exato.

ID do erro: BC30451

Para corrigir este erro


1. Verifique a ortografia do nome na instrução de referência. O Visual Basic não
diferencia maiúsculas de minúsculas, mas qualquer outra variação na ortografia é
considerada um nome completamente diferente. Observe que o sublinhado ( _ ) faz
parte do nome e, portanto, faz parte da ortografia.

2. Verifique se você tem o operador de acesso de membro ( . ) entre um objeto e seu


membro. Por exemplo, se você tiver um controle TextBox de nome TextBox1 , para
acessar sua propriedade Text, você deverá digitar TextBox1.Text . Se, em vez disso,
você digitar TextBox1Text , você terá criado um nome diferente.

3. Se a ortografia estiver correta e a sintaxe de qualquer acesso de membro do


objeto estiver correta, verifique se o elemento foi declarado. Para obter mais
informações, consulte Nomes de elementos declarados.

4. Se o elemento de programação tiver sido declarado, verifique se ele está no


escopo. Se a instrução de referência estiver fora da região de declaração do
elemento de programação, talvez seja necessário qualificar o nome do elemento.
Para obter mais informações, consulte Escopo no Visual Basic.

5. Se você não estiver usando um tipo totalmente qualificado, tipo e nome de


membro (por exemplo, seu código se refere a uma propriedade como
MethodInfo.Name em vez de System.Reflection.MethodInfo.Name ), adicione uma

instrução Imports.

6. Se você estiver tentando compilar um projeto no estilo SDK (um projeto com um
arquivo *.vbproj que começa com a linha <Project Sdk="Microsoft.NET.Sdk"> ), e a
mensagem de erro se referir a um tipo ou membro no assembly
Microsoft.VisualBasic.dll, configure seu aplicativo para compilar com uma
referência à Biblioteca de Runtime do Visual Basic. Por padrão, um subconjunto da
biblioteca é inserido em seu assembly em um projeto no estilo SDK.

Por exemplo, o exemplo a seguir não é compilado porque o método


Microsoft.VisualBasic.CompilerServices.Conversions.ChangeType não pode ser
encontrado. Ele não está inserido no subconjunto do Runtime do Visual Basic
incluído no aplicativo.

VB

Imports Microsoft.VisualBasic.CompilerServices

Public Module Example

Sub Main(args As String())

Dim originalValue As String = args(0)

Dim t As Type = GetType(Int32)

Dim i As Int32 = Conversions.ChangeType(originalValue, t)


Console.WriteLine($"'{originalValue}' --> {i}")

End Sub

End Module

Para resolver esse erro, adicione o elemento <VBRuntime>Default</VBRuntime> à


seção <PropertyGroup> de projetos, como mostra o arquivo de projeto do Visual
Basic a seguir.

XML

<Project Sdk="Microsoft.NET.Sdk">

<ItemGroup>

<Reference Include="Microsoft.VisualBasic" />

</ItemGroup>

<PropertyGroup>

<VBRuntime>Default</VBRuntime>
<OutputType>Exe</OutputType>

<RootNamespace>vbruntime</RootNamespace>

<TargetFramework>net472</TargetFramework>

</PropertyGroup>

</Project>

Confira também
Resumo de Declarações e Constantes
Convenções de nomenclatura do Visual Basic
Nomes de elementos declarados
Referências a elementos declarados
BC40039: O nome <> no namespace
raiz <> não é compatível com CLS
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um assembly é marcado como <CLSCompliant(True)> , mas o nome do namespace raiz


começa com um sublinhado ( _ ).

Um elemento de programação pode conter um ou mais sublinhados, mas para estar em


conformidade com o CLS (Language Independence and Language-Independent
Components), não deve começar com um sublinhado. Consulte Nomes de elemento
declarados.

Quando você aplica o CLSCompliantAttribute a um elemento de programação, define o


parâmetro isCompliant do atributo como True ou False para indicar conformidade ou
não conformidade. Não há nenhum padrão para esse parâmetro e você precisa fornecer
um valor.

Se você não aplicar o CLSCompliantAttribute a um elemento, ele será considerado que


não está em conformidade.

Por padrão, esta mensagem é um aviso. Para obter informações sobre como ocultar
avisos ou tratá-los como erros, consulte Configurar avisos no Visual Basic.

ID do Erro: BC40039

Para corrigir este erro


Se você precisar de conformidade com CLS, altere o nome do namespace raiz para
que nenhum de seus elementos comece com um sublinhado.

Se você precisar que o nome do namespace raiz permaneça inalterado, remova o


CLSCompliantAttribute do assembly ou marque-o como <CLSCompliant(False)> .

Confira também
Instrução Namespace
Namespaces no Visual Basic
-rootnamespace
Página de Aplicativo, Designer de Projeto (Visual Basic)
Nomes de elementos declarados
Convenções de nomenclatura do Visual Basic
BC40056: o namespace ou o tipo
especificado em Imports
'<qualifiedelementname>' não contém
nenhum membro público ou não pode
ser localizado
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

O namespace ou o tipo especificado em Imports '<qualifiedelementname>' não contém


nenhum membro público ou não pode ser localizado. Verifique se o namespace ou o
tipo está definido e contém pelo menos um membro público. Certifique-se de que o
nome do alias não contenha outros aliases.

Uma instrução Imports especifica um elemento contido que não pode ser encontrado
ou não define nenhum membro Public .

Um elemento contendo pode ser um namespace, uma classe, uma estrutura, um módulo,
uma interface ou uma enumeração. O elemento de contenção contém membros, como
variáveis, procedimentos ou outros elementos de contenção.

O objetivo da importação é permitir que o código acesse namespace ou digite


membros sem precisar qualificá-los. O projeto também pode precisar adicionar uma
referência ao namespace ou ao tipo. Para obter mais informações, consulte "Importar
elementos que contêm" em Referências a elementos declarados.

Se o compilador não puder localizar o elemento que o contém, ele não poderá resolver
as referências que o utilizam. Se ele encontrar o elemento, mas o elemento não expor
nenhum membro Public , nenhuma referência poderá ser bem-sucedida. Em ambos os
casos, não faz sentido importar o elemento.

Tenha em mente que, se você importar um elemento contido e atribuir um alias de


importação a ele, não poderá usar esse alias de importação para importar outro
elemento. O código a seguir gera um erro de compilador.

VB

Imports winfrm = System.Windows.Forms

' The following statement is INVALID because it reuses an import alias.

Imports behave = winfrm.Design.Behavior`

ID do Erro: BC40056

Para corrigir este erro


1. Verifique se o elemento contido está acessível no projeto.

2. Verifique se a especificação do elemento contido não inclui nenhum alias de


importação de outra importação.

3. Verifique se o elemento que contém expõe pelo menos um membro Public .

Confira também
Instrução Imports (tipo e namespace .NET)
Instrução Namespace
Público
Namespaces no Visual Basic
Referências a elementos declarados
BC40057: o namespace ou o tipo
especificado no nível de projeto Imports
'<qualifiedelementname>' não contém
nenhum membro público ou não pode
ser localizado
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O namespace ou o tipo especificado no nível de projeto Imports


'<qualifiedelementname>' não contém nenhum membro público ou não pode ser
localizado. Verifique se o namespace ou o tipo está definido e contém pelo menos um
membro público. Certifique-se de que o nome do alias não contenha outros aliases.

Uma propriedade de importação de um projeto especifica um elemento contido que


não pode ser encontrado ou não define nenhum membro Public .

Um elemento contendo pode ser um namespace, uma classe, uma estrutura, um módulo,
uma interface ou uma enumeração. O elemento de contenção contém membros, como
variáveis, procedimentos ou outros elementos de contenção.

O objetivo da importação é permitir que o código acesse namespace ou digite


membros sem precisar qualificá-los. O projeto também pode precisar adicionar uma
referência ao namespace ou ao tipo. Para obter mais informações, consulte "Importar
elementos que contêm" em Referências a elementos declarados.

Se o compilador não puder localizar o elemento que o contém, ele não poderá resolver
as referências que o utilizam. Se ele encontrar o elemento, mas o elemento não expor
nenhum membro Public , nenhuma referência poderá ser bem-sucedida. Em ambos os
casos, não faz sentido importar o elemento.

Use o Designer de Projeto para especificar elementos a serem importados. Use a seção
Namespaces importados da página Referências. Você pode acessar o Designer de
Projetos clicando duas vezes no ícone Meu Projeto no Gerenciador de Soluções.

ID do Erro: BC40057

Para corrigir este erro


1. Abra o Designer de Projeto e alterne para a página Referência.
2. Na seção Namespaces importados, verifique se o elemento contido pode ser
acessado no projeto.

3. Verifique se o elemento que contém expõe pelo menos um membro Public .

Confira também
Página Referências, Designer de Projeto (Visual Basic)
Gerenciando propriedades de solução e de projeto
Público
Namespaces no Visual Basic
Referências a elementos declarados
Índice da matriz de propriedade
necessário
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Esse valor de propriedade é composto por uma matriz, em vez de um único valor. Você
não especificou o índice da matriz de propriedade que você tentou acessar.

Para corrigir este erro


Verifique a documentação do componente para encontrar o intervalo para os
índices adequados para a matriz. Especifique um índice adequado em sua
instrução de acesso à propriedade.

Confira também
Tipos de Erro
Opções de comentários do Visual Studio
BC36532: a função aninhada não tem
uma assinatura que seja compatível com
o delegado '<delegatename>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma expressão lambda foi atribuída a um delegado que tem uma assinatura
incompatível. Por exemplo, no código a seguir, o delegado Del tem dois parâmetros
inteiros.

VB

Delegate Function Del(ByVal p As Integer, ByVal q As Integer) As Integer

O erro será gerado se uma expressão lambda com um argumento for declarada como
tipo Del :

VB

' Neither of these is valid.

' Dim lambda1 As Del = Function(n As Integer) n + 1

' Dim lambda2 As Del = Function(n) n + 1

ID do erro: BC36532

Para corrigir este erro


Ajuste a definição de delegado ou a expressão lambda atribuída para que as assinaturas
sejam compatíveis.

Confira também
Conversão de delegado reduzida
Expressões Lambda
BC30737: Nenhum método 'Main'
acessível com uma assinatura
apropriada foi encontrado em '<name>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os aplicativos de linha de comando devem ter um Sub Main definido. Main deve ser
declarado como Public Shared se fosse definido em uma classe ou como Public se
fosse definido em um módulo.

ID do erro: BC30737

Para corrigir este erro


Defina um procedimento Public Sub Main para o projeto. Declare-o como Shared
apenas se você defini-lo dentro de uma classe.

Confira também
Estrutura de um programa Visual Basic
Procedimentos
BC40033: <membername> não
compatível com CLS não é permitido em
interfaces compatíveis com CLS
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma propriedade, um procedimento ou evento em uma interface recebe a marcação


<CLSCompliant(True)> quando a própria interface é marcada como
<CLSCompliant(False)> ou não é marcada.

Para que uma interface esteja em conformidade com o CLS (Independência da


linguagem e componentes independentes da linguagem), todos os seus membros
devem estar em conformidade.

Quando você aplica o CLSCompliantAttribute a um elemento de programação, define o


parâmetro isCompliant do atributo como True ou False para indicar conformidade ou
não conformidade. Não há nenhum padrão para esse parâmetro e você precisa fornecer
um valor.

Se você não aplicar o CLSCompliantAttribute a um elemento, ele será considerado que


não está em conformidade.

Por padrão, esta mensagem é um aviso. Para obter informações sobre como ocultar
avisos ou tratá-los como erros, consulte Configurar Avisos no Visual Basic.

ID do Erro: BC40033

Para corrigir este erro


Se você precisar de conformidade com CLS e tiver controle sobre o código-fonte
da interface, marque a interface como <CLSCompliant(True)> , caso todos os seus
membros estejam em conformidade.

Se você precisar de conformidade com CLS e não tiver controle sobre o código-
fonte da interface ou se ele não se qualificar quanto à conformidade, defina esse
membro em uma classe diferente.

Se você precisar que esse membro permaneça na sua interface atual, remova o
CLSCompliantAttribute de sua definição ou marque-o como
<CLSCompliant(False)> .
Confira também
Instrução Interface
BC36629: Inferência de tipo que permite
valor nulo não tem suporte neste
contexto
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Os tipos de valor e as estruturas podem ser declarados como anuláveis.

VB

Dim a? As Integer

Dim b As Integer?

No entanto, você não pode usar a declaração anulável em combinação com a inferência
de tipos. Os exemplos a seguir causam esse erro.

VB

' Not valid.

' Dim c? = 10

' Dim d? = a

ID do erro: BC36629

Para corrigir este erro


Use uma cláusula As para declarar a variável como um tipo de valor anulável.

Confira também
Tipos de Valor Anulável
Inferência de Tipo de Variável Local
BC30106: o número de índices excede o
número de dimensões da matriz
indexada
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O número de índices usados para acessar um elemento de matriz deve ser exatamente
o mesmo que a classificação da matriz, ou seja, o número de dimensões declaradas para
ele.

ID do error: BC30106

Para corrigir este erro


Remova os subscritos da referência de matriz até que o número total de subscritos
seja igual à classificação da matriz. Por exemplo:

VB

Dim gameBoard(3, 3) As String

' Incorrect code. The array has two dimensions.

gameBoard(1, 1, 1) = "X"

gameBoard(2, 1, 1) = "O"

' Correct code.

gameBoard(0, 0) = "X"

gameBoard(1, 0) = "O"

Confira também
matrizes
O objeto ou a classe não dá suporte ao
conjunto de eventos
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você tentou usar uma WithEvents variável com um componente que não pode
funcionar como uma fonte de evento para o conjunto de eventos especificado. Por
exemplo, você queria afundar os eventos de um objeto e, em seguida, criar outro objeto
que Implements o primeiro objeto. Embora você possa pensar que pode afundar os
eventos do objeto implementado, nem sempre é o caso. Implements implementa
apenas uma interface para métodos e propriedades. WithEvents não há suporte para
privados UserControls , pois as informações de tipo necessárias para acionar não
ObjectEvent estão disponíveis em tempo de execução.

Para corrigir este erro


Não é possível afundar eventos para um componente que não origina eventos.

Confira também
WithEvents
Instrução Implements
Objeto obrigatório (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Referências a propriedades e métodos geralmente exigem um qualificador de objeto


explícito. Esse é o caso aqui.

Para corrigir este erro


1. Verifique se as referências a uma propriedade ou método de objeto têm um
qualificador de objeto válido. Especifique um qualificador de objeto se você não
forneceu um.

2. Verifique a ortografia do qualificador de objeto e certifique-se de que o objeto


está visível na parte do programa em que você está fazendo referência a ele.

3. Se um caminho for fornecido ao comando Abertura de Arquivos de um aplicativo


host, verifique se os argumentos nele estão corretos.

4. Verifique a documentação do objeto e certifique-se de que a ação é válida.

Confira também
Tipos de Erro
Variável de objeto ou variável com bloco
não definida
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma variável de objeto inválida está sendo referenciada. Esse erro pode ocorrer por
várias razões:

Uma variável foi declarada sem especificar um tipo. Se uma variável for declarada
sem especificar um tipo, será padrão digitar Object .

Por exemplo, uma variável declarada com Dim x seria do tipo Object; uma
variável declarada com Dim x As String seria do tipo String .

 Dica

A instrução Option Strict não permite a digitação implícita que resulta em


um tipo Object . Se você omitir o tipo, ocorrerá um erro em tempo de
compilação. Consulte Instrução Option Strict.

Você está tentando fazer referência a um objeto que foi definido como Nothing .

Você está tentando acessar um elemento de uma variável de matriz que não foi
declarado corretamente.

Por exemplo, uma matriz declarada como products() As String disparará o erro
se você tentar fazer referência a um elemento da matriz products(3) = "Widget" . A
matriz não tem elementos e é tratada como um objeto.

Você está tentando acessar o código em um bloco With...End With antes que ele
seja inicializado. Um bloco With...End With deve ser inicializado executando o
ponto de entrada da instrução With .

7 Observação

Em versões anteriores do Visual Basic ou VBA, esse erro também foi disparado
atribuindo um valor a uma variável sem usar a palavra-chave Set ( x = "name" em
vez de Set x = "name" ). A palavra-chave Set não é mais válida no .Net do Visual
Basic.
Para corrigir este erro
1. Defina Option Strict como On adicionando o seguinte código ao início do
arquivo:

VB

Option Strict On

Ao executar o projeto, um erro do compilador aparecerá na Lista de Erros para


qualquer variável especificada sem um tipo.

2. Se você não quiser habilitar Option Strict , pesquise quaisquer variáveis no código
que foram especificadas sem um tipo ( Dim x em vez de Dim x As String ) e
adicione o tipo pretendido à declaração.

3. Verifique se você não está se referindo a uma variável de objeto definida como
Nothing . Pesquise em seu código a palavra-chave Nothing e revise o código para

que o objeto não seja definido como Nothing até que você o tenha referenciado.

4. Verifique se todas as variáveis de matriz são dimensionadas antes de acessá-las.


Você pode atribuir uma dimensão ao criar pela primeira vez a matriz ( Dim x(5) As
String em vez de Dim x() As String ), ou usar a palavra-chave ReDim para definir
as dimensões da matriz antes de acessá-la pela primeira vez.

5. Verifique se o bloco With foi inicializado executando o ponto de entrada da


instrução With .

Confira também
Declaração de Variável do Objeto
Instrução ReDim
Instrução With...End With
BC33000: a declaração do operador
deve ser uma das seguintes: +,-,*,,/,^, &,
Like, Mod, And, Or, Xor, Not, <<, >>...
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você pode declarar apenas um operador qualificado para sobrecarga. A tabela a seguir
lista os operadores que você pode declarar.

Type Operadores

Unário + , - , IsFalse , IsTrue , Not

Binário + , - , * , / , \ , & , ^ , >> , << , = , <> , > , >= , < , <= , And , Like , Mod , Or , Xor

Conversão (unário) CType

Observe que o operador = na lista binária é o operador de comparação, não de


atribuição.

ID do Erro: BC33000

Para corrigir este erro


Selecione um operador no conjunto de operadores sobrecarregáveis.

Se você precisar da funcionalidade de sobrecarga de um operador que não possa


sobrecarregar diretamente, crie um procedimento Function que use os
parâmetros apropriados e retorne o valor correto.

Confira também
Instrução Operator
Procedimentos do operador
Como definir um operador
Como definir um operador de conversão
Instrução Function
BC30202: "Opcional" esperado
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um argumento opcional em uma declaração de procedimento é seguido por um


argumento necessário. Cada argumento que segue um argumento opcional também
deve ser opcional.

ID do erro: BC30202

Para corrigir este erro


Se o argumento se destinar a ser necessário, mova-o para preceder o primeiro
argumento opcional na lista de argumentos.

Se o argumento se destinar a ser opcional, use a palavra-chave Optional .

Confira também
Parâmetros Opcionais
BC30812: Parâmetros opcionais devem
especificar um valor padrão
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Parâmetros opcionais devem fornecer valores padrão que podem ser usados se nenhum
parâmetro for fornecido por um procedimento de chamada.

ID do Erro: BC30812

Exemplo
O seguinte exemplo gera o erro BC30812:

VB

Sub Proc1(x As Integer, Optional y As String)

Console.WriteLine("Default argument is: " & y)

End Sub

Para corrigir este erro


Especifique valores padrão para parâmetros opcionais:

VB

Sub Proc1(x As Integer, Optional y As String = "Default Value")

Console.WriteLine("Default argument is: " & y)

End Sub

Confira também
Opcional
O ordinal não é válido
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Sua chamada para uma DLL (biblioteca de vínculo dinâmico) indicou o uso de um
número em vez de um nome de procedimento, usando a sintaxe #num . Esse erro tem as
seguintes causas possíveis:

Falha na tentativa de converter a expressão #num em um ordinal.

O #num especificado não especifica nenhuma função na DLL.

Uma biblioteca de tipos tem uma declaração inválida, resultando no uso interno
de um número ordinal inválido.

Para corrigir este erro


1. Verifique se a expressão representa um número válido ou chame o procedimento
pelo nome.

2. Verifique se #num identifica uma função válida na DLL.

3. Isole a chamada de procedimento que causa o problema comentando o código.


Grave uma instrução Declare para o procedimento e relate o problema ao
fornecedor da biblioteca de tipos.

Confira também
Instrução Declare
BC2004: sem memória
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Mais memória foi necessária do que está disponível.

ID do erro: BC2004

Para corrigir este erro


Feche aplicativos, documentos e arquivos de origem desnecessários.

Elimine controles e formulários desnecessários para que menos deles sejam


carregados de uma só vez

Reduza o número de variáveis Public .

Verifique o espaço em disco disponível.

Aumente a RAM disponível instalando memória adicional ou realocando-a.

Certifique-se de que a memória seja liberada quando ela não for mais necessária.

Confira também
Tipos de Erro
Sem espaço na pilha (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A pilha é uma área de trabalho de memória que cresce e diminui dinamicamente com as
demandas do programa em execução. Os limites dela foram excedidos.

Para corrigir este erro


1. Verifique se os procedimentos não estão aninhados muito profundamente.

2. Verifique se os procedimentos recursivos terminam corretamente.

3. Se as variáveis locais exigirem mais espaço de variável local do que o disponível,


tente declarar algumas variáveis no nível do módulo. Você também pode declarar
todas as variáveis no procedimento estático precedendo a palavra-chave Property ,
Sub ou Function com Static . Ou você pode usar a instrução Static para declarar

variáveis estáticas individuais dentro dos procedimentos.

4. Redefina algumas das cadeias de caracteres de comprimento fixo como cadeias de


caracteres de comprimento variável, pois cadeias de caracteres de comprimento
fixo usam mais espaço de pilha do que cadeias de caracteres de comprimento
variável. Você também pode definir a cadeia de caracteres no âmbito do módulo,
onde o espaço de pilha não é necessário.

5. Verifique o número de chamadas de função DoEvents aninhadas, usando a caixa


de diálogo Calls para visualizar quais procedimentos estão ativos na pilha.

6. Verifique se você não causou uma "cascata de eventos" disparando um evento que
chama um procedimento de evento já na pilha. Uma cascata de eventos é
semelhante a uma chamada de procedimento recursivo não numerada, mas é
menos óbvia, já que a chamada é feita pelo Visual Basic em vez de uma chamada
explícita no código. Use a caixa de diálogo Calls para exibir quais procedimentos
estão ativos na pilha.

Confira também
Janelas de memória
Fora do espaço da cadeia de caracteres
(Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Com o Visual Basic, você pode usar cadeias de caracteres muito grandes. No entanto, os
requisitos de outros programas e a maneira como você trabalha com suas cadeias de
caracteres ainda podem causar esse erro.

Para corrigir este erro


1. Verifique se uma expressão que exige a criação temporária de cadeia de caracteres
durante a avaliação não está causando o erro.

2. Remova todos os aplicativos desnecessários da memória para criar mais espaço.

Confira também
Tipos de Erro
Resumo de manipulação da cadeia de caracteres
BC30036: Estouro (erro do Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um literal representa um valor fora dos limites do tipo de dados ao qual está sendo
atribuído.

ID do erro: BC30036

Para corrigir este erro


Consulte o intervalo de valores para o tipo de dados de destino e reescreva o
literal para estar em conformidade com esse intervalo.

Confira também
Data Types
Estouro (erro de tempo de execução do
Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um estouro resulta quando você tenta uma atribuição que excede os limites do destino
dessa atribuição.

Para corrigir este erro


1. Verifique se os resultados de atribuições, cálculos e conversões de tipo de dados
não são muito grandes para serem representados no intervalo de variáveis
permitido para esse tipo de valor e atribua o valor a uma variável de um tipo que
possa conter um intervalo maior de valores, se necessário.

2. Verifique se as atribuições para propriedades se ajustam ao intervalo da


propriedade para a qual elas são feitas.

3. Verifique se os números usados em cálculos impostos a inteiros não têm


resultados maiores que inteiros.

Confira também
Int32.MaxValue
Double.MaxValue
Data Types
Tipos de Erro
demarcador não localizado
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Durante uma operação de acesso a arquivos ou acesso a disco, o sistema operacional


não pôde encontrar o caminho especificado. O caminho para um arquivo inclui a
especificação da unidade mais os diretórios e subdiretórios que devem ser percorridos
para localizar o arquivo. Um caminho pode ser relativo ou absoluto.

Para corrigir este erro


Verifique e pecifique o caminho novamente.

Confira também
Tipos de Erro
Erro de acesso ao demarcador/arquivo
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Durante uma operação de acesso a arquivos ou de acesso ao disco, o sistema


operacional não pôde fazer uma conexão entre o caminho e o nome do arquivo.

Para corrigir este erro


1. Verifique se a especificação de arquivo está formatada corretamente. Um nome de
arquivo pode conter um caminho totalmente qualificado (absoluto) ou relativo.
Um caminho totalmente qualificado começa com o nome da unidade (se o
caminho estiver em outra unidade) e lista o caminho explícito da raiz para o
arquivo. Qualquer caminho que não esteja totalmente qualificado é relativo à
unidade e ao diretório atuais.

2. Verifique se você não tentou salvar um arquivo que substituiria um arquivo


somente leitura existente. Se esse for o caso, altere o atributo somente leitura do
arquivo de destino ou salve o arquivo com um nome de arquivo diferente.

3. Verifique se você não tentou abrir um arquivo somente leitura no modo sequencial
Output ou Append . Se esse for o caso, abra o arquivo no modo Input ou altere o

atributo somente leitura do arquivo.

4. Verifique se você não tentou alterar um projeto do Visual Basic em um banco de


dados ou documento.

Confira também
Tipos de Erro
Permissão negada (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Foi feita uma tentativa de gravar em um disco protegido contra gravação ou de acessar
um arquivo bloqueado.

Para corrigir este erro


1. Para abrir um arquivo protegido por gravação, altere o atributo de proteção de
gravação do arquivo.

2. Verifique se outro processo não bloqueou o arquivo e aguarde para abri-lo até
que o outro processo o libere.

3. Para acessar o registro, verifique se as permissões de usuário incluem esse tipo de


acesso ao registro.

Confira também
Tipos de Erro
A chamada de procedimento ou o
argumento não é válido (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Não é possível concluir parte da chamada.

Para corrigir este erro


Verifique os intervalos permitidos para obter argumentos, com o objetivo de
garantir que nenhuma disposição exceda os valores permitidos.

Confira também
Tipos de Erro
BC42107: A propriedade
'<propertyname>' não retorna um valor
em todos os caminhos de código
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A propriedade '<propertyname>' não retorna um valor em todos os caminhos de


código. Uma exceção de referência nula pode ocorrer em tempo de execução quando o
resultado é usado.

Um procedimento Get da propriedade tem pelo menos um caminho possível por meio
do seu código que não retorna um valor.

Você pode retornar um valor de um procedimento Get da propriedade de qualquer


uma das seguintes formas:

Atribua o valor ao nome da propriedade e execute uma instrução Exit Property .

Atribua o valor ao nome da propriedade e execute a instrução End Get .

Inclua o valor em uma Instrução Return.

Se o controle for passado a Exit Property ou End Get e você não tiver atribuído
nenhum valor ao nome da propriedade, o procedimento Get retornará o valor padrão
do tipo de dados da propriedade. Para obter mais informações, consulte
"Comportamento" em Instrução Function.

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratar avisos como erros, confira Configuração de avisos no Visual
Basic.

ID do erro: BC42107

Para corrigir este erro


Verifique sua lógica de fluxo de controle e não deixe de atribuir um valor antes de
cada instrução que cause retorno.

É mais fácil garantir que cada retorno do procedimento retorne um valor se você
sempre usar a instrução Return . Se você fizer isso, a última instrução antes de End
Get deve ser uma instrução Return .
Confira também
Procedimentos de propriedade
Instrução Property
Instrução Get
O índice de matriz da propriedade não é
válido
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O valor fornecido não é válido para um índice de matriz de propriedades.

Para corrigir este erro


Verifique a documentação do componente para garantir que e o índice está dentro
do intervalo válido para a propriedade especificada.

Confira também
matrizes
Procedimento let de propriedade não
definido e procedimento get de
propriedade não retornou um objeto
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Determinadas propriedades, métodos e operações só podem se aplicar a objetos


Collection . Você especificou uma operação ou propriedade exclusiva para coleções,
mas o objeto não é uma coleção.

Para corrigir este erro


1. Verifique a ortografia do objeto ou nome da propriedade ou confirme se o objeto
é Collection .

2. Examine o método Add usado para adicionar o objeto à coleção para verificar se a
sintaxe está correta e se todos os identificadores foram escritos corretamente.

Confira também
Collection
Propriedade não localizada
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Este objeto não oferece suporte à propriedade especificada.

Para corrigir este erro


1. Verifique a ortografia do nome da propriedade.

2. Verifique a documentação do objeto para garantir que você não esteja tentando
acessar algo como uma propriedade de "texto" quando o objeto realmente dá
suporte a uma "legenda" ou propriedade nomeada da mesma forma.

Confira também
Tipos de Erro
Propriedade ou método não localizado
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O método de objeto ou a propriedade do objeto referenciada está sem definição.

Para corrigir este erro


Talvez você tenha escrito incorretamente o nome do objeto. Para ver quais
propriedades e métodos são definidos para um objeto, exiba o Pesquisador de
Objetos. Selecione a biblioteca de objetos apropriada para exibir uma lista de
propriedades e métodos disponíveis.

Confira também
Tipos de Erro
BC36633: A variável de intervalo
<variable> oculta uma variável em um
bloco delimitador, uma variável de
intervalo definida anteriormente ou
uma variável declarada implicitamente
em uma expressão de consulta
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um nome de variável de intervalo especificado em uma cláusula Select , From ,


Aggregate ou Let duplica o nome de uma variável de intervalo já especificada
anteriormente na consulta ou o nome de uma variável que é implicitamente declarada
pela consulta, como um nome de campo ou o nome de uma função de agregação.

ID do Erro: BC36633

Para corrigir este erro


Verifique se todas as variáveis de intervalo em um escopo de consulta específico
têm nomes exclusivos. Você pode colocar uma consulta entre parênteses para
garantir que as consultas aninhadas tenham um escopo exclusivo.

Confira também
Introdução a LINQ no Visual Basic
Cláusula From
Cláusula Let
Cláusula Aggregate
Cláusula Select
BC36599: o nome da variável de
intervalo só pode ser inferido a partir de
um nome simples ou qualificado sem
argumentos
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um elemento de programação que usa um ou mais argumentos é incluído em uma


consulta LINQ. O compilador não pode inferir uma variável de intervalo desse elemento
de programação.

ID do erro: BC36599

Para corrigir este erro


Forneça um nome de variável explícito para o elemento de programação, conforme
mostrado no seguinte código:

VB

Dim query = From var1 In collection1

Select VariableAlias= SampleFunction(var1), var1

Confira também
Introdução a LINQ no Visual Basic
Cláusula Select
BC30969: Referência necessária para o
assembly '<assemblyidentity>'
contendo o tipo '<typename>', mas não
foi possível encontrar uma referência
adequada devido à ambiguidade entre
os projetos '<projectname1>' e
'<projectname2>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma expressão usa um tipo, como uma classe, estrutura, interface, enumeração ou
delegado, que é definido fora do projeto. No entanto, você tem referências de projeto
para mais de um assembly definindo esse tipo.

Os projetos citados produzem assemblies com o mesmo nome. Portanto, o compilador


não pode determinar qual assembly usar para o tipo que você está acessando.

Para acessar um tipo definido em outro assembly, o compilador do Visual Basic deve ter
uma referência para esse assembly. Essa deve ser uma referência única e inequívoca que
não cause referências circulares entre projetos.

ID do erro: BC30969

Para corrigir este erro


1. Determine qual projeto produz o melhor assembly para o seu projeto fazer
referência. Para essa decisão, você pode usar critérios como facilidade de acesso a
arquivos e frequência de atualizações.

2. Nas propriedades do projeto, adicione uma referência ao arquivo que contém o


assembly que define o tipo que você está usando.

Confira também
Gerenciando referências em um projeto

Referências a elementos declarados


Gerenciando propriedades de solução e de projeto

Solução de Problemas de Referências Quebradas


BC30007: Referência obrigatória ao
assembly '<assemblyname>' que
contém a classe base '<classname>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Referência obrigatória ao assembly '<assemblyname>' que contém a classe base


'<classname>'. Adicione ao seu projeto.

A classe é definida em uma DLL (biblioteca de vínculo dinâmico) ou um assembly que


não é referenciado diretamente em seu projeto. O compilador do Visual Basic requer
uma referência para evitar ambiguidade caso a classe seja definida em mais de uma DLL
ou um assembly.

ID do erro: BC30007

Para corrigir este erro


Inclua o nome da DLL ou do assembly não referenciado nas suas referências de
projeto.

Confira também
Gerenciando referências em um projeto
Solução de Problemas de Referências Quebradas
BC35000: a operação solicitada não está
disponível porque a função de
biblioteca de runtime '<function>' não
foi definida.
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O Visual Basic está tentando fazer uma chamada interna para a função no Runtime do
Visual Basic (Microsoft.VisualBasic.dll) que não pode ser encontrada.

ID do erro: BC35000

Esse erro ocorre em projetos no estilo SDK (projetos com um arquivo *.vbproj que
começa com a linha <Project Sdk="Microsoft.NET.Sdk"> ). Por padrão, apenas um
subconjunto do assemblyMicrosoft.VisualBasic.dll é inserido no assembly do aplicativo e
a <function> não está incluída nesse subconjunto.

Para corrigir este erro


Em vez de inserir um subconjunto do Runtime do Visual Basic no assembly, você deve
fazer a compilação com uma referência a ele. Faça isso adicionando a seguinte chave à
seção <PropertyGroup> do arquivo *.vbproj:

XML

<VBRuntime>Default</VBRuntime>

Confira também
opção do compilador -vbruntime
Retomar sem erro
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma instrução Resume apareceu fora do código de tratamento de erros ou o código


saltou para um manipulador de erros, mesmo não havendo erros.

Para corrigir este erro


1. Mova a instrução Resume para um manipulador de erros ou exclua-a.

2. Os saltos para rótulos não podem ocorrer entre os procedimentos, portanto,


pesquise o procedimento para o rótulo que identifica o manipulador de erros. Se
você encontrar um rótulo duplicado especificado como o destino de uma
instrução GoTo que não seja uma instrução On Error GoTo , altere o rótulo de linha
para concordar com o destino pretendido.

Confira também
Instrução Resume
Instrução On Error
BC40027: o tipo de retorno da função
'<procedurename>' não é compatível
com CLS
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Um procedimento Function é marcado como <CLSCompliant(True)> , mas retorna um


tipo marcado como <CLSCompliant(False)> , que não está marcado ou que não se
qualifica porque não é compatível.

Para que um procedimento esteja em conformidade com o CLS (Independência da


Linguagem e Componentes Independentes da Linguagem), ele deve usar apenas tipos
em conformidade com o CLS. Isso se aplica aos tipos de parâmetros, ao tipo de retorno
e aos tipos de todas as variáveis locais.

Os seguintes tipos de dados do Visual Basic não são compatíveis com CLS:

Tipo de Dados SByte

Tipo de Dados UInteger

Tipo de Dados ULong

Tipo de Dados UShort

Quando você aplica o CLSCompliantAttribute a um elemento de programação, define o


parâmetro isCompliant do atributo como True ou False para indicar conformidade ou
não conformidade. Não há nenhum padrão para esse parâmetro e você precisa fornecer
um valor.

Se você não aplicar o CLSCompliantAttribute a um elemento, ele será considerado que


não está em conformidade.

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratar os avisos como erros, consulte Configurar avisos no Visual Basic.

ID do Erro: BC40027

Para corrigir este erro


Se o procedimento Function precisar retornar esse tipo específico, remova o
CLSCompliantAttribute. O procedimento não pode ser compatível com CLS.
Se o procedimento Function precisar ser compatível com CLS, altere o tipo de
retorno para aquele em conformidade com CLS mais próximo. Por exemplo, no
lugar de UInteger você pode ser capaz de usar Integer se não precisar do
intervalo de valores acima de 2.147.483.647. Se você precisar do intervalo
estendido, poderá substituir UInteger por Long .

Se você estiver fazendo interface com objetos de Automação ou COM, tenha em


mente que alguns tipos têm larguras de dados diferentes daquelas do .NET
Framework. Por exemplo, int geralmente são 16 bits em outros ambientes. Se
você estiver retornando um inteiro de 16 bits para um componente desse tipo,
declare-o como Short em vez de Integer no seu novo código gerenciado do
Visual Basic.
BC31102: O acessador 'Set' da
propriedade '<propertyname>' não está
acessível
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma instrução tenta armazenar o valor de uma propriedade quando ela não tem acesso
ao procedimento da propriedade Set .

Se a Instrução Set for marcada com um nível de acesso mais restritivo do que sua
Instrução Property, uma tentativa de definir o valor da propriedade poderá falhar nos
seguintes casos:

A instrução Set está marcada como Private e o código de chamada está fora da
classe ou estrutura na qual a propriedade está definida.

A instrução Set está marcada como Protected e o código de chamada não está na
classe ou estrutura na qual a propriedade está definida, nem em uma classe
derivada.

A instrução Set está marcada como Friend e o código de chamada não está no
mesmo assembly no qual a propriedade está definida.

ID do erro: BC31102

Para corrigir este erro


Se você tiver o controle do código-fonte que define a propriedade, considere
declarar o procedimento Set com o mesmo nível de acesso que o da própria
propriedade.

Se você não tiver controle do código-fonte que define a propriedade ou deve


restringir o nível de acesso do procedimento Set mais do que a própria
propriedade, tente mover a instrução que define o valor da propriedade para uma
região de código que tenha melhor acesso à propriedade.

Confira também
Procedimentos de propriedade
Como declarar uma propriedade com níveis de acesso mistos
Não é possível excluir algumas
subchaves
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Foi feita uma tentativa de excluir uma chave do Registro, mas a operação falhou, pois
algumas subchaves não podem ser excluídas. Normalmente, isso ocorre devido à falta
de permissões.

Para corrigir este erro


Verifique se você tem permissões suficientes para excluir as subchaves
especificadas.

Confira também
Microsoft.VisualBasic.MyServices.RegistryProxy
DeleteSubKey
RegistryPermission
BC32005: A instrução não pode finalizar
um bloco fora de uma instrução 'If' de
linha
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma instrução If de linha única contém várias instruções separadas por dois-pontos (:),
uma das quais é uma instrução End para um bloco de controle fora de If de linha
única. Instruções If de linha única não usam a instrução End If .

ID do erro: BC32005

Para corrigir este erro


Mova a instrução If de linha única para fora do bloco de controle que contém a
instrução End If .

Confira também
Instrução If...Then...Else
BC30001: A instrução não é válida em
um namespace
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A instrução não pode aparecer no nível de um namespace. As únicas declarações


permitidas no nível do namespace são declarações de módulo, interface, classe,
delegado, enumeração e estrutura.

ID do erro: BC30001

Para corrigir este erro


Mova a instrução para um local dentro de uma definição de módulo, classe,
interface, estrutura, enumeração ou delegado.

Confira também
Escopo no Visual Basic
Namespaces no Visual Basic
BC30024: a instrução não é válida
dentro de um método/lambda de várias
linhas
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A instrução não é válida dentro de uma Sub , Function , propriedade Get , ou


procedimento de propriedade Set . Algumas instruções podem ser colocadas no nível
do módulo ou da classe. Outras, como Option Strict , devem estar no nível do
namespace e preceder todas as outras declarações.

ID do erro: BC30024

Para corrigir este erro


Remova a instrução do procedimento.

Confira também
Instrução Sub
Instrução Function
Instrução Get
Instrução Set
BC30648: as constantes da cadeia de
caracteres devem terminar com aspas
duplas
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

As constantes de cadeia de caracteres devem começar e terminar com aspas.

ErrorID: BC30648

Para corrigir este erro


Verifique se o literal da cadeia de caracteres termina com uma aspa ("). Se você
colar valores de outros editores de texto, verifique se o caractere colado é uma
aspa válida e não um dos caracteres que se assemelham a ele, como aspas
"curvas" (" ou ") ou duas aspas simples ('').

Confira também
Cadeias de caracteres
BC30941: a estrutura '<structurename>'
deve conter pelos menos uma variável
membro da instância ou pelo menos
uma declaração de evento da instância
não marcada como 'Personalizada'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma definição de estrutura não inclui variáveis ou eventos não personalizados e não
compartilhados.

Cada estrutura deve ter uma variável ou um evento que se aplica a cada instância
específica (não compartilhada) em vez de todas as instâncias coletivamente
(Compartilhada). Constantes, propriedades e procedimentos não compartilhados não
atendem a esse requisito. Além disso, se não houver variáveis não compartilhadas e
apenas um evento não compartilhado, esse último não poderá ser um evento Custom .

ID do Erro: BC30941

Para corrigir este erro


Defina pelo menos uma variável ou evento que não seja Shared . Se você definir
apenas um evento, ele deverá ser não personalizado e não compartilhado.

Confira também
Estruturas
Como: Declarar uma estrutura
Instrução Structure
BC30420: 'Sub Main' não foi encontrado
em '<name>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Sub Main está ausente ou o local errado foi especificado para ele.

ID do erro: BC30420

Para corrigir este erro


1. Forneça a instrução Sub Main ausente ou, se ela existir, mova-a para o local
apropriado no código. Para obter mais informações sobre Sub Main , consulte
Procedimento Principal no Visual Basic.

2. Especifique o local do objeto de inicialização do projeto na caixa Formulário


Inicialização do Designer de Projeto.

Confira também
Instrução Sub
Procedimento principal no Visual Basic
Sub ou função não definida (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Sub ou Function deve ser definida para ser chamada. Possíveis causas do erro incluem:

Escrever o nome do procedimento de maneira incorreta.

Tentar chamar um procedimento de outro projeto sem adicionar explicitamente


uma referência a ele na caixa de diálogo Referências.

Especificar um procedimento que não está visível para o procedimento de


chamada.

Declarar uma rotina de DLL (biblioteca de vínculo dinâmico) do Windows ou uma


rotina de recurso de código do Macintosh que não está no recurso de código ou
biblioteca especificado.

Para corrigir este erro


1. Verifique se o nome do procedimento está escrito corretamente.

2. Localize o nome do projeto que contém o procedimento que você deseja chamar
na caixa de diálogo Referências. Se ele não aparecer, clique no botão Procurar
para pesquisá-lo. Marque a caixa de seleção à esquerda do nome do projeto e
clique em OK.

3. Verifique o nome da rotina.

Confira também
Tipos de Erro
Gerenciando referências em um projeto
Instrução Sub
Instrução Function
Subscrito fora do intervalo (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um subscrito de matriz não é válido porque está fora do intervalo permitido. O valor
subscrito mais baixo para uma dimensão é sempre 0, e o valor de subscrito mais alto é
retornado pelo método GetUpperBound dessa dimensão.

Para corrigir este erro


Altere o subscrito para que ele fique dentro do intervalo válido.

Confira também
Array.GetUpperBound
matrizes
TextFieldParser não pode concluir a
operação de leitura porque o tamanho
máximo do buffer foi excedido
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A operação não pode ser concluída porque o tamanho máximo do buffer (10.000.000
bytes) foi excedido.

Para corrigir este erro


Verifique se não há campos malformados no arquivo.

Confira também
OpenTextFieldParser
TextFieldParser
Como: ler de arquivos de texto com vários formatos
Analisando arquivos de texto com o objeto TextFieldParser
BC42110: o tipo da variável
'<variablename>' não será inferido
porque está associado a um campo em
um escopo delimitador
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O tipo da variável '<variablename>' não será inferido porque está associado a um


campo em um escopo delimitador. Altere o nome de '<variablename>' ou use o nome
totalmente qualificado (por exemplo, 'Me.variablename' ou 'MyBase.variablename').

Uma variável de controle de loop no código tem o mesmo nome que um campo da
classe ou outro escopo delimitador. Como a variável de controle é usada sem uma
cláusula As , ela é associada ao campo no escopo delimitador e o compilador não cria
uma nova variável para ela ou infere seu tipo.

No exemplo a seguir, Index , a variável de controle na instrução For é associada ao


campo Index na classe Customer . O compilador não cria uma nova variável para a
variável de controle Index nem infere seu tipo.

VB

Class Customer

' The class has a field named Index.

Private Index As Integer

Sub Main()

' The following line will raise this warning.

For Index = 1 To 10

' ...

Next

End Sub

End Class

Por padrão, esta mensagem é um aviso. Para obter informações sobre como ocultar
avisos ou como tratar avisos como erros, consulte Configurar avisos no Visual Basic.

ID do erro: BC42110
Para resolver este aviso
Torne a variável de controle de loop local alterando seu nome para um
identificador que também não seja o nome de um campo da classe.

VB

For I = 1 To 10

Esclareça se a variável de controle de loop se associa ao campo de classe


prefixando Me. para o nome da variável.

VB

For Me.Index = 1 To 10

Em vez de depender da inferência de tipo de variável local, use uma cláusula As


para especificar um tipo para a variável de controle de loop.

VB

For Index As Integer = 1 To 10

Exemplo
O código a seguir mostra o exemplo anterior com a primeira correção efetiva.

VB

Class Customer

' The class has a field named Index.

Private Index As Integer

Sub Main()

For I = 1 To 10

' ...

Next

End Sub

End Class

Confira também
Instrução Option Infer
Instrução For Each...Next
Instrução For...Next
Como fazer referência à instância atual de um objeto
Inferência de Tipo de Variável Local
Me, My, MyBase e MyClass
Esta matriz é fixa ou está
temporariamente bloqueada (Visual
Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Esse erro tem as seguintes causas possíveis:

Usar ReDim para alterar o número de elementos de uma matriz de tamanho fixo.

Redimensionar uma matriz dinâmica no nível do módulo, na qual um elemento foi


passado como um argumento para um procedimento. Se um elemento for
passado, a matriz será bloqueada para impedir a desalocação da memória para o
parâmetro de referência dentro do procedimento.

Tentar atribuir um valor a uma variável Variant que contém uma matriz, mas
Variant está bloqueada no momento.

Para corrigir este erro


1. Torne a matriz original dinâmica em vez de fixada declarando-a com ReDim (se a
matriz for declarada dentro de um procedimento) ou declarando-a sem especificar
o número de elementos (se a matriz for declarada no nível do módulo).

2. Determine se você realmente precisa passar o elemento, pois ele é visível em


todos os procedimentos no módulo.

3. Determine o que está bloqueando Variant e resolva isso.

Confira também
matrizes
Esta chave já está associada a um
elemento desta coleção
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A chave especificada para um membro de coleção já identifica outro membro dela. Uma
chave é uma cadeia de caracteres especificada no método Add que identifica
exclusivamente um membro específico de uma coleção.

Para corrigir este erro


Use uma chave diferente para este membro.

Confira também
Tipos de Erro
Muitos arquivos
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Foram criados mais arquivos no diretório raiz do que o sistema operacional permite, ou
foram abertos mais arquivos do que o número especificado na configuração files=, no
seu arquivo CONFIG.SYS.

Para corrigir este erro


1. Se o programa estiver abrindo, fechando ou salvando arquivos no diretório raiz,
altere seu programa para que ele use um subdiretório.

2. Aumente o número de arquivos especificados na configuração files= feita no


arquivo CONFIG.CONFIG e reinicie o computador.

Confira também
Tipos de Erro
BC30251: o tipo '<typename>' não tem
construtores
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um tipo não suporta uma chamada para Sub New() . Uma possível causa é um
compilador corrompido ou arquivo binário.

ID do erro: BC30251

Para corrigir este erro


1. Se o tipo estiver em um projeto diferente ou em um arquivo referenciado, reinstale
o projeto ou arquivo.

2. Se o tipo estiver no mesmo projeto, recompile o assembly que contém o tipo.

3. Se o erro persistir, reinstale o compilador do Visual Basic.

4. Se o erro persistir, reúna informações sobre as circunstâncias e notifique o


Microsoft Product Support Services.

Confira também
Objetos e Classes
Opções de comentários do Visual Studio
BC40041: o tipo <typename> não é
compatível com CLS
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma variável, propriedade ou retorno de função é declarada com um tipo de dados que
não é compatível com CLS.

Para que um aplicativo esteja em conformidade com o CLS (Independência da


Linguagem e Componentes Independentes da Linguagem), ele deve usar apenas tipos
em conformidade com o CLS.

Os seguintes tipos de dados do Visual Basic não são compatíveis com CLS:

Tipo de Dados SByte

Tipo de Dados UInteger

Tipo de Dados ULong

Tipo de Dados UShort

ID do erro: BC40041

Para corrigir este erro


Se o aplicativo precisar ser compatível com CLS, altere o tipo de dados desse
elemento para o tipo mais próximo em conformidade com CLS. Por exemplo, no
lugar de UInteger você pode ser capaz de usar Integer se não precisar do
intervalo de valores acima de 2.147.483.647. Se você precisar do intervalo
estendido, poderá substituir UInteger por Long .

Se o aplicativo não precisar ser compatível com CLS, não será necessário alterar
nada. No entanto, você deve estar ciente de sua não conformidade.
BC30002: o tipo '<typename>' não está
definido
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

A instrução fez referência a um tipo que não foi definido. Você pode definir um tipo em
uma instrução de declaração, como Enum , Structure , Class ou Interface .

ID do erro: BC30002

Para corrigir este erro


Verifique se a definição de tipo e sua referência usam a mesma ortografia.

Verifique se a definição de tipo está acessível à referência. Por exemplo, se o tipo


estiver em outro módulo e tiver sido declarado Private , mova a definição de tipo
para o módulo de referência ou declare-a Public .

Verifique se o namespace do tipo não está redefinido em seu projeto. Se for, use a
palavra-chave Global para qualificar totalmente o nome do tipo. Por exemplo, se
um projeto definir um namespace nomeado System , o tipo System.Object não
poderá ser acessado, a menos que seja totalmente qualificado com a palavra-
chave Global : Global.System.Object .

Se o tipo for definido, mas a biblioteca de objetos ou a biblioteca de tipos na qual


ele está definido não estiver registrada no Visual Basic, clique em Adicionar
Referência no menu Projeto e selecione a biblioteca de objetos ou a biblioteca de
tipos apropriada.

Verifique se o tipo está em um assembly que faz parte do perfil de .NET


Framework de destino. Para obter mais informações, consulte Solução de
problemas de erros de definição de destino do .NET Framework.

Confira também
Namespaces no Visual Basic
Instrução Enum
Instrução Structure
Instrução Class
Instrução Interface
Gerenciando referências em um projeto
BC36564: Não foi possível inferir
argumentos de tipo do delegado
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma instrução de atribuição usa AddressOf para atribuir o endereço de um


procedimento genérico a um delegado, mas não fornece argumentos de tipo ao
procedimento genérico.

Normalmente, quando você invoca um tipo genérico, fornece um argumento de tipo


para cada parâmetro de tipo que o tipo genérico define. Se você não fornecer nenhum
argumento de tipo, o compilador tentará inferir os tipos a serem passados para os
parâmetros de tipo. Se o contexto não fornecer informações suficientes para o
compilador inferir esses tipos, será gerado um erro.

ID do erro: BC36564

Para corrigir este erro


Especifique os argumentos de tipo para o procedimento genérico na expressão
AddressOf .

Confira também
Tipos genéricos no Visual Basic
Operador AddressOf
Procedimentos genéricos no Visual Basic
Lista de Tipos
Métodos de Extensão
Tipos incompatíveis (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você tentou converter um valor em outro tipo de uma forma que não é válida.

Para corrigir este erro


1. Verifique se a atribuição é válida.

2. Verifique se você não passou um objeto para um procedimento que espera uma
única propriedade ou valor.

3. Verifique se você não usou um nome de módulo ou projeto em que uma


expressão era esperada.

Confira também
Tipos de Erro
BC30982: o tipo de '<variablename>'
não pode ser inferido porque os limites
de loop e a variável step não são
ampliados com o mesmo tipo
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você escreveu um loop For...Next no qual o compilador não pode inferir um tipo de
dados para a variável de controle de loop porque as seguintes condições são
verdadeiras:

O tipo de dados da variável de controle de loop não é especificado com uma


cláusula As .

Os limites de loop e a variável de etapa contêm pelo menos dois tipos de dados.

Não existem conversões padrão entre os tipos de dados.

Portanto, o compilador não pode inferir o tipo de dados da variável de controle de um


loop.

No exemplo a seguir, a variável de etapa é um caractere e os limites de loop são


inteiros. Como não há conversão padrão entre caracteres e inteiros, esse erro é relatado.

VB

Dim stepVar = "1"c

Dim m = 0

Dim n = 20

' Not valid.

' For i = 1 To 10 Step stepVar

' Loop processing

' Next

ID do erro: BC30982

Para corrigir este erro


Altere os tipos dos limites de loop e da variável de etapa conforme necessário para
que, pelo menos, um deles seja um tipo para o qual os outros se expandam. No
exemplo anterior, altere o tipo de stepVar para Integer .
VB

Dim stepVar = 1

-ou-

VB

Dim stepVar As Integer = 1

Use funções de conversão explícitas para converter os limites de loop e a variável


de etapa para os tipos apropriados. No exemplo anterior, aplique a função Val a
stepVar .

VB

For i = 1 To 10 Step Val(stepVar)

' Loop processing

Next

Confira também
Val
Instrução For...Next
Conversões implícitas e explícitas
Inferência de Tipo de Variável Local
Instrução Option Infer
Funções de conversão do tipo
Conversões de Widening e Narrowing
BC40025: o tipo de membro
“<membername>” não é compatível
com CLS
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

O tipo de dados especificado para esse membro não faz parte do CLS (Independência
da linguagem e componentes independentes da linguagem). Isso não é um erro em seu
componente, pois o .NET Framework e o Visual Basic dão suporte a esse tipo de dados.
No entanto, outro componente escrito em código estritamente compatível com CLS
pode não dar suporte a esse tipo de dados. Esse componente pode não ser capaz de
interagir com êxito com o seu componente.

Os seguintes tipos de dados do Visual Basic não são compatíveis com CLS:

Tipo de Dados SByte

Tipo de Dados UInteger

Tipo de Dados ULong

Tipo de Dados UShort

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratar avisos como erros, consulte Configurar Avisos no Visual Basic.

ID do Erro: BC40025

Para corrigir este erro


Se seu componente faz interface apenas com outros componentes .NET
Framework ou não faz interface com nenhum outro componente, você não precisa
alterar nada.

Se você estiver fazendo interface com um componente não escrito para o .NET
Framework, poderá determinar, por meio de reflexão ou da documentação, se ele
dá suporte a esse tipo de dados. Se isso acontecer, você não precisa mudar nada.

Se você estiver fazendo interface com um componente que não dá suporte a esse
tipo de dados, deverá substituí-lo pelo tipo mais próximo em conformidade com o
CLS. Por exemplo, no lugar de UInteger você pode ser capaz de usar Integer se
não precisar do intervalo de valores acima de 2.147.483.647. Se você precisar do
intervalo estendido, poderá substituir UInteger por Long .

Se você estiver fazendo interface com objetos de Automação ou COM, tenha em


mente que alguns tipos têm larguras de dados diferentes daquelas do .NET
Framework. Por exemplo, uint geralmente são 16 bits em outros ambientes. Se
você estiver transmitindo um argumento de 16 bits para um componente desse
tipo, declare-o como UShort em vez de UInteger no seu novo código gerenciado
do Visual Basic.

Confira também
Reflexão
BC40042: o tipo de valor opcional para
o parâmetro opcional
<parametername> não é compatível
com CLS
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Um procedimento é marcado como <CLSCompliant(True)> , mas declara um parâmetro


opcional com valor padrão de um tipo não compatível.

Para que um procedimento esteja em conformidade com o CLS (Independência da


Linguagem e Componentes Independentes da Linguagem), ele deve usar apenas tipos
em conformidade com o CLS. Isso se aplica aos tipos de parâmetros, ao tipo de retorno
e aos tipos de todas as variáveis locais. Ele também se aplica aos valores padrão de
parâmetros opcionais.

Os seguintes tipos de dados do Visual Basic não são compatíveis com CLS:

Tipo de Dados SByte

Tipo de Dados UInteger

Tipo de Dados ULong

Tipo de Dados UShort

Quando você aplica o atributo CLSCompliantAttribute a um elemento de programação,


define o parâmetro isCompliant do atributo como True ou False para indicar
conformidade ou não conformidade. Não há nenhum padrão para esse parâmetro e
você precisa fornecer um valor.

Se você não aplicar CLSCompliantAttribute a um elemento, ele será considerado em não


conformidade.

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratar os avisos como erros, consulte Configurar avisos no Visual Basic.

ID do Erro: BC40042

Para corrigir este erro


Se o parâmetro opcional precisar ter um valor padrão desse tipo específico,
remova CLSCompliantAttribute. O procedimento não pode ser compatível com
CLS.

Se o procedimento precisar ser compatível com CLS, altere o tipo desse valor
padrão para aquele em conformidade com CLS mais próximo. Por exemplo, no
lugar de UInteger você pode ser capaz de usar Integer se não precisar do
intervalo de valores acima de 2.147.483.647. Se você precisar do intervalo
estendido, poderá substituir UInteger por Long .

Se você estiver fazendo interface com objetos de Automação ou COM, tenha em


mente que alguns tipos têm larguras de dados diferentes daquelas do .NET
Framework. Por exemplo, int geralmente são 16 bits em outros ambientes. Se
você estiver aceitando um inteiro de 16 bits de um componente desse tipo,
declare-o como Short em vez de Integer no novo código gerenciado do Visual
Basic.
BC40028: o tipo de parâmetro
'<parametername>' não é compatível
com CLS
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Um procedimento é marcado como <CLSCompliant(True)> , mas declara um parâmetro


com um tipo marcado como <CLSCompliant(False)> , que não está marcado ou que não
se qualifica porque não é compatível.

Para que um procedimento esteja em conformidade com o CLS (Independência da


Linguagem e Componentes Independentes da Linguagem), ele deve usar apenas tipos
em conformidade com o CLS. Isso se aplica aos tipos de parâmetros, ao tipo de retorno
e aos tipos de todas as variáveis locais.

Os seguintes tipos de dados do Visual Basic não são compatíveis com CLS:

Tipo de Dados SByte

Tipo de Dados UInteger

Tipo de Dados ULong

Tipo de Dados UShort

Quando você aplica o CLSCompliantAttribute a um elemento de programação, define o


parâmetro isCompliant do atributo como True ou False para indicar conformidade ou
não conformidade. Não há nenhum padrão para esse parâmetro e você precisa fornecer
um valor.

Se você não aplicar o CLSCompliantAttribute a um elemento, ele será considerado que


não está em conformidade.

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratar os avisos como erros, consulte Configurar avisos no Visual Basic.

ID do Erro: BC40028

Para corrigir este erro


Se o procedimento precisar usar um parâmetro desse tipo específico, remova o
CLSCompliantAttribute. O procedimento não pode ser compatível com CLS.
Se o procedimento precisar ser compatível com CLS, altere o tipo desse
procedimento para aquele em conformidade com CLS mais próximo. Por exemplo,
no lugar de UInteger você pode ser capaz de usar Integer se não precisar do
intervalo de valores acima de 2.147.483.647. Se você precisar do intervalo
estendido, poderá substituir UInteger por Long .

Se você estiver fazendo interface com objetos de Automação ou COM, tenha em


mente que alguns tipos têm larguras de dados diferentes daquelas do .NET
Framework. Por exemplo, int geralmente são 16 bits em outros ambientes. Se
você estiver aceitando um inteiro de 16 bits de um componente desse tipo,
declare-o como Short em vez de Integer no novo código gerenciado do Visual
Basic.
BC32098: não é possível usar
parâmetros de tipo como qualificadores
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um elemento de programação é qualificado com uma cadeia de caracteres de


qualificação que inclui um parâmetro de tipo.

Um parâmetro de tipo representa um requisito para um tipo que deve ser fornecido
quando o tipo genérico é construído. Ele não representa um tipo definido específico.
Uma cadeia de caracteres de qualificação deve incluir apenas elementos definidos no
momento da compilação.

O seguinte código pode gerar esse erro:

VB

Public Function CheckText(Of c As System.Windows.Forms.Control)(

badText As String) As Boolean

Dim saveText As c.Text

' Insert code to look for badText within saveText.

End Function

ID do erro: BC32098

Para corrigir este erro


1. Remova o parâmetro de tipo da cadeia de caracteres de qualificação ou substitua-
o por um tipo definido.

2. Se você precisar usar um tipo construído para localizar o elemento de


programação que está sendo qualificado, deverá usar uma lógica de programa
adicional.

Confira também
Referências a elementos declarados
Tipos genéricos no Visual Basic
Lista de Tipos
BC31026: não foi possível criar um
assembly de nome forte a partir do
arquivo '<filename>': <error>
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O assembly de nome forte não pode ser criado usando o arquivo de chave especificado.

ID do Erro: BC31026

Para corrigir este erro


1. Verifique se o arquivo de chave correto foi especificado e se ele não está
bloqueado por outro aplicativo.

Confira também
Sn.exe (ferramenta Nome Forte))
BC30143: não é possível inserir o
arquivo de recurso '<filename>':
<mensagem de erro>
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O compilador do Visual Basic chama o Assembly Linker (Al.exe, também conhecido


como Alink) para gerar um assembly com um manifesto. O vinculador relatou um erro
ao incorporar a um arquivo de recurso COM+ nativo no assembly.

Identificação do erro: BC30143

Para corrigir este erro


1. Examine a mensagem de erro e consulte o tópico Al.exe. para obter mais
explicações e conselhos.

2. Se o erro persistir, reúna informações sobre as circunstâncias e notifique o


Microsoft Product Support Services.

Confira também
Al.exe
Opções de comentários do Visual Studio
BC30145: não foi possível emitir o
assembly: <error message>
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

O compilador Visual Basic chama o Assembly Linker (Al.exe, também conhecido como
Alink) para gerar um assembly com um manifesto, e o vinculador relata um erro no
estágio de emissão da criação do assembly.

ID do erro: BC30145

Para corrigir este erro


1. Examine a mensagem de erro entre aspas e consulte o tópico Al.exe para obter
mais explicações e recomendações.

2. Tente assinar o assembly manualmente, usando o Al.exe ou o Sn.exe (Ferramenta


Nome Forte).

3. Se o erro persistir, reúna informações sobre as circunstâncias e notifique o


Microsoft Product Support Services.

Para assinar o assembly manualmente


1. Use o Sn.exe (Ferramenta Nome Forte)) para criar um arquivo de par de chaves
público/privado.

Esse arquivo tem uma extensão .snk.

2. Exclua a referência COM que está gerando o erro no projeto.

3. Abra o Prompt de Comando do Desenvolvedor do Visual Studio ou PowerShell do


Desenvolvedor do Visual Studio.

4. Altere o diretório para aquele onde deseja colocar o wrapper do assembly.

5. Insira o seguinte comando:

Prompt de comando do Windows

tlbimp <path to COM reference file> /out:<output assembly name>


/keyfile:<path to .snk file>

Um exemplo do comando real que você pode inserir é:

Prompt de comando do Windows

tlbimp c:\windows\system32\msi.dll /out:Interop.WindowsInstaller.dll


/keyfile:"c:\documents and settings\mykey.snk"

 Dica

Use aspas duplas se um caminho ou arquivo contiver espaços.

6. No Visual Studio, inclua uma referência .NET Assembly para o arquivo que acabou
de ser criado.

Confira também
Al.exe
Sn.exe (Ferramenta Nome Forte)
Como criar um par de chaves pública/privada
Opções de comentários do Visual Studio
BC30655: Não é possível localizar o
arquivo '<filename>' obrigatório
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um arquivo que é exigido pelo Visual Studio está faltando ou danificado.

ID do erro: BC30655

Para corrigir este erro


Reinstale o Visual Studio.

Confira também
Opções de comentários do Visual Studio
Não foi possível obter nomes de portas
serial devido a um erro interno do
sistema
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Ocorreu um erro interno ao chamar a propriedade My.Computer.Ports.SerialPortNames .

Para corrigir este erro


1. Consulte Fundamentos do depurador para obter mais informações de solução de
problemas.

2. Observe as circunstâncias em que ocorreu o erro e entre em contato com o


Microsoft Product Support Services.

Confira também
SerialPortNames
Noções básicas do depurador
Opções de comentários do Visual Studio
BC30144: não é possível vincular ao
arquivo de recurso '<filename>': <error
message>
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O compilador do Visual Basic chama o Assembly Linker (Al.exe, também conhecido


como Alink) para gerar um assembly com um manifesto. O vinculador relatou um erro
ao vincular a um arquivo de recurso COM+ nativo do assembly.

ID do erro: BC30144

Para corrigir este erro


1. Examine a mensagem de erro e consulte o tópico Al.exe. para obter mais
explicações e conselhos.

2. Se o erro persistir, reúna informações sobre as circunstâncias e notifique o


Microsoft Product Support Services.

Confira também
Al.exe
Opções de comentários do Visual Studio
BC30712: Não é possível carregar
informações da classe '<classname>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Foi feita uma referência a uma classe que não está disponível.

ID do erro: BC30712

Para corrigir este erro


1. Verifique se a classe está definida e se você escreveu o nome corretamente.

2. Tente acessar um dos membros declarados no módulo. Em alguns casos, o


ambiente de depuração não pode localizar membros porque os módulos em que
eles são declarados ainda não foram carregados.

Confira também
Depurando no Visual Studio
BC31020: Não foi possível gravar a saída
na memória
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Houve um problema ao gravar a saída na memória.

ID do Erro: BC31020

Para corrigir este erro


1. Compile o programa novamente para verificar se o erro persiste.

2. Se o erro continuar, salve o trabalho e reinicie o Visual Studio.

3. Se o erro persistir, reinstale o Visual Basic.

4. Se o erro persistir após a reinstalação, notifique o Microsoft Product Support


Services.

Confira também
Opções de comentários do Visual Studio
BC30698: Não foi possível gravar o
arquivo temporário porque o caminho
temporário não está disponível
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O Visual Basic não pôde determinar o caminho onde os arquivos temporários são
armazenados.

ID do erro: BC30698

Para corrigir este erro


1. Reinicie o Visual Studio.

2. Se o problema persistir, reinstale o Visual Studio.

Confira também
Opções de comentários do Visual Studio
BC31019: não é possível gravar no
arquivo de saída '<filename>': <error>
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Ocorreu um problema na criação do arquivo.

Não foi possível abrir um arquivo de saída para gravação. O arquivo (ou a pasta que
contém o arquivo) pode estar aberto para uso exclusivo por outro processo ou pode ter
seu atributo definido como somente leitura.

Algumas situações comuns em que um arquivo fica aberto exclusivamente são quando:

O aplicativo está em execução e usando os arquivos dele. Para resolver esse


problema, verifique se o aplicativo não está em execução.

Outro aplicativo abriu o arquivo. Para resolver esse problema, verifique se nenhum
outro aplicativo está acessando os arquivos. Nem sempre é óbvio qual aplicativo
está acessando seus arquivos. Nesse caso, reiniciar o computador pode ser o
caminho mais fácil para encerrar o aplicativo.

Se apenas um dos arquivos de saída do projeto estiver marcado como somente leitura,
esta exceção será acionada.

ID do erro: BC31019

Para corrigir este erro


1. Compile o programa novamente para verificar se o erro persiste.

2. Se o erro continuar, salve o trabalho e reinicie o Visual Studio.

3. Se o erro persistir, reinicie o computador.

4. Se o erro persistir, reinstale o Visual Basic.

5. Se o erro persistir após a reinstalação, notifique o Microsoft Product Support


Services.

Para verificar atributos de arquivo no Explorador de


Arquivos
1. Abra a pasta que lhe interessa.
2. Clique no ícone Modos de exibição e clique em Detalhes.

3. Clique com o botão direito do mouse no cabeçalho da coluna e escolha Atributos


na lista suspensa.

Para alterar os atributos de um arquivo ou pasta


1. No Explorador de Arquivos, clique com o botão direito do mouse no arquivo ou
pasta e escolha Propriedades.

2. Na seção Atributos da guia Geral, desmarque a caixa Somente leitura.

3. Pressione OK.

Confira também
Opções de comentários do Visual Studio
BC40032: o tipo subjacente
<typename> de Enum não é compatível
com CLS
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

O tipo de dados especificado para essa enumeração não faz parte do CLS
(Independência da linguagem e componentes independentes da linguagem). Isso não é
um erro em seu componente, pois o .NET Framework e o Visual Basic dão suporte a
esse tipo de dados. No entanto, outro componente escrito em código estritamente
compatível com CLS pode não dar suporte a esse tipo de dados. Esse componente pode
não ser capaz de interagir com êxito com o seu componente.

Os seguintes tipos de dados do Visual Basic não são compatíveis com CLS:

Tipo de Dados SByte

Tipo de Dados UInteger

Tipo de Dados ULong

Tipo de Dados UShort

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratar avisos como erros, confira Configuração de avisos no Visual
Basic.

ID do Erro: BC40032

Para corrigir este erro


Se seu componente faz interface apenas com outros componentes .NET
Framework ou não faz interface com nenhum outro componente, você não precisa
alterar nada.

Se você estiver fazendo interface com um componente não escrito para o .NET
Framework, poderá determinar, por meio de reflexão ou da documentação, se ele
dá suporte a esse tipo de dados. Se isso acontecer, você não precisa mudar nada.

Se você estiver fazendo interface com um componente que não dá suporte a esse
tipo de dados, deverá substituí-lo pelo tipo mais próximo em conformidade com o
CLS. Por exemplo, no lugar de UInteger você pode ser capaz de usar Integer se
não precisar do intervalo de valores acima de 2.147.483.647. Se você precisar do
intervalo estendido, poderá substituir UInteger por Long .

Se você estiver fazendo interface com objetos de Automação ou COM, tenha em


mente que alguns tipos têm larguras de dados diferentes daquelas do .NET
Framework. Por exemplo, uint geralmente são 16 bits em outros ambientes. Se
você estiver transmitindo um argumento de 16 bits para um componente desse
tipo, declare-o como UShort em vez de UInteger no seu novo código gerenciado
do Visual Basic.

Confira também
Reflexão (Visual Basic)
Reflexão
BC42324: O uso de uma variável de
iteração em uma expressão lambda
pode ter resultados inesperados
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O uso de uma variável de iteração em uma expressão lambda pode ter resultados
inesperados. Em vez disso, crie uma variável local dentro do loop e atribua-lhe o valor
da variável de iteração.

Esse aviso é exibido quando você usa uma variável de iteração de loop em uma
expressão lambda declarada dentro do loop. Por exemplo, o exemplo a seguir faz com
que o aviso apareça.

VB

For i As Integer = 1 To 10

' The warning is given for the use of i.

Dim exampleFunc As Func(Of Integer) = Function() i

Next

O exemplo a seguir mostra os resultados inesperados que podem ocorrer.

VB

Module Module1

Sub Main()

Dim array1 As Func(Of Integer)() = New Func(Of Integer)(4) {}

For i As Integer = 0 To 4

array1(i) = Function() i

Next

For Each funcElement In array1

System.Console.WriteLine(funcElement())

Next

End Sub

End Module

O loop For cria uma matriz de expressões lambda, cada uma delas retorna o valor da
variável i de iteração de loop. Quando as expressões lambda são avaliadas no loop For
Each , você pode esperar ver 0, 1, 2, 3 e 4 exibidos, os valores sucessivos do i no loop

For . Em vez disso, você verá o valor final de i exibido cinco vezes:
5

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratar avisos como erros, consulte Configurar Avisos no Visual Basic.

ID do Erro: BC42324

Para corrigir este erro


Atribua o valor da variável de iteração a uma variável local e use a variável local na
expressão lambda.

VB

Module Module1

Sub Main()

Dim array1 As Func(Of Integer)() = New Func(Of Integer)(4) {}

For i As Integer = 0 To 4

Dim j = i

array1(i) = Function() j

Next

For Each funcElement In array1

System.Console.WriteLine(funcElement())

Next

End Sub

End Module

Confira também
Expressões Lambda
BC30955: o valor do tipo '<typename1>'
não pode ser convertido em
'<typename2>'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Valor do tipo “<typename1>” não pode ser convertido em “<typename2>”. A


incompatibilidade de tipo pode ser devido à mistura de uma referência de arquivo com
uma referência de projeto ao assembly '<assemblyname>'. Tente substituir a referência
de arquivo a '<filepath>' no projeto '<projectname1>' por uma referência de projeto a
'<projectname2>'.

Em uma situação em que um projeto faz uma referência de projeto e uma referência de
arquivo, o compilador não pode garantir que um tipo possa ser convertido em outro.

O pseudocódigo a seguir ilustra uma situação que pode gerar esse erro.

' ================ Visual Basic project P1 ================

' P1 makes a PROJECT REFERENCE to project P2

' and a FILE REFERENCE to project P3.

Public commonObject As P3.commonClass

commonObject = P2.getCommonClass()

' ================ Visual Basic project P2 ================

' P2 makes a PROJECT REFERENCE to project P3

Public Function getCommonClass() As P3.commonClass

Return New P3.commonClass

End Function

' ================ Visual Basic project P3 ================

Public Class commonClass

End Class
O Project P1 faz uma referência de projeto indireto por meio de P2 ao P3 e também
uma referência de arquivo direto para P3 . A declaração de commonObject usa a
referência de arquivo para P3 , enquanto a chamada para P2.getCommonClass usa a
referência do projeto para P3 .

O problema nessa situação é que a referência de arquivo especifica um caminho de


arquivo e um nome para o arquivo de saída (normalmente p3.dll), enquanto as
referências do projeto identificam o projeto de origem ( P3 ) pelo nome do P3 projeto.
Por isso, o compilador não pode garantir que o tipo P3.commonClass venha do mesmo
código-fonte por meio das duas referências diferentes.

Normalmente, essa situação ocorre quando referências de projeto e referências de


arquivo são misturadas. Na ilustração anterior, o problema não ocorreria se P1 fizesse
uma referência de projeto direta a P3 em vez de uma referência de arquivo.

ID do erro: BC30955

Para corrigir este erro


Altere a referência de arquivo para uma referência de projeto.

Confira também
Conversões de tipo no Visual Basic
Gerenciando referências em um projeto
BC30961: O valor do tipo
“<typename1>” não pode ser
convertido em “<typename2>” (várias
referências ao arquivo)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Valor do tipo “<typename1>” não pode ser convertido em “<typename2>”. A


incompatibilidade de tipo pode ser devido à mistura de referências de arquivo do
“<filepath1>” no projeto “<projectname1>” com um arquivo de referência no
“<filepath2>” no projeto “<projectname2>”. Se ambos os assemblies forem idênticos,
tente substituir essas referências para que ambas sejam do mesmo local.

Em uma situação em que um projeto faz mais de uma referência de arquivo a um


assembly, o compilador não pode garantir que um tipo possa ser convertido em outro.

Cada referência de arquivo especifica um caminho de arquivo e um nome para o


arquivo de saída de um projeto (normalmente um arquivo DLL). O compilador não pode
garantir que os arquivos de saída sejam provenientes da mesma origem ou que
representem a mesma versão do mesmo assembly. Portanto, não pode garantir que os
tipos nas diferentes referências sejam do mesmo tipo ou mesmo que um possa ser
convertido no outro.

Você pode usar uma única referência de arquivo se souber que os assemblies
referenciados têm a mesma identidade de assembly. A identidade do assembly inclui o
nome do assembly, a versão, a chave pública (se houver) e a cultura. Essas informações
identificam exclusivamente o assembly.

ID do erro: BC30961

Para corrigir este erro


Se os assemblies referenciados tiverem a mesma identidade de assembly, remova
ou substitua uma das referências de arquivo para que haja apenas uma única
referência de arquivo.

Se os assemblies referenciados não tiverem a mesma identidade de assembly,


altere o código para que ele não tente converter um tipo em um para um tipo no
outro.
Confira também
Conversões de tipo no Visual Basic
Gerenciando referências em um projeto
BC31194: valor do tipo 'type1' não pode
ser convertido em 'type2'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Valor do tipo 'type1' não pode ser convertido em 'type2'. Você pode usar a propriedade
'Value' para obter o valor de cadeia de caracteres do primeiro elemento de
'<parentElement>'.

Foi feita uma tentativa de converter implicitamente um literal do XML em um tipo


específico. O literal do XML não pode ser convertido implicitamente no tipo
especificado.

ID do erro: BC31194

Para corrigir este erro


Use a propriedade Value do literal do XML para referenciar o valor como um
String . Use a função CType , outra função de conversão de tipo ou a classe

Convert para converter o valor como o tipo especificado.

Confira também
Convert
Funções de conversão do tipo
Literais XML
XML
BC30616: a variável '<variablename>'
oculta uma variável em bloco
delimitador
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma variável entre um bloco tem o mesmo nome que outra variável local.

ID do erro: BC30616

Para corrigir este erro


Renomeie a variável no bloco fechado para que ela não seja a mesma que
qualquer outra variável local. Por exemplo:

VB

Dim a, b, x As Integer

If a = b Then

Dim y As Integer = 20 ' Uniquely named block variable.

End If

Uma causa comum para esse erro é o uso de dentro de um manipulador de


eventos Catch e As Exception . Se esse for o caso, nomeie a variável de bloco
Catch ex em vez de e .

Outra fonte comum desse erro é uma tentativa de acessar uma variável local
declarada dentro de um bloco Try em um bloco Catch distinto. Para corrigir isso,
declare a variável fora da estrutura Try...Catch...Finally .

Confira também
Instrução Try...Catch...Finally
Declaração de Variável
BC42104: a variável '<variablename>' é
usada antes de receber um valor
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A variável '<variablename>' é usada antes de receber um valor. Uma exceção de


referência nula pode ocorrer em tempo de execução.

Um aplicativo tem pelo menos um caminho possível por meio do respectivo código,
que lê uma variável antes que qualquer valor seja atribuído a ele.

Se uma variável nunca tiver sido atribuída a um valor, ela armazenará o valor padrão
para o tipo de dados. Para um tipo de dados de referência, esse valor padrão é Nothing.
Ler uma variável de referência que tenha um valor de Nothing pode causar um
NullReferenceException em algumas circunstâncias.

Por padrão, esta mensagem é um aviso. Para obter mais informações sobre como
ocultar avisos ou tratar avisos como erros, confira Configuração de avisos no Visual
Basic.

ID do erro: BC42104

Para corrigir este erro


Verifique a lógica de fluxo de controle e se a variável tem um valor válido antes
que o controle passe para qualquer instrução que a leia.

Uma forma de garantir que a variável sempre tenha um valor válido é inicializá-la
como parte de sua declaração. Confira "Inicialização" na Instrução Dim.

Confira também
Instrução Dim
Declaração de Variável
Solução de problemas de Variáveis
A variável usa um tipo de automação
sem suporte no Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Você tentou usar uma variável definida em uma biblioteca de tipos ou biblioteca de
objetos que tem um tipo de dados sem suporte no Visual Basic.

Para corrigir este erro


Use uma variável de um tipo reconhecido pelo Visual Basic.

-ou-

Se você encontrar esse erro ao usar FileGet ou FileGetObject , verifique se o


arquivo que você está tentando usar foi gravado com FilePut ou FilePutObject .

Confira também
Data Types
BC31168: As propriedades de eixo XML
não dão suporte à associação tardia
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma propriedade de eixo XML foi referenciada para um objeto sem tipo.

ID do erro: BC31168

Para corrigir este erro


Verifique se o objeto é um objeto XElement de tipo forte antes de referenciar a
propriedade de eixo XML.

Confira também
Propriedades do eixo XML
XML
BC42319: a exceção de comentário XML
deve ter um atributo 'cref'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A marca de <exceção> fornece um modo de documentar as exceções que podem ser


geradas por um método. O atributo cref necessário designa o nome de um membro,
que é verificado pelo gerador de documentação. Se o membro existir, ele será traduzido
para o nome do elemento canônico no arquivo de documentação.

ID do erro: BC42319

Para corrigir este erro


Adicione o atributo cref à exceção da seguinte maneira:

XML

<exception cref="member">description</exception>

Confira também
<exception>
Como criar documentação XML
Marcações de Comentário XML
BC31180: as referências de entidade XML
não são suportadas
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Uma referência de entidade (por exemplo, © ) que não está definida na especificação
XML 1.0 está incluída como um valor para um literal do XML. Somente as referências de
entidade XML & , " , < , > e ' têm suporte em literais do XML.

ID do erro: BC31180

Para corrigir este erro


Remova a referência de entidade sem suporte.

Confira também
Especificação dos literais XML e do XML 1.0
Literais XML
XML
BC31200: Literais e propriedades de
XML não são suportados em código
inserido dentro do ASP.NET
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Literais e propriedades de XML não são suportados em código inserido dentro do


ASP.NET. Para usar recursos XML, mova o código para code-behind.

Uma propriedade do eixo XML literal ou XML é definida dentro do código inserido ( <%=
=> ) em um arquivo ASP.NET.

ID do Erro: BC31200

Para corrigir este erro


Mova o código que inclui a propriedade do eixo XML literal ou XML para um
arquivo ASP.NET code-behind.

Confira também
Literais XML
Propriedades do eixo XML
XML
BC31183: URI de namespace de XML
http://www.w3.org/XML/1998/namespace ;
pode ser limitado somente a 'xmlns'
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O URI http://www.w3.org/XML/1998/namespace é usado em uma declaração de


namespace de XML. Esse URI é um namespace reservado e não pode ser incluído em
uma declaração de namespace de XML.

ID do erro: BC31183

Para corrigir este erro


Remova a declaração de namespace de XML ou substitua o URI
http://www.w3.org/XML/1998/namespace por um URI de namespace válido.

Confira também
Instrução Imports (namespace XML)
Literais XML
XML
Referência (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Esta seção fornece links para informações de referência sobre vários aspectos da
programação do Visual Basic.

Nesta seção
Referência da linguagem Visual Basic

Esta seção fornece informações de referência para vários aspectos da linguagem Visual
Basic.

Compilador de linha de comando do Visual Basic

Fornece links para informações sobre o compilador de linha de comando, que fornece
uma alternativa para compilar programas de IDE do Visual Studio.

Informações de referência do .NET Framework

Fornece links para informações sobre como trabalhar com a biblioteca de classe do .NET
Framework.

Especificação da linguagem Visual Basic

Fornece links para a conclusão da especificação do idioma do Visual Basic, que contêm
informações detalhadas sobre todos os aspectos do idioma.

Seções relacionadas
Elementos gerais de interface do usuário (Visual Studio)

Contém tópicos para caixas de diálogo e janelas usadas no Visual Studio.

Ferramentas XML no Visual Studio

Fornece links para tópicos em várias ferramentas XML disponíveis em Visual Studio.

Extensibilidade do Visual Studio

Fornece links para tópicos abrangendo automação e extensibilidade no Visual Studio,


para componentes compartilhados e de idioma específico.
Compilador de linha de comando do
Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

O Visual Basic fornece um compilador de linha de comando como alternativa para


compilar programas no IDE (ambiente de desenvolvimento integrado) do Visual Studio.
Esta seção contém descrições para as opções do compilador do Visual Basic.

Todas as opções do compilador estão disponíveis em duas formas: -option e /option .


A documentação mostra apenas a forma -option .

Nesta seção
Compilando da Linha de Comando

Descreve o compilador de linha de comando do Visual Basic, que é fornecido como uma
alternativa para compilar programas de dentro do IDE do Visual Studio.

Opções do compilador do Visual Basic listadas em ordem alfabética

Lista opções do compilador em uma tabela alfabética

Opções de compilador do Visual Basic listadas por categoria

Apresenta opções de compilador in grupos funcionais.


Compilando a partir da linha de
comando (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Um projeto do Visual Basic é composto por um ou mais arquivos de origem separados.


Durante o processo conhecido como compilação, esses arquivos são reunidos em um
pacote— um único arquivo executável que pode ser executado como um aplicativo.

O Visual Basic fornece um compilador de linha de comando como alternativa para


compilar programas no IDE (ambiente de desenvolvimento integrado) do Visual Studio.
O compilador de linha de comando foi projetado para situações nas quais você não
requer o conjunto completo de recursos no IDE, por exemplo, quando você está usando
computadores com memória do sistema ou espaço de armazenamento limitados, ou
gravando para tais equipamentos.

Para compilar arquivos de origem de dentro do IDE do Visual Studio, escolha o


comando Compilar no menu Compilar.

 Dica

Quando você compila arquivos de projeto usando o IDE do Visual Studio, você
pode exibir informações sobre o comando vbc associado e suas opções na janela
de saída. Para exibir essas informações, abra a caixa de diálogo Opções, Projetos e
Soluções, Compilar e Executar e, em seguida, defina o detalhamento da saída de
build do projeto do MSBuild como Normal ou um nível mais alto de
detalhamento. Para obter mais informações, consulte Como exibir, salvar e
configurar arquivos de log de build.

Você pode compilar arquivos de projeto (.vbproj) em um prompt de comando usando o


MSBuild. Para obter mais informações, consulte Referência de linha de comando e Passo
a passo: usando o MSBuild.

Nesta seção
Como: Invocar o compilador de linha de comando

Descreve como invocar o compilador de linha de comando no prompt MS-DOS ou em


um subdiretório específico.
Linhas de Comando de Compilação de Exemplo

Fornece uma lista de linhas de comando de exemplo que você pode modificar para seu
próprio uso.

Seções relacionadas
Compilador de linha de comando do Visual Basic

Fornece listas de opções do compilador, organizadas em ordem alfabética ou por


finalidade.

Compilação Condicional

Descreve como compilar seções específicas do código.

Compilando e limpando projetos e soluções no Visual Studio

Descreve como organizar o que será incluído em diferentes builds, escolher


propriedades do projeto e garantir que os projetos sejam compilados na ordem correta.
Como invocar o compilador de linha de
comando (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Você pode invocar o compilador de linha de comando digitando o nome do arquivo


executável na linha de comando, também conhecida como prompt MS-DOS. Se você
compilar no Prompt de Comando padrão do Windows, deverá digitar o caminho
totalmente qualificado para o arquivo executável. Para substituir esse comportamento
padrão, você pode usar o Prompt de Comando do Desenvolvedor para Visual Studio ou
modificar a variável de ambiente PATH. Ambos permitem que você compile de qualquer
diretório simplesmente digitando o nome do compilador.

7 Observação

Seu computador pode mostrar diferentes nomes ou locais para alguns dos
elementos de interface do usuário do Visual Studio nas instruções a seguir. A
edição do Visual Studio que você possui e as configurações que você usa
determinam esses elementos. Para obter mais informações, consulte
Personalizando o IDE.

Para invocar o compilador usando o Prompt de


Comando do Desenvolvedor para Visual Studio
1. Abra a pasta de programa Ferramentas do Visual Studio no grupo de programas
do Microsoft Visual Studio.

2. Você pode usar o Prompt de Comando do Desenvolvedor para Visual Studio para
acessar o compilador de qualquer diretório no seu computador se o Visual Studio
estiver instalado.

3. Invocar o Prompt de Comando do Desenvolvedor para o Visual Studio.

4. Na linha de comando, digite vbc.exe sourceFileName e pressione ENTER.

Por exemplo, se você armazenasse o código-fonte em um diretório chamado


SourceFiles , abriria o Prompt de Comando e digitaria cd SourceFiles para alterar

para esse diretório. Se o diretório contiver um arquivo de origem chamado


Source.vb , você poderá compilá-lo digitando vbc.exe Source.vb .
Para definir a variável de ambiente PATH para o
compilador do Prompt de Comando do
Windows
1. Use o recurso Windows Search para encontrar Vbc.exe no seu disco local.

O nome exato do diretório em que o compilador está localizado depende do local


do diretório do Windows e da versão do ".NET Framework" instalada. Se você tiver
mais de uma versão do ".NET Framework" instalada, deverá determinar qual versão
usar (normalmente a versão mais recente).

2. No menu Iniciar, clique com o botão direito do mouse em Meu Computador e


clique em Propriedades no menu de atalho.

3. Clique na guia Avançado e em Variáveis de Ambiente.

4. No painel de variáveis do Sistema, selecione Caminho na lista e clique em Editar.

5. Na caixa de diálogo Editar Variável do Sistema, mova o ponto de inserção para o


final da cadeia de caracteres no campo Valor Variável e digite um ponto e vírgula
(;) seguido pelo nome completo do diretório encontrado na Etapa 1.

6. Clique em OK para confirmar suas edições e fechar as caixas de diálogo.

Depois de alterar a variável de ambiente PATH, você pode executar o compilador


do Visual Basic no Prompt de Comando do Windows de qualquer diretório no
computador.

Para invocar o compilador usando o Prompt de


Comando do Windows
1. No menu Iniciar, clique na pasta Acessórios e abra o Prompt de Comando do
Windows.

2. Na linha de comando, digite vbc.exe sourceFileName e pressione ENTER.

Por exemplo, se você armazenasse o código-fonte em um diretório chamado


SourceFiles , abriria o Prompt de Comando e digitaria cd SourceFiles para alterar

para esse diretório. Se o diretório contiver um arquivo de origem chamado


Source.vb , você poderá compilá-lo digitando vbc.exe Source.vb .
Confira também
Compilador de linha de comando do Visual Basic
Compilação Condicional
Linhas de comando de compilação de
exemplo (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Como alternativa para compilar programas do Visual Basic de dentro do Visual Studio,
você pode compilar a partir da linha de comando para produzir arquivos executáveis
(.exe) ou arquivos de biblioteca de vínculo dinâmico (.dll).

O compilador de linha de comando do Visual Basic dá suporte a um conjunto completo


de opções que controlam arquivos de entrada e saída, assemblies e opções de
depuração e pré-processador. Cada opção está disponível em duas formas
intercambiáveis: -option e /option . Esta documentação mostra apenas a forma -
option .

A tabela a seguir lista algumas linhas de comando de exemplo que você pode modificar
para seu próprio uso.

Para Use

Compilar File.vb e criar File.exe vbc -


reference:Microsoft.VisualBasic.dll
File.vb

Compilar File.vb e criar File.dll vbc -target:library File.vb

Compilar File.vb e criar My.exe vbc -out:My.exe File.vb

Compilar File.vb e criar uma biblioteca e um assembly de vbc -target:library -


referência chamado File.dll ref:.\debug\bin\ref\file.dll
File.vb

Compilar todos os arquivos do Visual Basic no diretório vbc -define:DEBUG=1 -optimize -


atual, com otimizações ativadas e o símbolo DEBUG out:File2.exe *.vb
definido, produzindo File2.exe

Compilar todos os arquivos do Visual Basic no diretório vbc -target:library -out:File2.dll


atual, produzindo uma versão de depuração de File2.dll -nowarn -nologo -debug *.vb
sem exibir o logotipo ou avisos

Compilar todos os arquivos do Visual Basic no diretório vbc -target:library -


atual para Something.dll out:Something.dll *.vb

 Dica
Quando você compila um projeto usando o IDE do Visual Studio, você pode exibir
informações sobre o comando vbc associado e suas opções de compilador na
janela de saída. Para exibir essas informações, abra a caixa de diálogo Opções,
Projetos e Soluções, Compilar e Executar e, em seguida, defina o detalhamento da
saída de build do projeto do MSBuild como Normal ou um nível mais alto de
detalhamento.

Confira também
Compilador de linha de comando do Visual Basic
Compilação Condicional
Opções de compilador do Visual Basic
listadas em ordem alfabética
Artigo • 28/11/2022 • 4 minutos para o fim da leitura

O compilador de linha de comando é fornecido como uma alternativa para compilar


programas no IDE (ambiente de desenvolvimento integrado) do Visual Studio. Veja a
seguir uma lista das opções do compilador de linha de comando do Visual Basic
classificadas em ordem alfabética.

Todas as opções do compilador estão disponíveis em duas formas: -option e /option .


A documentação mostra apenas a forma -option .

Opção Finalidade

@ (especificar arquivo Especifica um arquivo de resposta.


de resposta)

-? Exibe as opções do compilador. Esse comando é o mesmo que


especificar a opção -help . Nenhuma compilação ocorre.

-additionalfile Nomeia outros arquivos que não afetam diretamente a geração de


código, mas podem ser usados por analisadores para produzir erros ou
avisos.

-addmodule Faz com que o compilador verifique todos os tipos de informações de


arquivos especificados disponíveis para o projeto que você está
compilando.

-analyzer Executar os analisadores com basse nesse assembly (forma abreviada: -a)

-baseaddress Especifica o endereço básico de um DLL.

-bugreport Cria um arquivo que contém informações que tornam mais fácil relatar
um bug.

-checksumalgorithm: Especifique o algoritmo para calcular a soma de verificação do arquivo


<alg> de origem armazenada no PDB. Os valores com suporte são: SHA1
(padrão) ou SHA256.

Em razão de problemas de colisão com SHA1, a Microsoft recomenda


SHA256 ou melhor.

-codepage Especifica a página de código a ser usada para todos os arquivos de


código-fonte na compilação.

-debug Produz informações de depuração.

-define Define símbolos para a compilação condicional.


Opção Finalidade

-delaysign Especifica se o assembly será assinado total ou parcialmente.

-deterministic Faz com que o compilador gere um assembly de conteúdo binário


idêntico entre compilações se as entradas são idênticas.

-doc Processa comentários de documentação para um arquivo XML.

-errorreport Especifica como o compilador do Visual Basic deve relatar erros internos
do compilador.

-filealign Especifica onde alinhar as seções do arquivo de saída.

ajuda Exibe as opções do compilador. Esse comando é o mesmo que


especificar a opção -? . Nenhuma compilação ocorre.

-highentropyva Indica se um executável em especial dá suporte a ASLR (Aleatoriedade


de Layout de Espaço de Endereço) de alta entropia.

-imports Importa um namespace de um assembly especificado.

-keycontainer Especifica um nome de contêiner de chave para um par de chaves para


dar um nome forte a um assembly.

-keyfile Especifica um arquivo que contém um par de chaves ou chave para dar
um nome forte a um assembly.

-langversion Especificar a versão do idioma: 9|9.0|10|10.0|11|11.0.

-libpath Especifica o local dos assemblies referenciados pela opção -reference.

-linkresource Cria um link a um recurso gerenciado.

-main Especifica a classe que contém o procedimento Sub Main a ser usado na
inicialização.

- Especifica o nome do assembly do qual um módulo fará parte.


moduleassemblyname

-modulename:<string> Especificar o nome do módulo de origem

-netcf Define o compilador como destino para o .NET Compact Framework.

-noconfig Não compile com Vbc.rsp.

-nologo Suprime as informações da faixa do compilador.

-nostdlib Faz com que o compilador não referencie as bibliotecas padrão.

-nowarn Suprime a capacidade do compilador de gerar avisos.


Opção Finalidade

-nowin32manifest Instrui o compilador a não inserir nenhum manifesto de aplicativo no


arquivo executável.

-optimize Habilita/desabilita a otimização de código.

-optioncompare Especifica se as comparações de cadeia de caracteres devem ser binárias


ou usar semânticas de texto específicas da localidade.

-optionexplicit Requer declaração explícita de variáveis.

-optioninfer Permite o uso de inferência de tipo local nas declarações de variáveis.

-optionstrict Aplica a semântica restrita de idioma.

-out Especifica um arquivo de saída.

-parallel[+|-] Especifica se deve o build simultâneo deve ser usado (+).

-platform Especifica a plataforma de processador que o compilador direciona para


o arquivo de saída.

-preferreduilang Especifique o nome do idioma de saída preferencial.

-quiet Impede que o compilador exiba código para erros e avisos relacionados
à sintaxe.

-recurse Pesquisa em subdiretórios arquivos de código-fonte a serem


compilados.

-reference Importa os metadados de um assembly.

-refonly Gera apenas um assembly de referência.

-refout Especifica o caminho de saída de um assembly de referência.

-removeintchecks Desabilita a verificação de estouro de inteiro.

-resource Insere um arquivo de recurso gerenciado em um assembly.

-rootnamespace Especifica um namespace para todas as declarações de tipo.

-ruleset:<file> Especifique um arquivo de conjunto de regras que desabilita o


diagnóstico específico.

-sdkpath Especifica o local de Mscorlib.dll e Microsoft.VisualBasic.dll.

-subsystemversion Especifica a versão mínima do subsistema que o arquivo executável


gerado pode usar.

-target Especifica o formato do arquivo de saída.


Opção Finalidade

-utf8output Exibe a saída do compilador usando a codificação UTF-8.

-vbruntime Especifica que o compilador deve ser compilado sem uma referência à
Biblioteca de Runtime do Visual Basic ou com uma referência a uma
biblioteca de runtime específica.

-verbose Gera informações extras durante a compilação.

-warnaserror Promove avisos a erros.

-win32icon Insere um arquivo .ico no arquivo de saída.

-win32manifest Identifica um arquivo de manifesto do aplicativo Win32 definido pelo


usuário para ser inserido em um arquivo PE de um projeto.

-win32resource Insere um arquivo do recurso do Win32 no arquivo de saída.

Confira também
Opções de compilador do Visual Basic listadas por categoria
Gerenciar propriedades do projeto e da solução
@ (especificar arquivo de resposta)
(Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica um arquivo que contém opções do compilador e arquivos de código-fonte a


serem compilados.

Sintaxe
Console

@response_file

Argumentos
response_file

Obrigatórios. Um arquivo que lista as opções do compilador ou os arquivos de código-


fonte a serem compilados. Coloque o nome do arquivo entre aspas ("") se o nome
conter um espaço.

Comentários
O compilador processa as opções do compilador e os arquivos de código-fonte
especificados em um arquivo de resposta como se tivessem sido especificados na linha
de comando.

Para especificar mais de um arquivo de resposta em uma compilação, especifique várias


opções de arquivo de resposta, como a seguir.

Console

@file1.rsp @file2.rsp

Em um arquivo de resposta, várias opções de compilador e de arquivos de código-fonte


podem ser exibidas em uma linha. Uma única especificação de opção do compilador
deve ser exibida em uma linha (não é possível abranger várias linhas). Os arquivos de
resposta podem ter comentários que começam com o símbolo # .
Você pode combinar opções especificadas na linha de comando com opções
especificadas em um ou mais arquivos de resposta. O compilador processa as opções
de comando conforme as encontra. Portanto, os argumentos da linha de comando
podem substituir opções listadas anteriormente em arquivos de resposta. Por outro
lado, opções em um arquivo de resposta substituirão as opções listadas anteriormente
na linha de comando ou em outros arquivos de resposta.

O Visual Basic fornece o arquivo Vbc.rsp, localizado no mesmo diretório que o arquivo
Vbc.exe. O arquivo Vbc.rsp é incluído por padrão, a menos que a opção -noconfig seja
usada. Para obter mais informações, confira -noconfig.

7 Observação

A opção @ não está disponível no ambiente de desenvolvimento do Visual Studio;


ela só está disponível quando se compila na linha de comando.

Exemplo 1
As linhas a seguir são de uma amostra de arquivo de resposta.

Console

# build the first output file

-target:exe

-out:MyExe.exe

source1.vb

source2.vb

Exemplo 2
O exemplo a seguir demonstra como usar a opção @ com o arquivo de resposta
chamado File1.rsp .

Console

vbc @file1.rsp

Confira também
Compilador de linha de comando do Visual Basic
-noconfig
Linhas de Comando de Compilação de Exemplo
-addmodule
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Faz com que o compilador verifique todos os tipos de informações de arquivos


especificados disponíveis para o projeto que você está compilando.

Sintaxe
Console

-addmodule:fileList

Argumentos
fileList

Obrigatórios. Lista delimitada por vírgulas de arquivos que contêm metadados, mas não
manifestos de assembly. Os nomes de arquivo que contêm espaços devem ser cercados
por aspas (" ").

Comentários
Os arquivos listados pelo parâmetro fileList devem ser criados com a opção ou com a
opção -target:module ou com outro equivalente no compilador a -target:module .

Todos os módulos adicionados com -addmodule devem estar no mesmo diretório que o
arquivo de saída em tempo de execução. Ou seja, é possível especificar um módulo em
qualquer diretório em tempo de compilação, mas o módulo deve estar no diretório do
aplicativo em tempo de execução. Se não estiver, você receberá um erro
TypeLoadException.

Se você especificar (implícita ou explicitamente) qualquer opção -target (Visual Basic)


diferente de -target:module com -addmodule , os arquivos transmitidos para -addmodule
se tornarão parte do assembly do projeto. Um assembly deve executar um arquivo de
saída que tenha um ou mais arquivos adicionados com -addmodule .

Use -reference (Visual Basic) para importar metadados de um arquivo que contenha um
assembly.
7 Observação

A opção -addmodule não está disponível no ambiente de desenvolvimento do


Visual Studio; ela só está disponível quando se compila na linha de comando.

Exemplo
O código a seguir cria um módulo.

VB

' t1.vb

' Compile with vbc /target:module t1.vb.

' Outputs t1.netmodule.

Public Class TestClass

Public i As Integer

End Class

O código a seguir importa os tipos do módulo.

VB

' t2.vb

' Compile with vbc /addmodule:t1.netmodule t2.vb.

Option Strict Off

Namespace NetmoduleTest

Module Module1

Sub Main()

Dim x As TestClass

x = New TestClass

x.i = 802

System.Console.WriteLine(x.i)

End Sub

End Module

End Namespace

Quando você executa t1 , ele gera 802 .

Confira também
Compilador de linha de comando do Visual Basic
-target (Visual Basic)
-reference (Visual Basic)
Linhas de Comando de Compilação de Exemplo
-baseaddress
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Especifica um endereço base padrão ao criar uma DLL.

Sintaxe
Console

-baseaddress:address

Argumentos
Termo Definição

address Obrigatórios. O endereço básico da DLL. Este endereço deve ser especificado como um
número hexadecimal.

Comentários
O endereço básico padrão de uma DLL é definido pelo Common Language Runtime do
.NET Framework.

Lembre-se de que a palavra de ordem inferior nesse endereço será arredondada. Por
exemplo, se 0x11110001 for especificado, será arredondado para 0x11110000.

Para concluir o processo de assinatura de uma DLL, use a opção –R da ferramenta De


Nomenclatura Forte (Sn.exe).

Essa opção será ignorada se o destino não for uma DLL.

Para definir -baseaddress no IDE do Visual Studio

1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em Propriedades.


2. Clique na guia Compilar.

3. Clique em Avançadas.

4. Modifique o valor no endereço base da DLL: caixa. Nota: O endereço base da DLL: a caixa é
somente leitura, a menos que o destino seja uma DLL.

Confira também
Compilador de linha de comando do Visual Basic
-target (Visual Basic)
Linhas de Comando de Compilação de Exemplo
Sn.exe (ferramenta Nome Forte))
-bugreport
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Cria um arquivo que você pode usar ao registrar um relatório de bugs.

Sintaxe
Console

-bugreport:file

Argumentos
Termo Definição

file Obrigatórios. O nome do arquivo que conterá o relatório de bug. Coloque o nome do
arquivo entre aspas ("") se o nome conter um espaço.

Comentários
As seguintes informações são adicionadas a file :

Uma cópia de todos os arquivos de código-fonte na compilação.

Uma lista das opção do compilador usadas na compilação.

Informações de versão sobre o compilador, o tempo de execução do CLR e o


sistema operacional.

Saída do compilador, se houver.

Uma descrição do problema, para qual você foi solicitado.

Uma solicitação de como você acha que o problema deve ser corrigido.

Como uma cópia de todos os arquivos de código-fonte será colocada no file , talvez
seja desejável reproduzir o suposto defeito do código no programa mais curto possível.

) Importante
A -bugreport opção produz um arquivo que contém informações potencialmente
confidenciais. Isso inclui a hora atual, a versão do compilador, .NET Framework
versão, a versão do sistema operacional, o nome de usuário, os argumentos de
linha de comando com os quais o compilador foi executado, todo o código-fonte e
a forma binária de qualquer assembly referenciado. Essa opção pode ser acessada
especificando opções de linha de comando no arquivo Web.config para uma
compilação do lado do servidor de um aplicativo ASP.NET. Para evitar isso,
modifique o arquivo Machine.config para impedir que os usuários compilem no
servidor.

Se essa opção for usada com -errorreport:prompt , -errorreport:queue ou -


errorreport:send , e seu aplicativo encontrar um erro interno do compilador, as

informações serão file enviadas para a Microsoft Corporation. Essas informações


ajudarão os engenheiros da Microsoft a identificar a causa do erro e podem ajudar a
melhorar a próxima versão do Visual Basic. Por padrão, nenhuma informação é enviada
à Microsoft. No entanto, quando você compila um aplicativo usando -
errorreport:queue , que está habilitado por padrão, o aplicativo coleta seus relatórios de

erro. Em seguida, quando o administrador do computador faz logon, o sistema de


relatórios de erros exibe uma janela pop-up que permite que o administrador
encaminhe à Microsoft quaisquer relatórios de erro ocorridos desde o logon.

7 Observação

A opção -bugreport não está disponível no ambiente de desenvolvimento do


Visual Studio; ela só está disponível quando se compila na linha de comando.

Exemplo
O exemplo a seguir compila t2.vb e coloca todas as informações de relatório de bugs no
arquivo Problem.txt.

Console

vbc -bugreport:problem.txt t2.vb

Confira também
Compilador de linha de comando do Visual Basic
-debug (Visual Basic)
-errorreport
Linhas de Comando de Compilação de Exemplo
Elemento trustLevel para securityPolicy (esquema de configurações ASP.NET)
/codepage (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Especifica a página de código a ser usada para todos os arquivos de código-fonte na


compilação.

Sintaxe
Console

-codepage:id

Argumentos
Termo Definição

id Obrigatórios. O compilador usa a página de código especificada para id interpretar a


codificação dos arquivos de origem.

Comentários
Para compilar o código-fonte salvo com uma codificação específica, você pode usar -
codepage para especificar qual página de código deve ser usada. A -codepage opção se

aplica a todos os arquivos de código-fonte em sua compilação. Para obter mais


informações, consulte Codificação de Caracteres no .NET Framework.

A -codepage opção não será necessária se os arquivos de código-fonte foram salvos


usando a página de código ANSI atual, Unicode ou UTF-8 com uma assinatura. O Visual
Studio salva todos os arquivos de código-fonte com a página de código ANSI atual por
padrão, a menos que o usuário especifique outra codificação na caixa de diálogo
Codificação. O Visual Studio usa a caixa de diálogo Codificação para código aberto
arquivos de código salvos com uma página de código diferente.

7 Observação

A opção -codepage não está disponível no ambiente de desenvolvimento do Visual


Studio; ela só está disponível quando se compila na linha de comando.
Confira também
Compilador de linha de comando do Visual Basic
-debug (Visual Basic)
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Faz o compilador gerar informações de depuração e colocá-las no(s) arquivo(s) de saída.

Syntax
Console

-debug[+ | -]

ou

Console

-debug:[full | pdbonly]

Argumentos
Termo Definição

+ | - Opcional. Especificar + ou -debug faz o compilador gerar informações de depuração e


colocá-las em um arquivo .pdb. Especificar - tem o mesmo efeito que especificar -
debug .

full | Opcional. Especifica o tipo de informações de depuração geradas pelo compilador. Se


pdbonly você não especificar -debug:pdbonly , o padrão será full , o que permite anexar um
depurador ao programa em execução. O argumento pdbonly permite a depuração de
código-fonte quando o programa é iniciado no depurador, mas exibe o código de
linguagem assembly somente quando o programa em execução está anexado ao
depurador.

Comentários
Use essa opção para criar builds de depuração. Se você não especificar -debug , -debug+
ou -debug:full , não será possível depurar o arquivo de saída do programa.

Por padrão, as informações de depuração não são emitidas ( -debug- ). Para emitir
informações de depuração, especifique -debug ou -debug+ .
Para obter informações sobre como configurar o desempenho de depuração de um
aplicativo, consulte Facilitando a depuração de uma imagem.

Para configurar -debug no ambiente de desenvolvimento integrado do Visual Studio

1. Com um projeto selecionado no Gerenciador de Soluções, no menu Projeto, clique em


Propriedades.

2. Clique na guia Compilar.

3. Clique em Opções Avançadas de Compilação.

4. Modifique o valor na caixa Gerar Informações de Depuração.

Exemplo
O exemplo a seguir coloca informações de depuração no arquivo de saída App.exe .

Console

vbc -debug -out:app.exe test.vb

Confira também
Compilador de linha de comando do Visual Basic
-bugreport
Linhas de Comando de Compilação de Exemplo
-define (Visual Basic)
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Define as constantes de compilador condicional.

Syntax
Console

-define:["]symbol[=value][,symbol[=value]]["]

ou

Console

-d:["]symbol[=value][,symbol[=value]]["]

Argumentos
Termo Definição

symbol Obrigatórios. O símbolo a ser definido.

value Opcional. O valor para atribuir symbol . Se value for uma cadeia de caracteres, ela
deverá ser colocada entre sequências de barra invertida/aspas (\"), em vez de aspas. Se
nenhum valor for especificado, será considerado como True.

Comentários
A opção -define tem um efeito semelhante a usar uma diretiva de pré-processador
#Const em seu arquivo de origem, exceto que as constantes definidas com -define são

públicas e se aplicam a todos os arquivos do projeto.

Você pode usar símbolos criados por essa opção com a diretiva #If ... Then ... #Else para
compilar os arquivos de origem condicionalmente.

-d é a forma abreviada de -define .

Você pode definir vários símbolos com -define usando uma vírgula para separar as
definições de símbolos.
Para configurar -define no ambiente de desenvolvimento integrado do Visual Studio

1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em Propriedades.


2. Clique na guia Compilar.

3. Clique em Avançadas.

4. Modifique o valor na caixa Constantes Personalizadas.

Exemplo
O código a seguir define e usa duas constantes de compilador condicional.

VB

' Vbc /define:DEBUGMODE=True,TRAPERRORS=False test.vb

Sub mysub()

#If debugmode Then

' Insert debug statements here.

MsgBox("debug mode")

#Else

' Insert default statements here.

#End If

End Sub

Confira também
Compilador de linha de comando do Visual Basic
Diretivas #If...Then...#Else
Diretiva #Const
Linhas de Comando de Compilação de Exemplo
-delaysign
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica se o assembly será assinado total ou parcialmente.

Sintaxe
Console

-delaysign[+ | -]

Argumentos
+ | -

Opcional. Use -delaysign- se você quiser um assembly totalmente assinado. Use -


delaysign+ se você quiser colocar a chave pública no assembly e reservar espaço para o

hash assinado. O padrão é -delaysign- .

Comentários
A opção -delaysign não tem nenhum efeito a menos que seja usada com -keyfile ou -
keycontainer.

Quando você solicita um assembly totalmente assinado, o compilador usa o hash no


arquivo que contém o manifesto (metadados de assembly) e sinaliza esse hash com a
chave particular. A assinatura digital resultante é armazenada no arquivo que contém o
manifesto. Quando um assembly é assinado com atraso, o compilador não calcula e
armazena a assinatura, mas reserva o espaço no arquivo, de modo que a assinatura
possa ser adicionada depois.

Por exemplo, usando -delaysign+ , um desenvolvedor em uma organização pode


distribuir versões de teste não assinadas de um assembly que os testadores podem
registrar com o cache de assembly global e usar. Quando o trabalho no assembly é
concluído, a pessoa responsável pela chave privada da organização pode assinar
totalmente o assembly. Essa compartimentalização protege a chave privada da
organização contra a divulgação, permitindo que todos os desenvolvedores trabalhem
nos assemblies.
Confira Criando e usando assemblies de nomes fortes e mais informações sobre
assinatura de um assembly.

Para configurar -delaysign no ambiente de


desenvolvimento integrado do Visual Studio
1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em
Propriedades.

2. Clique na guia Assinatura .

3. Defina o valor na caixa Somente sinal de atraso.

Confira também
Compilador de linha de comando do Visual Basic
-keyfile
-keycontainer
Linhas de Comando de Compilação de Exemplo
-deterministic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Faz com que o compilador produza um assembly cuja saída byte a byte é idêntica entre
compilações para entradas idênticas.

Sintaxe
Console

-deterministic

Comentários
Por padrão, a saída do compilador de um determinado conjunto de entradas é
exclusiva, uma vez que o compilador adiciona um carimbo de data/hora e um GUID
gerado com base em números aleatórios. Use a opção -deterministic para produzir
um assembly determinística, cujo conteúdo binário seja idêntico entre compilações,
desde que a entrada permaneça a mesma.

O compilador considera as seguintes entradas com a finalidade de determinismo:

A sequência de parâmetros de linha de comando.


O conteúdo do arquivo de resposta .rsp do compilador.
A versão precisa do compilador usado e seus assemblies referenciados.
O caminho do diretório atual.
O conteúdo binário de todos os arquivos passados explicitamente para o
compilador direta ou indiretamente, incluindo:
Arquivos de origem
Assemblies referenciados
Módulos referenciados
Recursos
O arquivo de chave de nome forte
@ arquivos de resposta
Analisadores
Conjuntos de regras
Arquivos adicionais que podem ser usados por analisadores
A cultura atual (para o idioma no qual as mensagens de diagnóstico e exceção são
produzidas).
A codificação padrão (ou a página de código atual) se a codificação não for
especificada.
A existência, a inexistência e o conteúdo dos arquivos em caminhos de pesquisa
do compilador (especificados, por exemplo, por -lib ou -recurse ).
A plataforma CLR na qual o compilador é executado.
O valor de %LIBPATH% , que pode afetar o carregamento de dependência do
analisador.

Quando as fontes estão disponíveis publicamente, a compilação determinística pode ser


usada para estabelecer se um binário é compilado de uma fonte confiável. Isso também
pode ser útil em um sistema de compilação contínua para determinar se as etapas de
compilação dependentes de alterações para um binário precisam ser executadas.

Confira também
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-doc
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Processa comentários de documentação para um arquivo XML.

Syntax
Console

-doc[+ | -]

ou

Console

-doc:file

Argumentos
Termo Definição

+ | - Opcional. Especificar +, ou apenas -doc , faz com que o compilador gere informações
sobre a documentação e as coloque em um arquivo XML. Especificar - é equivalente a
não especificar -doc , fazendo com que nenhuma informação de documentação seja
criada.

file Necessário se -doc: for usado. Especifica o arquivo XML de saída, que é preenchido
com os comentários dos arquivos de código-fonte da compilação. Se o nome do
arquivo contiver um espaço, coloque o nome entre aspas (" ").

Comentários
A opção -doc controla se o compilador gera um arquivo XML contendo os comentários
de documentação. Se você usar a sintaxe -doc:file , o parâmetro file especifica o
nome do arquivo XML. Se você usar -doc ou -doc+ , o compilador pega o nome do
arquivo XML do arquivo executável ou da biblioteca que o compilador está criando. Se
você usar -doc- ou não especificar a opção -doc , o compilador não criará um arquivo
XML.
Nos arquivos de código-fonte, os comentários de documentação podem preceder as
seguintes definições:

Tipos definidos pelo usuário, como uma classe ou interface

Membros, como um campo, evento, propriedade, função ou sub-rotina.

Para usar o arquivo XML gerado com o recurso IntelliSense do Visual Studio, deixe o
nome do arquivo XML ser o mesmo que o assembly para o qual você deseja dar
suporte. Certifique-se de que o arquivo XML esteja no mesmo diretório que o assembly
de modo que, ao referenciar o assembly no projeto do Visual Studio, o arquivo .xml
também seja encontrado. Os arquivos de documentação XML não são necessários para
o IntelliSense funcionar com o código dentro do projeto ou em projetos referenciados
por um projeto.

A menos que você compile com -target:module , o arquivo XML contém as marcações
<assembly></assembly> . Essas marcações especificam o nome do arquivo que contém o

manifesto do assembly para o arquivo de saída da compilação.

Veja Marcas de Comentário XML para descobrir as maneiras de gerar documentação de


comentários em seu código.

Para configurar -doc no ambiente de desenvolvimento integrado do Visual Studio

1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em Propriedades.


2. Clique na guia Compilar.

3. Defina o valor na caixa Gerar arquivo de documentação XML.

Exemplo
Veja Como documentar o código com XML para obter um exemplo.

Confira também
Compilador de linha de comando do Visual Basic
Documentando o código com XML
-errorreport
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Especifica como o compilador do Visual Basic deve relatar erros internos do compilador.

Sintaxe
Console

-errorreport:{ prompt | queue | send | none }

Comentários
Essa opção fornece uma maneira conveniente de relatar um ICE (erro do compilador
interno) do Visual Basic para a equipe do Visual Basic na Microsoft. Por padrão, o
compilador não envia nenhuma informação para a Microsoft. No entanto, se você
encontrar um erro interno do compilador, essa opção permitirá que você relate o erro à
Microsoft. Essas informações ajudarão os engenheiros da Microsoft a identificar a causa
e podem ajudar a melhorar a próxima versão do Visual Basic.

A capacidade do usuário de enviar relatórios depende das permissões de política de


usuário e de computador.

A tabela a seguir resume os efeitos da opção -errorreport .

Opção Comportamento

prompt Se ocorrer um erro interno do compilador, uma caixa de diálogo será exibida para que
você possa exibir os dados exatos coletados pelo compilador. Você pode determinar se
há informações confidenciais no relatório de erros e tomar uma decisão sobre se deseja
enviá-lo para a Microsoft. Se você decidir enviá-lo e as configurações de política do
computador e do usuário permitirem, o compilador enviará os dados para a Microsoft.

queue Enfileira o relatório de erros. Ao fazer logon com privilégios de administrador, você
pode relatar quaisquer falhas desde a última vez em que fez logon (não será solicitado
que você envie relatórios para falhas mais de uma vez a cada três dias). Esse é o
comportamento padrão quando a opção -errorreport não é especificada.
Opção Comportamento

send Se ocorrer um erro interno do compilador e as configurações de política do


computador e do usuário permitirem, o compilador enviará os dados para a Microsoft.

A opção -errorreport:send tenta enviar automaticamente informações de erro à


Microsoft se o relatório estiver habilitado pelas configurações do sistema Relatório de
Erros do Windows.

none Se ocorrer um erro interno do compilador, ele não será coletado ou enviado para a
Microsoft.

O compilador envia dados que incluem a pilha no momento do erro, que geralmente
inclui algum código-fonte. Se -errorreport for usado com a opção -bugreport, todo o
arquivo de origem será enviado.

Essa opção é melhor usada com a opção -bugreport, pois permite que os engenheiros
da Microsoft reproduzam o erro com mais facilidade.

7 Observação

A opção -errorreport não está disponível no ambiente de desenvolvimento do


Visual Studio; ela só está disponível quando se compila na linha de comando.

Exemplo
O código a seguir tenta compilar T2.vb e, se o compilador encontrar um erro interno do
compilador, ele solicitará que você envie o relatório de erro para a Microsoft.

Console

vbc -errorreport:prompt t2.vb

Confira também
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-bugreport
-filealign
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica onde alinhar as seções do arquivo de saída.

Sintaxe
Console

-filealign:number

Argumentos
number

Obrigatórios. Um valor que especifica o alinhamento das seções no arquivo de saída. Os


valores válidos são 512, 1024, 2048, 4096 e 8192. Esses valores estão em bytes.

Comentários
Você pode usar a opção -filealign para especificar o alinhamento das seções no
arquivo de saída. As seções são blocos de memória contígua em um arquivo PE (Portátil
Executável) que contém código ou dados. A -filealign opção permite compilar seu
aplicativo com um alinhamento não padrão; a maioria dos desenvolvedores não precisa
usar essa opção.

Cada seção é alinhada em um limite que é um múltiplo do valor -filealign . Não há


nenhum padrão fixo. Se -filealign não for especificado, o compilador escolhe o
padrão no tempo de compilação.

Ao especificar o tamanho da seção, você afeta o tamanho do arquivo de saída.


Modificar o tamanho da seção pode ser útil para programas que serão executados em
dispositivos menores.

7 Observação

A opção -filealign não está disponível no ambiente de desenvolvimento do


Visual Studio; ela só está disponível quando se compila na linha de comando.
Confira também
Compilador de linha de comando do Visual Basic
/help, /? (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Exibe as opções do compilador.

Syntax
Console

-help

ou

Console

-?

Comentários
Se essa opção for incluída em uma compilação, nenhum arquivo de saída será criado e
nenhuma compilação acontecerá.

7 Observação

A opção -help não está disponível no ambiente de desenvolvimento do Visual


Studio; ela só está disponível quando se compila na linha de comando.

Exemplo
O código a seguir exibe a ajuda da linha de comando.

Console

vbc -help

Confira também
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-highentropyva (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Indica se um executável de 64 bits ou um executável marcado pela opção do


compilador -platform:anycpu dá suporte à ASLR (Randomização de Layout de Espaço de
Endereço) de alta entropia.

Sintaxe
Console

-highentropyva[+ | -]

Argumentos
+ | -

Opcional. A opção será desativada por padrão ou se você especificar -highentropyva- . A


opção será ativada se você especificar -highentropyva ou -highentropyva+ .

Comentários
Se você especificar essa opção, versões compatíveis do kernel do Windows poderão
usar níveis maiores de entropia quando o kernel randomizar o layout de espaço de
endereço de um processo como parte do ASLR. Se o kernel usar níveis mais altos de
entropia, um número maior de endereços poderá ser alocado para regiões de memória
como pilhas e heaps. Como resultado, é mais difícil adivinhar a localização de uma
região específica da memória.

Quando a opção for atuvada, o executável de destino e todos os módulos dos quais ele
depende deverão ser capazes de manipular valores de ponteiro que sejam maiores que
4 GB (gigabytes) quando esses módulos estiverem em execução como um processo de
64 bits.

Confira também
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-imports (Visual Basic)
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Importa namespaces de um assembly especificado.

Sintaxe
Console

-imports:namespaceList

Argumentos
Termo Definição

namespaceList Obrigatórios. Lista delimitada por vírgulas de namespaces a serem importados.

Comentários
A opção -imports importa qualquer namespace definido dentro do conjunto atual de
arquivos de origem ou de qualquer assembly referenciado.

Os membros em um namespace especificado com -imports estão disponíveis para


todos os arquivos de código-fonte na compilação. Use a Instrução Imports (namespace
e tipo .NET) para usar um namespace em um único arquivo de código-fonte.

Para configurar -imports no ambiente de desenvolvimento integrado do Visual Studio

1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em Propriedades.


2. Clique na guia Referências.

3. Insira o nome do namespace na caixa ao lado do botão Adicionar importação de usuário.

4. Clique no botão Adicionar importação de usuário.

Exemplo
O código a seguir é compilado quando -imports:system.globalization é especificado.
Sem ela, a compilação bem-sucedida requer que uma instrução Imports
System.Globalization seja incluída no início do arquivo de código-fonte ou que a
propriedade seja totalmente qualificada como
System.Globalization.CultureInfo.CurrentCulture.Name .

VB

Module Example

Public Sub Main()

Console.WriteLine($"The current culture is


{CultureInfo.CurrentCulture.Name}")

End Sub

End Module

Confira também
Compilador de linha de comando do Visual Basic
Referências e a instrução Imports
Linhas de Comando de Compilação de Exemplo
-keycontainer
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Especifica um nome de contêiner de chave para um par de chaves para dar um nome
forte a um assembly.

Sintaxe
Console

-keycontainer:container

Argumentos
Termo Definição

container Obrigatórios. Arquivo de contêiner que contém a chave. Coloque o nome do arquivo
entre aspas ("") se o nome conter um espaço.

Comentários
O compilador cria um componente compartilhável inserindo uma chave pública no
manifesto do assembly e assinando o assembly final com a chave privada. Para gerar um
arquivo de chave, digite sn -k file na linha de comando. A opção -i instala o par de
chaves no contêiner. Para obter mais informações, consulte Sn.exe (Ferramenta de
Nome Forte).

Se você compilar com -target:module , o nome do arquivo de chave será mantido no


módulo e incorporado no assembly que é criado quando você compila um assembly
com -addmodule.

Também é possível especificar essa opção como um atributo personalizado


(AssemblyKeyNameAttribute) no código-fonte de qualquer módulo MSIL (Microsoft
Intermediate Language).

Também é possível passar suas informações de criptografia para o compilador com -


keyfile. Use -delaysign se quiser um assembly parcialmente assinado.

Confira Criando e Usando Assemblies de Nomes Fortes e mais informações sobre


assinatura de um assembly.
7 Observação

A opção -keycontainer não está disponível no ambiente de desenvolvimento do


Visual Studio; ela só está disponível quando se compila na linha de comando.

Exemplo
O código a seguir compila o arquivo de origem Input.vb e especifica um contêiner de
chaves.

Console

vbc -keycontainer:key1 input.vb

Confira também
Assemblies no .NET
Compilador de linha de comando do Visual Basic
-keyfile
Linhas de Comando de Compilação de Exemplo
-keyfile
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Especifica um arquivo que contém uma chave ou um par de chaves para dar um nome
forte a um assembly.

Sintaxe
Console

-keyfile:file

Argumentos
file

Obrigatórios. Arquivo que contém a chave. Se o nome do arquivo contém um espaço,


coloque o nome entre aspas (" ").

Comentários
O compilador insere a chave pública no manifesto do assembly e, em seguida, assina o
assembly final com a chave privada. Para gerar um arquivo de chave, digite sn -k file
na linha de comando. Para obter mais informações, consulte Sn.exe (Ferramenta de
Nome Forte).

Se você compilar com -target:module , o nome do arquivo de chave será mantido no


módulo e incorporado no assembly que é criado quando você compila um assembly
com -addmodule.

Também é possível passar suas informações de criptografia para o compilador com -


keycontainer. Use -delaysign se quiser um assembly parcialmente assinado.

Também é possível especificar essa opção como um atributo personalizado


(AssemblyKeyFileAttribute) no código-fonte de qualquer módulo MSIL (Microsoft
Intermediate Language).

Caso tanto -keyfile e -keycontainer sejam especificados (pela opção de linha de


comando ou pelo atributo personalizado) na mesma compilação, o compilador tentará
primeiro o contêiner de chaves. Se isso ocorrer, o assembly será assinado com as
informações no contêiner de chaves. Se o compilador não localizar o contêiner de
chaves, ele tentará o arquivo especificado com -keyfile . Se isso ocorrer, o assembly
será assinado com as informações no arquivo de chave e as informações da chave serão
instaladas no contêiner de chaves (semelhante a sn -i ), de modo que, na próxima
compilação, o contêiner de chaves será válido.

Observe que um arquivo de chave pode conter somente a chave pública.

Confira Criando e Usando Assemblies de Nomes Fortes e mais informações sobre


assinatura de um assembly.

7 Observação

A opção -keyfile não está disponível no ambiente de desenvolvimento do Visual


Studio; ela só está disponível quando se compila na linha de comando.

Exemplo
O código a seguir compila o arquivo Input.vb de origem e especifica um arquivo de
chave.

Console

vbc -keyfile:myfile.sn input.vb

Confira também
Assemblies no .NET
Compilador de linha de comando do Visual Basic
-reference (Visual Basic)
Linhas de Comando de Compilação de Exemplo
-langversion (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Faz com que o compilador aceite somente a sintaxe incluída na versão de linguagem
especificada em Visual Basic.

Sintaxe
Console

-langversion:version

Argumentos
version

Obrigatórios. A versão do idioma a ser usada durante a compilação. Os valores aceitos


são 9 , 10 , 11 , 12 , 14 , 15 , 15.3 , 15.5 , 16 , 16.9 , default e latest .

Qualquer um dos números inteiros também pode ser especificado usando .0 como a
versão secundária, por exemplo, 11.0 .

Você pode ver a lista de todos os valores possíveis especificando -langversion:? na


linha de comando.

Comentários
A opção -langversion especifica qual sintaxe o compilador aceita. Por exemplo, se você
especificar que a versão do idioma é 9.0, o compilador gerará erros de sintaxe válidos
somente na versão 10.0 e posterior.

Você pode usar essa opção ao desenvolver aplicativos direcionados a diferentes versões
de .NET Framework. Por exemplo, se você estiver direcionando .NET Framework 3.5,
poderá usar essa opção para garantir que não use a sintaxe do idioma versão 10.0.

Você só pode definir -langversion diretamente usando a linha de comando. Para obter
mais informações, consulte Definindo uma Versão Específica do .NET Framework como
Destino.
Exemplo
O código a seguir compila sample.vb para o Visual Basic 9.0.

Console

vbc -langversion:9.0 sample.vb

Confira também
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-libpath
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Especifica o local dos assemblies referenciados.

Sintaxe
Console

-libpath:dirList

Argumentos
Termo Definição

dirList Obrigatórios. Uma lista de diretórios delimitada por ponto e vírgula para o compilador
examinar se um assembly referenciado não foi encontrado no diretório de trabalho
atual (o diretório do qual você está invocando o compilador) ou no diretório de
sistema do CLR. Se o nome do diretório contém um espaço, coloque o nome entre
aspas (“ ”).

Comentários
A opção -libpath especifica o local dos assemblies referenciados pela opção -
reference.

O compilador pesquisa referências de assembly que não são totalmente qualificadas na


seguinte ordem:

1. Diretório de trabalho atual. Esse é o diretório do qual o compilador é invocado.

2. O diretório de sistema do Common Language Runtime.

3. Diretórios especificados por -libpath .

4. Diretórios especificados pela variável de ambiente LIB.

A opção -libpath é aditiva; especificá-la mais de uma vez acrescenta a valores


anteriores.

Use -reference para especificar uma referência de assembly.


Para configurar -libpath no ambiente de desenvolvimento integrado do Visual Studio

1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em Propriedades.


2. Clique na guia Referências.

3. Clique no botão Caminhos de Referência....

4. Na caixa de diálogo Caminhos de Referência, insira o nome do diretório na caixa Pasta:.

5. Clique em Adicionar Pasta.

Exemplo
O código a seguir compila T2.vb para criar um arquivo .exe. O compilador examina o
diretório de trabalho, no diretório raiz da unidade C: e no diretório Novos Assemblies da
unidade C: para referências de assembly.

Console

vbc -libpath:c:\;"c:\New Assemblies" -reference:t2.dll t2.vb

Confira também
Assemblies no .NET
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-link (Visual Basic)
Artigo • 22/02/2023 • 4 minutos para o fim da leitura

Faz com que o compilador disponibilize as informações de tipo COM nos assemblies
especificados para o projeto sendo compilado no momento.

Syntax
Console

-link:fileList

ou

Console

-l:fileList

Argumentos
Termo Definição

fileList Obrigatórios. Lista delimitada por vírgulas de nomes de arquivo do assembly. Se o


nome do arquivo contém um espaço, coloque o nome entre aspas.

Comentários
A opção -link permite que você implante um aplicativo que inseriu informações de
tipo. O aplicativo pode usar tipos em um assembly de runtime que implementa as
informações de tipo inseridas sem a necessidade de uma referência ao assembly de
runtime. Se forem publicadas várias versões do assembly de runtime, o aplicativo que
contém as informações de tipo inseridas poderá trabalhar com as várias versões sem
precisar ser recompilado. Para obter um exemplo, consulte Instruções passo a passo:
Inserindo tipos de assemblies gerenciado.

Usar a opção -link é especialmente útil quando você está trabalhando com a
interoperabilidade COM. Você pode inserir tipos COM para que seu aplicativo não
precise mais de um PIA (assembly de interoperabilidade primário) no computador de
destino. A opção -link instrui o compilador a inserir as informações de tipo de COM do
assembly de interoperabilidade referenciado no código compilado resultante. O tipo
COM é identificado pelo valor CLSID (GUID). Como resultado, o aplicativo pode ser
executado em um computador de destino que tem os mesmos tipos COM instalados
com os mesmos valores CLSID. Os aplicativos que automatizam o Microsoft Office são
um bom exemplo. Como aplicativos como o Office normalmente mantêm o mesmo
valor CLSID entre diferentes versões, seu aplicativo pode usar os tipos COM
referenciados contanto que o .NET Framework 4 ou posterior esteja instalado no
computador de destino e seu aplicativo use métodos, propriedades ou eventos que
estão incluídos nos tipos COM referenciados.

A opção -link incorpora apenas interfaces, estruturas e delegados. Não há suporte


para a inserção de classes COM.

7 Observação

Quando você cria uma instância de um tipo COM inserido no seu código, você
deve criar a instância usando a interface apropriada. Tentar criar uma instância de
um tipo COM inserido usando o CoClass causa um erro.

Para definir a opção -link em Visual Studio, adicione uma referência de assembly e
defina a propriedade Embed Interop Types como true. O valor padrão da propriedade
Embed Interop Types é false.

Se você vincular a um assembly COM (Assembly A) que em si faz referência a outro


assembly COM (Assembly B), também precisará vincular ao Assembly B se uma das
seguintes opções for verdadeira:

Um tipo do Assembly A herda de um tipo ou implementa uma interface do


Assembly B.

Um campo, propriedade, evento ou método que tem um tipo de retorno ou de


parâmetro do Assembly B é invocado.

Use -libpath para especificar o diretório no qual uma ou mais das suas referências do
assembly estão localizadas.

Como a opção do compilador -reference, a opção do compilador -link usa o arquivo


de resposta Vbc.rsp, que faz referência a assemblies do .NET Framework usados com
frequência. Use a opção do compilador -noconfig se não quiser que o compilador use o
arquivo Vbc.rsp.

A forma abreviada de -link é -l .


Tipos genéricos e inseridos
As seções a seguir descrevem as limitações no uso de tipos genéricos em aplicativos
que inserem tipos de interoperabilidade.

Interfaces genéricas
As interfaces genéricas que são inseridas de um assembly de interoperabilidade não
podem ser usadas. Isso é mostrado no exemplo a seguir.

VB

' The following code causes an error if ISampleInterface is an embedded


interop type.

Dim sample As ISampleInterface(Of SampleType)

Tipos que têm parâmetros genéricos


Os tipos que têm um parâmetro genérico cujo tipo é inserido de um assembly de
interoperabilidade não poderão ser usados se o tipo for de um assembly externo. Essa
restrição não se aplica a interfaces. Por exemplo, considere a interface Range que é
definida no assembly Microsoft.Office.Interop.Excel. Se uma biblioteca insere tipos de
interoperabilidade do assembly Microsoft.Office.Interop.Excel e expõe um método que
retorna um tipo genérico que tem um parâmetro cujo tipo é a interface Range, esse
método deve retornar uma interface genérica, como mostrado no exemplo de código a
seguir.

VB

Imports System.Collections.Generic

Imports Microsoft.Office.Interop.Excel

Class Utility

' The following code causes an error when called by a client assembly.

Public Function GetRange1() As List(Of Range)

VB

End Function

' The following code is valid for calls from a client assembly.

Public Function GetRange2() As IList(Of Range)

VB

End Function

End Class

No exemplo a seguir, o código do cliente pode chamar o método que retorna a


interface genérica IList sem erros.

VB

Module Client

Public Sub Main()

Dim util As New Utility()

' The following code causes an error.

Dim rangeList1 As List(Of Range) = util.GetRange1()

' The following code is valid.

Dim rangeList2 As List(Of Range) = CType(util.GetRange2(), List(Of


Range))

End Sub

End Module

Exemplo
A linha de comando a seguir compila o arquivo de origem OfficeApp.vb e faz referência
aos assemblies de COMData1.dll e COMData2.dll para produzir OfficeApp.exe .

Console

vbc -link:COMData1.dll,COMData2.dll -out:OfficeApp.exe OfficeApp.vb

Confira também
Compilador de linha de comando do Visual Basic
Instruções passo a passo: Inserindo tipos de assemblies gerenciados
-reference (Visual Basic)
-noconfig
-libpath
Linhas de Comando de Compilação de Exemplo
Introdução à Interoperabilidade COM
-linkresource (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Cria um link a um recurso gerenciado.

Syntax
Console

-linkresource:filename[,identifier[,public|private]]

ou

Console

-linkres:filename[,identifier[,public|private]]

Argumentos
filename

Obrigatórios. O arquivo de recurso a ser vinculado ao assembly. Se o nome do arquivo


contém um espaço, coloque o nome entre aspas (" ").

identifier

Opcional. O nome lógico para o recurso. O nome que é usado para carregar o recurso.
O padrão é o nome do arquivo. Opcionalmente, você pode especificar se o arquivo é
público ou privado no manifesto do assembly, por exemplo: -
linkres:filename.res,myname.res,public . Por padrão, filename é público no assembly.

Comentários
A opção -linkresource não insere o arquivo de recurso no arquivo de saída; use a
opção -resource para fazer isso.

A opção -linkresource requer uma das opções -target que não seja -target:module .

Se filename for um arquivo de recurso do .NET Framework criado, por exemplo, pelo
Resgen.exe (Gerador de Arquivos de Recurso) ou no ambiente de desenvolvimento, ele
poderá ser acessado com membros no namespace System.Resources. (Para obter mais
informações, consulte ResourceManager.) Para acessar todos os outros recursos em
tempo de execução, use os métodos que começam com GetManifestResource na classe
Assembly.

O nome do arquivo pode ser qualquer formato de arquivo. Por exemplo, crie uma parte
DLL nativa do assembly de maneira que possa ser instalada no cache de assembly
global e acessado no código gerenciado no assembly.

A forma abreviada de -linkresource é -linkres .

7 Observação

A opção -linkresource não está disponível no ambiente de desenvolvimento do


Visual Studio; ela só está disponível quando se compila na linha de comando.

Exemplo
O código a seguir compila in.vb e vincula ao arquivo de recurso rf.resource .

Console

vbc -linkresource:rf.resource in.vb

Confira também
Compilador de linha de comando do Visual Basic
-target (Visual Basic)
-resource (Visual Basic)
Linhas de Comando de Compilação de Exemplo
-main
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica a classe ou o módulo que contém o procedimento Sub Main .

Sintaxe
Console

-main:location

Argumentos
location

Obrigatórios. O nome da classe ou módulo que contém o procedimento Sub Main a ser
chamado quando o programa é iniciado. Isso pode estar no formulário -main:module
ou -main:namespace.module.

Comentários
Use essa opção ao criar um arquivo executável ou um programa executável do
Windows. Se a opção -main for omitida, o compilador procurará um Sub Main
compartilhado válido em todas as classes e módulos públicos.

Consulte Procedimento Principal no Visual Basic para uma discussão sobre as várias
formas do procedimento Main .

Quando location é uma classe que herda de Form, o compilador fornece um


procedimento Main padrão que inicia o aplicativo se a classe não tiver nenhum
procedimento Main . Isso permite compilar o código na linha de comando que foi criada
no ambiente de desenvolvimento.

VB

' Compile with /r:System.dll,SYSTEM.WINDOWS.FORMS.DLL /main:MyC

Public Class MyC

Inherits System.Windows.Forms.Form

End Class

Para configurar -main no ambiente de desenvolvimento


integrado do Visual Studio
1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em
Propriedades.

2. Clique na guia Aplicativo.

3. Verifique se a caixa de seleção Habilitar estrutura do aplicativo não está marcada.

4. Modifique o valor na caixa Objeto de Inicialização.

Exemplo
O código a seguir compila T2.vb e T3.vb , especificando que o procedimento Sub Main
será encontrado na classe Test2 .

Console

vbc t2.vb t3.vb -main:Test2

Confira também
Compilador de linha de comando do Visual Basic
-target (Visual Basic)
Linhas de Comando de Compilação de Exemplo
Procedimento principal no Visual Basic
-moduleassemblyname
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Especifica o nome do assembly do qual esse módulo fará parte.

Sintaxe
Console

-moduleassemblyname:assembly_name

Argumentos
Termo Definição

assembly_name O nome do assembly do qual esse módulo fará parte.

Comentários
O compilador somente processará a opção -moduleassemblyname se a opção -
target:module tiver sido especificada. Isso faz com que o compilador crie um módulo. O

módulo criado pelo compilador é válido apenas para o assembly especificado com a
opção -moduleassemblyname . Se você colocar o módulo em um assembly diferente,
ocorrerão erros em tempo de execução.

A opção -moduleassemblyname é necessária somente quando o seguinte for verdadeiro:

Um tipo de dados no módulo precisa de acesso a um tipo Friend em um


assembly de referência.

O assembly de referência concedeu acesso de assembly amigável ao assembly no


qual o módulo será compilado.

Para obter mais informações sobre como criar um módulo, consulte -target (Visual
Basic). Para obter mais informações sobre assemblies amigáveis, consulte Assemblies
Amigáveis.

7 Observação
A opção -moduleassemblyname não está disponível dentro do ambiente de
desenvolvimento do Visual Studio; ela só está disponível ao compilar a partir de um
prompt de comando.

Confira também
Como Compilar um Assembly de Vários Arquivos
Compilador de linha de comando do Visual Basic
-target (Visual Basic)
-main
-reference (Visual Basic)
-addmodule
Assemblies no .NET
Linhas de Comando de Compilação de Exemplo
Assemblies Amigáveis
-netcf
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Define o compilador como destino para o .NET Compact Framework.

Sintaxe
Console

-netcf

Comentários
A -netcf opção faz com que o compilador do Visual Basic direcione o .NET Compact
Framework em vez do .NET Framework completo. A funcionalidade de linguagem
presente apenas na .NET Framework completa está desabilitada.

A -netcf opção foi projetada para ser usada com -sdkpath. Os recursos de linguagem
desabilitados são -netcf os mesmos recursos de linguagem que não estão presentes
nos arquivos direcionados. -sdkpath

7 Observação

A opção -netcf não está disponível no ambiente de desenvolvimento do Visual


Studio; ela só está disponível ao compilar na linha de comando. A opção -netcf é
definida quando é carregado um projeto de dispositivo do Visual Basic.

A -netcf opção altera os seguintes recursos de idioma:

A palavra-chave Da palavra-chave< End>, que encerra a execução de um


programa, está desabilitada. O programa a seguir compila e é executado sem -
netcf , mas falha no tempo de compilação com -netcf .

VB

Module Module1

Sub Main()

End ' not valid to terminate execution with /netcf

End Sub

End Module

A associação tardia, em todos os formulários, está desabilitada. Erros de tempo de


compilação são gerados quando cenários de associação tardia reconhecidos são
encontrados. O programa a seguir compila e é executado sem -netcf , mas falha
no tempo de compilação com -netcf .

VB

Class LateBoundClass

Sub S1()

End Sub

Default Property P1(ByVal s As String) As Integer

Get

End Get

Set(ByVal Value As Integer)

End Set

End Property

End Class

Module Module1

Sub Main()

Dim o1 As Object

Dim o2 As Object

Dim o3 As Object

Dim IntArr(3) As Integer

o1 = New LateBoundClass

o2 = 1

o3 = IntArr

' Late-bound calls

o1.S1()

o1.P1("member") = 1

' Dictionary member access

o1!member = 1

' Late-bound overload resolution

LateBoundSub(o2)

' Late-bound array

o3(1) = 1

End Sub

Sub LateBoundSub(ByVal n As Integer)

End Sub

Sub LateBoundSub(ByVal s As String)

End Sub

End Module

Os modificadores Auto, Ansi e Unicode estão desabilitados. A sintaxe da Instrução


Declare também é modificada para Declare Sub|Function name Lib "library"
[Alias "alias"] [([arglist])] . O código a seguir mostra o efeito de -netcf uma

compilação.

VB

' compile with: /target:library

Module Module1

' valid with or without /netcf

Declare Sub DllSub Lib "SomeLib.dll" ()

' not valid with /netcf

Declare Auto Sub DllSub1 Lib "SomeLib.dll" ()

Declare Ansi Sub DllSub2 Lib "SomeLib.dll" ()

Declare Unicode Sub DllSub3 Lib "SomeLib.dll" ()

End Module

Usar palavras-chave do Visual Basic 6.0 que foram removidas do Visual Basic gera
um erro diferente quando -netcf é usado. Isso afeta as mensagens de erro para as
seguintes palavras-chave:

Open

Close

Put

Print

Write

Input

Lock

Unlock

Seek

Width

Name

FreeFile

EOF
Loc

LOF

Line

Exemplo
O código a seguir compila Myfile.vb com o .NET Compact Framework, usando as
versões de mscorlib.dll e Microsoft.VisualBasic.dll encontradas no diretório de instalação
padrão do .NET Compact Framework na unidade C. Normalmente, você usaria a versão
mais recente do .NET Compact Framework.

Console

vbc -netcf -sdkpath:"c:\Program Files\Microsoft Visual Studio .NET


2003\CompactFrameworkSDK\v1.0.5000\Windows CE " myfile.vb

Confira também
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-sdkpath
-noconfig
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Especifica que o compilador não deve referenciar automaticamente os assemblies de


.NET Framework comumente usados ou importar os namespaces System e
Microsoft.VisualBasic .

Sintaxe
Console

-noconfig

Comentários
A opção -noconfig informa que o compilador não deve compilar com o arquivo
Vbc.rsp, localizado no mesmo diretório que o arquivo Vbc.exe. O arquivo Vbc.rsp faz
referência aos assemblies de .NET Framework comumente usados e importa os
namespaces System e Microsoft.VisualBasic . O compilador referencia implicitamente o
assembly System.dll, a menos que a opção -nostdlib seja especificada. A opção -
nostdlib informa ao compilador que não deve compilar com Vbc.rsp ou referenciar

automaticamente o assembly System.dll.

7 Observação

Os assemblies Mscorlib.dll e Microsoft.VisualBasic.dll são sempre referenciados.

Você pode modificar o arquivo Vbc.rsp para especificar opções de compilador adicionais
que devem ser incluídas em cada compilação do arquivo Vbc.exe (exceto ao especificar
a opção -noconfig ). Para obter mais informações, confira @ (Especificar de arquivo de
resposta).

O compilador processa as opções passadas para o comando vbc pela última vez.
Portanto, qualquer opção na linha de comando substitui a configuração da mesma
opção no arquivo Vbc.rsp.

7 Observação
A opção -noconfig não está disponível no ambiente de desenvolvimento do Visual
Studio; ela só está disponível quando se compila na linha de comando.

Confira também
-nostdlib (Visual Basic)
Compilador de linha de comando do Visual Basic
@ (especificar arquivo de resposta)
-reference (Visual Basic)
-nologo (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Suprime a exibição da faixa de direitos autorais e mensagens informativas durante a


compilação.

Sintaxe
Console

-nologo

Comentários
Se você especificar -nologo , o compilador não exibirá uma faixa de direitos autorais. Por
padrão, -nologo não está em vigor.

7 Observação

A opção -nologo não está disponível no ambiente de desenvolvimento do Visual


Studio; ela só está disponível quando se compila na linha de comando.

Exemplo
O código a seguir compila T2.vb e não exibe uma faixa de direitos autorais.

Console

vbc -nologo t2.vb

Confira também
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-nostdlib (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Faz com que o compilador não referencie automaticamente as bibliotecas padrão.

Sintaxe
Console

-nostdlib

Comentários
A opção -nostdlib remove a referência automática ao assembly System.dll e impede
que o compilador leia o arquivo Vbc.rsp. O arquivo Vbc.rsp, localizado no mesmo
diretório que o arquivo Vbc.exe, faz referência aos assemblies do .NET Framework
comumente usados e importa os namespaces System e Microsoft.VisualBasic .

7 Observação

Os assemblies Mscorlib.dll e Microsoft.VisualBasic.dll são sempre referenciados.

7 Observação

A opção -nostdlib não está disponível no ambiente de desenvolvimento do Visual


Studio; ela só está disponível quando se compila na linha de comando.

Exemplo
O código a seguir compila T2.vb sem referenciar as bibliotecas padrão. Você deve
definir a constante de compilação condicional _MYTYPE para a cadeia de caracteres
"Empty" para remover o objeto My .

Console

vbc -nostdlib -define:_MYTYPE=\"Empty\" T2.vb

Confira também
-noconfig
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
Como personalizar quais objetos estão disponíveis em My
-nowarn
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Suprime a capacidade do compilador de gerar avisos.

Sintaxe
Console

-nowarn[:numberList]

Argumentos
Termo Definição

numberList Opcional. Lista delimitada por vírgulas dos números de ID de aviso que o
compilador deve suprimir. Se as IDs de aviso não forem especificadas, serão
suprimidos todos os avisos.

Comentários
A opção -nowarn faz com que o compilador não gere avisos. Para suprimir um aviso
individual, forneça a ID de aviso para a opção -nowarn após os dois pontos. Separe
vários números de aviso com vírgulas.

Você somente precisa especificar a parte numérica do identificador de aviso. Por


exemplo, se você quiser suprimir BC42024, o aviso para variáveis locais não usadas,
especifique -nowarn:42024 .

Para obter mais informações sobre os números de ID de aviso, confira Configurando


avisos no Visual Basic.

Para configurar -nowarn no ambiente de desenvolvimento integrado do Visual Studio

1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em Propriedades.


2. Clique na guia Compilar.

3. Selecione a caixa de seleção Desabilitar todos os avisos para desabilitar todos os avisos.

- ou -

Para desabilitar um aviso específico, clique em Nenhum na lista suspensa adjacente ao aviso.
Exemplo 1
O código a seguir compila T2.vb e não exibe nenhum aviso.

Console

vbc -nowarn t2.vb

Exemplo 2
O código a seguir compila T2.vb e não exibe os avisos para variáveis locais não usadas
(42024).

Console

vbc -nowarn:42024 t2.vb

Confira também
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
Configurando avisos no Visual Basic
-nowin32manifest (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Instrui o compilador a não inserir nenhum manifesto de aplicativo no arquivo


executável.

Sintaxe
Console

-nowin32manifest

Comentários
Quando essa opção for usada, o aplicativo estará sujeito à virtualização no Windows
Vista, a menos que você forneça um manifesto do aplicativo em um arquivo de recurso
Win32 ou durante uma etapa de build posterior. Para saber mais sobre virtualização,
confira Implantação do ClickOnce no Windows Vista.

Para saber mais sobre a criação do manifesto, confira -win32manifest (Visual Basic).

Confira também
Compilador de linha de comando do Visual Basic
Página de Aplicativo, Designer de Projeto (Visual Basic)
-optimize
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Habilita ou desabilita otimizações do compilador.

Sintaxe
Console

-optimize[ + | - ]

Argumentos
Termo Definição

+ | - Opcional. A opção -optimize- desabilita otimizações do compilador. A opção -


optimize+ habilita otimizações. Por padrão, as otimizações estão desabilitadas.

Comentários
Otimizações do compilador tornam o arquivo de saída menor, mais rápido e mais
eficiente. No entanto, como as otimizações resultam na reorganização de código no
arquivo de saída, -optimize+ pode dificultar a depuração.

Todos os módulos gerados com -target:module um assembly devem usar as mesmas -


optimize configurações do assembly. Para saber mais, confira -target (Visual Basic).

Você pode combinar as opções -optimize e -debug .

Para configurar -optimiza no ambiente de desenvolvimento integrado do Visual Studio

1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em Propriedades.

2. Clique na guia Compilar.

3. Clique no botão Avançado.

4. Modifique a caixa de seleção Habilitar otimizações.

Exemplo
O código a seguir compila T2.vb e habilita otimizações do compilador.

Console

vbc t2.vb -optimize

Confira também
Compilador de linha de comando do Visual Basic
-debug (Visual Basic)
Linhas de Comando de Compilação de Exemplo
-target (Visual Basic)
-optioncompare
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Especifica como são feitas comparações de cadeia de caracteres.

Sintaxe
Console

-optioncompare:{binary | text}

Comentários
Você pode especificar -optioncompare em uma das duas formas: -optioncompare:binary
para usar comparações de cadeia de caracteres binárias e -optioncompare:text para
usar comparações de cadeia de caracteres de texto. Por padrão, o compilador usa -
optioncompare:binary .

No Microsoft Windows, a página de código atual determina a ordem de classificação


binária. Uma ordem de classificação binária típica é a seguinte:

A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø

As comparações de cadeias de caracteres se baseiam em uma ordem de classificação de


texto com diferenciação de maiúsculas de minúsculas determinada pela localidade do
sistema. Uma ordem de classificação de texto típica é a seguinte:

(A = a) < (À = à) < (B=b) < (E=e) < (Ê = ê) < (Z=z) < (Ø = ø)

Para definir -optioncompare no Visual Studio IDE


1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em
Propriedades.

2. Clique na guia Compilar.

3. Modifique o valor na caixa Option Compare.

Para definir -optioncompare programaticamente


Consulte Instrução Option Compare.

Exemplo
O código a seguir compila ProjFile.vb e usa comparações de cadeia de caracteres
binárias.

Console

vbc -optioncompare:binary projFile.vb

Confira também
Compilador de linha de comando do Visual Basic
-optionexplicit
-optionstrict
-optioninfer
Linhas de Comando de Compilação de Exemplo
Instrução Option Compare
Caixa de diálogo Padrões do Visual Basic, Projetos, Opções
-optionexplicit
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Isso faz o compilador relatar erros se variáveis não forem declaradas antes de serem
usadas.

Sintaxe
Console

-optionexplicit[+ | -]

Argumentos
+ | -

Opcional. Especifique -optionexplicit+ para exigir a declaração explícita de variáveis. A


opção -optionexplicit+ é o padrão e é a mesma que -optionexplicit . A opção -
optionexplicit- habilita a declaração implícita de variáveis.

Comentários
Se o arquivo de código-fonte tiver uma instrução Option Explicit, a instrução substituirá
a configuração do compilador de linha de comando -optionexplicit .

Para definir -optionexplicit no IDE do Visual Studio


1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em
Propriedades.

2. Clique na guia Compilar.

3. Modifique o valor na caixa Option Explicit.

Exemplo
O código a seguir é compilado quando -optionexplicit- é usada.

VB
Module Module1

Sub Main()

i = 99

System.Console.WriteLine(i)

End Sub

End Module

Confira também
Compilador de linha de comando do Visual Basic
-optioncompare
-optionstrict
-optioninfer
Linhas de Comando de Compilação de Exemplo
Instrução Option Explicit
Caixa de diálogo Padrões do Visual Basic, Projetos, Opções
-optioninfer
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Permite o uso de inferência de tipo local nas declarações de variáveis.

Sintaxe
Console

-optioninfer[+ | -]

Argumentos
Termo Definição

+ | - Opcional. Especifique -optioninfer+ para habilitar a inferência de tipo de local ou -


optioninfer- para bloqueá-la. A opção -optioninfer , sem valor especificado, é a mesma
de -optioninfer+ . O valor padrão quando o comutador -optioninfer não estiver
presente também é -optioninfer+ . O valor padrão é definido no arquivo de resposta
Vbc.rsp.

7 Observação

Você pode usar a opção -noconfig para manter os padrões internos do compilador
em vez dos especificados no vbc.rsp. O padrão do compilador para essa opção é -
optioninfer- .

Comentários
Se o arquivo de código-fonte tiver uma instrução Option Explicit, a instrução substituirá
a configuração do compilador de linha de comando -optioninfer .

Para definir /optioninfer no IDE do Visual Studio


1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em
Propriedades.

2. Na guia Compilar, modifique o valor na caixa Option infer.


Exemplo
O seguinte código compila test.vb com a inferência de tipo local habilitada.

Console

vbc -optioninfer+ test.vb

Confira também
Compilador de linha de comando do Visual Basic
-optioncompare
-optionexplicit
-optionstrict
Linhas de Comando de Compilação de Exemplo
Instrução Option Infer
Inferência de Tipo de Variável Local
Caixa de diálogo Padrões do Visual Basic, Projetos, Opções
Página de Compilação, Designer de Projeto (Visual Basic)
-noconfig
Compilando da Linha de Comando
-optionstrict
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Impõe semântica de tipo estrito para restringir conversões de tipo implícito.

Sintaxe
Console

-optionstrict[+ | -]

-optionstrict[:custom]

Argumentos
+ | -

Opcional. A opção -optionstrict+ restringe a conversão de tipo implícito. O padrão


dessa opção é -optionstrict- . A opção -optionstrict+ é a mesma que -optionstrict .
Você pode usar ambas para semântica de tipo permissivo.

custom

Obrigatórios. Avisar quando a semântica de linguagem estrita não for respeitada.

Comentários
Quando -optionstrict+ estiver em vigor, somente conversões de tipo de ampliação
podem ser feitas implicitamente. Conversões implícitas de tipo de estreitamento, como
atribuir um objeto de tipo Decimal a um objeto de tipo inteiro, são relatadas como
erros.

Para gerar avisos para conversões de tipo de estreitamento implícitas, use -


optionstrict:custom . Use -nowarn:numberlist para ignorar avisos específicos e -

warnaserror:numberlist para tratar avisos específicos como erros.

Para definir -optionstrict no Visual Studio IDE


1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto, clique em
Propriedades.

2. Clique na guia Compilar.


3. Modifique o valor na caixa Opção Estrita.

Para definir -optionstrict programaticamente


Consulte Instrução Option Strict.

Exemplo
O código a seguir compila Test.vb usando semântica de tipo estrito.

Console

vbc -optionstrict+ test.vb

Confira também
Compilador de linha de comando do Visual Basic
-optioncompare
-optionexplicit
-optioninfer
-nowarn
-warnaserror (Visual Basic)
Linhas de Comando de Compilação de Exemplo
Instrução Option Strict
Caixa de diálogo Padrões do Visual Basic, Projetos, Opções
-out (Visual Basic)
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Especifica o nome do arquivo de saída.

Sintaxe
Console

-out:filename

Argumentos
Termo Definição

filename Obrigatórios. O nome do arquivo de saída criado pelo compilador. Se o nome do


arquivo contém um espaço, coloque o nome entre aspas (" ").

Comentários
Especifique o nome completo e a extensão do arquivo que você deseja criar. Se você
não fizer isso, o arquivo .exe usará seu nome do arquivo de código-fonte que contém o
Sub Main procedimento e o arquivo .dll usará seu nome do primeiro arquivo de código-

fonte.

Se você especificar um nome de arquivo sem uma extensão .exe ou .dll, o compilador
adicionará automaticamente a extensão para você, dependendo do valor especificado
para a opção do -target compilador.

Para configurar -doc no ambiente de desenvolvimento integrado do Visual Studio

1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em Propriedades.


2. Clique na guia Aplicativo.

3. Modifique o valor na caixa Nome do Assembly.

Exemplo
O código a seguir compila T2.vb e cria o arquivo T2.exe de saída.
Console

vbc t2.vb -out:t3.exe

Confira também
Compilador de linha de comando do Visual Basic
-target (Visual Basic)
Linhas de Comando de Compilação de Exemplo
-platform (Visual Basic)
Artigo • 22/02/2023 • 3 minutos para o fim da leitura

Especifica qual versão de plataforma do common language runtime (CLR) pode executar
o arquivo de saída.

Sintaxe
Console

-platform:{ x86 | x64 | Itanium | arm | anycpu | anycpu32bitpreferred }

Argumentos
Termo Definição

x86 Compila o assembly para ser executado pelo CLR compatível com x86, de
32 bits.

x64 Compila o assembly para ser executado pelo CLR de 64 bits em um


computador que oferece suporte ao conjunto de instruções de AMD64
ou EM64T.

Itanium Compila o assembly para ser executado pelo CLR de 64 bits em um


computador com um processador Itanium.

arm Compila o assembly para ser executado em um computador com um


processador ARM (Advanced RISC Machine).

anycpu Compila o assembly para ser executado em qualquer plataforma. O


aplicativo será executado como um aplicativo de 32 bits em versões de
32 bits do Windows e como um aplicativo de 64 bits em versões de 64
bits do Windows. Este sinalizador é o valor padrão.

anycpu32bitpreferred Compila o assembly para ser executado em qualquer plataforma. O


aplicativo será executado como um aplicativo de 32 bits em versões de
32 bits e 64 bits do Windows. Esse sinalizador é válido somente para
executáveis (.EXE) e requer .NET Framework 4.5.

Comentários
Use a opção -platform para especificar o tipo de processador direcionada pelo arquivo
de saída.
Em geral, os assemblies do .NET Framework gravados no Visual Basic serão executados
da mesma maneira, independentemente da plataforma. No entanto, existem alguns
casos em que se comportam de formas diferentes em plataformas distintas. Esses casos
comuns são:

Estruturas que contêm membros que alteram o tamanho de acordo com a


plataforma, como qualquer tipo de ponteiro.

Aritmética de ponteiro que inclui tamanhos constantes.

As declarações COM ou de invocação de plataforma incorreta que usam Integer


para identificadores em vez de IntPtr.

Convertendo IntPtr para Integer .

Usando a invocação de plataforma ou a interoperabilidade COM com os


componentes que não existem em todas as plataformas.

A opção -platform reduzirá alguns problemas se você souber que fez suposições sobre
a arquitetura na qual seu código será executado. Especificamente:

Se decidir atingir uma plataforma de 64 bits e o aplicativo for executado em uma


máquina de 32 bits, a mensagem de erro vem muito mais cedo e mais direcionada
ao problema do que o erro que ocorre sem usar essa comutador.

Se você definir o sinalizador x86 na opção e, em seguida, o aplicativo for


executado em uma máquina de 64 bits, o aplicativo será executado no subsistema
WOW em vez de ser executado nativamente.

Em um sistema operacional do Windows de 64 bits:

Assemblies compilados com -platform:x86 serão executados no CLR de 32 bits


em execução no WOW64.

Executáveis compilados com o -platform:anycpu serão executados no CLR de 64


bits.

Uma DLL compilada com o -platform:anycpu será executada no mesmo CLR que o
processo no qual foi carregado.

Executáveis compilados com -platform:anycpu32bitpreferred serão executados no


CLR de 32 bits.

Para obter mais informações sobre como desenvolver um aplicativo para ser executado
em uma versão de 64 bits do Windows, confira Aplicativos de 64 bits.
Para definir -platform no IDE do Visual Studio
1. No Gerenciador de Soluções, escolha o projeto, abra o menu Projeto e, em
seguida, clique em Propriedades.

2. Na guia Compilar, marque ou desmarque a caixa de seleção Preferir 32 bits ou na


lista CPU de Destino, escolha um valor.

Para obter mais informações, confira Página Compilar, Designer de Projeto (Visual
Basic).

Exemplo
O exemplo a seguir mostra como usar a opção do compilador -platform .

Console

vbc -platform:x86 myFile.vb

Confira também
-target (Visual Basic)
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-quiet
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Impede que o compilador exiba código para erros e avisos relacionados à sintaxe.

Sintaxe
Console

-quiet

Comentários
Por padrão, -quiet não está em vigor. Quando o compilador relata um erro ou aviso
relacionado à sintaxe, gera também a linha do código-fonte. Para aplicativos que
analisam a saída do compilador, pode ser mais conveniente para o compilador gerar
apenas o texto do diagnóstico.

No exemplo a seguir, Module1 gera um erro que inclui o código-fonte quando


compilado sem -quiet .

VB

Module Module1

Sub Main()

x()

End Sub

End Module

Saída:

Console

C:\projects\vb2.vb(3) : error BC30451: 'x' is not declared. It may be


inaccessible due to its protection level.

x()

Compilado com -quiet , o compilador produz apenas:

Console
E:\test\t2.vb(3) : error BC30451: Name 'x' is not declared.

7 Observação

A opção -quiet não está disponível no ambiente de desenvolvimento do Visual


Studio; ela só está disponível quando se compila na linha de comando.

Exemplo
O código a seguir compila T2.vb e não exibe código para diagnóstico de compilador
relacionado à sintaxe:

Console

vbc -quiet t2.vb

Confira também
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-recurse
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Compila arquivos de código-fonte em todos os diretórios filho do diretório especificado


ou do diretório do projeto.

Sintaxe
Console

-recurse:[dir\]file

Argumentos
dir

Opcional. O diretório no qual você deseja que a pesquisa comece. Se ele não for
especificado, a pesquisa começará no diretório do projeto.

file

Obrigatórios. Os arquivos a serem pesquisados. São permitidos caracteres curinga.

Comentários
É possível usar curingas em um nome de arquivo para compilar todos os arquivos
correspondentes no diretório do projeto sem usar -recurse . Se nenhum nome de
arquivo de saída for especificado, o compilador baseá o nome do arquivo de saída no
primeiro arquivo de entrada processado. Geralmente, esse é o primeiro arquivo na lista
de arquivos compilados quando exibidos em ordem alfabética. Por esse motivo, é
melhor especificar um arquivo de saída usando a opção -out .

7 Observação

A opção -recurse não está disponível no ambiente de desenvolvimento do Visual


Studio; ela só está disponível quando se compila na linha de comando.

Exemplo
O comando a seguir compila todos os arquivos do Visual Basic no diretório atual.

Console

vbc *.vb

O comando a seguir compila todos os arquivos do Visual Basic no diretório e todos os


Test\ABC diretórios abaixo dele e, em seguida, gera Test.ABC.dll .

Console

vbc -target:library -out:Test.ABC.dll -recurse:Test\ABC\*.vb

Confira também
Compilador de linha de comando do Visual Basic
-out (Visual Basic)
Linhas de Comando de Compilação de Exemplo
-reference (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Faz com que o compilador disponibilize as informações de tipo nos assemblies


especificados para o projeto sendo compilado no momento.

Syntax
Console

-reference:fileList

ou

Console

-r:fileList

Argumentos
Termo Definição

fileList Obrigatórios. Lista delimitada por vírgulas de nomes de arquivo do assembly. Se o


nome do arquivo contém um espaço, coloque o nome entre aspas.

Comentários
Os arquivos importados devem conter metadados de assembly. Somente tipos públicos
são visíveis fora do assembly. A opção -addmodule importa metadados de um módulo.

Se você referenciar um assembly (Assembly A) que referencia outro assembly (Assembly


B), será necessário referenciar o Assembly B se:

Um tipo do Assembly A herda de um tipo ou implementa uma interface do


Assembly B.

Um campo, propriedade, evento ou método que tem um tipo de retorno ou de


parâmetro do Assembly B é invocado.
Use -libpath para especificar o diretório no qual uma ou mais das suas referências do
assembly estão localizadas.

Para o compilador reconhecer um tipo em um assembly (não um módulo), ele deve ser
forçado a resolver o tipo. Um exemplo de como você pode fazer isso é definir uma
instância do tipo. Outras maneiras estão disponíveis para resolver nomes de tipo em um
assembly para o compilador. Por exemplo, se você herdar de um tipo em um assembly,
o nome do tipo se tornará conhecido pelo compilador.

O arquivo de resposta Vbc.rsp, que referencia assemblies .NET Framework usados com
frequência, é usado por padrão. Use -noconfig se você não quiser que o compilador
use Vbc.rsp.

A forma abreviada de -reference é -r .

Exemplo
A linha de comando a seguir compila o arquivo de origem Input.vb e faz referência aos
assemblies de Metad1.dll e Metad2.dll para produzir Out.exe .

Console

vbc -reference:metad1.dll,metad2.dll -out:out.exe input.vb

Confira também
Compilador de linha de comando do Visual Basic
-noconfig
-target (Visual Basic)
Público
Linhas de Comando de Compilação de Exemplo
-refonly (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

A opção -refonly indica que uma saída primária da compilação deve ser um assembly
de referência em vez de um assembly implementação. O parâmetro -refonly
silenciosamente desabilita a geração de PDBs, uma vez que assemblies de referência
não podem ser executados.

Todas as opções do compilador estão disponíveis em duas formas: -option e /option .


A documentação mostra apenas a forma -option .

Sintaxe
Console

-refonly

Comentários
O Visual Basic dá suporte à opção -refonly começando com a versão 15.3.

Os assemblies de referência são um tipo especial de assembly que contém apenas a


quantidade mínima de metadados necessários para representar a superfície de API
pública da biblioteca. Eles incluem declarações para todos os membros que são
significativas ao referenciar um assembly em ferramentas de build, mas excluem todas
as implementações de membros e declarações de membros privados que não têm
nenhum impacto observável em seu contrato de API. Para obter mais informações,
confira Assemblies de referência no Guia .NET.

As opções -refonly e -refout são mutualmente exclusivas.

Confira também
-refout
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-refout (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

A opção -refout especifica um caminho de arquivo em que o assembly de referência


deve ser gerado.

Todas as opções do compilador estão disponíveis em duas formas: -option e /option .


A documentação mostra apenas a forma -option .

Sintaxe
Console

-refout:filepath

Argumentos
filepath

O caminho e o nome do arquivo do assembly de referência. Geralmente, ele deve estar


em uma subpasta do assembly primário. A convenção recomendada (usada pelo
MSBuild) é colocar o assembly de referência em uma subpasta "ref/" em relação ao
assembly principal. Todas as pastas em filepath devem existir; o compilador não as
cria.

Comentários
O Visual Basic dá suporte à opção -refout começando com a versão 15.3.

Os assemblies de referência são um tipo especial de assembly que contém apenas a


quantidade mínima de metadados necessários para representar a superfície de API
pública da biblioteca. Eles incluem declarações para todos os membros que são
significativas ao referenciar um assembly em ferramentas de build, mas excluem todas
as implementações de membros e declarações de membros privados que não têm
nenhum impacto observável em seu contrato de API. Para obter mais informações,
confira Assemblies de referência no Guia .NET.

As opções -refout e -refonly são mutualmente exclusivas.


Confira também
-refonly
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-removeintchecks
Artigo • 12/12/2022 • 2 minutos para o fim da leitura

Ativa ou desativa a verificação de erro de estouro para operações de inteiro.

Sintaxe
Console

-removeintchecks[+ | -]

Argumentos
Termo Definição

+ | - Opcional. A opção -removeintchecks- faz com que o compilador verifique todos os


cálculos inteiros em busca de erros de estouro. O padrão é -removeintchecks- .

Especificar -removeintchecks ou -removeintchecks+ impede a verificação de erros e


pode tornar os cálculos inteiros mais rápidos. No entanto, sem a verificação de erros e
se as capacidades do tipo de dados forem estouradas, os resultados incorretos poderão
ser armazenados sem gerar um erro.

Para configurar -removeintchecks no ambiente de desenvolvimento integrado do Visual


Studio

1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em Propriedades.


2. Clique na guia Compilar.

3. Clique no botão Avançado.

4. Modifique o valor da caixa de seleção Remover estouro inteiro.

Exemplo
O código a seguir compila Test.vb e desativa a verificação de erro de estouro inteiro.

Console

vbc -removeintchecks+ test.vb

Confira também
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-resource (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Insere um arquivo de recurso gerenciado em um assembly.

Sintaxe
Console

-resource:filename[,identifier[,public|private]]

ou

Console

-res:filename[,identifier[,public|private]]

Argumentos
Termo Definição

filename Obrigatórios. O nome do arquivo de recurso a ser inserido no arquivo de saída. Por
padrão, filename é público no assembly. Coloque o nome do arquivo entre aspas
("") se o nome conter um espaço.

identifier Opcional. O nome lógico do recurso é o nome usado para carregá-lo. O padrão é o
nome do arquivo. Opcionalmente, você pode especificar se o recurso é público ou
privado no manifesto do assembly, como no seguinte: -res:filename.res,
myname.res, public

Comentários
Use -linkresource para vincular um recurso a um assembly sem colocar o arquivo de
recurso no arquivo de saída.

Se filename for um arquivo de recurso do .NET Framework criado, por exemplo, pelo
Resgen.exe (Gerador de Arquivos de Recurso) ou no ambiente de desenvolvimento, ele
poderá ser acessado com membros no namespace System.Resources (confira
ResourceManager para mais informações). Para acessar todos os outros recursos em
tempo de execução, use um dos seguintes métodos: GetManifestResourceInfo,
GetManifestResourceNamesou GetManifestResourceStream.

A forma abreviada de -resource é -res .

Para obter informações sobre como definir -resource no IDE do Visual Studio, consulte
Gerenciamento de Recursos de Aplicativo (.NET).

Exemplo
O código a seguir compila In.vb e anexa o arquivo Rf.resource de recurso.

Console

vbc -res:rf.resource in.vb

Confira também
Compilador de linha de comando do Visual Basic
-win32resource
-linkresource (Visual Basic)
-target (Visual Basic)
Linhas de Comando de Compilação de Exemplo
-rootnamespace
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Especifica um namespace para todas as declarações de tipo.

Sintaxe
Console

-rootnamespace:namespace

Argumentos
Termo Definição

namespace O nome do namespace no qual incluir todas as declarações de tipo para o projeto
atual.

Comentários
Se você usar o arquivo executável do Visual Studio (Devenv.exe) para compilar um
projeto criado no ambiente de desenvolvimento integrado do Visual Studio, use -
rootnamespace para especificar o valor da propriedade RootNamespace. Consulte

Comutadores de Linha de Comando de Devenv para obter mais informações.

Use o Disassembler do CLR do MSIL ( Ildasm.exe ) para exibir os nomes de namespace


no arquivo de saída.

Para configurar -rootnamespace no ambiente de desenvolvimento integrado do Visual


Studio

1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em Propriedades.


2. Clique na guia Aplicativo.

3. Modifique o valor na caixa Root Namespace .

Exemplo
O código a seguir compila In.vb e inclui todas as declarações de tipo no namespace
mynamespace .
Console

vbc -rootnamespace:mynamespace in.vb

Confira também
Compilador de linha de comando do Visual Basic
Ildasm.exe (IL Disassembler)
Linhas de Comando de Compilação de Exemplo
-sdkpath
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Especifica o local de mscorlib.dll e Microsoft.VisualBasic.dll.

Sintaxe
Console

-sdkpath:path

Argumentos
path

O diretório que contém as versões de mscorlib.dll e Microsoft.VisualBasic.dll para usar


para a compilação. Esse caminho não é verificado até que seja carregado. Coloque o
nome do diretório entre aspas (“ ”) se ele tiver um espaço.

Comentários
Essa opção informa ao compilador do Visual Basic para carregar os arquivos mscorlib.dll
e Microsoft.VisualBasic.dll de um local não padrão. A opção -sdkpath foi projetada para
ser usada com -netcf. O .NET Compact Framework usa versões diferentes dessas
bibliotecas de suporte para evitar o uso de tipos e recursos de linguagem não
encontrados nos dispositivos.

7 Observação

A opção -sdkpath não está disponível no ambiente de desenvolvimento do Visual


Studio; ela só está disponível ao compilar na linha de comando. A opção -sdkpath
é definida quando é carregado um projeto de dispositivo do Visual Basic.

Você pode especificar que o compilador deve ser compilado sem uma referência à
Biblioteca de Runtime do Visual Basic usando a opção do compilador -vbruntime . Para
obter mais informações, confira -vbruntime.

Exemplo
O código a seguir compila Myfile.vb com o .NET Compact Framework, usando as
versões de Mscorlib.dll e Microsoft.VisualBasic.dll encontradas no diretório de instalação
padrão do .NET Compact Framework na unidade C. Normalmente, você usaria a versão
mais recente do .NET Compact Framework.

Console

vbc -netcf -sdkpath:"c:\Program Files\Microsoft Visual Studio .NET


2003\CompactFrameworkSDK\v1.0.5000\Windows CE " myfile.vb

Confira também
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-netcf
-vbruntime
-target (Visual Basic)
Artigo • 28/11/2022 • 4 minutos para o fim da leitura

Especifica o formato da saída do compilador.

Sintaxe
Console

-target:{exe | library | module | winexe | appcontainerexe | winmdobj}

Comentários
A tabela a seguir resume os efeitos da opção -target .

Opção Comportamento

-target:exe Faz com que o compilador crie um aplicativo executável do console.

Essa é a opção padrão quando nenhuma opção -target é especificada.


O arquivo executável é criado com uma extensão .exe.

A menos que seja especificado de outra forma com a opção -out , o


nome do arquivo de saída usará o nome do arquivo de entrada que
contém o procedimento Sub Main .

Somente um procedimento Sub Main é necessário nos arquivos de


código-fonte que são compilados em um arquivo .exe. Use a opção do
compilador -main para especificar qual classe contém o procedimento
Sub Main .

-target:library Faz com que o compilador crie uma DLL (biblioteca de vínculo
dinâmico).

O arquivo de biblioteca de link dinâmico é criado com uma extensão


.dll.

A menos que seja especificado de outra forma com a opção -out , o


nome do arquivo de saída usa o nome do primeiro arquivo de entrada.

Ao compilar uma DLL, um procedimento Sub Main não é necessário.


Opção Comportamento

-target:module Faz com que o compilador gere um módulo que pode ser adicionado a
um assembly.

O arquivo de saída é criado com uma extensão .netmodule.

O common language runtime do .NET não pode carregar um arquivo


que não tenha um assembly. No entanto, esse arquivo pode ser
incorporado no manifesto do assembly de um assembly por meio de -
reference .

Quando o código em um módulo referenciar tipos internos em outro


módulo, os dois módulos deverão ser incorporados em um manifesto
do assembly, por meio de -reference .

A opção -addmodule importa metadados de um módulo.

-target:winexe Faz com que o compilador crie um aplicativo executável baseado em


Windows.

O arquivo executável é criado com uma extensão .exe. Um aplicativo


baseado em Windows é aquele que fornece uma interface do usuário
da biblioteca de classes .NET Framework ou com as APIs do Windows.

A menos que seja especificado de outra forma com a opção -out , o


nome do arquivo de saída usará o nome do arquivo de entrada que
contém o procedimento Sub Main .

Somente um procedimento Sub Main é necessário nos arquivos de


código-fonte que são compilados em um arquivo .exe. Nos casos em
que seu código tem mais de uma classe que tem um procedimento Sub
Main , use a opção do compilador -main para especificar qual classe
contém o procedimento Sub Main
Opção Comportamento

- Faz com que o compilador crie um aplicativo executável baseado em


target:appcontainerexe Windows que deve ser executado em um contêiner de aplicativo. Essa
configuração foi projetada para ser usada para aplicativos Windows 8.x
da Microsoft Store.

A configuração appcontainerexe define um bit no campo


Características do arquivo Executável portátil. Esse bit indica que o
aplicativo deve ser executado em um contêiner de aplicativo. Quando
esse bit estiver definido, ocorrerá um erro se o método CreateProcess
tentar inicializar o arquivo executável fora de um contêiner de
aplicativos. Além dessa configuração de bit, -target:appcontainerexe é
equivalente a -target:winexe.

O arquivo executável é criado com uma extensão .exe.

Salvo especificação de outra forma com a opção -out , o nome do


arquivo de saída usará o nome do arquivo de entrada que contém o
procedimento Sub Main .

Somente um procedimento Sub Main é necessário nos arquivos de


código-fonte que são compilados em um arquivo .exe. Se o seu código
tiver mais de uma classe que tem um procedimento Sub Main , use a
opção do compilador -main para especificar qual classe contém o
procedimento Sub Main

-target:winmdobj Faz com que o compilador crie um arquivo intermediário que você
pode converter em um arquivo binário Windows Runtime (.winmd). O
arquivo .winmd pode ser consumido por programas JavaScript e C++,
bem como programas de linguagem gerenciada.

O arquivo intermediário é criado com uma extensão .winmdobj.

Salvo especificação de outra forma com a opção -out , o nome do


arquivo de saída usará o nome do arquivo de entrada. Não é necessário
um procedimento Sub Main .

O arquivo .winmdobj foi projetado para ser usado como entrada para a
ferramenta de exportação WinMDExppara produzir um arquivo WinMD
(metadados do Windows). O arquivo WinMD tem uma extensão
.winmd e contém o código da biblioteca original e as definições do
WinMD que JavaScript, C++ e o Windows Runtime usam.

A menos que você especifique -target:module , -target faz com que um manifesto do
assembly .NET Framework seja colocado em um arquivo de saída.
Cada instância de Vbc.exe produz, no máximo, um arquivo de saída. Se você especificar
uma opção de compilador, como -out ou -target mais de uma vez, a última
processada pelo compilador será colocada em vigor. As informações sobre todos os
arquivos em uma compilação são adicionadas ao manifesto. Todos os arquivos de saída,
exceto os criados com -target:module podem conter metadados do assembly no
manifesto. Use Ildasm.exe (IL Disassembler) para exibir os metadados em um arquivo de
saída.

A forma abreviada de -target é -t .

Para definir -target no IDE do Visual Studio


1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em
Propriedades.

2. Clique na guia Aplicativo.

3. Modifique o valor na caixa Tipo de aplicativo.

Exemplo
O código a seguir compila in.vb , criando in.dll :

Console

vbc -target:library in.vb

Confira também
Compilador de linha de comando do Visual Basic
-main
-out (Visual Basic)
-reference (Visual Basic)
-addmodule
-moduleassemblyname
Assemblies no .NET
Linhas de Comando de Compilação de Exemplo
-subsystemversion (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Especifica a versão mínima do subsistema no qual o arquivo executável gerado pode ser
executado, determinando assim as versões do Windows em que o arquivo executável
pode ser executado. Normalmente, essa opção garante que o arquivo executável possa
tirar proveito de determinados recursos de segurança que não estão disponíveis com
versões mais antigas do Windows.

7 Observação

Para especificar o subsistema em si, use a opção do compilador -target.

Sintaxe
VB

-subsystemversion:major.minor

Parâmetros
major.minor

A versão mínima obrigatória do subsistema, conforme expresso em uma notação de


ponto para versões principais e secundárias. Por exemplo, você pode especificar que um
aplicativo não pode ser executado em um sistema operacional mais antigo que o
Windows 7 se definir o valor dessa opção como 6.01, conforme descrito na tabela mais
adiante neste tópico. Você deve especificar os valores de major e minor como inteiros.

Zeros à esquerda na versão minor não alteram a versão, mas zeros à direita alteram. Por
exemplo, 6.1 e 6.01 se referem à mesma versão, mas 6.10 se refere a uma versão
diferente. É recomendável expressar a versão secundária como dois dígitos para evitar
confusão.

Comentários
A seguinte tabela lista as versões de subsistema comuns do Windows.
Versão do Windows Versão do subsistema

Windows Server 2003 5,02

Windows Vista 6,00

Windows 7 6.01

Windows Server 2008 6.01

Windows 8 6.02

Valores padrão
O valor padrão da opção do compilador -subsystemversion depende das condições na
lista a seguir:

O valor padrão é 6.02 se qualquer opção do compilador na lista a seguir for


definida:

-target:appcontainerexe

-target:winmdobj

-platform:arm

O valor padrão será 6.00 se você estiver usando o MSBuild, se tiver como destino o
.NET Framework 4.5 e se não definiu nenhuma das opções de compilador que
foram especificadas anteriormente na lista.

O valor padrão é 4.00 se nenhuma das condições anteriores for verdadeira.

Definindo esta opção


Para definir a opção do compilador -subsystemversion no Visual Studio, você precisa
abrir o arquivo .vbproj e especificar um valor para a propriedade SubsystemVersion no
XML do MSBuild. Você não pode definir essa opção no IDE do Visual Studio. Para obter
mais informações, consulte "Valores padrão" no início deste tópico ou Propriedades de
projeto comuns do MSBuild.

Confira também
Compilador de linha de comando do Visual Basic
Propriedades MSBuild
-utf8output (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Exibe a saída do compilador usando a codificação UTF-8.

Sintaxe
Console

-utf8output[+ | -]

Argumentos
+ | -

Opcional. O padrão para essa opção é -utf8output- , o que significa que a saída do
compilador não usa a codificação UTF-8. Especificar -utf8output é o mesmo que
especificar -utf8output+ .

Comentários
Em algumas configurações internacionais, a saída do compilador não pode ser exibida
corretamente no console. Nessas situações, use -utf8output e redirecione a saída do
compilador para um arquivo.

7 Observação

A opção -utf8output não está disponível no ambiente de desenvolvimento do


Visual Studio; ela só está disponível quando se compila na linha de comando.

Exemplo
O código a seguir compila In.vb e direciona o compilador para exibir a saída usando a
codificação UTF-8.

Console

vbc -utf8output in.vb

Confira também
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-vbruntime
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Especifica que o compilador deve ser compilado sem uma referência à Biblioteca de
Runtime do Visual Basic ou com uma referência a uma biblioteca de runtime específica.

Sintaxe
Console

-vbruntime:{ - | + | * | path }

Argumentos
-

Compile sem uma referência à Biblioteca de Runtime do Visual Basic.

Compile com uma referência à Biblioteca de Runtime padrão do Visual Basic.

Compile sem uma referência à Biblioteca de Runtime do Visual Basic e insira a


funcionalidade principal da Biblioteca de Runtime do Visual Basic no assembly.

path

Compile com uma referência à DLL (biblioteca) especificada.

Comentários
A opção do compilador -vbruntime permite que você especifique que o compilador
deve ser compilado sem uma referência à Biblioteca de Runtime do Visual Basic. Se você
compilar sem uma referência à Biblioteca de Runtime do Visual Basic, erros ou avisos
serão registrados em código ou constructos de linguagem que geram uma chamada
para um auxiliar de runtime do Visual Basic. (Um auxiliar de runtime do Visual Basic é
uma função definida em Microsoft.VisualBasic.dll que é chamada em tempo de
execução para executar uma semântica de linguagem específica.)

A opção -vbruntime+ produzirá o mesmo comportamento que ocorre se nenhuma


comutador -vbruntime for especificado. Você pode usar a opção -vbruntime+ para
substituir os comutadores anteriores -vbruntime .

A maioria dos objetos do tipo My não está disponível quando você usa as opções -
vbruntime- ou -vbruntime:path .

Inserindo a funcionalidade principal do


Runtime do Visual Basic
A opção -vbruntime* permite que você compile sem uma referência a uma biblioteca
de runtime. Em vez disso, a funcionalidade principal da Biblioteca de Runtime do Visual
Basic é inserida no assembly do usuário. Você pode usar essa opção se o aplicativo for
executado em plataformas que não contenham o runtime do Visual Basic.

Os seguintes membros de runtime são inseridos:

Classe Conversions

Método AscW(Char)

Método AscW(String)

Método ChrW(Int32)

Constante vbBack

Constante vbCr

Constante vbCrLf

Constante vbFormFeed

Constante vbLf

Constante vbNewLine

Constante vbNullChar

Constante vbNullString

Constante vbTab

Constante vbVerticalTab

Alguns objetos do tipo My


Se você compilar usando a opção -vbruntime* e seu código fizer referência a um
membro da Biblioteca de Runtime do Visual Basic que não está inserido com a
funcionalidade principal, o compilador retornará um erro que indica que o membro não
está disponível.

Referenciando uma biblioteca especificada


Você pode usar o argumento path para compilar com uma referência a uma biblioteca
de runtime personalizada em vez da Biblioteca de Runtime padrão do Visual Basic.

Se o valor do argumento path for um caminho totalmente qualificado para uma DLL, o
compilador usará esse arquivo como a biblioteca de runtime. Se o valor do argumento
path não for um caminho totalmente qualificado para uma DLL, o compilador do Visual

Basic pesquisará a DLL identificada na pasta atual primeiro. Em seguida, ele pesquisará
no caminho especificado usando a opção do compilador -sdkpath. Se a opção do
compilador -sdkpath não for usada, o compilador pesquisará a DLL identificada na
pasta .NET Framework ( %systemroot%\Microsoft.NET\Framework\versionNumber ).

Exemplo
O exemplo a seguir mostra como usar a opção -vbruntime para compilar com uma
referência a uma biblioteca personalizada.

Console

vbc -vbruntime:C:\VBLibraries\CustomVBLibrary.dll

Confira também
Visual Basic Core – Novo modo de compilação no Visual Studio 2010 SP1
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-sdkpath
-verbose
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Faz com que o compilador produza mensagens de erro e status detalhados.

Sintaxe
Console

-verbose[+ | -]

Argumentos
+ | -

Opcional. Especificar -verbose é o mesmo que especificar -verbose+ e faz com que o
compilador emita mensagens detalhadas. O padrão dessa opção é -verbose- .

Comentários
A opção -verbose exibe informações sobre o número total de erros emitidos pelo
compilador, relata quais assemblies estão sendo carregados por um módulo e exibe
quais arquivos estão sendo compilados no momento.

7 Observação

A opção -verbose não está disponível no ambiente de desenvolvimento do Visual


Studio; ela só está disponível quando se compila na linha de comando.

Exemplo
O código a seguir compila In.vb e direciona o compilador para exibir informações de
status detalhadas.

Console

vbc -verbose in.vb

Confira também
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-warnaserror (Visual Basic)
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Faz com que o compilador trate a primeira ocorrência de um aviso como um erro.

Sintaxe
Console

-warnaserror[+ | -][:numberList]

Argumentos
Termo Definição

+|- Opcional. Por padrão, -warnaserror- está em vigor; os avisos não impedem que o
compilador produza um arquivo de saída. A opção -warnaserror , que é o mesmo
que -warnaserror+ , faz com que os avisos sejam tratados como erros.

numberList Opcional. A lista delimitada por vírgulas dos números de identificação do aviso aos
quais se aplica a opção -warnaserror . Se nenhuma identificação de aviso for
especificada, a opção -warnaserror se aplica a todos os avisos.

Comentários
A opção -warnaserror trata todos os avisos como erros. Quaisquer mensagens que
normalmente seriam relatadas como avisos são, em vez disso, relatadas como erros. O
compilador relatará as ocorrências subsequentes do mesmo aviso como avisos.

Por padrão, -warnaserror- está em vigor, o que faz com que os avisos sejam apenas
informativos. A opção -warnaserror , que é o mesmo que -warnaserror+ , faz com que
os avisos sejam tratados como erros.

Se você deseja que apenas avisos específicos sejam tratados como erros, pode
especificar uma lista separada por vírgulas de números de aviso para serem tratados
como erros.

7 Observação
A opção -warnaserror não controla como os avisos são exibidos. Use a opção -
nowarn para desativar os avisos.

Para definir -warnaserror para tratar todos os avisos como erros no IDE do Visual Studio

1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em Propriedades.


2. Clique na guia Compilar.

3. Verifique se a caixa de seleção Desabilitar todos os avisos está desmarcada.

4. Marque a caixa de seleção Tratar todos os avisos como erros.

Para definir -warnaserror para tratar avisos específicos como erros no IDE do Visual Studio

1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em Propriedades.

2. Clique na guia Compilar.

3. Verifique se a caixa de seleção Desabilitar todos os avisos está desmarcada.

4. Verifique se a caixa de seleção Tratar todos os avisos como erros está desmarcada.

5. Selecione Erro na coluna Notificação adjacente ao aviso que deve ser tratado como um erro.

Exemplo 1
O código a seguir compila In.vb e direciona o compilador para exibir um erro para a
primeira ocorrência de cada aviso que ele encontre.

Console

vbc -warnaserror in.vb

Exemplo 2
O código a seguir compila T2.vb e trata apenas o aviso de variáveis locais não utilizadas
(42024) como um erro.

Console

vbc -warnaserror:42024 t2.vb

Confira também
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
Configurando avisos no Visual Basic
-win32icon
Artigo • 28/11/2022 • 2 minutos para o fim da leitura

Insere um arquivo .ico no arquivo de saída. Esse arquivo .ico representa o arquivo de
saída no File Explorer.

Sintaxe
Console

-win32icon:filename

Argumentos
Termo Definição

filename O arquivo .ico para adicionar ao seu arquivo de saída. Coloque o nome do arquivo
entre aspas ("") se o nome conter um espaço.

Comentários
Você pode criar um arquivo .ico com o RC (Compilador de Recursos do Microsoft
Windows). O Compilador de Recurso é invocado quando você compila um programa do
Visual C++; um arquivo .ico é criado com base no arquivo .rc. As opções -win32icon e -
win32resource são mutualmente exclusivas.

Consulte -linkresource (Visual Basic) para fazer referência a um arquivo de recurso .NET
Framework ou -resource (Visual Basic) para anexar um arquivo de recurso .NET
Framework. Consulte -win32resource para importar um arquivo .res.

Para definir -win32icon no IDE do Visual Studio

1. Selecione um projeto no Gerenciador de Soluções. No menu Projeto , clique em Propriedades.


2. Clique na guia Aplicativo.

3. Modifique o valor na caixa Ícone.

Exemplo
O código a seguir compila In.vb e anexa um arquivo .ico Rf.ico .
Console

vbc -win32icon:rf.ico in.vb

Confira também
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
-win32manifest (Visual Basic)
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

Identifica um arquivo de manifesto do aplicativo Win32 definido pelo usuário para ser
inserido em um arquivo PE de um projeto.

Sintaxe
Console

-win32manifest: fileName

Argumentos
Termo Definição

fileName O caminho do arquivo de manifesto personalizado.

Comentários
Por padrão, o compilador do Visual Basic insere um manifesto do aplicativo que
especifica o nível de execução solicitado asInvoker. Ele cria o manifesto na mesma pasta
em que o arquivo executável é compilado, normalmente a pasta bin\Debug ou
bin\Release quando você usa o Visual Studio. Se você quiser fornecer um manifesto
personalizado, por exemplo, para especificar um nível de execução solicitado de
highestAvailable ou requireAdministrator, use esta opção para especificar o nome do
arquivo.

7 Observação

Essa opção e a opção -win32resource são mutuamente exclusivas. Se você tentar


usar ambas as opções na mesma linha de comando, você obterá um erro de build.

Um aplicativo que não tem nenhum manifesto do aplicativo que especifica que um nível
de execução solicitado estará sujeito à virtualização de arquivos/Registro sob o recurso
de Controle de Conta de Usuário no Windows Vista. Para saber mais sobre virtualização,
confira Implantação do ClickOnce no Windows Vista.
Seu aplicativo estará sujeito à virtualização se alguma das condições a seguir for
verdadeira:

1. Você usa a opção -nowin32manifest e não fornece um manifesto em uma etapa de


build posterior ou como parte de um arquivo de Recurso (.res) do Windows
usando a opção -win32resource .

2. Você fornece um manifesto personalizado que não especifica um nível de


execução solicitado.

O Visual Studio cria um arquivo .manifest padrão e o armazena nos diretórios de


depuração e liberação juntamente com o arquivo executável. Você pode exibir ou editar
o arquivo app.manifest padrão clicando em Exibir Configurações do UAC na guia
Aplicativo no Designer de Projeto. Para obter mais informações, consulte Página de
aplicativo, Designer de Projeto (Visual Basic).

Você pode fornecer o manifesto do aplicativo como uma etapa de pós-build


personalizada ou como parte de um arquivo de recurso Win32 usando a opção -
nowin32manifest . Use essa mesma opção se quiser que o aplicativo seja sujeito à

virtualização de arquivo ou Registro no Windows Vista. Isso impedirá que o compilador


crie e insira um manifesto padrão no arquivo PE.

Exemplo
O exemplo a seguir mostra o manifesto padrão que o Compilador do Visual Basic insere
em um PE.

7 Observação

O compilador insere um nome de aplicativo padrão MyApplication no XML do


manifesto. Essa é uma solução alternativa para habilitar os aplicativos para serem
executados no Windows Server 2003 Service Pack 3.

XML

<?xml version="1.0" encoding="utf-8" standalone="yes"?>

<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">

<assemblyIdentity version="1.0.0.0" name="MyApplication.app"/>

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v2">

<security>

<requestedPrivileges xmlns="urn:schemas-microsoft-com:asm.v3">

<requestedExecutionLevel level="asInvoker"/>

</requestedPrivileges>

</security>

</trustInfo>

</assembly>

Confira também
Compilador de linha de comando do Visual Basic
-nowin32manifest (Visual Basic)
-win32resource
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Insere um arquivo do recurso do Win32 no arquivo de saída.

Sintaxe
Console

-win32resource:filename

Argumentos
filename

O arquivo de recurso que você deseja adicionar ao seu arquivo de saída. Coloque o
nome do arquivo entre aspas ("") se o nome conter um espaço.

Comentários
Você pode criar um arquivo de recurso Win32 com o RC (Microsoft Windows Resource
Compiler).

Um recurso do Win32 pode conter informações de versão ou de bitmap (ícone) que


ajudem a identificar seu aplicativo no File Explorer. Se você não especificar -
win32resource , o compilador gerará informações de versão com base na versão do
assembly. As opções -win32resource e -win32icon são mutualmente exclusivas.

Consulte -linkresource (Visual Basic) para fazer referência a um arquivo de recurso .NET
Framework ou -resource (Visual Basic) para anexar um arquivo de recurso .NET
Framework.

7 Observação

A opção -win32resource não está disponível no ambiente de desenvolvimento do


Visual Studio; ela só está disponível quando se compila na linha de comando.

Exemplo
O código a seguir compila In.vb e anexa um arquivo de recurso Win32: Rf.res

Console

vbc -win32resource:rf.res in.vb

Confira também
Compilador de linha de comando do Visual Basic
Linhas de Comando de Compilação de Exemplo
Opções de compilador do Visual Basic
listadas por categoria
Artigo • 28/11/2022 • 4 minutos para o fim da leitura

O compilador de linha de comando do Visual Basic é fornecido como uma alternativa


para compilar programas de dentro do IDE (ambiente de desenvolvimento integrado)
do Visual Studio. Veja a seguir uma lista das opções do compilador de linha de
comando do Visual Basic classificadas por categoria funcional.

Todas as opções do compilador estão disponíveis em dois formatos: -option e /option .


A documentação mostra apenas o formulário -option .

Saída do compilador
Opção Finalidade

-nologo Suprime as informações da faixa do compilador.

-utf8output Exibe a saída do compilador usando a codificação UTF-8.

-verbose Gera informações extras durante a compilação.

-modulename:<string> Especificar o nome do módulo de origem

-preferreduilang Especifique uma linguagem para a saída do compilador.

Otimização
Opção Finalidade

-filealign Especifica onde alinhar as seções do arquivo de saída.

-optimize Habilita/desabilita otimizações.

Arquivos de saída
Opção Finalidade

-doc Processa comentários de documentação em um arquivo XML.


Opção Finalidade

- Faz com que o compilador gere um assembly de conteúdo binário idêntico entre
deterministic compilações se as entradas são idênticas.

-netcf Define o compilador como destino para o .NET Compact Framework.

-out Especifica um arquivo de saída.

-refonly Gera apenas um assembly de referência.

-refout Especifica o caminho de saída de um assembly de referência.

-target Especifica o formato da saída.

Assemblies .NET
Opção Finalidade

-addmodule Faz com que o compilador verifique todos os tipos de informações de


arquivos especificados disponíveis para o projeto que você está
compilando.

-delaysign Especifica se o assembly será assinado total ou parcialmente.

-imports Importa um namespace de um assembly especificado.

-keycontainer Especifica um nome de contêiner de chave para um par de chaves para


dar um nome forte a um assembly.

-keyfile Especifica um arquivo que contém uma chave ou um par de chaves para
dar um nome forte a um assembly.

-libpath Especifica o local dos assemblies referenciados pela opção -reference.

-reference Importa os metadados de um assembly.

- Especifica o nome do assembly do qual um módulo fará parte.


moduleassemblyname

-analyzer Executar os analisadores com basse nesse assembly (forma abreviada: -a)

-additionalfile Nomeia outros arquivos que não afetam diretamente a geração de


código, mas podem ser usados por analisadores para produzir erros ou
avisos.

Verificação de depuração/erros
Opção Finalidade

-bugreport Cria um arquivo que contém informações que tornam mais fácil relatar um
bug.

-debug Produz informações de depuração.

-nowarn Suprime a capacidade do compilador de gerar avisos.

-quiet Impede que o compilador exiba código para erros e avisos relacionados à
sintaxe.

- Desabilita a verificação de estouro de inteiro.


removeintchecks

-warnaserror Promove avisos a erros.

-ruleset:<file> Especifique um arquivo de conjunto de regras que desabilita o diagnóstico


específico.

Ajuda
Opção Finalidade

-? Exibe as opções do compilador. Esse comando é o mesmo que especificar a opção -


help . Nenhuma compilação ocorre.

ajuda Exibe as opções do compilador. Esse comando é o mesmo que especificar a opção -? .
Nenhuma compilação ocorre.

Idioma
Opção Finalidade

-langversion Especifica a versão do idioma: 9|9.0|10|10.0|11|11.0.

-optionexplicit Impõe a declaração explícita de variáveis.

-optionstrict Impõe a semântica de tipo estrito.

- Especifica se as comparações de cadeia de caracteres devem ser binárias ou


optioncompare usar semânticas de texto específicas da localidade.

-optioninfer Permite o uso de inferência de tipo local nas declarações de variáveis.

Pré-processador
Opção Finalidade

-define Define símbolos para a compilação condicional.

Recursos
Opção Finalidade

-linkresource Cria um link a um recurso gerenciado.

-resource Insere um arquivo de recurso gerenciado em um assembly.

-win32icon Insere um arquivo .ico no arquivo de saída.

-win32resource Insere um arquivo do recurso do Win32 no arquivo de saída.

Diversos
Opção Finalidade

@ (especificar Especifica um arquivo de resposta.


arquivo de
resposta)

-baseaddress Especifica o endereço básico de um DLL.

-codepage Especifica a página de código a ser usada para todos os arquivos de


código-fonte na compilação.

-errorreport Especifica como o compilador do Visual Basic deve relatar erros internos do
compilador.

-highentropyva Diz ao kernel do Windows se um executável em especial dá suporte a ASLR


(Aleatoriedade de Layout de Espaço de Endereço) de alta entropia.

-main Especifica a classe que contém o procedimento Sub Main a ser usado na
inicialização.

-noconfig Não compile com Vbc.rsp

-nostdlib Faz com que o compilador não referencie as bibliotecas padrão.

-nowin32manifest Instrui o compilador a não inserir nenhum manifesto de aplicativo no


arquivo executável.

-platform Especifica a plataforma de processador que o compilador direciona para o


arquivo de saída.
Opção Finalidade

-recurse Pesquisa em subdiretórios arquivos de código-fonte a serem compilados.

-rootnamespace Especifica um namespace para todas as declarações de tipo.

-sdkpath Especifica o local de Mscorlib.dll e Microsoft.VisualBasic.dll.

-vbruntime Especifica que o compilador deve ser compilado sem uma referência à
Biblioteca de Runtime do Visual Basic ou com uma referência a uma
biblioteca de runtime específica.

-win32manifest Identifica um arquivo de manifesto do aplicativo Win32 definido pelo


usuário para ser inserido em um arquivo PE de um projeto.

- Especifica se deve o build simultâneo deve ser usado (+).


parallel[+&#124;-]

- Especifique o algoritmo para calcular a soma de verificação do arquivo de


checksumalgorithm: origem armazenada no PDB. Os valores com suporte são: SHA1 (padrão) ou
<alg> SHA256.

Em razão de problemas de colisão com SHA1, a Microsoft recomenda


SHA256 ou melhor.

Confira também
Opções do compilador do Visual Basic listadas em ordem alfabética
Gerenciar propriedades do projeto e da solução
Informações de referência do .NET
Framework (Visual Basic)
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

Este tópico fornece links para informações sobre como trabalhar com a biblioteca de
classes do .NET Framework.

Seções relacionadas
Introdução

Fornece uma visão geral abrangente do .NET Framework e links para recursos adicionais.

Visão geral da biblioteca de classes

Apresenta as classes, interfaces e os tipos de valor que ajudam a agilizar e otimizar o


processo de desenvolvimento e fornecem acesso à funcionalidade do sistema.

Guia de desenvolvimento

Fornece um guia para todas as principais áreas de tecnologia e tarefas para o


desenvolvimento de aplicativos, inclusive a criação, configuração, depuração, proteção e
implantação do seu aplicativo. Este tópico também fornece informações sobre áreas de
tecnologia como programação dinâmica, interoperabilidade, extensibilidade,
gerenciamento de memória e threading.

Ferramentas
Descreve as ferramentas que você pode usar para desenvolver, configurar e implantar
aplicativos usando tecnologias do .NET Framework.

Navegador de API .NET

Fornece sintaxe, exemplos de códigos e informações relacionadas a cada classe contida


nos namespaces do .NET Framework.
Especificação da linguagem Visual Basic
Artigo • 07/04/2023 • 2 minutos para o fim da leitura

A Especificação de linguagem de Visual Basic é a origem autoritativa de respostas para


todas as perguntas sobre sintaxe e gramática do Visual Basic. Ela contém informações
detalhadas sobre a linguagem, incluindo vários pontos não abordados na
documentação de referência do Visual Basic.

A especificação está disponível na Centro de Download da Microsoft .

Este site contém a especificação Visual Basic 11. Ela é criada de arquivos Markdown
contidos no repositório do GitHub dotnet/vblang .

Problemas na especificação devem ser criados no repositório dotnet/vblang . Ou, se


estiver interessado em corrigir os erros que encontrar, envie uma Solicitação de pull
para o mesmo repositório.

Confira também
Referência da linguagem Visual Basic

Próximo
Instruções passo a passo da linguagem
Visual Basic
Artigo • 22/02/2023 • 2 minutos para o fim da leitura

O passo a passo fornece instruções detalhadas para cenários comuns, o que os torna
um bom local para começar a aprender sobre o produto ou uma área de recurso
específica.

Escrevendo um programa assíncrono

Mostra como criar uma solução assíncrona usando Async e Await.

declarar e gerar eventos

Ilustra como eventos são declarados e gerados em Visual Basic.

Manipulando eventos

Mostra como manipular eventos usando a palavra-chave WithEvents padrão ou as


novas palavras-chave AddHandler / RemoveHandler .

Criando e implementando interfaces

Mostra como as interfaces são declaradas e implementadas em Visual Basic.

Definindo classes

Descreve como declarar uma classe e seu campos, propriedades, métodos e


eventos.

Escrevendo consultas em Visual Basic

Este passo a passo demonstra como você pode usar os recursos de linguagem do
Visual Basic para gravar expressões de consulta LINQ (Consulta Integrada à
Linguagem).

Implementando IEnumerable(Of T) no Visual Basic

Demonstra como criar uma classe que implementa a interface IEnumerable(Of


String) e uma classe que implementa a interface IEnumerator(Of String) para ler

um arquivo de texto uma linha de cada vez.

Chamando APIs do Windows

Explica como usar instruções Declare e chamar APIs do Windows. Inclui


informações sobre como usar atributos para controlar o marshaling para a
chamada à API e como expor uma chamada à API como um método de uma
classe.
Criando objetos COM com o Visual Basic

Demonstra como criar objetos COM em Visual Basic, com e sem o modelo de
classe COM.

Implementando a herança com objetos COM

Demonstra como usar o Visual Basic 6.0 para criar um objeto COM contendo uma
classe e, em seguida, usá-la como uma classe base em Visual Basic.

Determinando onde My.Application.Log grava informações

Descreve as configurações My.Application.Log padrão e como determinar as


configurações para seu aplicativo.

Alterando onde My.Application.Log grava informações

Mostra como substituir as configurações My.Log e Log padrão para registrar em


log as informações de evento e fazer com que o objeto My.Application.Log grave
em outros ouvintes de log.

Filtrando a saída de My.Application.Log

Demonstra como alterar a filtragem de log padrão do objeto My.Application.Log .

Criando ouvintes de log personalizados

Demonstra como criar um ouvinte de log personalizado e configurá-lo para ouvir a


saída do objeto My.Application.Log .

inserir tipos de assemblies gerenciados

Descreve como criar um assembly e um programa cliente que incorpora tipos dele.

Validando senhas complexas (Visual Basic)

Demonstra como verificar se há características de senha forte e atualizar um


parâmetro de cadeia de caracteres com informações sobre em quais verificações
uma senha falha.

Criptografando e descriptografando cadeias de caracteres no Visual Basic

Mostra como usar a classe DESCryptoServiceProvider para criptografar e


descriptografar cadeias de caracteres.

Manipulando arquivos e pastas no Visual Basic

Demonstra como usar funções do Visual Basic para determinar informações sobre
um arquivo, procurar uma cadeia de caracteres em um arquivo e gravar em um
arquivo.

Manipulando arquivos usando métodos do .NET Framework

Demonstra como usar métodos do .NET Framework para determinar informações


sobre um arquivo, pesquisar uma cadeia de caracteres em um arquivo e gravar em
um arquivo.

Instruções passo a passo: suporte Test-First com a Funcionalidade Gerar a partir do


Uso

Demonstra como realizar o desenvolvimento de test-first, no qual você primeiro


escreve testes de unidade e, em seguida, escreve o código-fonte para fazer os
testes terem êxito.

Você também pode gostar