Está en la página 1de 1359

Contents

Guía de Visual Basic


Novedades de Visual Basic
Primeros pasos
Recursos adicionales para programadores de Visual Basic
Desarrollo de aplicaciones
Programar en Visual Basic
Acceso a los recursos del equipo
Registrar información de la aplicación
Acceso a los datos de usuario
Acceso a los formularios de las aplicaciones
Acceso a los servicios web de las aplicaciones
Procedimiento Llamada a un servicio web de forma asincrónica
Accessing Application Settings
Procesar unidades, directorios y archivos
Desarrollo con My
Realización de tareas con My.Application, My.Computer y My.User
Instancias de objeto predeterminadas proporcionadas por My.Forms y
My.WebServices
Desarrollo rápido de aplicaciones con My.Resources y My.Settings
Información general sobre el modelo de aplicaciones de Visual Basic
Cómo My depende del tipo de proyecto
Acceso a datos
Creación y uso de componentes
Fundamentos de las aplicaciones de Windows Forms
Personalizar proyectos y ampliar My con Visual Basic
Extensión del espacio de nombres de My
Empaquetado e implementación de extensiones personalizadas de My
Ampliar el modelo de la aplicación de Visual Basic
Personalización de los objetos disponibles en My
Programar los conceptos
Programación asincrónica con Async y Await
Atributos
Información del llamador
Colecciones
Covarianza y contravarianza
Árboles de expresión
Iterators
Language-Integrated Query (LINQ)
Programación orientada a objetos
Reflexión
Serialización
Convenciones de código y estructura de programas
Estructura de un programa
Procedimiento principal
Instrucción Imports y referencias
Espacios de nombres
Convenciones de nomenclatura
Convenciones de código
Compilación condicional
Procedimiento Interrupción y combinación de instrucciones en código
Procedimiento Contracción y ocultación de secciones de código
Procedimiento Instrucciones de etiquetas
Caracteres especiales en el código
Comentarios en código
Palabras clave como nombres de elementos en el código
Me, My, MyBase y MyClass
Limitaciones
Características del lenguaje
Matrices
Inicializadores de colección
Constantes y enumeraciones
Flujo de control
Tipos de datos
Caracteres de tipo
Tipos de datos básicos
Tipos de datos numéricos
Tipos de datos de caracteres
Tipos de datos varios
Tipos de datos compuestos
Procedimiento Inclusión de más de un valor en una variable
Tipos genéricos
Procedimiento Definición de clases capaces de proporcionar la misma
funcionalidad en tipos de datos diferentes
Procedimiento Uso de clases genéricas
Procedimientos genéricos
Tipos de valores que aceptan valores NULL
Tipos de valor y tipos de referencia
Conversiones de tipos
Widening and Narrowing Conversions
Conversiones implícitas y explícitas
Conversiones entre cadenas y otros tipos
Procedimiento Conversión de un objeto a otro tipo
Conversiones de matriz
Estructuras
Procedimiento Declaración de estructuras
Variables de estructura
Estructuras y otros elementos de programación
Estructuras y clases
Tuplas
Uso eficiente de los tipos de datos
Solución de problemas de los tipos de datos
Elementos declarados
Delegados
Enlace en tiempo de compilación y en tiempo de ejecución
Tipos de errores
Events
Interfaces
Tutorial: Creación e implementación de interfaces
LINQ
Objetos y clases
Operadores y expresiones
Procedimientos
Instrucciones
Cadenas
Variables
XML
Interoperabilidad COM
Introducción a la interoperabilidad COM
Procedimiento Referencia de los objetos COM
Procedimiento Trabajo con controles ActiveX
Tutorial: Llamadas a las API de Windows
Procedimiento Llamadas a las API de Windows
Procedimiento Llamada una función de Windows que adopta tipos sin signo
Tutorial: Creación de objetos COM
Solución de problemas de interoperabilidad
Interoperabilidad COM en aplicaciones .NET Framework
Tutorial: Implementación de la herencia mediante objetos COM
Referencia del lenguaje
Configurar la versión del lenguaje
Convenciones tipográficas y de código
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Palabras clave
Resumen de las matrices
Resumen de los objetos de colección
Resumen del flujo de control
Resumen de las conversiones
Data Types Summary
Resumen de fechas y horas
Resumen de las constantes y declaraciones
Resumen de archivos y directorios
Resumen de los errores
Resumen financiero
Resumen de información e interacción
Resumen de entrada y salida
Resumen de funciones matemáticas
Funciones matemáticas derivadas
Referencia de My
Resumen de los operadores
Resumen del registro
Resumen de la manipulación de cadenas
Atributos
Constantes y enumeraciones
Resumen de los tipos de datos
Tipo de datos Boolean
Tipo de datos Byte
Tipo de datos Char
Tipo de datos Date
Tipo de datos Decimal
Tipo de datos Double
Tipo de datos Integer
Tipo de datos Long
Object Data Type
Tipo de datos SByte
Tipo de datos Short
Tipo de datos Single
String (Tipo de datos)
Tipo de datos UInteger
Tipo de datos ULong
Tipo de datos definido por el usuario
Tipo de datos UShort
Directivas
#Directiva Const
#Directiva ExternalSource
#Directivas If...Then...#Else
#Directiva Region
Funciones
Funciones de conversión
Funciones matemáticas
Funciones de cadena
Type Conversion Functions
Valores devueltos para la función CStr
CType Function
Modificadores
Ansi
Ensamblado
Async
Automático
ByRef
ByVal
Default
Friend
Modificador genérico In
Iterator
Key
Module
MustInherit
MustOverride
Narrowing
NotInheritable
NotOverridable
Optional
Modificador genérico Out
Overloads
Overridable
Overrides
ParamArray
Parcial
Private
Private Protected
Protegido
Protected Friend
Public
ReadOnly
Shadows
Shared
Estático
Unicode
Widening
WithEvents
WriteOnly
Módulos
Nothing
de la empresa
My.Application (Objeto)
My.Application.Info (Objeto)
My.Application.Log (objeto)
My.Computer (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.Forms (Objeto)
My.Log (Objeto)
My.Request (Objeto)
My.Response (Objeto)
My.Resources (Objeto)
My.Settings (Objeto)
My.User (Objeto)
My.WebServices (Objeto)
TextFieldParser Object
Operadores
Precedencia de operadores
Tipos de datos de los resultados de los operadores
Lista de operadores según funcionalidad
Operadores aritméticos
Operadores de asignación
Operadores de desplazamiento de bits
Operadores de comparación
Operadores de concatenación
Operadores lógicos y bit a bit
Operadores varios
Lista de operadores de Visual Basic
Operador &
Operador &=
* Operador
*= (Operador)
+ Operador
+= (Operador)
= (Operador)
- Operador
-= (Operador)
Operador <
Operador <=
> Operador
>= (Operador)
Operador <<
Operador <<=
>> Operador
>>= (Operador)
/ (Operador)
/= (Operador)
\ (Operador)
Operador \=
^ (Operador)
^= (Operador)
Operador ?()
?. Operador
Operador AddressOf
Operador And
Operador AndAlso
Await (Operador)
Operador DirectCast
Expresión Function
GetType Operator
Operador GetXmlNamespace
Operador If
Operador Is
Operador IsFalse
Operador IsNot
Operador IsTrue
Like (Operador)
Mod (Operador)
NameOf (Operador)
New (Operador)
Operador Not
Operador Or
Operador OrElse
Expresión Sub
Operador TryCast
Operador TypeOf
Operador Xor
Propiedades
Consultas
Aggregate Clause
Cláusula Distinct
Cláusula Equals
Cláusula From
Cláusula Group By
Cláusula Group Join
Cláusula Join
Cláusula Let
Cláusula Order By
Cláusula Select
Cláusula Skip
Cláusula Skip While
Cláusula Take
Cláusula Take While
Cláusula Where
Instrucciones
Instrucciones A-E
AddHandler (Instrucción)
Instrucción Call
Instrucción Class
Instrucción Const
Instrucción Continue
Declare Statement
Delegate (Instrucción)
Instrucción Dim
Instrucción Do...Loop
Instrucción Else
End (Instrucción)
Instrucción End <keyword>
Instrucción Enum
Instrucción Erase
Error (Instrucción)
Event (Instrucción)
Instrucción Exit
Instrucciones F-P
Instrucción For Each...Next
Instrucción For...Next
Instrucción Function
Get (Instrucción)
GoTo (Instrucción)
Instrucción If...Then...Else
Implements (Instrucción)
Instrucción Imports (Tipo y espacio de nombres de .NET)
Imports (Instrucción, Espacio de nombres XML)
Inherits Statement
Instrucción Interface
Mid (Instrucción)
Module (Instrucción)
Namespace (Instrucción)
Instrucción On Error
Operator Statement
Instrucción Option <keyword>
Option Compare (Instrucción)
Instrucción Option Explicit
Option Infer (instrucción)
Option Strict Statement
Property Statement
Instrucciones Q-Z
RaiseEvent (Instrucción)
Instrucción ReDim
Instrucción REM
RemoveHandler (Instrucción)
Resume (Instrucción)
Instrucción Return
Instrucción Select...Case
Instrucción Set
Instrucción Stop
Structure (Instrucción)
Instrucción Sub
SyncLock (Instrucción)
Then (Instrucción)
Throw (Instrucción)
Instrucción Try...Catch...Finally
Instrucción Using
Instrucción While...End While
Instrucción With...End With
Instrucción Yield
Cláusulas
Cláusula Alias
Cláusula As
Cláusula Handles
Cláusula Implements
Cláusula In
Cláusula Into
Cláusula Of
Contextos de declaración y niveles de acceso predeterminados
Lista de atributos
Lista de parámetros
Type List
Etiquetas de comentario XML
<c>
<code>
<example>
<exception>
<include>
<list>
<para>
<param>
<paramref>
<permission>
<remarks>
<returns>
<see>
<seealso>
<summary>
<typeparam>
<value>
Propiedades de eje XML
XML Attribute Axis Property
XML Child Axis Property
XML Descendant Axis Property
Propiedad de indexador de extensión
Propiedad de valor XML
Literales XML
Literal de elemento XML
Literal de documento XML
Literal de CDATA XML
Literal de comentario XML
Literal de instrucción de procesamiento XML
Mensajes de error
'#ElseIf' debe ir precedida de la instrucción '#If' o '#ElseIf' correspondiente
Las instrucciones "#Region" y "#End Region" no son válidas en los cuerpos de
método y operaciones lambda de varias líneas
No se puede aplicar '<attribute>' porque el formato del GUID '<number>' no es
correcto
La clase '<classname>' no es compatible con CLS porque la interfaz
'<interfacename>' que implementa tampoco lo es
'<elementname>' está obsoleto (Advertencia de Visual Basic)
'<eventname>' es un evento y no se le puede llamar directamente
'<expression>' no se puede utilizar como restricción de tipo
"<functionname>" no se declaró (error del compilador de Smart Device/Visual
Basic)
"<interfacename>.<membername>" ya se ha implementado mediante la clase base
"<baseclassname>". Se supone que <type> se implementa de nuevo
'<keyword>' sólo es válida en un método de instancia
'<membername>' no puede exponer el tipo '<typename>' fuera del proyecto
mediante <containertype> '<containertypename>'
'<membername>' es ambiguo en las interfaces heredadas '<interfacename1>' y
'<interfacename2>'
<message> Este error también puede ser debido a la combinación de una
referencia de archivo con una referencia de proyecto al ensamblado "
<assemblyname>"
'<methodname>' tiene varias definiciones con firmas idénticas
'<name>' es ambiguo en el espacio de nombres '<namespacename>'
'<name1>' es ambiguo y se ha importado de los espacios de nombres o tipos
'<name2>'
<proceduresignature1> no es compatible con CLS porque sobrecarga a
<proceduresignature2>, que difiere de ella solo en la matriz de tipos de parámetro
de matriz o el rango de los tipos de parámetro de matriz
<type1>"<typename>" debe implementar "<membername>" para la interfaz "
<interfacename>"
<type1>"<typename>" debe implementar "<methodname>" para la interfaz "
<interfacename>"
'<typename>' no puede heredar del <type> '<basetypename>' porque amplía el
acceso del <type> fuera del ensamblado
'<typename>' es un tipo delegado
'<typename>' es un tipo y no se puede usar como expresión
Un carácter de comilla doble no es un símbolo (token) de comentario válido para
campos delimitados donde EscapeQuote está establecido en True
Una llamada a una propiedad o un método no puede incluir una referencia a un
objeto privado como un argumento o un valor de retorno
Se creó una referencia al ensamblado de interoperabilidad '<assembly1>'
incrustado debido a una referencia indirecta a dicho ensamblado desde el
ensamblado '<assembly2>'
No se ha especificado un formulario de inicio
Acceso de miembro compartido mediante una instancia; la expresión calificadora no
se evaluará
El operando 'AddressOf' debe ser el nombre de un método (sin paréntesis)
Error inesperado porque no se puede conseguir un recurso del sistema operativo
necesario para el inicio de una instancia única
El nombre de miembro de tipo anónimo sólo se puede inferir a partir de un nombre
simple o completo sin argumentos
Argumento no opcional
Los límites de matriz no pueden aparecer en los especificadores de tipo
Una matriz declarada como variable de control de bucle no se puede declarar con
un tamaño inicial
Falta la expresión de subíndice de matriz
Las matrices declaradas como miembros de estructura no se pueden declarar con un
tamaño inicial
'As Any' no se admite en instrucciones 'Declare'
No se puede aplicar el atributo '<attributename>' más de una vez
Error de automatización
Valor de suma de comprobación incorrecto; no tiene dígitos hexadecimales o el
número de dígitos hexadecimales es impar
Convención de llamada a archivo DLL no válida
Modo de archivo incorrecto
Número o nombre de archivo incorrecto
Longitud de registro incorrecta
Dado que no se esperaba esta llamada, la ejecución del método actual continuará
antes de que se complete la llamada.
No se puede convertir el tipo anónimo en un árbol de expresión porque una
propiedad del tipo se usa para inicializar otra propiedad.
No se puede crear el componente ActiveX
No se puede hacer referencia a '<name>' porque es miembro del campo de tipo de
valor '<name>' de la clase '<classname>' que tiene 'System.MarshalByRefObject'
como clase base
No se puede hacer referencia a un miembro de instancia de una clase desde un
método compartido o un inicializador de método compartido sin una instancia
explícita de la clase
No se puede crear el archivo temporal necesario
No se puede abrir '<filename>' para escritura
No se puede encontrar la clase '<classname>'
Esta clase no admite automatización o no admite la interfaz esperada
La instrucción 'Class' debe terminar con la instrucción 'End Class' correspondiente
Formato del Portapapeles no válido
La expresión constante no se puede representar en el tipo '<typename>'
Las constantes deben ser de tipo intrínseco o enumerado; no pueden ser de tipo
clase, estructura, parámetro de tipo ni matriz
El constructor '<name>' no se puede llamar a sí mismo
La acción de volver a copiar el valor del parámetro 'ByRef' '<parametername>' en el
argumento coincidente restringe del tipo '<typename1>' al tipo '<typename2>'
El modificador 'Custom' no es válido en eventos declarados sin tipos de delegado
explícitos
Los tipos de datos de los parámetros de tipo no se pueden inferir de estos
argumentos
Se esperaba una declaración
La propiedad predeterminada '<propertyname1>' está en conflicto con la
propiedad predeterminada '<propertyname2>' en la base '<classname>' y, por tanto,
se debe declarar como 'Shadows'
Hay un acceso de propiedad Default ambiguo entre los miembros
<defaultpropertyname> heredados de la interfaz <interfacename1> y
<defaultpropertyname> de la interfaz <interfacename2>
La clase delegada '<classname>' no tiene ningún método Invoke y, por tanto, una
expresión de este tipo no puede ser el destino de una llamada a método
Las clases derivadas no pueden provocar eventos de clase base
Error de E/S del dispositivo
Se debe llamar primero a la función 'Dir' con un argumento 'Pathname'
Se esperaba el fin de instrucción
Error al crear manifiesto del ensamblado: <error message>
Error al crear recursos Win32: <error message>
Error al cargar DLL
Error al guardar el archivo de recursos temporal para Win32 '<filename>': <error
message>
Se produjeron errores al compilar los esquemas XML del proyecto
Se superó el tiempo de espera de evaluación de la expresión o instrucción
El evento '<eventname1>' no puede implementar el evento '<eventname2>' en la
interfaz '<interface>' porque sus tipos delegados '<delegate1>' y '<delegate2>' no
coinciden
Los eventos no se pueden declarar con un tipo delegado que tenga un tipo de valor
devuelto
Los métodos no compartidos no pueden controlar los eventos de variables
WithEvents compartidas
La expresión no genera un valor
La expresión tiene el tipo '<typename>' que es un tipo restringido y no se puede
utilizar para obtener acceso a miembros heredados de 'Object' o 'ValueType'
La expresión es un valor y, por lo tanto, no puede ser destino de una asignación
No se puede consultar una expresión de tipo <type>
La expresión llama de forma recursiva a la propiedad contenedora
'<propertyname>'
Expresión demasiado compleja
El atributo 'Extension' sólo se puede aplicar a las declaraciones 'Module', 'Sub' o
'Function'
Archivo ya abierto
Archivo demasiado grande para su lectura en una matriz de bytes
No se encontró el nombre del archivo o de la clase durante la operación de
Automation
No se encuentra el archivo (error en tiempo de ejecución de Visual Basic)
El primer operando de una expresión 'If' binaria debe ser un tipo que acepte valores
NULL o un tipo de referencia
La primera instrucción de este 'Sub New' debe ser una llamada a 'MyBase.New' o
'MyClass.New' (constructor no accesible sin parámetros)
La primera instrucción de este 'Sub New' debe ser una llamada explícita a
'MyBase.New' o a 'MyClass.New' porque el constructor '<constructorname>' de la
clase base '<baseclassname>' de '<derivedclassname>' está marcado como obsoleto:
'<errormessage>'
La instrucción 'For Each' en el tipo '<typename>' es ambigua porque el tipo
implementa varias creaciones de instancias de
'System.Collections.Generic.IEnumerable(Of T)'
La referencia de ensamblado de confianza <reference> no es válida
La función '<procedurename>' no devuelve un valor en todas las rutas de acceso a
código
Se deshabilitó la evaluación de funciones porque se excedió el tiempo de espera de
una evaluación de funciones anterior
Los parámetros genéricos utilizados como tipos de parámetros opcionales deben
tener restricción de clase
El descriptor de acceso 'Get' de la propiedad '<propertyname>' no está accesible
La cláusula Handles requiere una variable WithEvents definida en el tipo contenedor
o en uno de sus tipos base
Se esperaba un identificador
El identificador es demasiado largo
Se esperaba un inicializador
Se sobrepasó el final del archivo
Se ha producido un error interno en <location>
Conversión implícita de '<typename1>' a '<typename2>' al copiar de nuevo el valor
del parámetro 'ByRef' '<parametername>' en el argumento correspondiente
'Is' requiere operandos que tienen tipos de referencia, pero este operando tiene el
tipo de valor '<typename>'
El operando 'IsNot' de tipo 'nombreDeTipo' solo se puede comparar con 'Nothing',
porque 'nombreDeTipo' es un tipo que acepta valores NULL
Las etiquetas que son números deben ir seguidas de dos puntos
La expresión lambda no se quitará de este controlador de eventos
Las expresiones lambda no son válidas en la primera expresión de una instrucción
'Select Case'
Resolución enlazada tempranamente; pueden producirse errores en tiempo de
ejecución
La resolución de sobrecarga enlazada tardíamente no se puede aplicar a
'<procedurename>' porque la instancia de acceso es un tipo de interfaz
'.' o '!' inicial sólo puede aparecer dentro de una instrucción 'With'
La línea es demasiado larga
Ya no se admiten instrucciones 'Line' (error del compilador de Visual Basic)
El método no tiene una firma compatible con el delegado
Los métodos de 'System.Nullable(Of T)' no se pueden utilizar como operandos del
operador 'AddressOf'
Las instrucciones 'Module' sólo pueden ocurrir en el nivel de archivo o de espacio
de nombres
El nombre <membername> no es compatible con CLS
No se ha declarado el nombre '<name>'
El nombre <namespacename> del espacio de nombres raíz <fullnamespacename>
no es compatible con CLS
El espacio de nombres o tipo especificado en las importaciones
'<qualifiedelementname>' no contiene miembros públicos o no se encuentra
El espacio de nombres o tipo especificado en las importaciones del proyecto
'<qualifiedelementname>' no tiene miembros públicos o no se encuentra
Se necesita un índice de matriz de propiedades
La función anidada no tiene una signatura compatible con el delegado
'<delegatename>'
No se encontró ningún método 'Main' accesible con una firma apropiada en
'<name>'
<membername> no compatible con CLS no se permite en una interfaz compatible
con CLS
No se admite la inferencia de tipos que acepten valores NULL en este contexto
El número de índices sobrepasa el número de dimensiones de la matriz indizada
El objeto o la clase no admite el conjunto de eventos
Se requiere un objeto
Variable de objeto o de bloque With no establecida
La declaración de un operador debe ser una de las siguientes: +,-,*,\,/,^, &, Like,
Mod, And, Or, Xor, Not, <>, =, <>, =, CType, IsTrue, IsFalse
Se esperaba 'Optional'
Los parámetros opcionales deben especificar un valor predeterminado
El ordinal no es válido
Memoria insuficiente (error del compilador de Visual Basic)
Espacio de pila insuficiente
Espacio de cadena insuficiente
Desbordamiento (Error de Visual Basic)
Desbordamiento (Error en tiempo de ejecución de Visual Basic)
No se encuentra la ruta de acceso
Error de acceso a la ruta o al archivo
Permiso denegado
Argumento o llamada a procedimiento no válido
La propiedad '<propertyname>' no devuelve un valor en todas las rutas de acceso a
código
El índice de la matriz de propiedades no es válido
El procedimiento Let de la propiedad no está definido y el procedimiento Get no ha
devuelto un objeto
Propiedad no encontrada
No se encuentra la propiedad ni el método
La variable de rango <variable> oculta una variable en un bloque de inclusión, una
variable de rango definida anteriormente o una variable declarada de forma implícita
en una expresión de consulta
El nombre de una variable de rango sólo se puede inferir a partir de un nombre
simple o completo sin argumentos
Es necesaria una referencia al ensamblado '<assemblyidentity>' que contenga el
tipo '<typename>', pero no se encontró una referencia adecuada debido a la
ambigüedad entre los proyectos '<projectname1>' y '<projectname2>'
Es necesaria una referencia al ensamblado '<assemblyname>' que contenga la clase
base '<classname>'
Operación solicitada no disponible (BC35000)
Reanudar sin error
El tipo de valor devuelto de la función '<procedurename>' no es compatible con
CLS
El descriptor de acceso 'Set' de la propiedad '<propertyname>' no está accesible
Algunas subclaves no se pueden eliminar
La instrucción no puede terminar un bloque fuera de una línea de la instrucción 'If'
La instrucción no es válida en un espacio de nombres
Instrucción no válida dentro de un método o una expresión lambda de varias líneas
Las constantes de cadena deben terminar en comillas dobles
La estructura '<structurename>' debe contener al menos una variable miembro de
instancia o una declaración de evento de instancia que no esté marcada como
'Custom'
No se encontró 'Sub Main' en '<name>'
Elemento Sub o Function no definido
Subíndice fuera del rango
TextFieldParser no puede finalizar la operación de lectura porque se ha superado el
tamaño máximo de búfer
El tipo de la variable '<variablename>' no se inferirá porque está enlazado a un
campo en un ámbito de inclusión
Matriz fija o bloqueada temporalmente
Esta clave ya está asociada con un elemento de esta colección
Demasiados archivos
El tipo '<typename>' no tiene ningún constructor
El tipo <typename> no es compatible con CLS
No está definido el tipo '<typename>'
No se pudieron inferir los argumentos de tipo a partir del delegado
Error de coincidencia de tipos
No se puede inferir el tipo de '<variablename>' porque los límites del bucle y la
variable step no se convierten en el mismo tipo
El tipo de miembro '<membername>' no es compatible con CLS
El tipo de valor opcional para el parámetro opcional <parametername> no es
compatible con CLS
El tipo de parámetro '<parametername>' no es compatible con CLS
Los parámetros de tipo no se pueden utilizar como calificadores
No se puede crear el ensamblado con nombre desde el archivo de clave
<filename>: <error>
No se puede incrustar el archivo de recursos '<filename>': <error message>
No se puede emitir el ensamblado: <error message>
No se encuentra el archivo '<filename>' necesario
No se pueden obtener los nombres de los puertos serie a causa de un error interno
del sistema
No se puede vincular al archivo de recursos '<filename>': <error message>
No se puede cargar información para la clase '<classname>'
No se puede escribir el resultado en memoria
No se puede escribir el archivo temporal porque la ruta de acceso temporal no está
disponible
No se puede escribir en el archivo de resultados '<filename>': <error>
El tipo subyacente <typename> de Enum no es compatible con CLS
El uso de una variable de iteración en una expresión lambda puede producir
resultados inesperados.
Un valor de tipo '<typename1>' no se puede convertir a '<typename2>'
Un valor de tipo '<typename1>' no se puede convertir a '<typename2>' (varias
referencias de archivo)
Un valor de tipo 'tipo1' no se puede convertir en 'tipo2'
La variable '<variablename>' oculta una variable en un bloque de inclusión
La variable '<variablename>' se utiliza antes de ser asignada a un valor
La variable utiliza un tipo de Automation no compatible con Visual Basic
Las propiedades del eje XML no admiten enlace en tiempo de ejecución
La excepción del comentario XML debe tener un atributo 'cref'
No se admiten referencias de entidad XML
No se admiten literales XML ni propiedades XML en código incrustado en ASP.NET
El identificador URI de espacio de nombres "<uri>" solo se puede enlazar a "xmlns"
Referencia
Compilador de línea de comandos
Compilación desde la línea de comandos
Procedimiento Invocación del compilador de la línea de comandos
Líneas de comandos de compilación de ejemplo
Opciones del compilador por orden alfabético
@ (especificar archivo de respuesta)
-addmodule
-baseaddress
-bugreport
-codepage
-debug
-define
-delaysign
-deterministic
-doc
-errorreport
-filealign
-help, -?
-highentropyva
-imports
-keycontainer
-keyfile
-langversion
-libpath
-link
-linkresource
-main
-moduleassemblyname
-netcf
-noconfig
-nologo
-nostdlib
-nowarn
-nowin32manifest
-optimize
-optioncompare
-optionexplicit
-optioninfer
-optionstrict
-out
-platform
-quiet
-recurse
-reference
-refonly
-refout
-removeintchecks
-resource
-rootnamespace
-sdkpath
-target
-subsystemversion
-utf8output
-vbruntime
-verbose
-warnaserror
-win32icon
-win32manifest
-win32resource
Opciones del compilador por categoría
Información de referencia de .NET Framework
Especificación del lenguaje
Aplicaciones de ejemplo
Tutoriales
Novedades de Visual Basic
19/03/2020 • 22 minutes to read • Edit Online

En este tema se enumeran los nombres de las características clave de cada versión de Visual Basic con
descripciones detalladas de las características nuevas y mejoradas de las versiones más recientes del lenguaje.

Versión actual
Visual Basic 16.0/Visual Studio 2019, versión 16.0
Para las nuevas características, vea Visual Basic 16.0.

Versiones anteriores
Visual Basic 15.8/Visual Studio 2017, versión 15.8
Para consultar las nuevas características, vea Visual Basic 15.8.
Visual Basic 15.5/Visual Studio 2017, versión 15.5
Para consultar las nuevas características, vea Visual Basic 15.5.
Visual Basic 15.3/Visual Studio 2017, versión 15.3
Para consultar las nuevas características, vea Visual Basic 15.3.
Visual Basic 2017/Visual Studio 2017
Para consultar las nuevas características, vea Visual Basic 2017.
Visual Basic/Visual Studio 2015
Para consultar las nuevas características, vea Visual Basic 14.
Visual Basic/Visual Studio 2013
Vistas previas de tecnología de .NET Compiler Platform ("Roslyn")
Visual Basic/Visual Studio 2012
palabras clave Async y await , iteradores, atributos de información de autor de llamada
Visual Basic, Visual Studio 2010
Propiedades autoimplementadas, inicializadores de colección, continuación de línea implícita, dinámica,
covarianza/contravarianza genérica, acceso de espacio de nombres global
Visual Basic/Visual Studio 2008
Language Integrated Query (LINQ), literales XML, inferencia de tipo de variable local, inicializadores de objeto, tipos
anónimos, métodos de extensión, inferencia de tipo de variable local var , expresiones lambda, operador if ,
métodos parciales, tipos de valor que aceptan valores null
Visual Basic/Visual Studio 2005
El tipo My y los tipos del asistente (acceso a la aplicación, equipo, sistema de archivos, red)
Visual Basic/Visual Studio .NET 2003
Operadores de desplazamiento de bits, declaración de variable de bucle
Visual Basic/Visual Studio .NET 2002
La primera versión de Visual Basic .NET

Visual Basic 16.0


Visual Basic 16.0 se centra en proporcionar más características del entorno de ejecución de Visual Basic
(microsoft.visualbasic.dll) a .NET Core y es la primera versión de Visual Basic centrada en .NET Core. Muchas partes
del entorno de ejecución de Visual Basic dependen de WinForms y se agregarán en una versión posterior de
Visual Basic.
Comentarios permitidos en más lugares dentro de las instrucciones
En Visual Basic 15.8 y versiones anteriores, solo se permiten comentarios en líneas en blanco, al final de una
instrucción o en lugares específicos dentro de una instrucción donde se permita una continuación de línea
implícita. A partir de Visual Basic 16.0, también se permiten comentarios después de las continuaciones de línea
explícitas y dentro de una instrucción en una línea que comienza con un espacio seguido de un guion bajo.

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

Visual Basic 15.8


Punto flotante optimizado para la conversión de enteros
En versiones anteriores de Visual Basic, la conversión de valores dobles y únicos a enteros ofrecía un rendimiento
relativamente bajo. Visual Basic 15.8 mejora significativamente el rendimiento de las conversiones de punto
flotante a enteros al pasar el valor devuelto por cualquiera de los métodos siguientes a uno de las funciones de
conversión de enteros de Visual Basic intrínsecas (CByte, CShort, CInt, CLng, CSByte, CUShort, CUInt, CULng) o
cuando el valor devuelto por cualquiera de los métodos siguientes se convierte implícitamente a un tipo entero
cuando Opción estricta se establece en Off :
Conversion.Fix(Double)
Conversion.Fix(Object)
Conversion.Fix(Single)
Conversion.Int(Double)
Conversion.Int(Object)
Conversion.Int(Single)
Math.Ceiling(Double)
Math.Floor(Double)
Math.Round(Double)
Math.Truncate(Double)
Esta optimización permite que el código se ejecute más rápido, hasta el doble de rápido para código que realiza un
gran número de conversiones a tipos enteros. En el ejemplo siguiente se muestran algunas llamadas a métodos
simples que se ven afectadas por esta optimización:

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
Tenga en cuenta que esto trunca los valores de punto flotante en lugar de redondearlos.

Visual Basic 15.5


Argumentos con nombre no finales
En Visual Basic 15.3 y en versiones anteriores, cuando una llamada de método incluía argumentos por posición y
por nombre, los argumentos posicionales tenían que preceder a los argumentos con nombre. A partir de Visual
Basic 15.5, los argumentos posicionales y los argumentos con nombre pueden aparecer en cualquier orden,
siempre y cuando todos los argumentos hasta el último argumento posicional se encuentren en la posición
correcta. Esto es muy útil si se usan argumentos con nombre para mejorar la legibilidad del código.
Por ejemplo, la siguiente llamada de método tiene dos argumentos posicionales entre un argumento con nombre.
El argumento con nombre deja claro que el valor 19 representa una edad.

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

Modificador de acceso de miembro Private Protected

Esta nueva combinación de palabras clave define un miembro al que pueden acceder todos los miembros de su
clase contenedora y los tipos derivados de dicha clase, pero solo si también se encuentran en el ensamblado
contenedor. Dado que las estructuras no se pueden heredar, Private Protected solo se pueden aplicar a los
miembros de una clase.
Separador hexadecimal/binario/octal inicial
En Visual Basic 2017 se ha agregado compatibilidad con el carácter de subrayado ( _ ) como separador de dígitos.
A partir de Visual Basic 15.5 puede usar el carácter de subrayado como separador inicial entre el prefijo y los
dígitos hexadecimales, binarios u octales. En el ejemplo siguiente se usa un separador de dígitos inicial para definir
3,271,948,384 como número hexadecimal:

Dim number As Integer = &H_C305_F860

Para usar el carácter de subrayado como separador inicial, debe agregar el elemento siguiente al archivo del
proyecto de Visual Basic (*.vbproj):

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Visual Basic 15.3


Inferencia en tuplas con nombre
Al asignar el valor de elementos de tupla desde variables, Visual Basic infiere el nombre de los elementos de tupla
a partir de los nombres de variable correspondientes, por lo que no es necesario asignar un nombre a un elemento
de tupla de forma explícita. En el ejemplo siguiente se usa la inferencia para crear una tupla con tres elementos con
nombre: state , stateName y capital .
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

Modificadores del compilador adicionales


El compilador de línea de comandos de Visual Basic ahora admite las opciones de compilador -refout y -refonly
para controlar la salida de ensamblados de referencia. -refout define el directorio de salida del ensamblado de
referencia y -refonly especifica que solo un ensamblado de referencia se transferirá por compilación.

Visual Basic 2017


Tuplas
Las tuplas son una estructura de datos ligera que se usan normalmente para devolver varios valores de una sola
llamada al método. Normalmente, para devolver varios valores de un método, tiene que realizar una de las
siguientes acciones:
Definir un tipo personalizado ( Class o Structure ). Esta es una solución pesada.
Definir uno o más parámetros ByRef , además de devolver un valor del método.
La compatibilidad de Visual Basic con las tuplas le permite definir rápidamente una tupla, asignar opcionalmente
nombres semánticos a sus valores y recuperar sus valores rápidamente. En el ejemplo siguiente se ajusta una
llamada al método TryParse y se devuelve una tupla.

Imports System.Globalization

Public Module NumericLibrary


Public Function ParseInteger(value As String) As (Success As Boolean, Number As Int32)
Dim number As Integer
Return (Int32.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, number), number)
End Function
End Module

Después, puede llamar al método y controlar la tupla devuelta con código como el siguiente.

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

Literales binarios y separadores de dígitos


Puede definir un literal binario con el prefijo &B o &b . Además, puede usar el carácter de subrayado, _ , como un
separador de dígitos para mejorar la legibilidad. En el ejemplo siguiente se usan ambas características para asignar
un valor Byte y para mostrarlo como un número binario, hexadecimal y decimal.
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 obtener más información, vea la sección "Asignaciones literales" de los tipos de datos Byte, Integer, Long,
Short, SByte, UInteger, ULong y UShort.
Compatibilidad con los valores devueltos de referencia de C#
A partir de C# 7.0, C# admite los valores devueltos de referencia. Es decir, cuando el método de llamada recibe un
valor devuelto mediante referencia, puede cambiar el valor de esta. Visual Basic no le permite crear métodos con
valores devueltos de referencia, pero le permite consumirlos y modificarlos.
Por ejemplo, la siguiente clase Sentence escrita en C# incluye un método FindNext que busca la siguiente palabra
de una frase que comienza por una subcadena especificada. La cadena se devuelve como un valor devuelto de
referencia, y una variable Boolean que se ha pasado mediante referencia al método indica si la búsqueda se ha
realizado correctamente. Esto significa que, aparte de leer el valor devuelto, el autor de la llamada también puede
modificarlo, y esa modificación se refleja en la clase Sentence .

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();
}
}

En su forma más sencilla, puede modificar la palabra que se ha encontrado en la frase con código como el que se
muestra a continuación. Tenga en cuenta que no está asignando un valor al método, sino a la expresión que
devuelve el método, que es el valor devuelto de referencia.

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.

En cambio, un problema con este código es que si no se detecta una coincidencia, el método devuelve la primera
palabra. Como el ejemplo no examina el valor del argumento Boolean para determinar si se detecta una
coincidencia, modifica la primera palabra si no hay ninguna. En el ejemplo siguiente se corrige esto reemplazando
la primera palabra por ella misma si no existe ninguna coincidencia.

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.

Una solución mejor es usar un método del asistente en el que el valor devuelto de referencia se pase mediante una
referencia. El método del asistente puede después modificar el argumento que se ha pasado por referencia. En el
siguiente ejemplo se realiza esto.

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 obtener más información, vea Valores devueltos de referencia.

Visual Basic 14
NameOf
Puede obtener el nombre de cadena no calificado de un tipo o miembro para usarlo en un mensaje de error sin
codificar de forma rígida una cadena. Esto permite que el código siga siendo correcto al refactorizarlo. Esta
característica también es útil para enlazar los vínculos MVC del controlador de vista de modelos y desencadenar
eventos de propiedad cambiada.
Interpolación de cadenas
Puede usar expresiones de interpolación de cadenas para construir cadenas. Una expresión de cadena interpolada
es similar a una cadena de plantilla que contiene expresiones. Una cadena interpolada es más fácil de entender con
respecto a los argumentos que el formato compuesto.
Acceso a miembros condicionales NULL e indexación
Puede probar si hay valores null de forma sintáctica ligera antes de realizar una operación de acceso a miembros (
?. ) o índice ( ?[] ). Estos operadores ayudan a escribir menos código para controlar las comprobaciones de null,
especialmente para descender en estructuras de datos. Si la referencia de objeto u operando izquierdo es null, la
operación devuelve null.
Literales de cadena multilínea
Los literales de cadena pueden contener secuencias de nueva línea. Ya no necesita la antigua solución alternativa
que consistía en usar <xml><![CDATA[...text with newlines...]]></xml>.Value
Comentarios
Puede colocar comentarios después de las continuaciones de línea implícita, dentro de expresiones de inicializador
y entre los términos de la expresión LINQ.
Resolución de nombres completos más inteligente
Dado código como Threading.Thread.Sleep(1000) , Visual Basic solía buscar el espacio de nombres "Threading",
detectaba ambigüedad entre System.Threading y System.Windows.Threading y, a continuación, notificaba un error.
Ahora, Visual Basic considera juntos ambos espacios de nombres posibles. Si aparece la lista de finalización, el
editor de Visual Studio muestra los miembros de ambos tipos en la lista de finalización.
Literales de fecha con el año en primer lugar
Puede tener literales de fecha en el formato aaaa-mm-dd, #2015-03-17 16:10 PM# .
Propiedades de interfaz de solo lectura
Puede implementar propiedades de interfaz de solo lectura mediante una propiedad de lectura y escritura. La
interfaz garantiza una funcionalidad mínima y no impide que una clase de implementación pueda establecer la
propiedad.
TypeOf <expr> IsNot <type>
Para mejorar la legibilidad del código, ahora puede usar TypeOf con IsNot .
#Disable Warning <ID> y #Enable Warning <ID>
Puede deshabilitar y habilitar advertencias específicas para las regiones dentro de un archivo de origen.
Mejoras de comentarios de documento XML
Al escribir comentarios de documento, obtiene compatibilidad inteligente de editor y compilación para validar
nombres de parámetro, controlar adecuadamente crefs (genéricos, operadores, etc.), colorear y refactorizar.
Definiciones de módulo parcial e interfaz
Además de clases y structs, puede declarar módulos parciales e interfaces.
Directivas #Region dentro de cuerpos de método
Puede colocar delimitadores #Region... #End Region en cualquier parte de un archivo, dentro de funciones e incluso
abarcando los cuerpos de función.
Las definiciones de invalidaciones son implícitamente sobrecargas
Si agrega el modificador Overrides a una definición, el compilador agrega implícitamente Overloads , de modo
que pueda escribir menos código en los casos comunes.
CObj permitido en argumentos de atributos
El compilador solía producir un error advirtiendo de que CObj(...) no era una constante cuando se usaba en
construcciones de atributo.
Declaración y consumo de métodos ambiguos desde otras interfaces
Anteriormente, en el código siguiente producía errores que impedían declarar IMock o llamar a GetDetails (si
estos se habían declarado en C#):

Interface ICustomer
Sub GetDetails(x As Integer)
End Interface

Interface ITime
Sub GetDetails(x As String)
End Interface

Interface IMock : Inherits ICustomer, ITime


Overloads Sub GetDetails(x As Char)
End Interface

Interface IMock2 : Inherits ICustomer, ITime


End Interface

Ahora el compilador usa las reglas de resolución de sobrecarga normales para elegir el GetDetails más apropiado
que se va a llamar, y se pueden declarar relaciones de interfaz en Visual Basic como las que se muestran en el
ejemplo.

Vea también
Novedades de Visual Studio 2017
Novedades de Visual Studio 2019
Introducción a Visual Basic
18/03/2020 • 2 minutes to read • Edit Online

Esta sección de la documentación sirve como introducción al desarrollo de aplicaciones con Visual Basic.

Introducción a Visual Basic y .NET Core


Compilación de una aplicación "Hola mundo" con .NET Core en Visual Studio
Compilación de una biblioteca de clases con .NET Standard en Visual Studio

Información adicional
Novedades de Visual Basic Se enumeran las características nuevas de cada versión de Visual Basic .NET.
Recursos adicionales para programadores de Visual Basic Se proporciona una lista de sitios web y grupos de
noticias que ayudan a encontrar respuestas a problemas comunes.

Vea también
Obtener Visual Basic Ofrece vínculos de descarga para las versiones de Visual Studio que son compatibles
con Visual Basic, incluidas las versiones gratuitas.
Programación orientada a objetos Proporciona vínculos a páginas que presentan la programación orientada
a objetos y describen cómo crear sus propios objetos y cómo utilizar objetos para simplificar la escritura del
código.
Ejemplos Proporciona vínculos al código de ejemplo de Visual Basic.
Tutoriales Proporciona una lista de páginas de Ayuda donde se explican aspectos del lenguaje Visual Basic.
Opciones de comentarios para Visual Studio Se explica cómo recibir asistencia y proporcionar información
al servicio técnico.
Visual Studio Proporciona vínculos a la documentación de Visual Studio.
C# Proporciona los vínculos a la documentación sobre desarrollo de aplicaciones con Visual C#.
Visual C++ Proporciona vínculos a la documentación de Visual C++.
Desarrollo de Office y SharePoint Proporciona información sobre cómo usar Microsoft Office y Visual Studio
como parte de una aplicación empresarial.
Recursos adicionales
18/03/2020 • 2 minutes to read • Edit Online

En los siguientes sitios web encontrará orientación y respuestas a algunos problemas comunes.

Recursos de Microsoft
En la Web
URL DESC RIP T IO N

Diseño del lenguaje Visual Basic .NET Repositorio oficial en GitHub para el diseño del lenguaje Visual
Basic .NET.

Blog del equipo de Microsoft Visual Basic Permite acceder al blog del equipo de Visual Basic.

Ejemplos de código
URL DESC RIP T IO N

Ejemplos de documentación de Visual Basic Contiene los ejemplos que se usan en la documentación de
Visual Basic y de .NET.

Foros
URL DESC RIP T IO N

Foros de Visual Basic Se describen problemas generales de Visual Basic.

Vídeos y webcasts
URL DESC RIP T IO N

Channel9 Proporciona una comunidad continua a través de vídeos,


Wikis y foros.

Compatibilidad
URL DESC RIP T IO N

Soporte técnico de Microsoft Proporciona acceso a los artículos de Knowledge Base (KB), a
descargas y actualizaciones, a difusiones web sobre soporte
técnico y a otros servicios.

Preguntas sobre Visual Studio Permite informar de errores o proporcionar sugerencias a


Microsoft sobre .NET y Visual Studio. También puede notificar
un error seleccionando Ayuda > Enviar comentarios >
Notificar un problema en Visual Studio.

Recursos de terceros
URL DESC RIP T IO N

VBForums Proporciona un foro para hablar sobre Visual Basic, .NET y


mucho más.

vbCity Un sitio de la comunidad para que los usuarios obtengan


información y formulen preguntas sobre Visual Basic y .NET.

Desbordamiento de pila Stack Overflow es un sitio en el que los desarrolladores


formulan y contestan preguntas.

Vea también
Introducción a Visual Basic
Hable con nosotros
Desarrollo de aplicaciones con Visual Basic
18/03/2020 • 2 minutes to read • Edit Online

En esta sección se trata la documentación conceptual del lenguaje Visual Basic.

En esta sección
Programación en Visual Basic
Abarca una gran variedad de temas relacionados con la programación.
Desarrollo con la función My
Versa sobre una nueva característica llamada My , que proporciona acceso a información y a instancias de objetos
predeterminados relacionados con una aplicación y su entorno de ejecución.
Obtener acceso a datos en aplicaciones de Visual Basic
Contiene ayuda sobre cómo acceder a los datos de Visual Basic.
Crear y usar componentes en Visual Basic
Se define el término componente y se habla de cómo y cuándo crear componentes.
Fundamentos de las aplicaciones de Windows Forms
Proporciona información sobre cómo crear aplicaciones de Windows Forms usando Visual Studio.
Personalizar proyectos y ampliar My
Describe cómo personalizar plantillas de proyecto para proporcionar objetos de My adicionales.

Secciones relacionadas
Guía de programación en Visual Basic
Se explican los elementos básicos de la programación con Visual Basic.
Referencia del lenguaje Visual Basic
Contiene documentación de referencia del lenguaje Visual Basic.
Programar en Visual Basic
18/03/2020 • 2 minutes to read • Edit Online

En esta sección se describen las tareas de programación sobre las que necesitará obtener información adicional a
medida que crea la aplicación de Visual Basic.

En esta sección
Acceso a los recursos del equipo
Contiene documentación sobre cómo utilizar el objeto My.Computer para acceder a información sobre el equipo en
el que se ejecuta una aplicación y cómo controlar el equipo.
Registrar información de la aplicación
Contiene documentación sobre cómo registrar información de la aplicación mediante los objetos
My.Application.Log y My.Log y cómo ampliar las capacidades de registro de la aplicación.

Acceso a los datos del usuario


Contiene documentación sobre las tareas que puede realizar con el objeto My.User .
Acceso ad los formularios de la aplicación
Contiene documentación sobre el acceso a los formularios de una aplicación mediante los objetos My.Forms y
My.Application .

Acceso a los servicios web de la aplicación


Contiene documentación sobre cómo acceder a los servicios web a los que hace referencia la aplicación con el
objeto My.WebServices .
Accessing Application Settings
Contiene documentación sobre el acceso a la configuración de una aplicación con el objeto My.Settings .
Procesar unidades, directorios y archivos
Contiene documentación sobre cómo acceder al sistema de archivos mediante el objeto My.Computer.FileSystem .

Vea también
Características del lenguaje Visual Basic
Conceptos de programación
Colecciones
Desarrollo de aplicaciones con Visual Basic
Acceso a los recursos del equipo (Visual Basic)
18/03/2020 • 2 minutes to read • Edit Online

El objeto My.Computer es uno de los tres objetos centrales de My que proporcionan acceso a información y
funciones de uso frecuente. My.Computer proporciona los métodos, propiedades y eventos para obtener acceso al
equipo donde se ejecuta la aplicación. Entre sus objetos se incluyen:
Audio
Portapapeles (ClipboardProxy)
Clock
FileSystem
Info
Keyboard
Mouse
Network
Ports
Registro (RegistryProxy)

En esta sección
Reproducir sonidos
Muestra las tareas asociadas a My.Computer.Audio , como reproducir un sonido en segundo plano.
Almacenar y leer datos en el Portapapeles
Muestra las tareas asociadas a My.Computer.Clipboard , como leer datos del Portapapeles o escribir datos en él.
Obtener información acerca del equipo
Muestra las tareas asociadas a My.Computer.Info , como determinar el nombre completo o las direcciones IP de un
equipo.
Acceso al teclado
Muestra las tareas asociadas a My.Computer.Keyboard , como determinar si BLOQ MAYÚS está activado.
Acceso al mouse
Muestra las tareas asociadas a My.Computer.Mouse , como determinar si un mouse está presente.
Realizar operaciones de red
Muestra las tareas asociadas a My.Computer.Network , como cargar o descargar archivos.
Acceso a los puertos del equipo
Muestra las tareas asociadas a My.Computer.Ports , como mostrar los puertos serie disponibles o enviar cadenas a
los puertos serie.
Leer y escribir en el Registro
Muestra las tareas asociadas a My.Computer.Registry , como leer datos de las claves del Registro o escribir datos en
ellas.
Registrar información de la aplicación (Visual Basic)
18/03/2020 • 2 minutes to read • Edit Online

Esta sección contiene temas que explican cómo registrar información sobre su aplicación usando el objeto
My.Application.Log o My.Log y cómo ampliar las capacidades de registro de la aplicación.

El objeto Log proporciona métodos para escribir información en los agentes de escucha de registro de la
aplicación y la propiedad avanzada Log del objeto TraceSource proporciona información de configuración
detallada. El archivo de configuración de la aplicación configura el objeto Log .
El objeto solo está disponible para las aplicaciones ASP.NET. Para las aplicaciones cliente, use
My.Log
My.Application.Log . Para obtener más información, consulta Log.

Tareas
PA RA VEA

Escribir información de eventos en los registros de la Escribir mensajes de registro


aplicación.

Escribir información de excepciones en los registros de la Registrar excepciones


aplicación.

Escribir información de seguimiento en los registros de la Registrar mensajes cuando se inicia o se cierra la aplicación
aplicación cuando se inicia y se cierra la aplicación.

Configurar My.Application.Log para que escriba Escribir información de eventos en un archivo de texto
información en un archivo de texto.

Configurar My.Application.Log para escribir información en Cómo: Escribir el registro de eventos de una aplicación
un registro de eventos.

Cambiar la ubicación dónde My.Application.Log escribe Tutorial: Cambiar el lugar donde My.Application.Log escribe
información. información

Determinar dónde My.Application.Log escribe información. Tutorial: Determinar el lugar en el que My.Application.Log
escribe la información

Crear un agente de escucha de registro personalizado para Tutorial: Crear agentes de escucha de registro personalizados
My.Application.Log .

Filtrar el resultado de los registros My.Application.Log . Tutorial: Filtrar el resultado de My.Application.Log

Vea también
Microsoft.VisualBasic.Logging.Log
Trabajar con registros de aplicaciones
Solución de problemas: Agentes de escucha de registro
Acceso a los datos de usuario (Visual Basic)
18/03/2020 • 2 minutes to read • Edit Online

Esta sección contiene temas que tratan del objeto My.User y de las tareas que se pueden realizar con él.
El objeto My.User proporciona acceso a información sobre los usuarios que han iniciado la sesión devolviendo un
objeto que implementa la interfaz IPrincipal.

Tareas
PA RA VEA

Obtener el nombre de inicio de sesión del usuario Name

Obtener el nombre de dominio del usuario si la aplicación usa CurrentPrincipal


la autenticación de Windows

Determinar el rol del usuario IsInRole

Vea también
User
Acceso a los formularios de aplicaciones (Visual Basic)
18/03/2020 • 2 minutes to read • Edit Online

El objeto My.Forms proporciona una manera fácil de tener acceso a una instancia de cada Windows Form
declarado en el proyecto de la aplicación. También puede usar propiedades del objeto My.Application para tener
acceso a la pantalla de presentación y el formulario principal de la aplicación y para obtener una lista de los
formularios abiertos de la aplicación.

Tareas
En la siguiente tabla se incluyen ejemplos que muestran cómo acceder a los formularios de una aplicación.

PA RA VEA

Tener acceso a un formulario desde otro formulario de una My.Forms (objeto)


aplicación.

Mostrar los títulos de todos los formularios abiertos de la OpenForms


aplicación.

Actualizar la pantalla de presentación con información de SplashScreen


estado como los inicios de la aplicación.

Vea también
OpenForms
SplashScreen
My.Forms (objeto)
Acceso a los servicios Web de aplicaciones (Visual
Basic)
18/03/2020 • 2 minutes to read • Edit Online

El objeto My.WebServices proporciona una instancia de cada servicio Web al que hace referencia el proyecto
actual. Cada una de las instancias se crea a petición. Puede tener acceso a estos servicios Web a través de las
propiedades del objeto My.WebServices . El nombre de la propiedad es igual que el nombre del servicio Web al
que tiene acceso la propiedad. Cualquier clase que hereda de SoapHttpClientProtocol es un servicio web.

Tareas
La tabla siguiente muestra las posibles maneras de tener acceso a los servicios Web a los que hace referencia una
aplicación.

PA RA VEA

Llamar a un servicio Web My.WebServices (objeto)

Llamar de manera asincrónica a un servicio Web y controlar Llamar a un servicio web de forma asincrónica
un evento cuando finaliza

Vea también
My.WebServices (objeto)
Cómo: Llamar a un servicio Web de forma
asincrónica (Visual Basic)
18/03/2020 • 3 minutes to read • Edit Online

En este ejemplo se adjunta un controlador a un evento de controlador asincrónico de servicios web para poder
recuperar el resultado de una llamada de método asincrónico. En este ejemplo se ha usado el servicio web
DemoTemperatureService de http://www.xmethods.net .
Cuando se hace referencia a un servicio web en el proyecto en el entorno de desarrollo integrado (IDE) de Visual
Studio, dicho servicio se agrega al objeto My.WebServices y el IDE genera una clase de proxy de cliente para
obtener acceso al servicio web especificado.
La clase de proxy permite llamar sincrónicamente a los métodos de servicio web, mientras la aplicación espera a
que la función finalice. El proxy crea además otros miembros para ayudar a llamar al método asincrónicamente.
Por cada función de servicio web, NombreDeFunciónDeServicioWeb, el proxy crea una subrutina
NombreDeFunciónDeServicioWeb Async , un evento NombreDeFunciónDeServicioWeb Completed y una clase
NombreDeFunciónDeServicioWeb CompletedEventArgs . En este ejemplo se muestra cómo usar los miembros
asincrónicos para acceder a la función getTemp del servicio web DemoTemperatureService.

NOTE
Este código no funciona en aplicaciones web, ya que ASP.NET no admite el objeto My.WebServices .

Llamada a un servicio web de forma asincrónica


1. Haga referencia al servicio web DemoTemperatureService de http://www.xmethods.net . La dirección es

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

2. Agregue un controlador de eventos para el evento getTempCompleted :

Private Sub getTempCompletedHandler(ByVal sender As Object,


ByVal e As net.xmethods.www.getTempCompletedEventArgs)

MsgBox("Temperature: " & e.Result)


End Sub

NOTE
La instrucción Handles no se puede usar para asociar un controlador de eventos con los eventos del objeto
My.WebServices .

3. Agregue un campo para saber si el controlador de eventos se ha agregado al evento getTempCompleted :

Private handlerAttached As Boolean = False

4. Agregue un método para agregar el controlador de eventos al evento getTempCompleted (en caso necesario)
y para llamar al método getTempAsync :

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

Llame al método getTemp para llamar al método web CallGetTempAsync asincrónicamente. Cuando el
método web finalice, su valor devuelto se pasa al controlador de eventos getTempCompletedHandler .

Vea también
Acceso a los servicios web de la aplicación
My.WebServices (objeto)
Acceso a la configuración de la aplicación (Visual
Basic)
18/03/2020 • 2 minutes to read • Edit Online

Esta sección contiene temas en los que se describe el objeto My.Settings y las tareas que le permite realizar.

My.Settings
Las propiedades del objeto My.Settings proporcionan acceso a la configuración de la aplicación. Para agregar o
quitar la configuración, use el panel Configuración del Diseñador de proyectos .
Los métodos del objeto My.Settings permiten guardar la configuración actual de usuario o revertirla a los últimos
valores guardados.

Tareas
En la siguiente tabla se incluyen ejemplos que muestran cómo acceder a los formularios de una aplicación.

PA RA VEA

Actualizar el valor de una configuración de usuario Cómo: Cambiar la configuración del usuario en Visual Basic

Mostrar configuración de aplicación y usuario en una Cómo: Crear cuadrículas de propiedades para la configuración
cuadrícula de propiedades del usuario en Visual Basic

Guardar los valores de configuración de usuario actualizados Cómo: Conservar la configuración del usuario en Visual Basic

Determinar los valores de la configuración de usuario Cómo: Leer la configuración de la aplicación en Visual Basic

Vea también
Administrar la configuración de la aplicación (.NET)
My.Settings (objeto)
2 minutes to read
Desarrollo con My (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Visual Basic ofrece nuevas características para el desarrollo rápido de aplicaciones que mejoran la productividad y
la facilidad de uso con la máxima eficacia. Una de estas funciones, My , proporciona acceso a información y a las
instancias de objetos predeterminados relacionados con la aplicación y su entorno de ejecución. Esta información
está organizada en un formato que se descubre mediante IntelliSense y se define lógicamente según su uso.
Los miembros de nivel superior de My se exponen como objetos. Cada objeto se comporta de forma similar a un
espacio de nombres o una clase con miembros Shared y expone un conjunto de miembros relacionados.
Esta tabla muestra los objetos My de nivel superior y sus relaciones entre sí.

Esta sección
Realizacion de tareas con My.Application, My.Computer y My.User
Describe los tres objetos principales My , a saber, My.Application , My.Computer y My.User , que proporcionan
acceso a información y funcionalidades.
Instancias de objeto predeterminadas proporcionadas por My.Forms y My.WebServices
Describe los objetos My.Forms y My.WebServices , que proporcionan acceso a formularios, orígenes de datos y
servicios web XML utilizados por la aplicación.
Desarrollo rápido de aplicaciones con My.Resources y My.Settings
Describe los objetos My.Resources y My.Settings , que proporcionan acceso a la configuración y los recursos de
una aplicación.
Información general sobre el modelo de aplicaciones de Visual Basic
Describe el modelo de inicio y cierre de la aplicación Visual Basic.
Cómo My depende del tipo de proyecto
Proporciona información detallada sobre las características My disponibles en diferentes tipos de proyectos.

Vea también
ApplicationBase
Computer
User
My.Forms (objeto)
My.WebServices (objeto)
Cómo My depende del tipo de proyecto
Realizar tareas con My.Application, My.Computer y
My.User (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Los tres objetos de My central que proporcionan acceso a la información y a la funcionalidad de uso común son
My.Application (ApplicationBase), My.Computer (Computer) y My.User (User). Puede usar estos objetos para tener
acceso a la información relacionada con la aplicación actual, el equipo en el que está instalada la aplicación o el
usuario actual de la aplicación, respectivamente.

My. Application, My. Computer y My. User


En los siguientes ejemplos se muestra cómo se puede recuperar información mediante My .

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

' Gets a list of subfolders in a folder


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

Además de recuperar información, los miembros expuestos a través de estos tres objetos también permiten
ejecutar métodos relacionados con ese objeto. Por ejemplo, puede tener acceso a diversos métodos para manipular
archivos o actualizar el registro a través de My.Computer .
La e/s de archivos es mucho más sencilla y más rápida con My , que incluye una variedad de métodos y
propiedades para manipular archivos, directorios y unidades. El objeto TextFieldParser permite leer archivos
estructurados de gran tamaño que tienen campos delimitados o de ancho fijo. En este ejemplo se abre el reader
TextFieldParser y se usa para leer de C:\TestFolder1\test1.txt .

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 cambiar la referencia cultural de la aplicación. En el ejemplo siguiente se muestra cómo se
puede llamar a este método.

' Changes the current culture for the application to Jamaican English.
My.Application.ChangeCulture("en-JM")

Vea también
ApplicationBase
Computer
User
Cómo My depende del tipo de proyecto
Instancias de objeto predeterminadas proporcionadas
por My.Forms y My.WebServices (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Los objetos My. Forms y My. webservices proporcionan acceso a los formularios, orígenes de datos y servicios
Web XML utilizados por la aplicación. Para ello, proporcionan colecciones de instancias predeterminadas de cada
uno de estos objetos.

Instancias predeterminadas
Una instancia predeterminada es una instancia de la clase proporcionada por el motor en tiempo de ejecución y no
es necesario que se declare y cree una instancia de mediante las instrucciones Dim y New . En el ejemplo siguiente
se muestra cómo se podría haber declarado y creado una instancia de una instancia de una clase Form
denominada Form1 y cómo se puede obtener una instancia predeterminada de esta clase Form a través de
My.Forms .

' The old method of declaration and instantiation


Dim myForm As New Form1
myForm.show()

' With My.Forms, you can directly call methods on the default
' instance()
My.Forms.Form1.Show()

El objeto My.Forms devuelve una colección de instancias predeterminadas para cada clase Form que existe en el
proyecto. Del mismo modo, My.WebServices proporciona una instancia predeterminada de la clase de proxy para
cada servicio Web al que se haya creado una referencia en la aplicación.

Vea también
My.Forms (objeto)
My.WebServices (objeto)
Cómo My depende del tipo de proyecto
Desarrollo rápido de aplicaciones con My.Resources y
My.Settings (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

El objeto My.Resources proporciona acceso a los recursos de la aplicación y permite recuperar dinámicamente los
recursos de la aplicación.

Recuperar recursos
Se puede recuperar una serie de recursos, como archivos de audio, iconos, imágenes y cadenas, a través del objeto
My.Resources . Por ejemplo, puede tener acceso a los archivos de recursos específicos de la referencia cultural de la
aplicación. En el ejemplo siguiente se establece el icono del formulario en el icono denominado Form1Icon
almacenado en el archivo de recursos de la aplicación.

Sub SetFormIcon()
Me.Icon = My.Resources.Form1Icon
End Sub

El objeto My.Resources expone solo recursos globales. No proporciona acceso a los archivos de recursos asociados
a los formularios. Debe tener acceso a los recursos de formulario desde el formulario.
De forma similar, el objeto My.Settings proporciona acceso a la configuración de la aplicación y le permite
almacenar y recuperar dinámicamente la configuración de propiedades y otra información de la aplicación. Para
obtener más información, vea My. Resources (objeto ) y My. Settings (objeto).

Vea también
My.Resources (objeto)
My.Settings (objeto)
Accessing Application Settings
Información general sobre el modelo de aplicaciones
de Visual Basic
25/11/2019 • 7 minutes to read • Edit Online

Visual Basic proporciona un modelo bien definido para controlar el comportamiento de las aplicaciones de
Windows Forms: el modelo de aplicación de Visual Basic. Este modelo incluye eventos para controlar el inicio y el
apagado de la aplicación, así como eventos para detectar excepciones no controladas. También proporciona
compatibilidad para desarrollar aplicaciones de instancia única. El modelo de aplicación es extensible, por lo que
los desarrolladores que necesitan más control pueden personalizar sus métodos reemplazables.

Usos del modelo de aplicación


Una aplicación típica necesita realizar tareas al iniciarse y cerrarse. Por ejemplo, cuando se inicia, la aplicación
puede mostrar una pantalla de presentación, establecer conexiones con bases de datos, cargar un estado
guardado, etc. Cuando se cierra la aplicación, puede cerrar las conexiones de base de datos, guardar el estado
actual, etc. Además, la aplicación puede ejecutar código específico cuando la aplicación se cierra de forma
inesperada, como durante una excepción no controlada.
El modelo de aplicación de Visual Basic facilita la creación de una aplicación de instancia única . Una aplicación de
instancia única difiere de una aplicación normal en que solo se puede ejecutar una instancia de la aplicación a la
vez. Un intento de iniciar otra instancia de una aplicación de una sola instancia da como resultado la notificación
de la instancia original (por medio del evento StartupNextInstance ) que se realizó otro intento de inicio. La
notificación incluye los argumentos de línea de comandos de la instancia subsiguiente. A continuación, se cierra la
instancia subsiguiente de la aplicación antes de que se pueda realizar cualquier inicialización.
Se inicia una aplicación de instancia única y comprueba si se trata de la primera instancia o de una instancia
posterior de la aplicación:
Si es la primera instancia, se inicia como de costumbre.
Cada intento posterior de iniciar la aplicación, mientras se ejecuta la primera instancia, da como resultado
un comportamiento muy diferente. El siguiente intento notifica a la primera instancia sobre los argumentos
de la línea de comandos y, a continuación, sale inmediatamente. La primera instancia controla el evento
StartupNextInstance para determinar qué son los argumentos de línea de comandos de la instancia
subsiguiente y continúa ejecutándose.
En este diagrama se muestra cómo una instancia subsiguiente señala la primera instancia:

Al controlar el evento StartupNextInstance , puede controlar el comportamiento de la aplicación de instancia única.


Por ejemplo, Microsoft Outlook normalmente se ejecuta como una aplicación de instancia única. Cuando Outlook
se está ejecutando e intenta volver a iniciar Outlook, el enfoque se desplaza a la instancia original, pero no se abre
otra instancia.

Eventos en el modelo de aplicación


Los siguientes eventos se encuentran en el modelo de aplicación:
Inicio de la aplicación. La aplicación genera el evento Startup cuando se inicia. Al controlar este evento,
puede agregar código que inicialice la aplicación antes de que se cargue el formulario principal. El evento
Startup también proporciona para cancelar la ejecución de la aplicación durante esa fase del proceso de
inicio, si se desea.
Puede configurar la aplicación para mostrar una pantalla de presentación mientras se ejecuta el código de
inicio de la aplicación. De forma predeterminada, el modelo de aplicación suprime la pantalla de
presentación cuando se usa el argumento de línea de comandos /nosplash o -nosplash .
Aplicaciones de una sola instancia . El evento StartupNextInstance se genera cuando se inicia una
instancia subsiguiente de una aplicación de instancia única. El evento pasa los argumentos de línea de
comandos de la instancia subsiguiente.
Excepciones no controladas . Si la aplicación encuentra una excepción no controlada, genera el evento
UnhandledException. El controlador para ese evento puede examinar la excepción y determinar si se va a
continuar la ejecución.
El evento UnhandledException no se genera en algunas circunstancias. Para obtener más información, vea
UnhandledException.
Cambios de conectividad de red . Si cambia la disponibilidad de la red del equipo, la aplicación genera el
evento NetworkAvailabilityChanged.
El evento NetworkAvailabilityChanged no se genera en algunas circunstancias. Para obtener más
información, vea NetworkAvailabilityChanged.
Cierre de la aplicación. La aplicación proporciona el evento Shutdown para indicar cuándo está a punto de
cerrarse. En ese controlador de eventos, puede asegurarse de que se completan las operaciones que debe
realizar la aplicación (cerrando y guardando, por ejemplo). Puede configurar la aplicación para que se cierre
cuando se cierre el formulario principal, o para que se cierre solo cuando se cierren todos los formularios.

Disponibilidad
De forma predeterminada, el modelo de aplicación Visual Basic está disponible para los proyectos de Windows
Forms. Si configura la aplicación para que use un objeto de inicio diferente, o inicia el código de aplicación con un
Sub Main personalizado, ese objeto o clase puede necesitar proporcionar una implementación de la clase
WindowsFormsApplicationBase para utilizar el modelo de aplicación. Para obtener información sobre cómo
cambiar el objeto de inicio, vea Página de aplicación, diseñador de proyectos (Visual Basic).

Vea también
WindowsFormsApplicationBase
Startup
StartupNextInstance
UnhandledException
Shutdown
NetworkAvailabilityChanged
WindowsFormsApplicationBase
Extensión del modelo de la aplicación de Visual Basic
Cómo My depende del tipo de proyecto (Visual
Basic)
27/11/2019 • 5 minutes to read • Edit Online

My expone solo los objetos que requiere un tipo de proyecto determinado. Por ejemplo, el objeto My.Forms está
disponible en una aplicación Windows Forms, pero no está disponible en una aplicación de consola. En este tema
se describe qué objetos My están disponibles en diferentes tipos de proyectos.

Mis en aplicaciones y sitios web de Windows


My expone solo los objetos que son útiles en el tipo de proyecto actual; suprime los objetos que no son
aplicables. Por ejemplo, la siguiente imagen muestra el modelo de objetos de My en un proyecto de Windows
Forms.

En un proyecto de sitio web, My expone objetos que son relevantes para un desarrollador web (como los objetos
My.Request y My.Response ) mientras se suprimen objetos que no son relevantes (como el objeto My.Forms ). En la
imagen siguiente se muestra el modelo de objetos de My en un proyecto de sitio web:
Detalles del proyecto
En la tabla siguiente se muestra qué objetos My están habilitados de forma predeterminada para ocho tipos de
proyecto: aplicación para Windows, biblioteca de clases, aplicación de consola, biblioteca de controles de
Windows, biblioteca de controles Web, servicio de Windows, vacío y sitio Web.
Hay tres versiones del objeto My.Application , dos versiones del objeto My.Computer y dos versiones de My.User
objeto; los detalles sobre estas versiones se proporcionan en las notas a pie de la tabla.

B IB L IOT E
C A DE
A P L IC A C I C O N T RO L B IB L IOT E SERVIC IO
Ó N DE B IB L IOT E A P L IC A C I ES DE C A DE DE
MY W IN DO W C A DE Ó N DE W IN DO W C O N T RO L W IN DO W SIT IO
( O B JETO ) S C L A SES C O N SO L A S ES W EB S VA C ÍO W EB

Sí 1
My.Application Sí 2 Sí 3 Sí 2 No Sí 3 No No

My.Computer Sí 4 Sí 4 Sí 4 Sí 4 Sí 5 Sí 4 No Sí 5

My.Forms Sí No No Sí No No No No

My.Log No No No No No No No Sí

My.Request No No No No No No No Sí

My.Resources Sí Sí Sí Sí Sí Sí No No

My.Response No No No No No No No Sí

My.Settings Sí Sí Sí Sí Sí Sí No No

My.User Sí 6 Sí 6 Sí 6 Sí 6 Sí 7 Sí 6 No Sí 7


My.WebServices Sí Sí Sí Sí Sí No No

1 Windows Forms versión de My.Application . Deriva de la versión de la consola (vea la nota 3); agrega
compatibilidad para interactuar con las ventanas de la aplicación y proporciona el modelo de aplicación Visual
Basic.
versión de la biblioteca de My.Application . Proporciona la funcionalidad básica que necesita una aplicación:
proporciona miembros para escribir en el registro de la aplicación y obtener acceso a la información de la
aplicación.
3 versión de la consola de My.Application. Deriva de la versión de la biblioteca (vea la nota 2) y agrega miembros
adicionales para tener acceso a los argumentos de la línea de comandos de la aplicación e información de
implementación de ClickOnce.
4 versión de Windows de My.Computer . Deriva de la versión del servidor (vea la nota 5) y proporciona acceso a
objetos útiles en un equipo cliente, como el teclado, la pantalla y el mouse.
5 versión del servidor de My.Computer . Proporciona información básica sobre el equipo, como el nombre, el
acceso al reloj, etc.
6 versión de Windows de My.User . Este objeto está asociado a la identidad actual del subproceso.

7
7 versión Web de My.User . Este objeto está asociado a la identidad del usuario de la solicitud HTTP actual de la
aplicación.

Vea también
ApplicationBase
Computer
Log
User
Personalización de los objetos que están disponibles en My
Compilación condicional
-define (Visual Basic)
My.Forms (objeto)
My.Request (objeto)
My.Response (objeto)
My.WebServices (objeto)
Obtener acceso a datos en aplicaciones de Visual
Basic
23/10/2019 • 3 minutes to read • Edit Online

Visual Basic incluye varias características nuevas que ayudan en el desarrollo de aplicaciones que acceden a datos.
Los formularios enlazados a datos para aplicaciones Windows se crean arrastrando elementos desde la ventana
Orígenes de datos hasta el formulario. Se puede enlazar controles a datos arrastrando elementos desde la
ventana de orígenes de datos a los controles existentes.

Secciones relacionadas
Obtener acceso a los datos en Visual Studio
Proporciona vínculos a páginas que tratan sobre la incorporación de funcionalidad de acceso a datos a sus
aplicaciones.
Visual Studio Data Tools para .NET
Proporciona vínculos a páginas en las que se describe la creación de aplicaciones que funcionan con datos
mediante Visual Studio.
LINQ
Proporciona vínculos a temas en los que se describe cómo usar LINQ en Visual Basic.
LINQ to SQL
Proporciona información sobre LINQ to SQL. Incluye ejemplos de programación.
Herramientas LINQ to SQL en Visual Studio
Proporciona vínculos a temas sobre cómo crear un modelo de objetos LINQ to SQL en aplicaciones.
Trabajar con conjuntos de datos en aplicaciones de n capas
Proporciona vínculos a temas sobre cómo crear aplicaciones de datos de niveles múltiples.
Agregar nuevas conexiones
Proporciona vínculos a páginas sobre la conexión de la aplicación a datos con herramientas en tiempo de diseño y
objetos de conexión ADO.NET, mediante Visual Studio.
Herramientas de conjuntos de datos en Visual Studio
Proporciona vínculos a páginas que describen cómo cargar datos en los conjuntos de datos y cómo ejecutar
instrucciones SQL y procedimientos almacenados.
Enlazar controles a los datos en Visual Studio
Proporciona vínculos a páginas que explican cómo se muestran datos en Windows Forms mediante controles
enlazados a datos.
Editar datos en conjuntos de datos
Proporciona vínculos a páginas que describen cómo manipular los datos en las tablas de datos de un conjunto de
datos.
Validar los datos en conjuntos de datos
Proporciona vínculos a páginas que describen cómo agregar validación a un conjunto de datos durante los
cambios de columnas y filas.
Guardar los datos de nuevo en la base de datos
Proporciona vínculos a páginas que explican cómo enviar datos actualizados de una aplicación a la base de datos.
ADO.NET
Describe las clases ADO.NET que exponen servicios de acceso a datos al programador de .NET Framework.
Datos en las soluciones de Office
Contiene vínculos a páginas que explican el funcionamiento de los datos en las soluciones de Office, incluida
información sobre programación orientada a esquemas, almacenamiento de datos en memoria caché y acceso a
datos en el servidor.
Crear y utilizar componentes en Visual Basic
27/11/2019 • 5 minutes to read • Edit Online

Un componente es una clase que implementa la interfaz System.ComponentModel.IComponent o que deriva


directa o indirectamente de una clase que implementa IComponent. Un componente .NET Framework es un objeto
reutilizable, puede interactuar con otros objetos y proporciona control sobre los recursos externos y la
compatibilidad en tiempo de diseño.
Una característica importante de los componentes es que se pueden diseñar, lo que significa que se puede usar una
clase que es un componente en el entorno de desarrollo integrado de Visual Studio. Los componentes se pueden
agregar al cuadro de herramientas, se pueden arrastrar y soltar en un formulario y se pueden manipular en una
superficie de diseño. Observe que la compatibilidad en tiempo de diseño de los componentes está integrada en el
.NET Framework; un desarrollador de componentes no tiene que realizar ningún trabajo adicional para aprovechar
las ventajas de la funcionalidad básica en tiempo de diseño.
Un control es similar a un componente, ya que ambos se pueden diseñar, con la diferencia de que un control
proporciona una interfaz de usuario, mientras que un componente no. Un control debe derivar de una de las clases
de control base: Control o Control.

Cuándo se debe crear un componente


Si la clase se va a usar en una superficie de diseño (como en Windows Forms o en el Diseñador de Web Forms)
pero no tiene ninguna interfaz de usuario, debe ser un componente y debe implementar IComponent, o bien debe
derivarse de una clase que implemente directa o indirectamente IComponent.
Las clases Component y MarshalByValueComponent son implementaciones base de la interfaz IComponent. La
principal diferencia entre estas clases es que la clase Component se calcula por referencia, mientras que
IComponent se calcula por valor. En la lista siguiente se proporcionan directrices generales para los
implementadores.
Si el componente se tiene que calcular por referencia, se debe derivar de Component.
Si el componente se tiene que calcular por valor, se debe derivar de MarshalByValueComponent.
Si el componente no se puede derivar de una de las implementaciones base debido a la herencia única,
implemente IComponent.

Clases de componentes
El espacio de nombres System.ComponentModel proporciona clases que se usan para implementar el
comportamiento de los componentes y controles en tiempo de diseño y en tiempo de ejecución. Este espacio de
nombres incluye las clases bases y las interfaces para implementar atributos y convertidores de tipos, enlazarlos
con orígenes de datos y generar licencias para los componentes.
Las clases de componentes básicas son las siguientes:
Component. Una implementación base para la interfaz IComponent. Esta clase permite el uso compartido de
objetos entre aplicaciones.
MarshalByValueComponent. Una implementación base para la interfaz IComponent.
Container. La implementación base de la interfaz IContainer. Esta clase encapsula cero o más componentes.
Algunas de las clases usadas para la generación de licencias de componentes son las siguientes:
License. Clase base abstracta para todas las licencias. Las licencias se conceden a una instancia específica de
un componente.
LicenseManager. Proporciona propiedades y métodos para agregar una licencia a un componente y
administrar un LicenseProvider.
LicenseProvider. Clase base abstracta para implementar un proveedor de licencias.
LicenseProviderAttribute. Especifica la clase LicenseProvider que se va a usar con una clase.
Clases usadas habitualmente para describir y conservar componentes.
TypeDescriptor. Proporciona información sobre las características de un componente, como sus atributos,
propiedades y eventos.
EventDescriptor. Proporciona información sobre un evento.
PropertyDescriptor. Proporciona información sobre una propiedad.

Secciones relacionadas
Solución de problemas relacionados con la creación de controles y componentes
Se explica cómo solucionar problemas comunes.

Vea también
Cómo: Obtener acceso a las funciones en tiempo de diseño de formularios Windows Forms
Conceptos básicos de las aplicaciones de Windows
Forms (Visual Basic)
27/11/2019 • 13 minutes to read • Edit Online

Una parte importante de Visual Basic es la capacidad de crear Windows Forms aplicaciones que se ejecutan
localmente en los equipos de los usuarios. Puede usar Visual Studio para crear la aplicación y la interfaz de usuario
mediante Windows Forms. Una aplicación Windows Forms se basa en las clases del espacio de nombres
System.Windows.Forms.

Diseño de aplicaciones Windows Forms


Puede crear Windows Forms y aplicaciones de servicios de Windows con Visual Studio. Para obtener más
información, vea los temas siguientes:
Introducción con Windows Forms. Proporciona información sobre cómo crear y programar Windows
Forms.
Windows Forms controles. Colección de temas que detallan el uso de controles de Windows Forms.
Aplicaciones de servicios de Windows. Muestra temas en los que se explica cómo crear servicios de
Windows.

Compilación de interfaces de usuario completas e interactivas


Windows Forms es el componente de cliente inteligente de la .NET Framework, un conjunto de bibliotecas
administradas que permiten tareas de aplicación comunes, como la lectura y la escritura en el sistema de archivos.
Con un entorno de desarrollo como Visual Studio, puede crear Windows Forms aplicaciones que muestran
información, solicitan a los usuarios la entrada de datos y se comunican con equipos remotos a través de una red.
En Windows Forms, un formulario es una superficie visual en la que se muestra información al usuario.
Normalmente, las aplicaciones Windows Forms se compilan colocando controles en formularios y desarrollando
respuestas a las acciones del usuario, como clics del mouse o presiones de teclas. Un control es un elemento de
interfaz de usuario (UI) discreto que muestra datos o acepta la entrada de datos.
Eventos
Cuando un usuario realiza una acción en el formulario o en uno de sus controles, genera un evento. La aplicación
reacciona a estos eventos mediante código y procesa los eventos cuando se producen. Para más información,
consulte el artículo sobre creación de controladores de eventos en Windows Forms.
Controles
Windows Forms contiene diversos controles que puede colocar en formularios: controles que muestran cuadros de
texto, botones, cuadros desplegables, botones de radio e incluso páginas Web. Para obtener una lista de todos los
controles que puede usar en un formulario, consulte el artículo sobre controles que se utilizan en formularios
Windows Forms. Si un control existente no satisface sus necesidades, Windows Forms también permite crear
controles personalizados mediante la clase UserControl.
Windows Forms tiene controles de interfaz de usuario enriquecidos que emulan las características de las
aplicaciones de tecnología avanzada como Microsoft Office. Con el control ToolStrip y el MenuStrip, puede crear
barras de herramientas y menús que contienen texto e imágenes, muestran submenús y hospedan otros controles
como cuadros de texto y cuadros combinados.
Con el diseñador de formularios de arrastrar y colocar de Visual Studio, puede crear fácilmente aplicaciones de
Windows Forms: simplemente seleccione los controles con el cursor y colóquelos donde desee en el formulario. El
diseñador proporciona herramientas como líneas de cuadrícula y "líneas de ajuste" para aprovechar las molestias
de alinear los controles. Y si usa Visual Studio o compilar en la línea de comandos, puede usar los controles
FlowLayoutPanel, TableLayoutPanel y SplitContainer para crear diseños de formulario avanzados con tiempo y
esfuerzo mínimos.
Elementos de interfaz de usuario personalizados
Por último, si debe crear sus propios elementos de interfaz de usuario personalizados, el espacio de nombres
System.Drawing contiene todas las clases que necesita para representar líneas, círculos y otras formas
directamente en un formulario.
Para obtener información paso a paso sobre el uso de estas características, vea los siguientes temas de ayuda.

PA RA C O N SULT E

Creación de una nueva aplicación de Windows Forms con Tutorial 1: crear un visor de imágenes
Visual Studio

Usar controles en formularios Cómo: Agregar controles a Windows Forms

Crear gráficos con System.Drawing Introducción a la programación de gráficos

Crear controles personalizados Cómo: Heredar de una clase UserControl

Mostrar y manipular datos


Muchas aplicaciones deben mostrar datos procedentes de una base de datos, archivo XML, servicio web XML u
otro origen de datos. Windows Forms proporciona un control flexible denominado control de DataGridView para
representar estos datos tabulares en un formato tradicional de filas y columnas, de modo que cada dato ocupe su
propia celda. Con DataGridView puede personalizar la apariencia de celdas individuales, bloquear filas y columnas
arbitrarias en contexto y mostrar controles complejos dentro de las celdas, entre otras características.
La conexión a orígenes de datos a través de una red es una tarea sencilla con las aplicaciones smart client de
Windows Forms. El componente de BindingSource, nuevo con Windows Forms en Visual Studio 2005 y el .NET
Framework 2,0, representa una conexión a un origen de datos y expone métodos para enlazar datos a controles,
desplazarse a los registros anteriores y siguientes, modificar registros y guardar los cambios de nuevo en el origen
original. El control BindingNavigator proporciona una interfaz sencilla en el componente BindingSource para que
los usuarios se desplacen por los registros.
Controles enlazados a datos
Puede crear fácilmente controles enlazados a datos mediante la ventana orígenes de datos, que muestra los
orígenes de datos como bases de datos, servicios web y objetos en el proyecto. Para crear controles enlazados a
datos, arrastre los elementos desde esta ventana hasta los formularios de su proyecto. También puede enlazar
controles existentes a datos si arrastra los objetos desde la ventana Orígenes de datos a los controles existentes.
Configuración
Otro tipo de enlace de datos que puede administrar en Windows Forms es el de configuración. La mayoría de las
aplicaciones cliente inteligentes deben conservar cierta información sobre su estado de tiempo de ejecución, como
el último tamaño conocido de los formularios, y conservar los datos de las preferencias de usuario, como las
ubicaciones predeterminadas para los archivos guardados. La característica de configuración de la aplicación
aborda estos requisitos al proporcionar una manera sencilla de almacenar ambos tipos de configuración en el
equipo cliente. Una vez definida con Visual Studio o un editor de código, esta configuración se conserva como XML
y se vuelve a leer automáticamente en la memoria en tiempo de ejecución.
Para obtener información paso a paso sobre el uso de estas características, vea los siguientes temas de ayuda.

PA RA C O N SULT E

Usar el componente de BindingSource Cómo: Enlazar controles de Windows Forms con el


componente BindingSource mediante el Diseñador

Trabajar con orígenes de datos de ADO.NET Cómo: Ordenar y filtrar datos ADO.NET con el componente
BindingSource de Windows Forms

Usar la ventana orígenes de datos Tutorial: Mostrar datos en Windows Forms

Implementar aplicaciones en equipos cliente


Una vez que haya escrito la aplicación, debe enviarla a los usuarios para que puedan instalarla y ejecutarla en sus
equipos cliente. Con la tecnología ClickOnce, puede implementar sus aplicaciones desde Visual Studio con tan solo
unos clics y proporcionar a los usuarios una dirección URL que apunte a la aplicación en la Web. ClickOnce
administra todos los elementos y dependencias de la aplicación y garantiza que la aplicación está instalada
correctamente en el equipo cliente.
Las aplicaciones ClickOnce se pueden configurar para que se ejecuten solo cuando el usuario está conectado a la
red o para ejecutarse tanto en línea como sin conexión. Cuando se especifica que una aplicación debe admitir el
funcionamiento sin conexión, ClickOnce agrega un vínculo a la aplicación en el menú Inicio del usuario, para que
el usuario pueda abrirla sin usar la dirección URL.
Cuando se actualiza la aplicación, se publica un nuevo manifiesto de implementación y una nueva copia de la
aplicación en el servidor web. ClickOnce detecta que hay una actualización disponible y actualiza la instalación del
usuario; no se requiere ninguna programación personalizada para actualizar los ensamblados antiguos.
Para obtener una introducción completa a ClickOnce, consulte seguridad e implementación de ClickOnce. Para
obtener información paso a paso sobre el uso de estas características, vea los siguientes temas de ayuda:

PA RA C O N SULT E

Implementar una aplicación con ClickOnce Cómo: Publicar una aplicación ClickOnce mediante el Asistente
para publicación

Tutorial: Implementar manualmente una aplicación ClickOnce

Actualizar una implementación ClickOnce Cómo: Administrar actualizaciones de aplicaciones ClickOnce

Administrar la seguridad con ClickOnce Cómo: Habilitar la configuración de seguridad de ClickOnce

Otros controles y características


Hay muchas otras características en Windows Forms que simplifican y agilizan las tareas comunes de
implementación, como la posibilidad de crear cuadros de diálogo, imprimir, agregar ayuda y documentación, y
localizar la aplicación a varios idiomas. Además, Windows Forms se basa en el sólido sistema de seguridad de la
.NET Framework, lo que le permite publicar aplicaciones más seguras para sus clientes.
Para obtener información paso a paso sobre el uso de estas características, vea los siguientes temas de ayuda:
PA RA C O N SULT E

Imprimir el contenido de un formulario Cómo: Imprimir gráficos en Windows Forms

Cómo: Imprimir un archivo de texto de varias páginas en


formularios Windows Forms

Más información sobre la seguridad de Windows Forms Información general sobre la seguridad en Windows Forms

Vea también
WindowsFormsApplicationBase
Información general sobre formularios Windows Forms
My.Forms (objeto)
Personalizar proyectos y ampliar My con Visual Basic
27/11/2019 • 2 minutes to read • Edit Online

Puede personalizar las plantillas de proyecto para proporcionar objetos de My adicionales. Esto facilita a otros
desarrolladores la búsqueda y el uso de los objetos.

En esta sección
Extender el espacio de nombres My en Visual Basic
Describe cómo agregar miembros personalizados y valores al espacio de nombres My en Visual Basic.
Empaquetado e implementación de extensiones de My personalizadas
Describe cómo publicar extensiones de espacio de nombres de My personalizado mediante el uso de plantillas
de Visual Studio.
Extensión del modelo de la aplicación de Visual Basic
Describe cómo especificar sus propias extensiones para el modelo de aplicación mediante la invalidación de
miembros de la clase WindowsFormsApplicationBase.
Personalización de los objetos que están disponibles en My
Describe cómo controlar qué objetos de My se habilitan estableciendo la constante de compilación condicional
de _del proyecto.

Secciones relacionadas
Desarrollo con la función My
Describe qué objetos My están disponibles de forma predeterminada en distintos tipos de proyecto.
Información general sobre el modelo de aplicaciones de Visual Basic
Describe el modelo de Visual Basic para controlar el comportamiento de las aplicaciones de Windows Forms.
Cómo My depende del tipo de proyecto
Describe qué objetos My están disponibles de forma predeterminada en distintos tipos de proyecto.
Compilación condicional
Describe cómo el compilador utiliza la compilación condicional para seleccionar secciones de código
determinadas para compilar y excluir otras secciones.
ApplicationBase
Describe el objeto de My que proporciona propiedades, métodos y eventos relacionados con la aplicación
actual.

Vea también
Desarrollo de aplicaciones con Visual Basic
Extender el espacio de nombres My en Visual Basic
27/11/2019 • 17 minutes to read • Edit Online

El espacio de nombres My de Visual Basic expone propiedades y métodos que le permiten aprovechar fácilmente
la eficacia de la .NET Framework. El espacio de nombres My simplifica los problemas comunes de programación,
lo que a menudo reduce una tarea difícil a una sola línea de código. Además, el espacio de nombres My es
totalmente extensible, por lo que puede personalizar el comportamiento de My y agregar nuevos servicios a su
jerarquía para adaptarse a las necesidades específicas de la aplicación. En este tema se explica cómo personalizar
los miembros existentes del espacio de nombres My y cómo agregar sus propias clases personalizadas al espacio
de nombres My .

Personalización de los miembros de espacio de nombres My existentes


El espacio de nombres My de Visual Basic expone información de uso frecuente sobre su aplicación, su equipo,
etc. Para obtener una lista completa de los objetos del espacio de nombres My , vea mi referencia. Es posible que
tenga que personalizar los miembros existentes del espacio de nombres My de modo que se ajusten mejor a las
necesidades de la aplicación. Cualquier propiedad de un objeto en el espacio de nombres My que no sea de solo
lectura se puede establecer en un valor personalizado.
Por ejemplo, suponga que utiliza con frecuencia el objeto My.User para tener acceso al contexto de seguridad
actual para el usuario que ejecuta la aplicación. Sin embargo, su empresa usa un objeto de usuario personalizado
para exponer información adicional y capacidades para los usuarios de la empresa. En este escenario, puede
reemplazar el valor predeterminado de la propiedad My.User.CurrentPrincipal por una instancia de su propio
objeto de entidad de seguridad personalizada, como se muestra en el ejemplo siguiente:

My.User.CurrentPrincipal = CustomPrincipal

Al establecer la propiedad CurrentPrincipal en el objeto My.User , cambia la identidad en la que se ejecuta la


aplicación. El objeto My.User , a su vez, devuelve información sobre el usuario recién especificado.

Agregar miembros a objetos My


Los tipos devueltos de My.Application y My.Computer se definen como clases Partial . Por consiguiente, puede
extender los objetos My.Application y My.Computer creando una clase de Partial denominada MyApplication o
MyComputer . La clase no puede ser una clase Private . Si especifica la clase como parte del espacio de nombres
My , puede Agregar propiedades y métodos que se incluirán con los objetos My.Application o My.Computer .

En el ejemplo siguiente se agrega una propiedad denominada DnsServerIPAddresses al objeto My.Computer :


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

Agregar objetos personalizados al espacio de nombres My


Aunque el espacio de nombres My proporciona soluciones para muchas tareas de programación comunes, puede
encontrar tareas que el espacio de nombres My no soluciona. Por ejemplo, la aplicación podría tener acceso a los
servicios de directorio personalizados para los datos de usuario, o bien la aplicación podría utilizar ensamblados
que no se instalan de forma predeterminada con Visual Basic. Puede extender el espacio de nombres My para
incluir soluciones personalizadas a las tareas comunes que son específicas de su entorno. El espacio de nombres
My se puede ampliar fácilmente para agregar nuevos miembros a fin de satisfacer las necesidades crecientes de
las aplicaciones. Además, puede implementar las extensiones de espacio de nombres de My para otros
desarrolladores como una plantilla de Visual Basic.
Agregar miembros al espacio de nombres My

Dado que My es un espacio de nombres como cualquier otro espacio de nombres, puede agregarle propiedades
de nivel superior simplemente agregando un módulo y especificando un Namespace de My . Anote el módulo con
el atributo HideModuleName como se muestra en el ejemplo siguiente. El atributo HideModuleName garantiza que
IntelliSense no mostrará el nombre del módulo cuando muestre los miembros del espacio de nombres My .

Namespace My
<HideModuleName()>
Module MyCustomModule

End Module
End Namespace

Para agregar miembros al espacio de nombres My , agregue las propiedades según sea necesario al módulo. Para
cada propiedad agregada al espacio de nombres My , agregue un campo privado de tipo
ThreadSafeObjectProvider(Of T) , donde el tipo es el tipo devuelto por la propiedad personalizada. Este campo se
usa para crear instancias de objetos seguros para subprocesos que la propiedad devolverá llamando al método
GetInstance . Como resultado, cada subproceso que tiene acceso a la propiedad extendida recibe su propia
instancia del tipo devuelto. En el ejemplo siguiente se agrega una propiedad denominada SampleExtension que es
de tipo SampleExtension al espacio de nombres My :

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

Agregar eventos a objetos de My personalizados


Puede usar el objeto My.Application para exponer eventos para los objetos My personalizados extendiendo la
MyApplication clase parcial en el espacio de nombres My . En el caso de los proyectos basados en Windows,
puede hacer doble clic en el nodo mi proyecto en para el proyecto en Explorador de soluciones . En el
Diseñador de proyectos de Visual Basic, haga clic en la pestaña aplicación y, a continuación, haga clic en el
botón ver eventos de aplicaciones . Se creará un nuevo archivo denominado ApplicationEvents. VB . Contiene
el código siguiente para extender la clase MyApplication :

Namespace My
Partial Friend Class MyApplication
End Class
End Namespace

Puede agregar controladores de eventos para los objetos de My personalizados agregando controladores de
eventos personalizados a la clase MyApplication . Los eventos personalizados permiten agregar código que se
ejecutará cuando se agregue o se quite un controlador de eventos, o cuando se genere el evento. Tenga en cuenta
que el código de AddHandler para un evento personalizado solo se ejecuta si un usuario agrega el código para
controlar el evento. Por ejemplo, considere que el objeto SampleExtension de la sección anterior tiene un evento
Load para el que desea agregar un controlador de eventos personalizado. En el ejemplo de código siguiente se
muestra un controlador de eventos personalizado denominado SampleExtensionLoad que se invocará cuando se
produzca el evento de My.SampleExtension.Load . Cuando se agrega código para controlar el nuevo evento
My.SampleExtensionLoad , se ejecuta la parte AddHandler de este código de evento personalizado. El método
MyApplication_SampleExtensionLoad se incluye en el ejemplo de código para mostrar un ejemplo de un controlador
de eventos que controla el evento My.SampleExtensionLoad . Tenga en cuenta que el evento SampleExtensionLoad
estará disponible al seleccionar la opción mis eventos de aplicación en la lista desplegable de la izquierda
situada encima del editor de código cuando se edita el archivo ApplicationEvents. 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

Directrices de diseño
Al desarrollar extensiones para el espacio de nombres My , utilice las siguientes directrices para ayudar a
minimizar los costos de mantenimiento de los componentes de extensión:
Incluya solo la lógica de la extensión. La lógica incluida en la extensión de espacio de nombres My debe
incluir solo el código necesario para exponer la funcionalidad necesaria en el espacio de nombres My . Dado
que la extensión residirá en los proyectos de usuario como código fuente, la actualización del componente de
extensión incurrirá en un alto costo de mantenimiento y se debe evitar si es posible.
Minimizar suposiciones de proyecto. Al crear las extensiones del espacio de nombres My , no asuma un
conjunto de referencias, importaciones de nivel de proyecto o configuraciones de compilador específicas (por
ejemplo, Option Strict desactivada). En su lugar, minimice las dependencias y califique totalmente todas las
referencias de tipos mediante la palabra clave Global . Además, asegúrese de que la extensión se compila con
Option Strict activado para minimizar los errores de la extensión.
Aísle el código de la extensión. Al colocar el código en un único archivo, la extensión se podrá implementar
fácilmente como una plantilla de elemento de Visual Studio. Para obtener más información, vea "empaquetar e
implementar extensiones" más adelante en este tema. Colocar todos los My código de extensión de espacio de
nombres en un solo archivo o en una carpeta independiente de un proyecto también ayudará a los usuarios a
encontrar la extensión de espacio de nombres My .

Diseñar bibliotecas de clases para My


Como es el caso de la mayoría de los modelos de objetos, algunos modelos de diseño funcionan bien en el espacio
de nombres My y otros no. Al diseñar una extensión para el espacio de nombres My , tenga en cuenta los
siguientes principios:
Métodos sin estado. Los métodos del espacio de nombres My deben proporcionar una solución completa a
una tarea específica. Asegúrese de que los valores de parámetro que se pasan al método proporcionan toda la
entrada necesaria para completar la tarea en cuestión. Evite crear métodos que se basen en el estado anterior,
como conexiones abiertas a recursos.
Instancias globales. El único Estado que se mantiene en el espacio de nombres My es global en el proyecto.
Por ejemplo, My.Application.Info encapsula el estado que se comparte en toda la aplicación.
Tipos de parámetros simples. Evite las cosas sencillas evitando tipos de parámetro complejos. En su lugar,
cree métodos que no tomen ninguna entrada de parámetros o que tomen tipos de entrada simples como
cadenas, tipos primitivos, etc.
Métodos de generador. Algunos tipos son necesariamente difíciles de crear instancias. Proporcionar
métodos de fábrica como extensiones para el espacio de nombres My permite detectar y consumir más
fácilmente los tipos que se encuentran en esta categoría. Un ejemplo de un Factory Method que funciona bien
es My.Computer.FileSystem.OpenTextFileReader . Hay varios tipos de secuencias disponibles en el .NET
Framework. Al especificar los archivos de texto específicamente, el OpenTextFileReader ayuda al usuario a
comprender qué secuencia usar.
Estas instrucciones no impiden los principios de diseño generales de las bibliotecas de clases. En su lugar, son
recomendaciones que están optimizadas para los desarrolladores que usan Visual Basic y el espacio de nombres
My . Para obtener los principios de diseño generales para crear bibliotecas de clases, vea directrices de diseño de
marco.

Empaquetar e implementar extensiones


Puede incluir My extensiones de espacio de nombres en una plantilla de proyecto de Visual Studio, o puede
empaquetar las extensiones e implementarlas como una plantilla de elementos de Visual Studio. Al empaquetar las
extensiones de espacio de nombres de My como una plantilla de elementos de Visual Studio, puede aprovechar
las capacidades adicionales que proporciona Visual Basic. Estas funcionalidades permiten incluir una extensión
cuando un proyecto hace referencia a un ensamblado determinado, o bien permitir que los usuarios agreguen
explícitamente la extensión de espacio de nombres My mediante la página mis extensiones del diseñador de
proyectos de Visual Basic.
Para obtener más información sobre cómo implementar My extensiones de espacio de nombres, consulte
empaquetar e implementar extensiones My personalizadas.

Vea también
Empaquetado e implementación de extensiones de My personalizadas
Extensión del modelo de la aplicación de Visual Basic
Personalización de los objetos que están disponibles en My
Página Mis extensiones del Diseñador de proyectos
Página de aplicación, Diseñador de proyectos (Visual Basic)
Partial
Empaquetar e implementar extensiones My
personalizadas (Visual Basic)
27/11/2019 • 9 minutes to read • Edit Online

Visual Basic proporciona una manera fácil de implementar las extensiones de espacio de nombres de My
personalizadas mediante plantillas de Visual Studio. Si va a crear una plantilla de proyecto para la que las
extensiones de My son una parte integral del nuevo tipo de proyecto, puede incluir simplemente el código
personalizado de la extensión de My con el proyecto cuando exporte la plantilla. Para obtener más información
sobre cómo exportar plantillas de proyecto, vea Cómo: crear plantillas de proyecto.
Si la extensión de My personalizada se encuentra en un solo archivo de código, puede exportar el archivo como
una plantilla de elementos que los usuarios pueden agregar a cualquier tipo de proyecto de Visual Basic. A
continuación, puede personalizar la plantilla de elemento para habilitar funciones adicionales y el comportamiento
de la extensión de My personalizada en un proyecto de Visual Basic. Estas funcionalidades incluyen las siguientes:
Permitir a los usuarios administrar la extensión de My personalizada desde la página mis extensiones del
diseñador de proyectos de Visual Basic.
Agregar automáticamente la extensión de My personalizada cuando se agrega a un proyecto una
referencia a un ensamblado especificado.
Ocultar la plantilla de elemento de extensión My en el cuadro de diálogo Agregar elemento para que no
se incluya en la lista de elementos de proyecto.
En este tema se describe cómo empaquetar una extensión de My personalizada como una plantilla de elementos
oculta que se puede administrar desde la página mis extensiones del diseñador de proyectos de Visual Basic.
También se puede Agregar automáticamente la extensión de My personalizada cuando se agrega a un proyecto
una referencia a un ensamblado especificado.

Crear una extensión de espacio de nombres My


El primer paso para crear un paquete de implementación para una extensión de My personalizada es crear la
extensión como un solo archivo de código. Para obtener información detallada e instrucciones sobre cómo crear
una extensión de My personalizada, vea extender el espacio de nombres My en Visual Basic.

Exportar una extensión de espacio de nombres My como una plantilla


de elementos
Después de tener un archivo de código que incluya la extensión de espacio de nombres My , puede exportar el
archivo de código como una plantilla de elementos de Visual Studio. Para obtener instrucciones sobre cómo
exportar un archivo como una plantilla de elementos de Visual Studio, vea Cómo: crear plantillas de elementos.

NOTE
Si la extensión de espacio de nombres de My tiene una dependencia en un ensamblado determinado, puede personalizar la
plantilla de elemento para instalar automáticamente la extensión de espacio de nombres de My cuando se agrega una
referencia a ese ensamblado. Como resultado, querrá excluir esa referencia de ensamblado al exportar el archivo de código
como una plantilla de elementos de Visual Studio.
Personalizar la plantilla de elemento
Puede habilitar la administración de la plantilla de elementos desde la página mis extensiones del diseñador de
proyectos de Visual Basic. También puede habilitar la plantilla de elementos que se agregará automáticamente
cuando se agregue una referencia a un ensamblado especificado a un proyecto. Para habilitar estas
personalizaciones, agregará un nuevo archivo, denominado archivo CustomData, a la plantilla y, a continuación,
agregará un nuevo elemento al XML en el archivo. vstemplate.
Agregar el archivo CustomData
El archivo CustomData es un archivo de texto que tiene la extensión de nombre de archivo. CustomData (el
nombre de archivo se puede establecer en cualquier valor significativo para la plantilla) y que contiene XML. El
XML del archivo CustomData indica a Visual Basic que incluya su extensión de My cuando los usuarios usen la
página mis extensiones del diseñador de proyectos de Visual Basic. Opcionalmente, puede Agregar el <
AssemblyFullName> atributo al archivo CustomData XML. Esto indica a Visual Basic que instale automáticamente la
extensión de My personalizada cuando se agrega al proyecto una referencia a un ensamblado determinado.
Puede usar cualquier editor de texto o editor XML para crear el archivo CustomData y, a continuación, agregarlo a
la carpeta comprimida de la plantilla de elementos (archivo. zip).
Por ejemplo, el código XML siguiente muestra el contenido de un archivo CustomData que agregará el elemento
de plantilla a la carpeta My Extensions de un proyecto Visual Basic cuando se agregue al proyecto una referencia al
ensamblado Microsoft. VisualBasic. PowerPacks. vs. dll.

<VBMyExtensionTemplate
ID="Microsoft.VisualBasic.Samples.MyExtensions.MyPrinterInfo"
Version="1.0.0.0"
AssemblyFullName="Microsoft.VisualBasic.PowerPacks.vs"
/>

El archivo CustomData contiene un < VBMyExtensionTemplate> elemento que tiene los atributos que se muestran en
la tabla siguiente.

AT RIB UTO DESC RIP C IÓ N

ID Obligatorio. Identificador único de la extensión. Si la extensión


que tiene este identificador ya se ha agregado al proyecto, no
se le pedirá al usuario que lo agregue de nuevo.

Version Obligatorio. Un número de versión para la plantilla de


elemento.

AssemblyFullName Opcional. Nombre de ensamblado. Cuando se agrega al


proyecto una referencia a este ensamblado, se le pedirá al
usuario que agregue la extensión My a partir de esta plantilla
de elemento.

Agregue el elemento <CustomDataSignature > al archivo. vstemplate.


Para identificar la plantilla de elementos de Visual Studio como una extensión de espacio de nombres My ,
también debe modificar el archivo. vstemplate para la plantilla de elementos. Debe agregar un elemento
<CustomDataSignature> al elemento <TemplateData> . El elemento <CustomDataSignature> debe contener el
Microsoft.VisualBasic.MyExtension de texto, como se muestra en el ejemplo siguiente.

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

Los archivos de una carpeta comprimida (archivo. zip) no se pueden modificar directamente. Debe copiar el
archivo. vstemplate de la carpeta comprimida, modificarlo y, a continuación, reemplazar el archivo. vstemplate de
la carpeta comprimida por la copia actualizada.
En el ejemplo siguiente se muestra el contenido de un archivo. vstemplate que tiene agregado el elemento
<CustomDataSignature> .

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

Instalación de la plantilla
Para instalar la plantilla, puede copiar la carpeta comprimida (archivo . zip ) en la carpeta de plantillas de
elementos de Visual Basic. De forma predeterminada, las plantillas de elemento de usuario se encuentran en
%userprofile%\Documents\Visual Studio <versión>\Templates\ItemTemplates\Visual Basic. Como alternativa,
puede publicar la plantilla como un archivo Instalador de Visual Studio ( . VSI).

Vea también
Extender el espacio de nombres My en Visual Basic
Extensión del modelo de la aplicación de Visual Basic
Personalización de los objetos que están disponibles en My
Página Mis extensiones del Diseñador de proyectos
Ampliar el modelo de la aplicación de Visual Basic
25/11/2019 • 10 minutes to read • Edit Online

Puede Agregar funcionalidad al modelo de aplicación invalidando el Overridable miembros de la clase


WindowsFormsApplicationBase. Esta técnica permite personalizar el comportamiento del modelo de aplicación y
agregar llamadas a sus propios métodos a medida que la aplicación se inicia y se cierra.

Información general visual del modelo de aplicación


En esta sección se presenta visualmente la secuencia de llamadas a función en el modelo de aplicación Visual
Basic. En la siguiente sección se describe detalladamente el propósito de cada función.
En el gráfico siguiente se muestra la secuencia de llamada del modelo de aplicación en una aplicación Visual Basic
Windows Forms normal. La secuencia se inicia cuando el procedimiento Sub Main llama al método Run.

El modelo de aplicación de Visual Basic también proporciona los eventos StartupNextInstance y


UnhandledException. Los gráficos siguientes muestran el mecanismo para generar estos eventos.

Reemplazar los métodos base


El método Run define el orden en el que se ejecutan los métodos de Application . De forma predeterminada, el
procedimiento Sub Main para una aplicación Windows Forms llama al método Run.
Si la aplicación es una aplicación normal (aplicación de varias instancias) o la primera instancia de una aplicación
de una sola instancia, el método Run ejecuta los métodos de Overridable en el orden siguiente:
1. OnInitializeOperador De forma predeterminada, este método establece los estilos visuales, los estilos de
presentación de texto y la entidad de seguridad actual del subproceso de aplicación principal (si la
aplicación usa la autenticación de Windows) y llama a ShowSplashScreen si no se utiliza /nosplash ni
-nosplash como argumento de la línea de comandos.

La secuencia de inicio de la aplicación se cancela si esta función devuelve False . Esto puede ser útil si hay
circunstancias en las que la aplicación no se debe ejecutar.
El método OnInitialize llama a los métodos siguientes:
a. ShowSplashScreenOperador Determina si la aplicación tiene una pantalla de presentación definida y,
en caso de hacerlo, muestra la pantalla de presentación en un subproceso independiente.
El método ShowSplashScreen contiene el código que muestra la pantalla de presentación durante al
menos el número de milisegundos especificado por la propiedad
MinimumSplashScreenDisplayTime. Para usar esta funcionalidad, debe agregar la pantalla de
presentación a la aplicación mediante el Diseñador de proyectos (que establece la propiedad
My.Application.MinimumSplashScreenDisplayTime en dos segundos) o establecer la propiedad
My.Application.MinimumSplashScreenDisplayTime en un método que invalide el método OnInitialize o
OnCreateSplashScreen. Para obtener más información, vea MinimumSplashScreenDisplayTime.
b. OnCreateSplashScreenOperador Permite a un diseñador emitir código que inicializa la pantalla de
presentación.
De forma predeterminada, este método no hace nada. Si selecciona una pantalla de presentación
para la aplicación en el Diseñador de proyectos de Visual Basic, el diseñador invalida el método
OnCreateSplashScreen con un método que establece la propiedad SplashScreen en una nueva
instancia del formulario de pantalla de presentación.
2. OnStartupOperador Proporciona un punto de extensibilidad para generar el evento Startup . La secuencia
de inicio de la aplicación se detiene si esta función devuelve False .
De forma predeterminada, este método genera el evento Startup. Si el controlador de eventos establece la
propiedad Cancel del argumento de evento en True , el método devuelve False para cancelar el inicio de
la aplicación.
3. OnRunOperador Proporciona el punto de partida para cuando la aplicación principal está lista para
comenzar a ejecutarse, una vez finalizada la inicialización.
De forma predeterminada, antes de entrar en el Windows Forms bucle de mensajes, este método llama al
OnCreateMainForm (para crear el formulario principal de la aplicación) y HideSplashScreen (para cerrar la
pantalla de presentación):
a. OnCreateMainFormOperador Proporciona una forma para que un diseñador emita código que
inicializa el formulario principal.
De forma predeterminada, este método no hace nada. Sin embargo, cuando se selecciona un
formulario principal de la aplicación en el Diseñador de proyectos de Visual Basic, el diseñador
invalida el método OnCreateMainForm con un método que establece la propiedad MainForm en una
nueva instancia del formulario principal.
b. HideSplashScreenOperador Si la aplicación tiene una pantalla de presentación definida y está
abierta, este método cierra la pantalla de presentación.
De forma predeterminada, este método cierra la pantalla de presentación.
4. OnStartupNextInstanceOperador Proporciona una manera de personalizar el comportamiento de una
aplicación de una sola instancia cuando se inicia otra instancia de la aplicación.
De forma predeterminada, este método genera el evento StartupNextInstance.
5. OnShutdownOperador Proporciona un punto de extensibilidad para generar el evento Shutdown . Este
método no se ejecuta si se produce una excepción no controlada en la aplicación principal.
De forma predeterminada, este método genera el evento Shutdown.
6. OnUnhandledExceptionOperador Se ejecuta si se produce una excepción no controlada en cualquiera de los
métodos enumerados anteriormente.
De forma predeterminada, este método genera el evento UnhandledException siempre que no se adjunte
un depurador y la aplicación controle el evento de UnhandledException .
Si la aplicación es una aplicación de instancia única y la aplicación ya se está ejecutando, la instancia subsiguiente
de la aplicación llama al método OnStartupNextInstance en la instancia original de la aplicación y, a continuación,
se cierra.
El constructor OnStartupNextInstance(StartupNextInstanceEventArgs) llama a la propiedad
UseCompatibleTextRendering para determinar qué motor de representación de texto se va a utilizar para los
formularios de la aplicación. De forma predeterminada, la propiedad UseCompatibleTextRendering devuelve
False , que indica que se utilizará el motor de representación de texto GDI, que es el valor predeterminado en
Visual Basic 2005 y versiones posteriores. Puede invalidar la propiedad UseCompatibleTextRendering para
devolver True , que indica que se utilizará el motor de representación de texto GDI+, que es el valor
predeterminado en Visual Basic .NET 2002 y Visual Basic .NET 2003.

Configuración de la aplicación
Como parte del modelo de aplicación de Visual Basic, la clase WindowsFormsApplicationBase proporciona
propiedades protegidas que configuran la aplicación. Estas propiedades se deben establecer en el constructor de
la clase de implementación.
En un proyecto de Windows Forms predeterminado, el Diseñador de proyectos crea código para establecer las
propiedades con la configuración del diseñador. Las propiedades solo se usan cuando se inicia la aplicación; su
configuración después de que se inicie la aplicación no tiene ningún efecto.

C O N F IGURA C IÓ N EN EL PA N EL
A P L IC A C IÓ N DEL DISEÑ A DO R DE
P RO P IEDA D. DET ERM IN A P RO Y EC TO S

IsSingleInstance Si la aplicación se ejecuta como una Casilla crear aplicación de instancia


aplicación de instancia única o de varias única
instancias.

EnableVisualStyles Si la aplicación va a usar estilos visuales Casilla habilitar estilos visuales de


que coincidan con Windows XP. XP

SaveMySettingsOnExit Si la aplicación guarda Casilla Guardar My. Settings al


automáticamente los cambios de apagar
configuración de usuario de la
aplicación cuando se cierra la aplicación.
C O N F IGURA C IÓ N EN EL PA N EL
A P L IC A C IÓ N DEL DISEÑ A DO R DE
P RO P IEDA D. DET ERM IN A P RO Y EC TO S

ShutdownStyle Lo que hace que la aplicación finalice, Lista de modos de apagado


por ejemplo, cuando el formulario de
inicio se cierra o cuando se cierra la
última forma.

Vea también
ApplicationBase
Startup
StartupNextInstance
UnhandledException
Shutdown
NetworkAvailabilityChanged
Información general sobre el modelo de aplicaciones de Visual Basic
Página de aplicación, Diseñador de proyectos (Visual Basic)
Personalizar los objetos que están disponibles en My
(Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

En este tema se describe cómo puede controlar qué objetos de My se habilitan estableciendo la constante de
compilación condicional del proyecto _MYTYPE . El entorno de desarrollo integrado (IDE) de Visual Studio mantiene
el _MYTYPE constante de compilación condicional para un proyecto sincronizado con el tipo del proyecto.

Valores predefinidos de _de tipo


Debe utilizar la opción del compilador /define para establecer la _MYTYPE constante de compilación condicional.
Al especificar su propio valor para la constante _MYTYPE , debe incluir el valor de cadena en las secuencias de la
barra diagonal inversa/comilla (\"). Por ejemplo, podría usar:

/define:_MYTYPE=\"WindowsForms\"

En esta tabla se muestra cómo se establece la constante de compilación condicional de _MYTYPE para varios tipos
de proyecto.

T IP O DE P RO Y EC TO _VA LO R DE T IP O

Biblioteca de clases Windows

Aplicación de consola Console

Web Web

Biblioteca de controles Web WebControl

Aplicación de Windows WindowsForms

Aplicación para Windows, al iniciar con el Sub Main "WindowsFormsWithCustomSubMain"


personalizado

Biblioteca de controles de Windows Windows

Servicio de Windows Console

Vacío Vacía

NOTE
Todas las comparaciones de cadenas de compilación condicional distinguen mayúsculas de minúsculas, independientemente
de cómo se establezca la instrucción Option Compare .

Dependientes _mis constantes de compilación


A su vez, el _MYTYPE constante de compilación condicional controla los valores de varias otras constantes de
compilación _MY :

_M YA P P L IC AT IO _M Y C O M P UT ERT _M Y W EB SERVIC E
_DE T IP O NT YPE YPE _ _M Y USERT Y P E S

Console Console Windows Sin definir Windows TRUE

Personal Sin definir Sin definir Sin definir Sin definir Sin definir

Vacía Sin definir Sin definir Sin definir Sin definir Sin definir

Web Sin definir Web FALSE Web FALSE

WebControl Sin definir Web FALSE Web TRUE

"Windows" o "" Windows Windows Sin definir Windows TRUE

WindowsForms WindowsForms Windows TRUE Windows TRUE

"WindowsForms Console Windows TRUE Windows TRUE


WithCustomSub
Main"

De forma predeterminada, las constantes de compilación condicional sin definir se resuelven en FALSE . Puede
especificar valores para las constantes no definidas al compilar el proyecto para invalidar el comportamiento
predeterminado.

NOTE
Cuando _MYTYPE se establece en "Custom", el proyecto contiene el espacio de nombres My , pero no contiene ningún
objeto. Sin embargo, si se establece _MYTYPE en "Empty", se impide que el compilador agregue el espacio de nombres My
y sus objetos.

En esta tabla se describen los efectos de los valores predefinidos de las constantes de compilación _MY .

C O N STA N T E SIGN IF IC A DO

_MYAPPLICATIONTYPE Habilita My.Application , si la constante es "Console",


"Windows" o "WindowsForms":

-La versión "Console" deriva de ConsoleApplicationBase. y


tiene menos miembros que la versión "Windows".
-La versión "Windows" deriva de ApplicationBase. y tiene
menos miembros que la versión "WindowsForms".
-La versión "WindowsForms" de My.Application deriva de
WindowsFormsApplicationBase. Si la constante TARGET se
define como "winexe", la clase incluye un método Sub Main .

_MYCOMPUTERTYPE Habilita My.Computer , si la constante es "Web" o "Windows":

-La versión "Web" deriva de ServerComputery tiene menos


miembros que la versión "Windows".
-La versión "Windows" de My.Computer deriva de Computer.
C O N STA N T E SIGN IF IC A DO

_MYFORMS Habilita My.Forms , si la constante se TRUE .

_MYUSERTYPE Habilita My.User , si la constante es "Web" o "Windows":

-La versión "Web" de My.User está asociada a la identidad


del usuario de la solicitud HTTP actual.
-La versión "Windows" de My.User está asociada a la
entidad de seguridad actual del subproceso.

_MYWEBSERVICES Habilita My.WebServices , si la constante se TRUE .

_MYTYPE Habilita My.Log , My.Request y My.Response , si la


constante es "Web".

Vea también
ApplicationBase
Computer
Log
User
Cómo My depende del tipo de proyecto
Compilación condicional
-define (Visual Basic)
My.Forms (objeto)
My.Request (objeto)
My.Response (objeto)
My.WebServices (objeto)
Conceptos de programación (Visual Basic)
08/01/2020 • 3 minutes to read • Edit Online

En esta sección se explican los conceptos de programación del lenguaje Visual Basic.

En esta sección
T IT L E DESC RIP C IÓ N

Programación asincrónica con Async y Await (Visual Basic) Describe cómo escribir soluciones asincrónicas mediante las
palabras clave Async y Await. Incluye un tutorial.

Información general sobre los atributos (Visual Basic) Describe cómo proporcionar información adicional sobre
elementos de programación como tipos, campos, métodos y
propiedades mediante el uso de atributos.

Información del llamador (Visual Basic) Describe cómo obtener información sobre el llamador de un
método. Esta información incluye la ruta de acceso al código
fuente y el número de línea de dicho código y el nombre de
miembro del llamador.

Colecciones (Visual Basic) Describe algunos de los tipos de colecciones proporcionadas


por .NET Framework. Muestra cómo usar colecciones sencillas
y colecciones de pares clave-valor.

Covarianza y contravarianza (Visual Basic) Describe cómo habilitar la conversión implícita de parámetros
de tipo genérico en interfaces y delegados.

Árboles de expresión (Visual Basic) Explica cómo puede utilizar árboles de expresión para habilitar
la modificación dinámica de código ejecutable.

Iteradores (Visual Basic) Describe los iteradores, que se usan para recorrer colecciones
y devolver los elementos uno a uno.

Language-Integrated Query (LINQ) (Visual Basic) Describe las eficaces capacidades de consulta en la sintaxis del
lenguaje de Visual Basic y el modelo para consultar bases de
datos relacionales, documentos XML, conjuntos de datos y
colecciones en memoria.

Programación orientada a objetos (Visual Basic) Describe conceptos comunes orientados a objetos, incluidos la
encapsulación, la herencia y el polimorfismo.

Reflexión (Visual Basic) Se explica cómo usar la reflexión para crear dinámicamente
una instancia de un tipo, enlazar el tipo a un objeto existente
u obtener el tipo desde un objeto existente e invocar sus
métodos, o acceder a sus campos y propiedades.

Serialización (Visual Basic) Describe los conceptos clave de la serialización binaria, XML y
SOAP.

Secciones relacionadas
Ensamblados de .NET Describe cómo crear y utilizar ensamblados.

Sugerencias para mejorar el rendimiento Se describen varias reglas básicas que pueden ayudarle a
aumentar el rendimiento de la aplicación.
Programación asincrónica con Async y Await (Visual
Basic)
21/03/2020 • 31 minutes to read • Edit Online

Puede evitar cuellos de botella de rendimiento y mejorar la capacidad de respuesta total de la aplicación
mediante la programación asincrónica. Sin embargo, las técnicas tradicionales para escribir aplicaciones
asincrónicas pueden resultar complicadas, haciéndolas difícil de escribir, depurar y mantener.
Visual Studio 2012 introdujo un enfoque simplificado, la programación asincrónica, que aprovecha la
compatibilidad asincrónica de .NET Framework 4.5 y versiones posteriores, así como de Windows Runtime. El
compilador realiza el trabajo difícil que el desarrollador suele realizar y la aplicación conserva una estructura
lógica similar al código sincrónico. Como resultado, se obtienen todas las ventajas de la programación
asincrónica con una parte del trabajo.
Este tema proporciona información general sobre cuándo y cómo utilizar la programación asincrónica e incluye
vínculos que admiten temas con detalles y ejemplos.

Async mejora la capacidad de respuesta


La asincronía es esencial para actividades que pueden producir bloqueos, por ejemplo cuando la aplicación
obtiene acceso a Internet. Tener acceso a un recurso web a veces es lento o va retrasado. Si tal actividad queda
bloqueada dentro de un proceso sincrónico, toda la aplicación deberá esperar. En un proceso asincrónico, la
aplicación puede continuar con otro trabajo que no dependa del recurso web hasta que finaliza la tarea que
puede producir bloqueos.
En la tabla siguiente se muestran las áreas típicas donde la programación asincrónica mejora su capacidad de
respuesta. Las API enumeradas desde .NET Framework 4.5 y Windows Runtime contienen métodos que admiten
la programación asincrónica.

C O M PAT IB IL IDA D DE L A S A P I Q UE C O N T IEN EN M ÉTO DO S


Á REA DE A P L IC A C IÓ N A SIN C RÓ N IC O S

Acceso web HttpClient, SyndicationClient

Trabajar con archivos StorageFile, StreamWriter, StreamReader, XmlReader

Trabajo con imágenes MediaCapture, BitmapEncoder, BitmapDecoder

Programar WCF Operaciones sincrónicas y asincrónicas

La asincronía es especialmente valiosa para aquellas aplicaciones que obtienen acceso al subproceso de interfaz
de usuario, ya que todas las actividades relacionadas con la interfaz de usuario normalmente comparten un único
subproceso. Si se bloquea un proceso en una aplicación sincrónica, se bloquean todos. La aplicación deja de
responder y puede que se piense que se ha producido un error cuando en realidad la aplicación está esperando.
Cuando se usan métodos asincrónicos, la aplicación continúa respondiendo a la interfaz de usuario. Puede
cambiar el tamaño o minimizar una ventana, por ejemplo, o puede cerrar la aplicación si no desea esperar a que
finalice.
El enfoque basado en asincrónico agrega el equivalente de una transmisión automática a la lista de opciones
entre las que puede elegir al diseñar operaciones asincrónicas. Es decir, obtiene todas las ventajas de la
programación asincrónica tradicional pero con mucho menos trabajo de desarrollador.

Los métodos asincrónicos son más fáciles de escribir


Las palabras clave Async y Await en Visual Basic son fundamentales en la programación asincrónica. Con esas
dos palabras clave, se pueden utilizar los recursos en .NET Framework o en Windows Runtime para crear un
método asincrónico casi tan fácilmente como se crea un método sincrónico. Los métodos asincrónicos que se
definen utilizando Async y Await se denominan métodos asincrónicos.
En el ejemplo siguiente se muestra un método asincrónico. Casi todo el código deberá ser totalmente familiar. Los
comentarios informan sobre las características que se agregan para crear la asincronía.
Puede encontrar el archivo de ejemplo completo de Windows Presentation Foundation (WPF) al final de este
tema y puede descargar el ejemplo Async: ejemplo de "programación asincrónica con Async y Await".

' 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

Si AccessTheWebAsync no hay ningún trabajo que se pueda hacer entre llamar a GetStringAsync y esperar a su
finalización, se puede simplificar el código llamando y esperando en la siguiente instrucción única.

Dim urlContents As String = Await client.GetStringAsync()

Las siguientes características resumen lo que hace que el ejemplo anterior sea un método asincrónico:
Method Signature incluye un modificador Async .
El nombre de un método asincrónico, por convención, finaliza con un sufijo “Async”.
El tipo de valor devuelto es uno de los tipos siguientes:
Task(Of TResult) si el método tiene una instrucción return en la que el operando tiene el tipo TResult.
Task si el método no tiene ninguna instrucción return ni tiene una instrucción return sin operando.
Sub si está escribiendo un controlador de eventos asincrónicos.
Para obtener más información, vea "Tipos de valor devuelto y parámetros" más adelante en este tema.
El método normalmente incluye al menos una expresión await, que marca un punto en el que el método
no puede continuar hasta que se completa la operación asincrónica en espera. Mientras tanto, se suspende
el método y el control vuelve al llamador del método. La sección siguiente de este tema muestra lo que
sucede en el punto de suspensión.
En métodos asincrónicos, se utilizan las palabras clave y los tipos proporcionados para indicar lo que se desea
hacer y el compilador realiza el resto, incluido el seguimiento de qué debe ocurrir cuando el control vuelve a un
punto de espera en un método suspendido. Algunos procesos de rutina, tales como bucles y control de
excepciones, pueden ser difíciles de controlar en código asincrónico tradicional. En un método asincrónico, se
pueden escribir estos elementos como se haría en una solución sincrónica y se resuelve este problema.
Para obtener más información sobre la asincronía en versiones anteriores de .NET Framework, vea TPL y la
programación asincrónica tradicional de .NET Framework.

Qué sucede en un método Async


Lo más importante de entender en la programación asincrónica es cómo el flujo de control pasa de un método a
otro. El diagrama siguiente lo guía en el proceso:

Los números del diagrama corresponden a los siguientes pasos:


1. Un controlador de eventos llama al método asincrónico AccessTheWebAsync y lo espera.
2. AccessTheWebAsync crea una instancia HttpClient y llama al método asincrónico GetStringAsync para
descargar el contenido de un sitio web como una cadena.
3. Sucede algo en GetStringAsync que suspende el progreso. Quizás debe esperar a un sitio web para
realizar la descarga o alguna otra actividad de bloqueo. Para evitar el bloqueo de recursos, GetStringAsync
genera un control a su llamador, AccessTheWebAsync .
GetStringAsync devuelve un Task(Of TResult) donde TResult AccessTheWebAsync es una cadena
getStringTask y asigna la tarea a la variable. La tarea representa el proceso actual para la llamada a
GetStringAsync , con el compromiso de generar un valor de cadena real cuando se completa el trabajo.
4. Debido a que getStringTask no se ha esperado, AccessTheWebAsync puede continuar con otro trabajo que
no dependa del resultado final de GetStringAsync . Ese trabajo se representa mediante una llamada al
método sincrónico DoIndependentWork .
5. DoIndependentWork es un método sincrónico que funciona y vuelve al llamador.
6. AccessTheWebAsync se ha quedado sin el trabajo que se puede realizar sin un resultado de getStringTask .
Después, AccessTheWebAsync desea calcular y devolver la longitud de la cadena descargada, pero el método
no puede calcular ese valor hasta que el método tiene la cadena.
Por consiguiente, AccessTheWebAsync utiliza un operador await para suspender el progreso y producir el
control al método que llamó AccessTheWebAsync . AccessTheWebAsync devuelve Task(Of Integer) al
llamador. La tarea representa una sugerencia para generar un resultado entero que es la longitud de la
cadena descargada.

NOTE
Si se completa GetStringAsync (y por consiguiente getStringTask ) antes de que AccessTheWebAsync lo
espere, permanece el control en AccessTheWebAsync . El gasto de suspensión y después regresar a
AccessTheWebAsync se desperdiciaría si el proceso denominado asincrónico ( getStringTask ) ya se ha
completado y AccessTheWebSync no tiene que esperar el resultado final.

Dentro del llamador (el controlador de eventos en este ejemplo), el patrón de procesamiento continúa. El
llamador puede hacer otro trabajo que no depende del resultado de AccessTheWebAsync antes de esperar
ese resultado, o es posible que el llamador se espere inmediatamente. El controlador de eventos está
esperando AccessTheWebAsync , y AccessTheWebAsync está esperando GetStringAsync .
7. GetStringAsync completa y genera un resultado de la cadena. La llamada a GetStringAsync no devuelve el
resultado de la cadena de la manera que cabría esperar. (Recuerde que el método ya devolvió una tarea en
el paso 3.) En su lugar, el resultado de cadena se almacena en la tarea que representa la finalización del
método, getStringTask . El operador await recupera el resultado de getStringTask . La instrucción de
asignación asigna el resultado recuperado a urlContents .
8. Cuando AccessTheWebAsync tiene el resultado de la cadena, el método puede calcular la longitud de la
cadena. El trabajo de AccessTheWebAsync también se completa y el controlador de eventos que espera se
puede reanudar. En el ejemplo completo del final de este tema, puede comprobar que el controlador de
eventos recupera e imprime el valor de resultado de longitud.
Si no está familiarizado con la programación asincrónica, reserve un minuto para ver la diferencia entre el
comportamiento sincrónico y asincrónico. Un método sincrónico devuelve cuando se completa su trabajo (paso
5), pero un método asincrónico devuelve un valor de tarea cuando se suspende el trabajo (pasos 3 y 6). Cuando el
método asincrónico completa finalmente el trabajo, se marca la tarea como completa y el resultado, si existe, se
almacena en la tarea.
Para obtener más información sobre el flujo de control, vea Control Flow in Async Programs (Visual Basic) (Flujo
de control en programas asincrónicos [Visual Basic]).

Métodos asincrónicos de API


Tal vez se pregunte dónde encontrar métodos como GetStringAsync que sean compatibles con la programación
asincrónica. .NET Framework 4.5 o superior contiene Async muchos Await miembros con los que trabajar y .
Puede reconocer estos miembros mediante el sufijo "Async" que está asociado Task al nombre del miembro y un
tipo de valor devuelto de o Task(Of TResult). Por ejemplo, la clase System.IO.Stream contiene métodos como
CopyToAsync, ReadAsync y WriteAsync junto con los métodos sincrónicos CopyTo, Read y Write.
Windows Runtime también contiene muchos métodos que puede utilizar con Async y Await en Aplicaciones
Windows. Para obtener más información y métodos de ejemplo, vea Llamar a API asincrónicas en C- o Visual
Basic, Programación asincrónica (aplicacionesen tiempo de ejecución de Windows) y WhenAny: Bridging between
the .NET Framework y Windows Runtime.

Hilos
La intención de los métodos Async es ser aplicaciones que no pueden producir bloqueos. Una expresión Await
en un método asincrónico no bloquea el subproceso actual mientras la tarea esperada se encuentra en ejecución.
En vez de ello, la expresión declara el resto del método como una continuación y devuelve el control al llamador
del método asincrónico.
Las palabras clave Async y Await no hacen que se creen subprocesos adicionales. Los métodos asincrónicos no
requieren multiproceso porque un método asincrónico no se ejecuta en su propio subproceso. El método se
ejecuta en el contexto de sincronización actual y ocupa tiempo en el subproceso únicamente cuando el método
está activo. Puede utilizar Task.Run para mover el trabajo enlazado a la CPU a un subproceso en segundo plano,
pero un subproceso en segundo plano no ayuda con un proceso que solo está esperando a que los resultados
estén disponibles.
El enfoque basado en asincrónico en la programación asincrónica es preferible a los enfoques existentes en casi
todos los casos. En particular, este enfoque BackgroundWorker es mejor que para las operaciones enlazadas a E/S
porque el código es más simple y no tiene que protegerse contra las condiciones de carrera. Junto con Task.Run,
la programación asincrónica es mejor que BackgroundWorker para las operaciones enlazadas a la CPU porque la
programación asincrónica separa los detalles de coordinación en la ejecución del código del trabajo que
Task.Run transfiere al grupo de subprocesos.

Async y Await
Si especifica que un método es un método asincrónico mediante un modificador Async, habilite las dos
capacidades siguientes.
El método asincrónico marcado puede usar Await para designar puntos de suspensión. El operador await
indica al compilador que el método asincrónico no puede continuar pasado ese punto hasta que se
complete el proceso asincrónico aguardado. Mientras tanto, el control devuelve al llamador del método
asincrónico.
La suspensión de un método asincrónico en una expresión Await no constituye una salida del método y
los bloques Finally no se ejecutan.
El método asincrónico marcado sí se puede esperar por los métodos que lo llaman.
Un método asincrónico normalmente contiene una o más apariciones de un operador Await , pero la ausencia de
expresiones Await no causa errores de compilación. Si un método asincrónico no usa un operador Await para
marcar el punto de suspensión, se ejecuta como un método sincrónico, a pesar del modificador Async . El
compilador detecta una advertencia para dichos métodos.
Async y Await son palabras clave contextuales. Para obtener más información y ejemplos, vea los siguientes
temas:
Async
Await Operador

Tipos y parámetros de devolución


En la programación de .NET Framework, un método asincrónico normalmente devuelve una Task o una tarea (de
TResult). Dentro de un método asincrónico, se aplica un operador Await a una tarea que devuelve una llamada a
otro método asincrónico.
Especifique Task(Of TResult) como el tipo de Return valor devuelto si el TResult método contiene una instrucción
Return que especifica un operando de tipo .
Puede utilizar Task como tipo de valor devuelto si el método no tiene instrucción return o tiene una instrucción
return que no devuelve un operando.
En el ejemplo siguiente se muestra cómo declarar y llamar a Taskun método que devuelve un Task(Of TResult) o
un :

' 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 tarea devuelta representa el trabajo en curso. Una tarea encapsula la información sobre el estado del
proceso asincrónico y, finalmente, el resultado final del proceso o la excepción que el proceso provoca si no tiene
éxito.
Un método asincrónico también puede ser un método Sub . Este tipo de valor devuelto se utiliza principalmente
para definir controladores de eventos, donde se requiere un tipo de valor devuelto. Los controladores de eventos
asincrónicos sirven a menudo como punto de partida para programas asincrónicos.
Un método asincrónico Sub que es un procedimiento no se puede esperar y el llamador no puede detectar
ninguna excepción que produce el método.
Un método aisncrónico no puede declarar ningún parámetro ByRef, pero el método puede llamar a los métodos
que tienen estos parámetros.
Para más información y ejemplos, vea Async Return Types (Visual Basic) (Tipos de valor devuelto asincrónicos
[Visual Basic]). Para más información sobre cómo capturar excepciones en métodos asincrónicos, vea Instrucción
Try...Catch...Finally.
Las API asincrónicas en la programación de Windows Runtime tienen uno de los siguientes tipos de valor
devuelto, que son similares a las tareas:
IAsyncOperation(Of TResult), que corresponde a Task(Of TResult)
IAsyncAction, lo que equivale a Task
IAsyncActionWithProgress(Of TProgress)
IAsyncOperationWithProgress(Of TResult, TProgress)
Para obtener más información y un ejemplo, vea Llamar a API asincrónicas en C o Visual Basic.

Convención de nomenclatura
Por convención, se anexa "Async" a los nombres de métodos que tengan un modificador Async .
Puede ignorar esta convención cuando un evento, clase base o contrato de interfaz sugieren un nombre diferente.
Por ejemplo, no se debería cambiar el nombre de los controladores de eventos, tales como Button1_Click .

Temas y ejemplos relacionados (Visual Studio)


T ÍT ULO DESC RIP C IÓ N M UEST RA

Tutorial: Acceso a web usando Async y Muestra cómo convertir una solución Async Sample: Accessing the Web
Await (C# y Visual Basic) WPF sincrónica en una solución WPF Walkthrough (Ejemplo Async: obtener
asincrónica. La aplicación descarga una acceso al tutorial web)
serie de sitios web.

How to: Extend the Async Walkthrough Agrega Task.WhenAll al tutorial


by Using Task.WhenAll (Visual Basic) anterior. El uso de WhenAll inicia
(Ampliación del tutorial de Async todas las descargas al mismo tiempo.
mediante Task.WhenAll [Visual Basic])

How to: Make Multiple Web Requests Demuestra cómo comenzar varias Async Sample: Make Multiple Web
in Parallel by Using Async and Await tareas al mismo tiempo. Requests in Parallel (Ejemplo Async:
(Visual Basic) (Realización de solicitudes realización de varias solicitudes web en
web en paralelo mediante Async y paralelo)
Await [Visual Basic])

Async Return Types (Visual Basic) (Tipos Muestra los tipos que los métodos
de valor devuelto de Async [Visual asincrónicos pueden devolver y explica
Basic]) cuándo es apropiado cada uno de ellos.

Control Flow in Async Programs (Visual Rastrea en detalle el flujo de control a Async Sample: Control Flow in Async
Basic) (Flujo de control en programas través de una sucesión de expresiones Programs (Ejemplo Async: flujo de
asincrónicos [Visual Basic]) await en un programa asincrónico. control en programas asincrónicos)
T ÍT ULO DESC RIP C IÓ N M UEST RA

Fine-Tuning Your Async Application Muestra cómo agregar la siguiente Async Sample: Fine Tuning Your
(Visual Basic) (Ajuste de una aplicación funcionalidad a la solución asincrónica: Application (Ejemplo asincrónico: ajuste
asincrónica [Visual Basic]) de la aplicación)
- Cancel an Async Task or a List of Tasks
(Visual Basic) (Cancelación de una tarea
asincrónica o de una lista de tareas
[Visual Basic])
- Cancel Async Tasks after a Period of
Time (Visual Basic) (Cancelación de
tareas asincrónicas tras un período de
tiempo [Visual Basic])
- Cancel Remaining Async Tasks after
One Is Complete (Visual Basic)
(Cancelación de tareas asincrónicas
restantes [Visual Basic])
- Start Multiple Async Tasks and
Process Them As They Complete
(Visual Basic) (Inicio de varias tareas
asincrónicas y cómo procesarlas a
medida que se completan [Visual
Basic])

Handling Reentrancy in Async Apps Muestra cómo controlar los casos en


(Visual Basic) (Control de reentrada en los que se reinicia una operación
aplicaciones asincrónicas [Visual Basic]) asincrónica activa mientras se ejecuta.

WhenAny: Bridging between the .NET Muestra cómo unir entre tipos de Async Sample: Bridging between .NET
Framework and the Windows Runtime tareas en .NET Framework e and Windows Runtime (AsTask and
(WhenAny: Puente entre .NET IAsyncOperations en Windows Runtime WhenAny) (Ejemplo Async: puente
Framework y Windows Runtime) para poder usar WhenAny con un entre .NET y Windows Runtime [AsTask
método de Windows Runtime. y WhenAny])

Cancelación asincrónica: Puente entre Muestra cómo unir entre tipos de Async Sample: Bridging between .NET
.NET Framework y Windows Runtime tareas en .NET Framework e and Windows Runtime (AsTask &
IAsyncOperations en Windows Runtime Cancellation) (Ejemplo Async: puente
para poder usar entre .NET y Windows Runtime [AsTask
CancellationTokenSource con un & Cancellation])
método de Windows Runtime.

Usar Async en acceso a archivos (Visual Enumera y demuestra los beneficios de


Basic) usar async y await para obtener acceso
a archivos.

Modelo asincrónico basado en tareas Describe un nuevo patrón de


(TAP) asincronía en .NET Framework. El
patrón se Task basa en los tipos y
Task(Of TResult).

Vídeos de Async en Channel 9 Proporciona vínculos a una serie de


vídeos sobre programación asincrónica.

Ejemplo completo
El código siguiente es el archivo MainWindow.xaml.vb de la aplicación de Windows Presentation Foundation
(WPF) que se explica en este tema. Puede descargar el ejemplo de Async Sample: Example from "Asynchronous
Programming with Async and Await" (Ejemplo de Async: ejemplo de "programación asincrónica con Async y
Await").
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

Consulte también
Await Operador
Async
Información general sobre los atributos (Visual Basic)
27/11/2019 • 8 minutes to read • Edit Online

Los atributos proporcionan un método eficaz para asociar metadatos, o información declarativa, con código
(ensamblados, tipos, métodos, propiedades, etc.). Después de asociar un atributo con una entidad de programa,
se puede consultar el atributo en tiempo de ejecución mediante la utilización de una técnica denominada
reflexión. Para más información, vea Reflexión (Visual Basic).
Los atributos tienen las propiedades siguientes:
Los atributos agregan metadatos al programa. Los metadatos son información sobre los tipos definidos
en un programa. Todos los ensamblados .NET contienen un conjunto de metadatos específico que describe
los tipos y miembros de tipo definidos en el ensamblado. Puede agregar atributos personalizados para
especificar cualquier información adicional que sea necesaria. Para más información, vea Creating Custom
Attributes (Visual Basic) (Creación de atributos personalizados [Visual Basic]).
Puede aplicar uno o más atributos a todos los ensamblados, módulos o elementos de programa más
pequeños como clases y propiedades.
Los atributos pueden aceptar argumentos de la misma manera que los métodos y las propiedades.
El programa puede examinar sus propios metadatos o los metadatos de otros programas mediante la
reflexión. Para más información, vea Accessing Attributes by Using Reflection (Visual Basic) (Acceso a
atributos mediante reflexión [Visual Basic]).

Utilizar atributos
Los atributos se pueden colocar en la mayoría de las declaraciones, aunque un determinado atributo podría
restringir los tipos de declaraciones en que es válido. En Visual Basic, un atributo se encierra entre corchetes
angulares (< >). Debe aparecer inmediatamente antes del elemento al que se aplica, en la misma línea.
En este ejemplo, el atributo SerializableAttribute se usa para aplicar una característica específica a una clase:

<System.Serializable()> Public Class SampleClass


' Objects of this type can be serialized.
End Class

Un método con el atributo DllImportAttribute se declara de esta forma:

Imports System.Runtime.InteropServices

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

En una declaración se puede colocar más de un atributo:

Imports System.Runtime.InteropServices
Sub MethodA(<[In](), Out()> ByVal x As Double)
End Sub
Sub MethodB(<Out(), [In]()> ByVal x As Double)
End Sub

Algunos atributos se pueden especificar más de una vez para una entidad determinada. Un ejemplo de este tipo
de atributos multiuso es ConditionalAttribute:

<Conditional("DEBUG"), Conditional("TEST1")>
Sub TraceMethod()
End Sub

NOTE
Por convención, todos los nombres de atributos terminan con la palabra "Attribute" para distinguirlos de otros elementos
de .NET Framework. Sin embargo, no es necesario especificar el sufijo de atributo cuando utiliza atributos en el código. Por
ejemplo, [DllImport] es equivalente a [DllImportAttribute] , pero DllImportAttribute es el nombre del atributo
real en .NET Framework.

Parámetros de atributo
Muchos atributos tienen parámetros, que pueden ser posicionales, sin nombre o con nombre. Los parámetros
posicionales deben especificarse en un determinado orden y no se pueden omitir; los parámetros con nombre
son opcionales y se pueden especificar en cualquier orden. Los parámetros posicionales se especifican en primer
lugar. Por ejemplo, estos tres atributos son equivalentes:

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

El primer parámetro, el nombre del archivo DLL, es posicional y siempre va primero; los demás tienen un
nombre. En este caso, ambos parámetros con nombre tienen el estado false de forma predeterminada, por lo que
se pueden omitir. Consulte la documentación del atributo individual para obtener información sobre los valores
de parámetro predeterminados.
Destinos de atributo
El destino de un atributo es la entidad a la que se aplica el atributo. Por ejemplo, puede aplicar un atributo a una
clase, un método determinado o un ensamblado completo. De forma predeterminada, el atributo se aplica al
elemento que lo precede. Pero puede identificar explícitamente, por ejemplo, si se aplica un atributo a un método,
a su parámetro o a su valor devuelto.
Para identificar un destino de atributo de forma explícita, use la sintaxis siguiente:

<target : attribute-list>

La lista de posibles valores target se muestra en la tabla siguiente.

VA LO R DEL O B JET IVO SE A P L IC A A

assembly Ensamblado completo


VA LO R DEL O B JET IVO SE A P L IC A A

module Módulo del ensamblado actual (que es diferente de un


módulo de Visual Basic)

En el ejemplo siguiente se muestra cómo aplicar atributos a ensamblados y módulos. Para más información, vea
Atributos comunes (Visual Basic).

Imports System.Reflection
<Assembly: AssemblyTitleAttribute("Production assembly 4"),
Module: CLSCompliant(True)>

Usos comunes de los atributos


La lista siguiente incluye algunos de los usos comunes de atributos en el código:
Marcar métodos con el atributo WebMethod en los servicios web para indicar que el método debe ser
invocable a través del protocolo SOAP. Para obtener más información, consulta WebMethodAttribute.
Describir cómo serializar parámetros de método al interoperar con código nativo. Para obtener más
información, consulta MarshalAsAttribute.
Describir las propiedades COM para clases, métodos e interfaces.
Llamar al código no administrado mediante la clase DllImportAttribute.
Describir los ensamblados en cuanto a título, versión, descripción o marca.
Describir qué miembros de una clase serializar para la persistencia.
Describir cómo realizar asignaciones entre los miembros de clase y los nodos XML para la serialización
XML.
Describir los requisitos de seguridad para los métodos.
Especificar las características utilizadas para reforzar la seguridad.
Controlar optimizaciones mediante el compilador Just-In-Time (JIT) para que el código siga siendo fácil de
depurar.
Obtener información sobre el llamador de un método.

Secciones relacionadas
Para obtener más información, vea:
Creating Custom Attributes (Visual Basic) (Creación de atributos personalizados [Visual Basic])
Accessing Attributes by Using Reflection (Visual Basic) (Acceso a atributos mediante reflexión [Visual
Basic])
How to: Create a C/C++ Union by Using Attributes (Visual Basic) (Creación de uniones de C/C++
mediante la utilización de atributos [Visual Basic])
Common Attributes (Visual Basic) (Atributos comunes [Visual Basic])
Información del llamador (Visual Basic)
Vea también
Guía de programación en Visual Basic
Reflexión (Visual Basic)
Atributos
Información del autor de la llamada (Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

Mediante los atributos de información del llamador, se puede obtener información sobre el llamador de un
método. Puede obtener la ruta de acceso al código fuente, el número de línea en el código fuente y el nombre de
miembro del llamador. Esta información resulta útil para el seguimiento y la depuración, así como para crear
herramientas de diagnóstico.
Para obtener esta información, se usan los atributos que se aplican a los parámetros opcionales, que tienen valores
predeterminados. En la tabla siguiente se enumeran los atributos de información del llamador que se definen en el
espacio de nombres System.Runtime.CompilerServices:

AT RIB UTO DESC RIP C IÓ N T IP O

CallerFilePathAttribute Ruta de acceso completa del archivo de String


código fuente que contiene el llamador.
Esta es la ruta de acceso en tiempo de
compilación.

CallerLineNumberAttribute Número de línea en el archivo de Integer


código fuente en el que se llama al
método.

CallerMemberNameAttribute Método o nombre de propiedad del String


llamador. Vea Nombres de miembro
más adelante en este tema.

Ejemplo
En el ejemplo siguiente se muestra cómo utilizar atributos de información del llamador. En cada llamada al método
TraceMessage , la información del llamador se sustituye como argumentos para los parámetros opcionales.

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
Comentarios
Se debe especificar un valor predeterminado explícito para cada parámetro opcional. No se pueden aplicar
atributos de información del llamador para los parámetros que no se especifican como opcionales.
Los atributos de información del llamador no crean un parámetro opcional, sino que influyen en el valor
predeterminado que se pasa cuando se omite el argumento.
Los valores de información del llamador se emiten como literales en el lenguaje intermedio (IL) en tiempo de
compilación. A diferencia de los resultados de la propiedad StackTrace para las excepciones, los resultados no se
ven afectados por confusión.
Puede proporcionar explícitamente los argumentos opcionales para controlar la información del llamador u
ocultarla.
Nombres de miembro
Se puede utilizar el atributo CallerMemberName para evitar especificar el nombre de miembro como un argumento
String para el método llamado. Mediante esta técnica, se evita el problema de que la refactorización de
cambio de nombre no cambie los valores String . Esta ventaja es especialmente útil para las siguientes tareas:
Usar el seguimiento y las rutinas de diagnóstico.
Implementar la interfaz INotifyPropertyChanged al enlazar datos. Esta interfaz permite que la propiedad de
un objeto notifique a un control enlazado que la propiedad ha cambiado, de forma que el control pueda
mostrar información actualizada. Sin el atributo CallerMemberName , se debe especificar el nombre de
propiedad como un literal.
En el gráfico siguiente se muestran los nombres de miembro que se devuelven cuando se utiliza el atributo
CallerMemberName .

L A S L L A M A DA S SE P RO DUC EN EN RESULTA DO DEL N O M B RE DE M IEM B RO

Método, propiedad o evento Nombre del método, propiedad o evento en el que se originó
la llamada.

Constructor Cadena ".ctor"

Constructor estático Cadena ".cctor"

Destructor Cadena "Finalize"

Conversiones u operadores definidos por el usuario Nombre generado para el miembro, por ejemplo,
"op_Addition".

Constructor de atributo Nombre del miembro al que se aplica el atributo. Si el atributo


es cualquier elemento dentro de un miembro (como un
parámetro, un valor devuelto o un parámetro de tipo
genérico), el resultado es el nombre del miembro asociado a
este elemento.

Ningún miembro contenedor (por ejemplo, nivel de El valor predeterminado del parámetro opcional.
ensamblado o atributos que se aplican a tipos)

Vea también
Atributos (Visual Basic)
Common Attributes (Visual Basic) (Atributos comunes [Visual Basic])
Parámetros opcionales
Programming Concepts (Visual Basic) (Conceptos de programación (Visual Basic))
Colecciones (Visual Basic)
21/03/2020 • 23 minutes to read • Edit Online

Para muchas aplicaciones, puede que desee crear y administrar grupos de objetos relacionados. Existen dos
formas de agrupar objetos: mediante la creación de matrices de objetos y con la creación de colecciones de
objetos.
Las matrices son muy útiles para crear y trabajar con un número fijo de objetos fuertemente tipados. Para obtener
información sobre las matrices, vea Matrices.
Las colecciones proporcionan una manera más flexible de trabajar con grupos de objetos. A diferencia de las
matrices, el grupo de objetos con el que trabaja puede aumentar y reducirse de manera dinámica a medida que
cambian las necesidades de la aplicación. Para algunas colecciones, puede asignar una clave a cualquier objeto que
incluya en la colección para, de este modo, recuperar rápidamente el objeto con la clave.
Una colección es una clase, por lo que debe declarar una instancia de la clase para poder agregar elementos a
dicha colección.
Si la colección contiene elementos de un solo tipo de datos, puede usar una de las clases del espacio de nombres
System.Collections.Generic. Una colección genérica cumple la seguridad de tipos para que ningún otro tipo de
datos se pueda agregar a ella. Cuando recupera un elemento de una colección genérica, no tiene que determinar
su tipo de datos ni convertirlo.

NOTE
Para los ejemplos de este tema, System.Collections.Generic incluya System.Linq instrucciones Imports para los
espacios de nombres y.

Uso de una colección Simple


Los ejemplos de esta sección usan la clase genérica List<T>, que le permite trabajar con una lista de objetos
fuertemente tipados.
En el ejemplo siguiente se crea una lista de cadenas y, a continuación, recorre en iteración las cadenas mediante un
For Each... Siguiente declaración.

' 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

Si el contenido de una colección se conoce de antemano, puede usar un inicializador de colección para inicializar la
colección. Para obtener más información, vea Inicializadores de colección.
El ejemplo siguiente es el mismo que el ejemplo anterior, excepto que se usa un inicializador de colección para
agregar elementos a la colección.

' 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

Puede utilizar un For... Instrucción Next For Each en lugar de una instrucción para recorrer en iteración una
colección. Esto se consigue con el acceso a los elementos de la colección mediante la posición de índice. El índice
de los elementos comienza en 0 y termina en el número de elementos menos 1.
El ejemplo siguiente recorre en iteración los elementos de una colección mediante For…Next en lugar de
For Each .

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

El ejemplo siguiente quita un elemento de la colección especificando el objeto que se quitará.

' 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

El ejemplo siguiente quita elementos de una lista genérica. En lugar For Each de una declaración, un For... Se
utiliza la siguiente instrucción que itera en orden descendente. Esto es porque el método RemoveAt hace que los
elementos después de un elemento quitado tengan un valor de índice inferior.
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 el tipo de elementos de List<T>, también puede definir su propia clase. En el ejemplo siguiente, la clase
Galaxy que usa List<T> se define en el código.

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 colecciones
.NET Framework proporciona muchas colecciones comunes. Cada tipo de colección está diseñado para un fin
específico.
En esta sección se describen algunas de las clases de colecciones comunes:
Clases System.Collections.Generic
Clases System.Collections.Concurrent
Clases System.Collections
Clase Collection de Visual Basic
Clases System.Collections.Generic
Puede crear una colección genérica mediante una de las clases del espacio de nombres
System.Collections.Generic. Una colección genérica es útil cuando todos los elementos de la colección tienen el
mismo tipo. Una colección genérica exige el establecimiento de fuertes tipos al permitir agregar solo los tipos de
datos deseados.
En la tabla siguiente se enumeran algunas de las clases usadas con frecuencia del espacio de nombres
System.Collections.Generic:

C L A SE DESC RIP C IÓ N

Dictionary<TKey,TValue> Representa una colección de pares de clave y valor que se


organizan según la clave.

List<T> Representa una lista de objetos a los que puede tener acceso
el índice. Proporciona métodos para buscar, ordenar y
modificar listas.

Queue<T> Representa una colección de objetos de primeras entradas,


primeras salidas (FIFO).

SortedList<TKey,TValue> Representa una colección de pares clave-valor que se ordenan


por claves según la implementación de IComparer<T>
asociada.

Stack<T> Representa una colección de objetos de últimas entradas,


primeras salidas (LIFO).

Para obtener más información, vea Tipos de colección utilizados normalmente, Seleccionar una clase de colección
y System.Collections.Generic.
Clases System.Collections.Concurrent
En .NET Framework 4 o posterior, las colecciones del espacio de nombres System.Collections.Concurrent
proporcionan operaciones eficaces y seguras para subprocesos con el fin de obtener acceso a los elementos de la
colección desde varios subprocesos.
Las clases del espacio de nombres System.Collections.Concurrent deben usarse en lugar de los tipos
correspondientes de los espacios de nombres System.Collections.Generic y System.Collections cada vez que varios
subprocesos tengan acceso de manera simultánea a la colección. Para obtener más información, vea Colecciones
seguras para subprocesos y System.Collections.Concurrent.
Algunas clases incluidas en el espacio de nombres System.Collections.Concurrent son BlockingCollection<T>,
ConcurrentDictionary<TKey,TValue>, ConcurrentQueue<T> y ConcurrentStack<T>.
Clases System.Collections
Las clases del espacio de nombres System.Collections no almacenan los elementos como objetos de tipo
específico, sino como objetos del tipo Object .
Siempre que sea posible, debe usar las colecciones genéricas del espacio de nombres System.Collections.Generic o
del espacio de nombres System.Collections.Concurrent en lugar de los tipos heredados del espacio de nombres
System.Collections .

En la siguiente tabla se enumeran algunas de las clases usadas con frecuencia en el espacio de nombres
System.Collections :
C L A SE DESC RIP C IÓ N

ArrayList Representa una matriz cuyo tamaño aumenta dinámicamente


cuando es necesario.

Hashtable Representa una colección de pares de clave y valor que se


organizan por código hash de la clave.

Queue Representa una colección de objetos de primeras entradas,


primeras salidas (FIFO).

Stack Representa una colección de objetos de últimas entradas,


primeras salidas (LIFO).

El espacio de nombres System.Collections.Specialized proporciona clases de colección especializadas y


fuertemente tipadas como, por ejemplo, colecciones de solo cadena y diccionarios híbridos y de lista vinculada.
Clase de colección de Visual Basic
Puede usar la clase de Visual Basic Collection para tener acceso a un elemento de colección mediante un índice
numérico o una clave String . Puede agregar elementos a un objeto de colección especificando o sin especificar
clave. Si agrega un elemento sin clave, debe usar su índice numérico para tener acceso a dicho elemento.
La clase de Visual Basic Collection almacena todos sus elementos como de tipo Object , por lo que puede
agregar un elemento de cualquier tipo de datos. No hay ningún método de protección contra los tipos de datos
inadecuados agregados.
Cuando se usa la clase de Visual Basic Collection , el primer elemento de una colección tiene un índice de 1. Esto
difiere de las clases de colección de .NET Framework, para las cuales el índice inicial es 0.
Siempre que sea posible, debe usar las colecciones genéricas del espacio de nombres System.Collections.Generic o
del espacio de nombres System.Collections.Concurrent en lugar de la clase de Visual Basic Collection .
Para más información, consulte Collection.

Implementación de una colección de pares de clave/valor


La colección genérica Dictionary<TKey,TValue> le permite tener acceso a los elementos de una colección con la
clave de cada elemento. Cada adición al diccionario consta de un valor y de su clave asociada. Recuperar un valor
usando su clave es rápido porque la clase Dictionary se implementa como una tabla hash.
En el ejemplo siguiente se crea una colección Dictionary y se recorre en iteración el diccionario usando una
instrucción For Each .
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 usar un inicializador de colección para compilar la colección Dictionary , puede reemplazar los métodos
BuildDictionary y AddToDictionary por el método siguiente.

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

En el ejemplo siguiente se usa el método ContainsKey y la propiedad Item[TKey] de Dictionary para encontrar
rápidamente un elemento por clave. La Item propiedad permite tener acceso elements a un elements(symbol)
elemento de la colección mediante el código de Visual Basic.
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

En el ejemplo siguiente se usa en su lugar el método TryGetValue para encontrar rápidamente un elemento por
clave.

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

Uso de LINQ para tener acceso a una colección


LINQ (Language-Integrated Query) puede usar para tener acceso a las colecciones. Las consultas LINQ
proporcionan capacidades de filtrado, ordenación y agrupación. Para obtener más información, vea Introducción a
LINQ en Visual Basic.
El ejemplo siguiente ejecuta una consulta LINQ en una List genérica. La consulta LINQ devuelve otra colección
que contiene los resultados.
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

Ordenar una colección


En el ejemplo siguiente se muestra un procedimiento para ordenar una colección. El ejemplo ordena las instancias
de la clase Car que se almacenan en un List<T>. La clase Car implementa la interfaz IComparable<T>, que
requiere implementar el método CompareTo.
Cada llamada al método CompareTo realiza una comparación única que se usa para la ordenación. El código
escrito por el usuario en el método CompareTo devuelve un valor para cada comparación del objeto actual con
otro objeto. El valor devuelto es menor que cero si el objeto actual es menor que el otro objeto, mayor que cero si
el objeto actual es mayor que el otro objeto y cero si son iguales. Esto permite definir en el código los criterios de
mayor que, menor que e igual.
En el método ListCars , la instrucción cars.Sort() ordena la lista. Esta llamada al método Sort de List<T> hace
que se llame automáticamente al método CompareTo para los objetos Car de List .

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 = "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

Definición de una colección personalizada


Puede definir una colección implementando la interfaz IEnumerable<T> o IEnumerable. Para obtener información
adicional, consulte Enumeración de una colección.
Aunque puede definir una colección personalizada, es mejor usar las colecciones incluidas en .NET Framework.
Estas colecciones se describen en la sección Tipos de colecciones de este tema.
En el siguiente ejemplo se define una clase de colección personalizada denominada AllColors . Esta clase
implementa la interfaz IEnumerable que requiere implementar el método GetEnumerator.
El método GetEnumerator devuelve una instancia de la clase ColorEnumerator . ColorEnumerator implementa la
interfaz IEnumerator, que requiere que la propiedad Current, el método MoveNext y el método Reset estén
implementados.
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
Iteradores
Los iteradores se usan para efectuar una iteración personalizada en una colección. Un iterador puede ser un
método o un descriptor de acceso get . Un iterador utiliza un Yield instrucción para devolver cada elemento de la
colección de uno en uno.
Llamar a un iterador mediante un For Each... Siguiente declaración. Cada iteración del bucle For Each llama al
iterador. Cuando se alcanza una instrucción Yield en el iterador, se devuelve una expresión y se conserva la
ubicación actual en el código. La ejecución se reinicia desde esa ubicación la próxima vez que se llama al iterador.
Para obtener más información, vea Iterators (Visual Basic).
El siguiente ejemplo usa el método del iterador. El método de Yield iterador tiene una instrucción que está dentro
de un For... Siguiente bucle. En el método ListEvenNumbers , cada iteración del cuerpo de la instrucción For Each
crea una llamada al método iterador, que continúa con la siguiente instrucción Yield .

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

Consulte también
Inicializadores de colección
Conceptos de programación (Visual Basic)
Option Strict (instrucción)
LINQ to Objects (Visual Basic)
Parallel LINQ (PLINQ)
Colecciones y Estructuras de Datos
Seleccionar una clase de colección
Comparaciones y ordenaciones en colecciones
Cuándo usar colecciones genéricas
Covarianza y contravarianza (Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

En Visual Basic, la covarianza y la contravarianza habilitan la conversión de referencias implícita de tipos de


matriz, tipos de delegado y argumentos de tipo genérico. La covarianza conserva la compatibilidad de
asignaciones y la contravarianza la invierte.
El siguiente código muestra la diferencia entre la compatibilidad de asignaciones, la covarianza y la
contravarianza.

' 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

La covarianza de matrices permite la conversión implícita de una matriz de un tipo más derivado a una matriz de
un tipo menos derivado. Pero esta operación no es segura, tal como se muestra en el ejemplo de código siguiente.

Dim array() As Object = New String(10) {}


' The following statement produces a run-time exception.
' array(0) = 10

La compatibilidad de la covarianza y la contravarianza con grupos de métodos permite hacer coincidir firmas de
método con tipos de delegado. Esto le permite asignar a los delegados no solo métodos con firmas coincidentes,
sino métodos que devuelven tipos más derivados (covarianza) o que aceptan parámetros con tipos menos
derivados (contravarianza) que el especificado por el tipo de delegado. Para obtener más información, vea
Variance in Delegates (Visual Basic) (Varianza en delegados (Visual Basic)) y Using Variance in Delegates (Visual
Basic) (Usar varianza en delegados (Visual Basic)).
En el ejemplo de código siguiente, se muestra la compatibilidad de covarianza y contravarianza con grupos de
métodos.
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

En .NET Framework 4 o posterior, Visual Basic admite la covarianza y la contravarianza en interfaces y delegados
genéricos y permite la conversión implícita de parámetros de tipo genérico. Para obtener más información, vea
Variance in Generic Interfaces (Visual Basic) (Varianza en interfaces genéricas (Visual Basic)) y Variance in
Delegates (Visual Basic) (Varianza en delegados (Visual Basic)).
En el ejemplo de código siguiente, se muestra la conversión implícita de referencias para interfaces genéricas.

Dim strings As IEnumerable(Of String) = New List(Of String)


Dim objects As IEnumerable(Of Object) = strings

Un delegado o interfaz genéricos se denominan variante si sus parámetros genéricos se declaran como
covariantes o contravariantes. Visual Basic le permite crear sus propias interfaces y delegados variantes. Para
obtener más información, vea Creating Variant Generic Interfaces (Visual Basic) (Crear interfaces genéricas
variantes (Visual Basic)) y Variance in Delegates (Visual Basic) (Varianza en delegados (Visual Basic)).

Temas relacionados
T ÍT ULO DESC RIP C IÓ N

Varianza en interfaces genéricas (Visual Basic) Describe la covarianza y contravarianza en las interfaces
genéricas y proporciona una lista de interfaces genéricas
variantes en .NET Framework.

Crear interfaces genéricas variantes (Visual Basic) Se muestra cómo crear interfaces variantes personalizadas.

Usar la varianza en interfaces para las colecciones genéricas Se muestra cómo la compatibilidad de covarianza y
(Visual Basic) contravarianza en las interfaces IEnumerable<T> y
IComparable<T> puede ayudarle a volver a usar el código.

Varianza en delegados (Visual Basic) Se describe la covarianza y contravarianza en delegados


genéricos y no genéricos y se proporciona una lista de
delegados genéricos variantes en .NET Framework.
T ÍT ULO DESC RIP C IÓ N

Usar varianza en delegados (Visual Basic) Se muestra cómo usar la compatibilidad de covarianza y
contravarianza en los delegados no genéricos para que
coincidan las firmas de método con los tipos de delegado.

Usar la varianza para los delegados genéricos Func y Action Se muestra cómo la compatibilidad de covarianza y
(Visual Basic) contravarianza en los delegados Func y Action puede
ayudarle a volver a usar el código.
Árboles de expresión (Visual Basic)
21/03/2020 • 8 minutes to read • Edit Online

Los árboles de expresión representan el código en una estructura de datos en forma de árbol donde cada nodo es
una expresión, por ejemplo, una llamada a método o una operación binaria como x < y .
El código representado en árboles de expresión se puede compilar y ejecutar. Esto permite realizar cambios
dinámicos en el código ejecutable, ejecutar consultas LINQ en varias bases de datos y crear consultas dinámicas.
Para obtener más información sobre los árboles de expresión en LINQ, consulte How to: Use Expression Trees to
Build Dynamic Queries (Visual Basic) (Usar árboles de expresión para generar consultas dinámicas en Visual Basic).
Los árboles de expresión también se usan en Dynamic Language Runtime (DLR) para proporcionar
interoperabilidad entre los lenguajes dinámicos y .NET Framework y, asimismo, para permitir que los
programadores de compiladores emitan árboles de expresión en lugar de Lenguaje intermedio de Microsoft
(MSIL). Para obtener más información sobre el entorno DLR, vea Información general acerca de Dynamic Language
Runtime.
Puede hacer que el compilador de Visual Basic o de C# cree un árbol de expresión en función de una expresión
lambda anónima, o bien puede crear árboles de expresión manualmente usando el espacio de nombres
System.Linq.Expressions.

Crear árboles de expresión a partir de expresiones lambda


Cuando una expresión lambda se asigna a una variable de tipo Expression<TDelegate>, el compilador emite
código para crear un árbol de expresión que represente la expresión lambda.
El compilador de Visual Basic puede generar árboles de expresión solo a partir de lambdas de expresión (o de
lambdas de una sola línea). No pueden analizar lambdas de instrucción (o lambdas de varias líneas). Para obtener
más información sobre las expresiones lambda en Visual Basic, consulte Expresiones lambda.
Los siguientes ejemplos de código muestran cómo crear un árbol de expresión que represente la expresión lambda
Function(num) num < 5 con el compilador de Visual Basic.

Dim lambda As Expression(Of Func(Of Integer, Boolean)) =


Function(num) num < 5

Crear árboles de expresión mediante la API


Para crear árboles de expresión mediante la API, use la clase Expression. Esta clase contiene métodos de fábrica
estáticos que crean nodos de árbol de expresión de tipos específicos, como, por ejemplo, ParameterExpression, que
representa una variable o un parámetro, o MethodCallExpression, que representa una llamada a método.
ParameterExpression, MethodCallExpression y los demás tipos específicos de expresión también se definen en el
espacio de nombres System.Linq.Expressions. Estos tipos se derivan del tipo abstracto Expression.
En el siguiente ejemplo de código se muestra cómo crear un árbol de expresión que represente la expresión
lambda Function(num) num < 5 mediante la API.
' 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})

En .NET Framework 4 y versiones posteriores, la API de árboles de expresión admite también asignaciones y
expresiones de flujo de control como bucles, bloques condicionales y bloques try-catch . Con la API, se pueden
crear árboles de expresión más complejos que los que pueden crear el compilador de Visual Basic a partir de
expresiones lambda. En el siguiente ejemplo se indica cómo crear un árbol de expresión que calcula el factorial de
un número.

' 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 obtener más información, consulte Generating Dynamic Methods with Expression Trees in Visual Studio 2010
(Generar métodos dinámicos con árboles de expresión en Visual Studio 2010), que también se aplica a las últimas
versiones de Visual Studio.

Analizar árboles de expresión


En el siguiente ejemplo de código se muestra cómo la expresión del árbol que representa la expresión lambda
Function(num) num < 5 se puede descomponer en partes.
' 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

Inmutabilidad de los árboles de expresión


Los árboles de expresión deben ser inmutables. Esto significa que, si desea modificar un árbol de expresión, deberá
construir un nuevo árbol de expresión copiando el ya existente y reemplazando los nodos que hay en él. Puede
usar un visitante de árbol de expresión para recorrer el árbol de expresión existente. Para obtener más información,
consulte How to: Modify Expression Trees (Visual Basic) (Cómo modificar árboles de expresión en Visual Basic).

Compilar árboles de expresión


El tipo Expression<TDelegate> proporciona el método Compile que compila el código representado por un árbol
de expresión en un delegado ejecutable.
En el siguiente ejemplo de código se indica cómo compilar un árbol de expresión y ejecutar el código resultante.

' 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 obtener más información, consulte How to: Execute Expression Trees (Visual Basic) (Cómo ejecutar árboles de
expresión en Visual Basic).

Consulte también
System.Linq.Expressions
How to: Execute Expression Trees (Visual Basic) (Cómo ejecutar árboles de expresión en Visual Basic)
How to: Modify Expression Trees (Visual Basic) (Cómo modificar árboles de expresión en Visual Basic)
Expresiones Lambda
Descripción general del tiempo de ejecución del lenguaje dinámico
Conceptos de programación (Visual Basic)
Iteradores (Visual Basic)
27/02/2020 • 16 minutes to read • Edit Online

Un iterador puede usarse para recorrer colecciones como listas y matrices.


Un método iterador o un descriptor de acceso get realiza una iteración personalizada en una colección. Un
método de iterador utiliza la instrucción yield para devolver cada elemento de uno en uno. Cuando se alcanza
una instrucción Yield , se recuerda la ubicación actual en el código. La ejecución se reinicia desde esa ubicación
la próxima vez que se llama a la función del iterador.
Un iterador se usa a partir del código de cliente mediante un para cada... Instrucción siguiente o mediante una
consulta LINQ.
En el ejemplo siguiente, la primera iteración del bucle For Each hace que continúe la ejecución del método de
iterador SomeNumbers hasta que se alcance la primera instrucción Yield . Esta iteración devuelve un valor de 3, y
la ubicación actual del método de iterador se conserva. En la siguiente iteración del bucle, la ejecución del
método iterador continúa desde donde se dejó, deteniéndose de nuevo al alcanzar una instrucción Yield . Esta
iteración devuelve un valor de 5, y la ubicación actual del método de iterador se vuelve a conservar. El bucle se
completa al alcanzar el final del método iterador.

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

El tipo de valor devuelto de un método de iterador o descriptor de acceso get puede ser IEnumerable,
IEnumerable<T>, IEnumerator o IEnumerator<T>.
Puede usar una instrucción Exit Function o Return para finalizar la iteración.
Una Visual Basic función de iterador o get declaración de descriptor de acceso incluye un modificador de
iterador .
Los iteradores se introdujeron en Visual Basic en Visual Studio 2012.
En este tema
Iterador simple
Crear una clase de colección
Bloques try
Métodos anónimos
Uso de iteradores con una lista genérica
Información sobre la sintaxis
Implementación técnica
Uso de iteradores

NOTE
En todos los ejemplos del tema excepto en el ejemplo de iterador simple, incluya instrucciones Imports para los espacios
de nombres System.Collections y System.Collections.Generic .

Iterador simple
El ejemplo siguiente tiene una única instrucción Yield que está dentro de un ... Siguiente bucle. En Main , cada
iteración del cuerpo de la instrucción For Each crea una llamada a la función de iterador, que continúa a la
instrucción Yield siguiente.

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

Crear una clase de colección


En el ejemplo siguiente, la clase DaysOfTheWeek implementa la interfaz IEnumerable, que requiere un método
GetEnumerator. El compilador llama implícitamente al método GetEnumerator , que devuelve un IEnumerator.
El método GetEnumerator devuelve cada cadena de una en una mediante la instrucción Yield y un modificador
Iterator se encuentra en la declaración de función.
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

En el ejemplo siguiente se crea una clase Zoo que contiene una colección de animales.
La instrucción For Eachque hace referencia a la instancia de clase ( theZoo ) llama implícitamente al método
GetEnumerator . Las instrucciones For Each que hacen referencia a las propiedades Birds y Mammals usan el
método iterador con el nombre AnimalsForType .

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

Bloques try
Visual Basic permite una instrucción de Yield en el bloque Try de una instrucción try... Detectar... Finally. Un
bloque Try que tiene una instrucción Yield puede tener bloques Catch y puede tener un bloque Finally .
En el ejemplo siguiente se incluyen los bloques Try , Catch y Finally en una función de iterador. El bloque
Finally de la función de iterador se ejecuta antes de que finalice la iteración de For Each .
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

Una instrucción Yield no puede estar dentro de un bloque de Catch o un bloque Finally .
Si el cuerpo de For Each (en lugar del método de iterador) produce una excepción, no se ejecuta un bloque de
Catch en la función de iterador, pero se ejecuta un bloque de Finally en la función de iterador. Un bloque
Catch dentro de una función de iterador solo detecta las excepciones que se producen dentro de la función de
iterador.

Métodos anónimos
En Visual Basic, una función anónima puede ser una función de iterador. Esto se ilustra en el siguiente ejemplo.

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()

En el ejemplo siguiente hay un método que no es de iterador que valida los argumentos. El método devuelve el
resultado de un iterador anónimo que describe los elementos de la colección.
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

Si la validación está en su lugar dentro de la función de iterador, no se puede realizar la validación hasta el inicio
de la primera iteración del cuerpo de For Each .

Uso de iteradores con una lista genérica


En el ejemplo siguiente, la clase genérica Stack(Of T) implementa la interfaz genérica IEnumerable<T>. El
método Push asigna valores a una matriz de tipo T . El método GetEnumerator devuelve los valores de la
matriz con la instrucción Yield .
Además del método GetEnumerator genérico, el método GetEnumerator no genérico también debe
implementarse. Esto es porque IEnumerable<T> se hereda de IEnumerable. La implementación no genérica
aplaza la implementación genérica.
El ejemplo usa iteradores con nombre para admitir distintas formas de recorrer en iteración la misma colección
de datos. Estos iteradores con nombre son las propiedades TopToBottom y BottomToTop , y el método TopN .
La declaración de la propiedad BottomToTop incluye la palabra clave Iterator .

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


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


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

Información sobre la sintaxis


Un iterador se puede producir como un método o como un descriptor de acceso get . Un iterador no puede
aparecer en un evento, un constructor de instancia, un constructor estático o un destructor estático.
Debe existir una conversión implícita desde el tipo de expresión en la instrucción Yield al tipo de valor
devuelto por el iterador.
En Visual Basic, un método de iterador no puede tener ningún parámetro ByRef .
En Visual Basic, "yield" no es una palabra reservada y tiene un significado especial solo cuando se usa en un
método de Iterator o un descriptor de acceso get .

Implementación técnica
Aunque un iterador se escribe como un método, el compilador lo traduce a una clase anidada que es, en
realidad, una máquina de estados. Esta clase realiza el seguimiento de la posición del iterador mientras el bucle
For Each...Next continúe en el código de cliente.

Para ver lo que hace el compilador, puede usar la herramienta Ildasm.exe para ver el código de lenguaje
intermedio de Microsoft que se genera para un método iterador.
Cuando se crea un iterador para una clase o struct, no es necesario implementar la interfaz de IEnumerator
completa. Cuando el compilador detecta el iterador, genera automáticamente los métodos Current , MoveNext y
Dispose de la interfaz IEnumerator o IEnumerator<T>.

En cada iteración sucesiva del bucle For Each…Next (o la llamada directa a IEnumerator.MoveNext ), el cuerpo de
código del iterador siguiente se reanuda después de la instrucción Yield anterior. Después, continúa con la
siguiente instrucción Yield hasta que se alcanza el final del cuerpo del iterador o hasta que se encuentra una
instrucción Exit Function o Return .
Los iteradores no admiten el método IEnumerator.Reset. Para volver a recorrer en iteración desde el principio, se
debe obtener un nuevo iterador.
Para obtener más información, vea la especificación del lenguaje Visual Basic.

Uso de iteradores
Los iteradores permiten mantener la simplicidad de un bucle For Each cuando se necesita usar código
complejo para rellenar una secuencia de lista. Esto puede ser útil si quiere hacer lo siguiente:
Modificar la secuencia de lista después de la primera iteración del bucle For Each .
Evitar que se cargue totalmente una lista grande antes de la primera iteración de un bucle For Each . Un
ejemplo es una búsqueda paginada para cargar un lote de filas de tabla. Otro ejemplo es el método
EnumerateFiles, que implementa iteradores en .NET Framework.
Encapsular la creación de la lista en el iterador. En el método iterador, puede crear la lista y después
devolver cada resultado en un bucle.

Consulte también
System.Collections.Generic
IEnumerable<T>
For Each...Next (instrucción)
Yield (instrucción)
Iterator
Language-Integrated Query (LINQ) (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

LINQ es un conjunto de características que agrega capacidades de consulta eficaces a la sintaxis del lenguaje Visual
Basic. LINQ incorpora patrones estándar y de fácil aprendizaje para consultar y actualizar datos, y la tecnología se
puede ampliar para proporcionar compatibilidad prácticamente con cualquier tipo de almacén de datos. .NET
Framework incluye ensamblados de proveedor LINQ que habilitan el uso de LINQ con colecciones de .NET
Framework, bases de datos de SQL Server, conjuntos de datos ADO.NET y documentos XML.

Esta sección
Introducción a LINQ (Visual Basic)
Proporciona una introducción general a los tipos de aplicaciones que puede escribir y los tipos de problemas que
puede solucionar con las consultas LINQ.
Introducción a LINQ en Visual Basic
Describe los hechos básicos que debería conocer para entender la documentación y los ejemplos de Visual Basic.
Compatibilidad del IDE y las herramientas de Visual Studio con LINQ (Visual Basic)
Describe el Object Relational Designer de Visual Studio, la compatibilidad del depurador con las consultas y otras
características del IDE relacionadas con LINQ.
Información general sobre operadores de consulta estándar (Visual Basic)
Proporciona una introducción a los operadores de consulta estándar. También proporciona vínculos a temas que
contienen más información sobre cada tipo de operación de consulta.
LINQ to Objects (Visual Basic)
Incluye vínculos a temas que explican cómo usar LINQ to Objects para tener acceso a estructuras de datos en
memoria.
LINQ to XML (Visual Basic)
Incluye vínculos a temas que explican cómo usar LINQ to XML, que proporciona las funciones de modificación de
documentos en memoria del Document Object Model (DOM) y admite expresiones de consulta de LINQ.
LINQ to ADO.NET (Página de portal)
Proporciona un punto de entrada de documentación sobre LINQ to DataSet, LINQ to SQL y LINQ to Entities. LINQ
to DataSet permite compilar capacidades de consulta más complejas en DataSet mediante la misma funcionalidad
de consulta disponible para otros orígenes de datos. LINQ to SQL proporciona una infraestructura en tiempo de
ejecución para administrar los datos relacionales como objetos. LINQ to Entities permite a los desarrolladores
escribir consultas en el modelo conceptual de Entity Framework mediante C#.
Habilitar un origen de datos para realizar consultas LINQ
Proporciona una introducción a los proveedores LINQ personalizados, los árboles de expresión LINQ y otras
maneras de extender LINQ.
Programación orientada a objetos (Visual Basic)
21/03/2020 • 19 minutes to read • Edit Online

Visual Basic proporciona compatibilidad completa para la programación orientada a objetos, incluida la
encapsulación, la herencia y el polimorfismo.
La encapsulación significa que un grupo de propiedades, métodos y otros miembros relacionados se tratan como
una sola unidad u objeto.
La herencia describe la posibilidad de crear nuevas clases basadas en una clase existente.
El polimorfismo significa que puede tener múltiples clases que se pueden usar de manera intercambiable, aunque
cada clase implementa las mismas propiedades o los mismos métodos de maneras diferentes.
En esta sección se describen los conceptos siguientes:
Clases y objetos
Miembros de clase
Propiedades y campos
Métodos
Constructores
Destructores
Eventos
Clases anidadas
Modificadores de acceso y niveles de acceso
Clases de creación de instancias
Clases y miembros compartidos
Tipos anónimos (Guía de programación de C#).
Herencia
Miembros que anulan
Interfaces
Genéricos
Delegados

Clases y objetos
Los términos clase y objeto se usan a veces indistintamente pero, en realidad, las clases describen el tipo de los
objetos, mientras que los objetos son instancias de clases que se pueden usar. Así, la acción de crear un objeto se
denomina creación de instancias. Con la analogía de plano, una clase es un plano y un objeto es un edificio
construido a partir de ese plano.
Para definir una clase:

Class SampleClass
End Class

Visual Basic también proporciona una versión ligera de clases denominadas estructuras que son útiles cuando se
necesita crear una gran matriz de objetos y no desea consumir demasiada memoria para ello.
Para definir una estructura:
Structure SampleStructure
End Structure

Para más información, consulte:


Class (instrucción)
Structure (Instrucción)
Miembros de clase
Cada clase puede tener distintos miembros de clase, entre los que se incluyen las propiedades que describen los
datos de clase, los métodos que definen el comportamiento de la clase y los eventos que proporcionan
comunicación entre distintos objetos y clases.
Propiedades y campos
Los campos y propiedades representan información que contiene un objeto. Los campos se parecen a las variables
ya que se pueden leer y establecer directamente.
Para definir un campo:

Class SampleClass
Public SampleField As String
End Class

Las propiedades tienen procedimientos get y set, que proporcionan un mayor control sobre la forma en que se
establecen o devuelven los valores.
Visual Basic permite crear un campo privado para almacenar el valor de propiedad o usar las denominadas
propiedades implementadas automáticamente que crean este campo automáticamente en segundo plano y
proporcionan la lógica básica para los procedimientos de propiedad.
Para definir una propiedad implementada automáticamente:

Class SampleClass
Public Property SampleProperty as String
End Class

Si necesita realizar algunas operaciones adicionales para leer y escribir el valor de propiedad, defina un campo
para almacenar el valor de propiedad y proporcione la lógica básica para almacenarlo y recuperar lo:

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

La mayoría de las propiedades tienen métodos o procedimientos tanto para establecer como para obtener el valor
de propiedad. Sin embargo, se pueden crear propiedades de solo lectura o solo escritura para restringir su
modificación o lectura. En Visual Basic se pueden usar las palabras clave ReadOnly y WriteOnly . En cambio, las
propiedades implementadas automáticamente no pueden ser de solo lectura o de solo escritura.
Para más información, consulte:
Property (instrucción)
Get (Instrucción)
Establecer declaración
Readonly
Writeonly
Métodos
Un método es una acción que un objeto puede realizar.

NOTE
En Visual Basic hay dos formas de crear un método: se usa la instrucción Sub si el método no devuelve un valor o bien se
usa la instrucción Function si el método devuelve un valor.

Para definir un método de una clase:

Class SampleClass
Public Function SampleFunc(ByVal SampleParam As String)
' Add code here
End Function
End Class

Una clase puede tener varias implementaciones o sobrecargas del mismo método que se diferencian en el número
de parámetros o de tipos de parámetro.
Para sobrecargar un método:

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

En la mayoría de los casos, un método se declara dentro de una definición de clase. Sin embargo, Visual Basic
también admite métodos de extensión que permiten agregar métodos a una clase existente fuera de la definición
real de la clase.
Para más información, consulte:
Function (instrucción)
Instrucción Sub
Sobrecargas
Métodos de extensión
Constructores
Los constructores son métodos de clase que se ejecutan automáticamente cuando se crea un objeto de un tipo
determinado. Normalmente, los constructores inicializan los miembros de datos del nuevo objeto. Un constructor
solo puede ejecutarse una vez cuando se crea una clase. Además, el código del constructor siempre se ejecuta
antes que cualquier otro código en una clase. Sin embargo, puede crear varias sobrecargas del constructor de la
misma forma que para cualquier otro método.
Para definir un constructor para una clase:

Class SampleClass
Sub New(ByVal s As String)
// Add code here.
End Sub
End Class

Para obtener más información, consulte: Duración del objeto: cómo se crean y destruyen los objetos.
Destructores
Los destructores se utilizan para destruir instancias de clases. En .NET Framework, el recolector de elementos no
utilizados administra automáticamente la asignación y la liberación de memoria para los objetos administrados en
la aplicación. Sin embargo, es posible que aún se necesiten destructores para limpiar cualquiera de los recursos no
administrados creados por la aplicación. Solo puede haber un destructor para una clase.
Para obtener más información sobre los destructores y la recolección de elementos no utilizados en .NET
Framework, vea Garbage Collection (Recolección de elementos no utilizados).
Eventos
Cuando ocurre algo interesante, los eventos habilitan una clase u objeto para notificarlo a otras clases u objetos.
La clase que envía (o genera) el evento se denomina editor y las clases que reciben (o controlan) el evento se
denominan suscriptores. Para obtener más información sobre los eventos y la forma en que se generan y
controlan, vea Eventos.
Para declarar eventos, utilice la instrucción Event.
Para generar eventos, utilice la instrucción RaiseEvent.
Para especificar controladores de eventos mediante una forma declarativa, use la instrucción WithEvents y
la cláusula Handles.
Para poder agregar, quitar y cambiar dinámicamente el controlador de eventos asociado a un evento, use la
instrucción AddHandler y la instrucción RemoveHandler junto con el operador AddressOf.
Clases anidadas
Una clase definida dentro de otra se denomina anidada. De forma predeterminada, una clase anidada es privada.

Class Container
Class Nested
' Add code here.
End Class
End Class

Para crear una instancia de la clase anidada, use el nombre de la clase contenedora seguido de un punto y seguido,
a continuación, del nombre de la clase anidada:

Dim nestedInstance As Container.Nested = New Container.Nested()

Modificadores de acceso y niveles de acceso


Todas las clases y miembros de clase pueden especificar el nivel de acceso que proporcionan a otras clases
mediante los modificadores de acceso.
Están disponibles los siguientes modificadores de acceso:
M O DIF IC A DO R DE VISUA L B A SIC DEF IN IC IÓ N

Público Puede obtener acceso al tipo o miembro cualquier otro


código del mismo ensamblado o de otro ensamblado que
haga referencia a éste.

Privada Solamente puede obtener acceso al tipo o miembro el código


de la misma clase.

Protegido Solamente puede obtener acceso al tipo o miembro el código


de la misma clase o de una clase derivada.

Amigo Puede obtener acceso al tipo o miembro cualquier código del


mismo ensamblado, pero no de un ensamblado distinto.

Protected Friend Puede obtener acceso al tipo o miembro cualquier código del
mismo ensamblado o cualquier clase derivada de otro
ensamblado.

Para obtener más información, vea Niveles de acceso en Visual Basic.


Clases de creación de instancias
Para crear un objeto, debe crear una o varias instancias de una clase.

Dim sampleObject as New SampleClass()

Una vez creadas las instancias de una clase, puede asignar valores a las propiedades y los campos de la instancia,
así como invocar métodos de clase.

' Set a property value.


sampleObject.SampleProperty = "Sample String"
' Call a method.
sampleObject.SampleMethod()

Para asignar valores a las propiedades durante el proceso de creación de instancias de una clase, use los
inicializadores de objeto:

Dim sampleObject = New SampleClass With


{.FirstProperty = "A", .SecondProperty = "B"}

Para más información, consulte:


New Operator (Nuevo operador)
Inicializadores de objeto: Tipos con nombre y anónimos
Clases y miembros compartidos
Un miembro compartido de la clase es una propiedad, procedimiento o campo que comparten todas las instancias
de una clase.
Para definir un miembro compartido:

Class SampleClass
Public Shared SampleString As String = "Sample String"
End Class
Para tener acceso al miembro compartido, utilice el nombre de la clase sin crear un objeto de esta clase:

MsgBox(SampleClass.SampleString)

Los módulos compartidos de Visual Basic solo tienen miembros compartidos y no se pueden crear instancias. Los
miembros compartidos tampoco pueden acceder a propiedades, campos o métodos no compartidos
Para más información, consulte:
Compartido
Module (Instrucción)
Tipos anónimos
Los tipos anónimos permiten crear objetos sin escribir una definición de clase para el tipo de datos. En su lugar, el
compilador genera una clase. La clase no tiene ningún nombre que se pueda usar y contiene las propiedades
especificadas al declarar el objeto.
Para crear una instancia de un tipo anónimo:

' sampleObject is an instance of a simple anonymous type.


Dim sampleObject =
New With {Key .FirstProperty = "A", .SecondProperty = "B"}

Para obtener más información, consulte: Tipos anónimos.

Herencia
La herencia permite crear una nueva clase que reutiliza, extiende y modifica el comportamiento que se define en
otra clase. La clase cuyos miembros se heredan se denomina clase base y la clase que hereda esos miembros se
denomina clase derivada. Sin embargo, todas las clases Object de Visual Basic heredan implícitamente de la clase
que admite la jerarquía de clases .NET y proporciona servicios de bajo nivel a todas las clases.

NOTE
Visual Basic no admite la herencia múltiple. Es decir, solo puede especificar una clase base para una clase derivada.

Para heredar de una clase base:

Class DerivedClass
Inherits BaseClass
End Class

De forma predeterminada, todas las clases se pueden heredar. Sin embargo, puede especificar si una clase no se
debe usar como clase base o bien crear una clase que solo se pueda usar como clase base.
Para especificar que una clase no se puede usar como clase base:

NotInheritable Class SampleClass


End Class

Para especificar que una clase se puede usar solo como clase base y no se pueden crear instancias de esta:
MustInherit Class BaseClass
End Class

Para más información, consulte:


Inherits (instrucción)
NotInheritable
MustInherit
Miembros que anulan
De forma predeterminada, una clase derivada hereda todos los miembros de su clase base. Si desea cambiar el
comportamiento del miembro heredado, debe invalidarlo. Es decir, se puede definir una nueva implementación del
método, la propiedad o el evento en la clase derivada.
Los siguientes modificadores se utilizan para controlar cómo se reemplazan propiedades y métodos:

M O DIF IC A DO R DE VISUA L B A SIC DEF IN IC IÓ N

Overridable Permite invalidar un miembro de una clase derivada.

Invalidaciones Invalida un miembro virtual (invalidable) definido en la clase


base.

NotOverridable Impide que un miembro se invalide en una clase heredera.

MustOverride Requiere que se invalide un miembro de clase en la clase


derivada.

Shadows Oculta un miembro heredado de una clase base.

Interfaces
Las interfaces, como las clases, definen un conjunto de propiedades, métodos y eventos. Pero de forma contraria a
las clases, las interfaces no proporcionan implementación. Se implementan como clases y se definen como
entidades separadas de las clases. Una interfaz representa un contrato, en el cual una clase que implementa una
interfaz debe implementar cualquier aspecto de dicha interfaz exactamente como esté definido.
Para definir una interfaz:

Public Interface ISampleInterface


Sub DoSomething()
End Interface

Para implementar una interfaz en una clase:

Class SampleClass
Implements ISampleInterface
Sub DoSomething
' Method implementation.
End Sub
End Class

Para más información, consulte:


Interfaces
Interface (instrucción)
Implements (instrucción)

Genéricos
Las clases, estructuras, interfaces y métodos de .NET pueden incluir parámetros de tipo que definen tipos de
objetos que pueden almacenar o usar. El ejemplo más común de elementos genéricos es una colección, donde se
puede especificar el tipo de objetos que se va a almacenar en una colección.
Para definir una clase genérica:

Class SampleGeneric(Of T)
Public Field As T
End Class

Para crear una instancia de una clase genérica:

Dim sampleObject As New SampleGeneric(Of String)


sampleObject.Field = "Sample string"

Para más información, consulte:


Genéricos
Tipos genéricos en Visual Basic

Delegados
Un delegado es un tipo que define una firma de método y que puede proporcionar una referencia a cualquier
método con una firma compatible. Puede invocar (o llamar) al método a través del delegado. Los delegados se
utilizan para pasar métodos como argumentos a otros métodos.

NOTE
Los controladores de eventos no son más que métodos que se invocan a través de delegados. Para obtener más
información sobre el uso de delegados en el control de eventos, vea Eventos.

Para crear un delegado:

Delegate Sub SampleDelegate(ByVal str As String)

Para crear una referencia a un método que coincida con la firma especificada por el delegado:

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 más información, consulte:
Delegados
Delegate (instrucción)
AddressOf (operador)

Consulte también
Guía de programación en Visual Basic
Reflexión (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

La reflexión proporciona objetos (de tipo Type) que describen los ensamblados, módulos y tipos. Puede usar la
reflexión para crear dinámicamente una instancia de un tipo, enlazar el tipo a un objeto existente u obtener el tipo
desde un objeto existente e invocar sus métodos, o acceder a sus campos y propiedades. Si usa atributos en el
código, la reflexión le permite acceder a ellos. Para obtener más información, consulte Attributes (Atributos).
Este es un ejemplo simple de reflexión que usa el método estático GetType , heredado por todos los tipos de la
clase base Object , para obtener el tipo de una variable:

' Using GetType to obtain type information:


Dim i As Integer = 42
Dim type As System.Type = i.GetType()
System.Console.WriteLine(type)

El resultado es el siguiente:
System.Int32

En el ejemplo siguiente se usa la reflexión para obtener el nombre completo del ensamblado cargado.

' Using Reflection to get information from an Assembly:


Dim info As System.Reflection.Assembly = GetType(System.Int32).Assembly
System.Console.WriteLine(info)

El resultado es el siguiente:
mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089

Información general de la reflexión


La reflexión resulta útil en las siguientes situaciones:
Cuando tenga que acceder a atributos en los metadatos del programa. Para obtener más información,
consulte Retrieving Information Stored in Attributes (Recuperar la información almacenada en atributos).
Para examinar y crear instancias de tipos en un ensamblado.
Para generar nuevos tipos en tiempo de ejecución. Usar clases en System.Reflection.Emit.
Para llevar a cabo métodos de acceso de enlace en tiempo de ejecución en tipos creados en tiempo de
ejecución. Consulte el tema Dynamically Loading and Using Types (Cargar y usar tipos dinámicamente).

Secciones relacionadas
Para obtener más información:
Reflexión
Viewing Type Information (Ver información tipos)
Reflection and Generic Types (Reflexión y tipos genéricos)
System.Reflection.Emit
Retrieving Information Stored in Attributes (Recuperar la información almacenada en atributos)

Vea también
Guía de programación en Visual Basic
Ensamblados de .NET
Serialización (Visual Basic)
27/11/2019 • 8 minutes to read • Edit Online

La serialización es un proceso que consiste en convertir un objeto en una secuencia de bytes para almacenar el
objeto o transmitirlo a la memoria, a una base de datos o a un archivo. Su propósito principal es guardar el estado
de un objeto para poder volver a crearlo cuando sea necesario. El proceso inverso se denomina deserialización.

Funcionamiento de la serialización
En esta ilustración se muestra el proceso general de la serialización.

El objeto se serializa en una secuencia, que incluye no solo los datos, sino también la información sobre el tipo de
objeto, como su versión, referencia cultural y nombre de ensamblado. A partir de esa secuencia, el almacenamiento
se puede realizar en una base de datos, en un archivo o en la memoria.
Usos de la serialización
La serialización permite al desarrollador guardar el estado de un objeto y volver a crearlo según sea necesario,
gracias a que proporciona almacenamiento de los objetos e intercambio de datos. A través de la serialización, un
desarrollador puede realizar acciones como enviar un objeto a una aplicación remota por medio de un servicio
web, pasar un objeto de un dominio a otro, pasar un objeto a través de un firewall como una cadena XML o
mantener la seguridad o información específica del usuario entre aplicaciones.
Conversión de un objeto en serializable
Para serializar un objeto, necesita el objeto que se va a serializar, una secuencia que contenga el objeto serializado y
un Formatter. System.Runtime.Serialization contiene las clases necesarias para serializar y deserializar objetos.
Aplique el atributo SerializableAttribute a un tipo para indicar que se pueden serializar instancias de este tipo. Si se
intenta serializar pero el tipo no tiene el atributo SerializationException, se produce una excepción
SerializableAttribute.
Si no quiere que un campo dentro de la clase sea serializable, aplique el atributo NonSerializedAttribute. Si un
campo de un tipo serializable contiene un puntero, un controlador o alguna otra estructura de datos específica para
un entorno concreto y el campo no se puede reconstituir correctamente en un entorno diferente, puede convertirlo
en no serializable.
Si una clase serializada contiene referencias a objetos de otras clases marcadas como SerializableAttribute, esos
objetos también se serializarán.

Serialización XML y binaria


Se puede usar la serialización binaria y XML. En la serialización binaria, se serializan todos los miembros, incluso
aquellos que son de solo lectura, y se mejora el rendimiento. La serialización XML proporciona código más legible,
así como mayor flexibilidad para compartir objetos y utilizarlos para fines de interoperabilidad.
Serialización binaria
La serialización binaria utiliza la codificación binaria para generar una serialización compacta para usos como
almacenamiento o secuencias de red basadas en socket.
Serialización XML
La serialización XML serializa las propiedades y los campos públicos de un objeto o los parámetros y valores
devueltos de los métodos en una secuencia XML que se ajusta a un documento específico del lenguaje de
definición de esquema XML (XSD). La serialización XML produce clases fuertemente tipadas cuyas propiedades y
campos públicos se convierten a XML. System.Xml.Serialization contiene las clases necesarias para serializar y
deserializar XML.
Se pueden aplicar atributos a clases y a miembros de clase para controlar la forma en que XmlSerializer serializa o
deserializa una instancia de la clase.

Serialización básica y personalizada


La serialización puede realizarse de dos formas, es decir, de manera básica y también personalizada. La
serialización básica utiliza .NET Framework para serializar automáticamente el objeto.
Serialización básica
El único requisito de la serialización básica es que el objeto tenga aplicado el atributo SerializableAttribute.
NonSerializedAttribute puede usarse para impedir la serialización de campos específicos.
Cuando se utiliza la serialización básica, el control de versiones de objetos puede crear problemas, en cuyo caso la
serialización personalizada puede ser preferible. La serialización básica es la manera más fácil de realizar la
serialización, pero no proporciona mucho control sobre el proceso.
Serialización personalizada
En la serialización personalizada, puede especificar exactamente qué objetos se serializarán y cómo se llevará a
cabo la serialización. La clase debe marcarse como SerializableAttribute e implementar la interfaz ISerializable.
Si desea que el objeto se deserialice también de forma personalizada, debe usar un constructor personalizado.

Serialización de diseñador
La serialización de diseñador es una forma especial de serialización que abarca el tipo de persistencia de objeto
normalmente asociado a las herramientas de desarrollo. La serialización de diseñador es un proceso que consiste
en convertir un gráfico de objetos en un archivo de código fuente que puede utilizarse posteriormente para
recuperar el gráfico de objetos. Un archivo de código fuente puede contener código, marcado o incluso
información de la tabla SQL.

Temas relacionados y ejemplos


Walkthrough: Persisting an Object in Visual Studio (Visual Basic) (Tutorial: Conservar un objeto en Visual Studio
[Visual Basic])
Se explica cómo se puede usar la serialización para conservar los datos de un objeto entre instancias, lo que le
permite almacenar valores y recuperarlos la próxima vez que se cree una instancia del objeto.
How to: Read Object Data from an XML File (Visual Basic) (Lectura de datos de objetos de un archivo XML [Visual
Basic])
Se muestra cómo leer los datos de objetos que se han escrito anteriormente en un archivo XML con la clase
XmlSerializer.
How to: Write Object Data to an XML File (Visual Basic) (Escritura de datos de objetos en un archivo XML [Visual
Basic])
Se muestra cómo escribir el objeto de una clase en un archivo XML con la clase XmlSerializer.
Convenciones de código y estructura de programas
(Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

En esta sección se presenta la estructura de programas de Visual Basic típica, se proporciona un sencillo programa
de Visual Basic, "Hello, World", y se explican las convenciones de código Visual Basic. Las convenciones de código
son sugerencias que no se centran en la lógica de un programa, sino en su estructura y apariencia física. Después,
hace que el código sea más fácil de leer, comprender y mantener. Las convenciones de código pueden incluir, entre
otras:
Formatos normalizados para etiquetar y comentar código.
Instrucciones para el espaciado, el formato y la sangría del código.
Convenciones de nomenclatura para objetos, variables y procedimientos.
En los siguientes temas se presenta un conjunto de directrices de programación para Visual Basic programas,
junto con ejemplos de uso correcto.

Esta sección
Estructura de un programa de Visual Basic
Proporciona información general sobre los elementos que componen un programa Visual Basic.
Procedimiento Main en Visual Basic
Describe el procedimiento que sirve como punto de partida y control general de la aplicación.
Referencias y la instrucción Imports
Describe cómo hacer referencia a objetos de otros ensamblados.
Espacios de nombres en Visual Basic
Describe cómo los espacios de nombres organizan los objetos dentro de los ensamblados.
Convenciones de nomenclatura de Visual Basic
Incluye directrices generales para asignar nombres a procedimientos, constantes, variables, argumentos y objetos.
Convenciones de código de Visual Basic
Revisa las instrucciones usadas en el desarrollo de los ejemplos de esta documentación.
Compilación condicional
Describe cómo compilar de forma selectiva bloques concretos de código mientras se indica al compilador que
omita otros.
Interrumpir y combinar instrucciones en código
Muestra cómo dividir instrucciones largas en varias líneas y combinar instrucciones cortas en una sola línea.
Contraer y ocultar secciones de código
Muestra cómo contraer y ocultar secciones de código en el editor de código de Visual Basic.
Aplicar etiquetas a las instrucciones
Muestra cómo marcar una línea de código para identificarla para su uso con instrucciones como On Error Goto .
Caracteres especiales en el código
Muestra cómo y dónde utilizar caracteres no numéricos y no alfabéticos.
Comentarios en código
Describe cómo agregar comentarios descriptivos al código.
Palabras clave como nombres de elementos en código
Describe cómo usar corchetes ( [] ) para delimitar nombres de variable que también se Visual Basic palabras
clave.
Me, My, MyBase y MyClass
Describe varias maneras de hacer referencia a los elementos de un programa de Visual Basic.
Limitaciones de Visual Basic
Describe la eliminación de los límites de código conocidos en Visual Basic.

Secciones relacionadas
Convenciones tipográficas y de código
Proporciona convenciones de codificación estándar para Visual Basic.
Escribir código
Describe las características que facilitan la escritura y administración del código.
Estructura de un programa de Visual Basic
23/10/2019 • 7 minutes to read • Edit Online

Un programa de Visual Basic se componen de bloques de creación estándar. Un solución consta de uno o varios
proyectos. Un proyecto a su vez puede contener uno o más ensamblados. Cada ensamblado está compilada a
partir de uno o varios archivos de origen. Un archivo de código fuente proporciona la definición e implementación
de clases, estructuras, módulos e interfaces, que en última instancia contienen todo el código.
Para obtener más información acerca de estos bloques de creación de un programa de Visual Basic, vea soluciones
y proyectos y ensamblados de .NET.

Elementos de programación de nivel de archivo


Al iniciar un proyecto o archivo y abrir el editor de código, verá algo de código ya está en su lugar y en el orden
correcto. Cualquier código que escriba debe seguir la secuencia siguiente:
1. Option Instrucciones
2. Imports Instrucciones
3. Namespace instrucciones y los elementos de nivel de espacio de nombres
Si escribe instrucciones en un orden diferente, pueden dar lugar a errores de compilación.
Un programa también puede contener instrucciones de compilación condicional. Se pueden incluirse en el archivo
de código fuente entre las instrucciones de la secuencia anterior.
Instrucciones de la opción
Option las instrucciones establecen reglas básicas para el código subsiguiente, ayudando a evitar errores de
sintaxis y la lógica. El instrucción Option Explicit garantiza que todas las variables se declaran y ha escrito
correctamente, lo que reduce el tiempo de depuración. El Option Strict Statement ayuda a minimizar la pérdida de
datos y errores de lógica que puede producirse al trabajar entre variables de diferentes tipos de datos. El
instrucción Option Compare especifica las cadenas de manera que se comparan entre sí, en función de sus Binary
o Text valores.
Instrucciones Imports
Puede incluir un instrucción Imports (tipo y Namespace. NET) para importar los nombres definidos fuera del
proyecto. Un Imports instrucción permite que el código hacer referencia a clases y otros tipos definidos en el
espacio de nombres importado, sin tener que calificarlos. Puede utilizar tantas Imports instrucciones según
corresponda. Para obtener más información, consulte referencias y la instrucción Imports.
Instrucciones de Namespace
Los espacios de nombres le ayudan a organiza y clasificar los elementos de programación para facilitar la
agrupación y el acceso. Usa el instrucción Namespace para clasificar las instrucciones siguientes dentro de un
espacio de nombres determinado. Para más información, consulte Espacios de nombres en Visual Basic.
Instrucciones de compilación condicional
Instrucciones de compilación condicional pueden aparecer prácticamente en cualquier parte en el archivo de
origen. Hacen que las partes del código que se incluirán o excluirán en tiempo de compilación según determinadas
condiciones. También se puede usar para depurar la aplicación, como código condicional se ejecuta en modo sólo
de depuración. Para obtener más información, consulte compilación condicional.
Elementos de programación de nivel de Namespace
Las clases, estructuras y los módulos contienen todo el código en el archivo de origen. Son nivel de espacio de
nombres elementos, que pueden aparecer dentro de un espacio de nombres o en el nivel de archivos de origen.
Contienen las declaraciones de todos los demás elementos de programación. Las interfaces, que definen las firmas
de elemento pero no proporcionan ninguna implementación, también aparecen en el nivel de módulo. Para
obtener más información sobre los elementos de nivel de módulo, vea lo siguiente:
Class (instrucción)
Structure (instrucción)
Module (instrucción)
Interface (instrucción)
Elementos de datos en el nivel de espacio de nombres son las enumeraciones y delegados.

Elementos de programación de nivel de módulo


Los procedimientos, operadores, propiedades y eventos son los únicos elementos de programación que pueden
contener código ejecutable (instrucciones que realizan acciones en tiempo de ejecución). Son el nivel de módulo
elementos del programa. Para obtener más información sobre los elementos de nivel de procedimiento, vea lo
siguiente:
Function (instrucción)
Sub (instrucción)
Declare (instrucción)
Operator (instrucción)
Property (instrucción)
Event (instrucción)
Elementos de datos en el nivel de módulo son variables, constantes, enumeraciones y delegados.

Elementos de programación de nivel de procedimiento


La mayoría del contenido de nivel de procedimiento elementos son instrucciones ejecutables, que constituyen el
código de tiempo de ejecución del programa. Todo el código ejecutable debe estar en algún procedimiento (
Function , Sub , Operator , Get , Set , AddHandler , RemoveHandler , RaiseEvent ). Para obtener más información,
vea Instrucciones (Guía de programación de C#).
Elementos de datos en el nivel de procedimiento se limitan a las constantes y variables locales.

El procedimiento principal
El Main procedimiento es el primer código que se ejecutará cuando se ha cargado la aplicación. Main sirve como
punto de partida y control general de la aplicación. Hay cuatro variedades de Main :
Sub Main()

Sub Main(ByVal cmdArgs() As String)

Function Main() As Integer

Function Main(ByVal cmdArgs() As String) As Integer


La variedad más común de este procedimiento es Sub Main() . Para obtener más información, consulte
procedimiento Main en Visual Basic.

Vea también
Procedimiento Main en Visual Basic
Convenciones de nomenclatura de Visual Basic
Limitaciones de Visual Basic
Procedimiento Main en Visual Basic
27/11/2019 • 5 minutes to read • Edit Online

Cada Visual Basic aplicación debe contener un procedimiento denominado Main . Este procedimiento sirve como
punto de partida y control general de la aplicación. El .NET Framework llama a su Main procedimiento cuando
haya cargado la aplicación y esté listo para pasarle el control. A menos que cree una aplicación Windows Forms,
debe escribir el procedimiento de Main para las aplicaciones que se ejecutan por sí mismas.
Main contiene el código que se ejecuta en primer lugar. En Main , puede determinar qué formulario se va a
cargar primero cuando se inicie el programa, averiguar si ya se está ejecutando una copia de la aplicación en el
sistema, establecer un conjunto de variables para la aplicación o abrir una base de datos que la aplicación
requiera.

Requisitos para el procedimiento Main


Un archivo que se ejecuta por su cuenta (normalmente con la extensión. exe) debe contener un procedimiento
Main . Una biblioteca (por ejemplo, con extensión. dll) no se ejecuta por sí misma y no requiere un procedimiento
Main . Los requisitos para los diferentes tipos de proyectos que puede crear son los siguientes:

Las aplicaciones de consola se ejecutan por sí mismas, por lo que debe proporcionar al menos un
procedimiento Main .
Windows Forms aplicaciones se ejecutan por sí solos. Sin embargo, el compilador de Visual Basic genera
automáticamente un procedimiento de Main en este tipo de aplicación y no es necesario escribir ninguno.
Las bibliotecas de clases no requieren un procedimiento Main . Entre ellas se incluyen bibliotecas de
controles de Windows y bibliotecas de controles Web. Las aplicaciones web se implementan como
bibliotecas de clases.

Declarar el procedimiento Main


Hay cuatro maneras de declarar el procedimiento Main . Puede tomar argumentos o no, y puede devolver un
valor.

NOTE
Si declara Main en una clase, debe utilizar la palabra clave Shared . En un módulo, Main no tiene que ser Shared .

La manera más sencilla consiste en declarar un procedimiento Sub que no tome argumentos o devuelva
un valor.

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 también puede devolver un valor Integer , que el sistema operativo usa como código de salida para
el programa. Otros programas pueden probar este código examinando el valor de ERRORLEVEL de
Windows. Para devolver un código de salida, debe declarar Main como un Function procedimiento en
lugar de un procedimiento Sub .

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 también puede tomar una matriz de String como argumento. Cada cadena de la matriz contiene
uno de los argumentos de línea de comandos utilizados para invocar el programa. Puede realizar
diferentes acciones en función de sus valores.

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

Puede declarar Main para examinar los argumentos de la línea de comandos, pero no devolver un código
de salida, como se indica a continuación.

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

Vea también
MsgBox
Length
UBound
Estructura de un programa de Visual Basic
-main
Shared
Sub (instrucción)
Function (instrucción)
Integer (tipo de datos)
String (tipo de datos)
Referencias y la instrucción Imports (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Puede hacer que los objetos externos estén disponibles para el proyecto eligiendo el comando Agregar
referencia en el menú proyecto . Las referencias en Visual Basic pueden apuntar a ensamblados, que son
similares a las bibliotecas de tipos, pero contienen más información.

La instrucción Imports
Los ensamblados incluyen uno o varios espacios de nombres. Al agregar una referencia a un ensamblado,
también puede Agregar una instrucción Imports a un módulo que controla la visibilidad de los espacios de
nombres de ese ensamblado en el módulo. La instrucción Imports proporciona un contexto de ámbito que le
permite usar solo la parte del espacio de nombres necesaria para proporcionar una referencia única.
La instrucción Imports tiene la siguiente sintaxis:
Imports [Aliasname =] Namespace

Aliasname hace referencia a un nombre corto que puede usar en el código para hacer referencia a un espacio de
nombres importado. Namespace es un espacio de nombres disponible a través de una referencia de proyecto, a
través de una definición dentro del proyecto o a través de una instrucción de Imports anterior.
Un módulo puede contener cualquier número de instrucciones Imports . Deben aparecer después de cualquier
instrucción Option , si está presente, pero antes de cualquier otro código.

NOTE
No confunda las referencias de proyecto con la instrucción Imports o la instrucción Declare . Las referencias de proyecto
hacen que los objetos externos, como los objetos de los ensamblados, estén disponibles para proyectos de Visual Basic. La
instrucción Imports se usa para simplificar el acceso a las referencias del proyecto, pero no proporciona acceso a estos
objetos. La instrucción Declare se utiliza para declarar una referencia a un procedimiento externo en una biblioteca de
vínculos dinámicos (DLL).

Usar alias con la instrucción Imports


La instrucción Imports facilita el acceso a los métodos de las clases, ya que elimina la necesidad de escribir
explícitamente los nombres completos de las referencias. Los alias permiten asignar un nombre más descriptivo a
solo una parte de un espacio de nombres. Por ejemplo, la secuencia de retorno de carro/avance de línea que hace
que se muestre un único fragmento de texto en varias líneas forma parte del módulo de ControlChars en el
espacio de nombres Microsoft.VisualBasic. Para usar esta constante en un programa sin un alias, debe escribir el
código siguiente:

MsgBox("Some text" & Microsoft.VisualBasic.ControlChars.CrLf &


"Some more text")

Imports instrucciones siempre deben ser las primeras líneas inmediatamente después de cualquier instrucción
Option de un módulo. En el siguiente fragmento de código se muestra cómo importar y asignar un alias al
módulo Microsoft.VisualBasic.ControlChars:
Imports CtrlChrs = Microsoft.VisualBasic.ControlChars

Las referencias futuras a este espacio de nombres pueden ser mucho más cortas:

MsgBox("Some text" & CtrlChrs.CrLf & "Some more text")

Si una instrucción Imports no incluye un nombre de alias, los elementos definidos en el espacio de nombres
importado se pueden usar en el módulo sin calificación. Si se especifica el nombre de alias, se debe usar como
calificador para los nombres contenidos dentro de ese espacio de nombres.

Vea también
ControlChars
Microsoft.VisualBasic
Espacios de nombres en Visual Basic
Ensamblados de .NET
Imports (instrucción), espacio de nombres y tipo .NET
Espacios de nombres en Visual Basic
21/03/2020 • 11 minutes to read • Edit Online

Los espacios de nombres organizan los objetos definidos en un ensamblado. Los ensamblados pueden contener
varios espacios de nombres, que a su vez pueden contener otros espacios de nombres. Los espacios de
nombres evitan las ambigüedades y simplifican las referencias cuando se usan grupos de objetos grandes,
como las bibliotecas de clases.
Por ejemplo, .NET Framework ListBox define System.Windows.Forms la clase en el espacio de nombres. En el
siguiente fragmento de código se muestra cómo declarar una variable con el nombre completo de esta clase:

Dim LBox As System.Windows.Forms.ListBox

Evitar conflictos de nombres


Los espacios de nombres de .NET Framework solucionan un problema a veces denominado contaminación por
espacios de nombres, en el que el desarrollador de una biblioteca de clases se ve obstaculizado por el uso de
nombres similares en otra biblioteca. Estos conflictos con componentes existentes a veces se denominan
conflictos de nombres.
Por ejemplo, si crea una clase denominada ListBox , puede usarla en su proyecto sin ninguna calificación, Sin
embargo, si desea usar ListBox la clase .NET Framework en el mismo proyecto, debe usar una referencia
completa para que la referencia sea única. Si la referencia no es única, Visual Basic produce un error que indica
que el nombre es ambiguo. En el ejemplo de código siguiente se muestra cómo declarar estos objetos:

' 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

En la ilustración siguiente se muestran ListBox dos jerarquías de espacio de nombres, ambas con un objeto
denominado:

De forma predeterminada, cada archivo ejecutable que cree con Visual Basic contiene un espacio de nombres
con el mismo nombre que el proyecto. Por ejemplo, si define un objeto en un proyecto denominado
ListBoxProject , el archivo ejecutable ListBoxProject.exe contiene un espacio de nombres llamado
ListBoxProject .

Se puede usar el mismo espacio de nombres en varios ensamblados. Visual Basic los trata como un único
conjunto de nombres. Por ejemplo, puede definir clases para un espacio de nombres ( SomeNameSpace ) en un
ensamblado ( Assemb1 ) y definir clases adicionales para el mismo espacio de nombres desde un ensamblado
denominado Assemb2 .

nombres completos
Los nombres completos son referencias de objetos que llevan como prefijo el nombre del espacio de nombres
en el que se define el objeto. Puede usar los objetos definidos en otros proyectos si crea una referencia a la clase
(eligiendo Agregar referencia desde el menú Proyecto ) y usa el nombre completo del objeto en el código.
En el siguiente fragmento de código se muestra cómo usar el nombre completo de un objeto desde el espacio
de nombres de otro proyecto:

Dim LBC As New ListBoxProject.Form1.ListBox

Los nombres completos evitan conflictos de nomenclatura, ya que permiten que el compilador determine el
objeto que se está usando, aunque los nombres pueden llegar a ser largos y complicados. Para solucionar este
problema, puede usar la instrucción Imports para definir un alias: un nombre abreviado que puede usar en
lugar de un nombre completo. Por ejemplo, en el siguiente ejemplo de código se crean alias para dos nombres
completos y se usan para definir dos objetos.

Imports LBControl = System.Windows.Forms.ListBox


Imports MyListBox = ListBoxProject.Form1.ListBox

Dim LBC As LBControl


Dim MyLB As MyListBox

Si usa la instrucción Imports sin un alias, puede usar todos los nombres de ese espacio de nombres sin
ninguna calificación, siempre que sean únicos en el proyecto. Si el proyecto contiene instrucciones Imports de
los espacios de nombres que contienen elementos con el mismo nombre, debe calificar totalmente ese nombre
en el momento de usarlo. Supongamos, por ejemplo, que el proyecto contenía las dos instrucciones Imports
siguientes:

' This namespace contains a class called Class1.


Imports MyProj1
' This namespace also contains a class called Class1.
Imports MyProj2

Si intenta usar Class1 sin calificarlo completamente, Visual Basic produce Class1 un error que indica que el
nombre es ambiguo.

Instrucciones de nivel de espacio de nombres


Dentro de un espacio de nombres, puede definir elementos tales como módulos, interfaces, clases, delegados,
enumeraciones, estructuras y otros espacios de nombres. Los elementos tales como propiedades,
procedimientos, variables y eventos no se pueden definir en el nivel de espacio de nombres. Estos elementos
deben declararse dentro de contenedores tales como módulos, estructuras o clases.

Palabra clave Global en los nombres completos


Si ha definido una jerarquía anidada de espacios de nombres, el código insertado en esa jerarquía podría tener
bloqueado el acceso al espacio de nombres System de .NET Framework. En el siguiente ejemplo se muestra una
jerarquía en la que el espacio de nombres SpecialSpace.System bloquea el acceso a System.
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, el compilador de Visual Basic no puede resolver correctamente la referencia a System.Int32,
porque SpecialSpace.System no define Int32 . Puede usar la palabra clave Global para iniciar la cadena de
calificación en el nivel más externo de la biblioteca de clases de .NET Framework. De este modo, puede
especificar el espacio de nombres System o cualquier otro espacio de nombres en la biblioteca de clases. Esto se
ilustra en el siguiente ejemplo.

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

Puede usar Global para obtener acceso a otros espacios de nombres de nivel de raíz, como
Microsoft.VisualBasic, y a cualquier espacio de nombres asociado a su proyecto.

Palabra clave Global en las instrucciones de espacio de nombres


También puede usar la palabra clave Global en una Namespace Statement. con lo que podrá definir un espacio
de nombres fuera del espacio de nombres raíz del proyecto.
Todos los espacios de nombres del proyecto se basan en el espacio de nombres raíz de este. Visual Studio asigna
el nombre del proyecto como el espacio de nombres raíz predeterminado para todo el código del proyecto. Por
ejemplo, si el proyecto se llama ConsoleApplication1 , los respectivos elementos de programación pertenecerán
al espacio de nombres ConsoleApplication1 . Si declara Namespace Magnetosphere , las referencias a
Magnetosphere en el proyecto tendrán acceso a ConsoleApplication1.Magnetosphere .

En los siguientes ejemplos se usa la palabra clave Global para declarar un espacio de nombres fuera del
espacio de nombres raíz del proyecto.

Namespace Global.Magnetosphere

End Namespace

Namespace Global
Namespace Magnetosphere

End Namespace
End Namespace

En una declaración de espacio de nombres, no se puede anidar Global en otro espacio de nombres.
Puede usar la Application Page, Project Designer (Visual Basic) para ver y modificar el espacio de nombres
raíz del proyecto. En cuanto a los proyectos nuevos, el espacio de nombres raíz tiene como nombre
predeterminado el nombre del proyecto. Para que Global sea el espacio de nombres de nivel superior, puede
borrar la entrada Espacio de nombres raíz para que el cuadro esté vacío. Si se borra Espacio de nombres
raíz , ya no es necesario usar la palabra clave Global en las declaraciones de espacio de nombres.
Si una instrucción Namespace declara un nombre que también es un espacio de nombres en .NET Framework, el
espacio de nombres de .NET Framework dejará de estar disponible si la palabra clave Global no se usa en un
nombre completo. Para habilitar el acceso al espacio de nombres de .NET Framework sin usar la palabra clave
Global , puede incluir la palabra clave Global en la instrucción Namespace .

En el siguiente ejemplo aparece la palabra clave Global en la declaración de espacio de nombres System.Text .
Si la palabra clave Global no estuviera presente en la declaración de espacio de nombres, no se podría obtener
acceso a StringBuilder sin especificar Global.System.Text.StringBuilder . Para el proyecto ConsoleApplication1 ,
las referencias a System.Text tendrían acceso a ConsoleApplication1.System.Text si no se usara la palabra clave
Global .

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

Consulte también
ListBox
System.Windows.Forms
Ensamblados de .NET
Instrucción Imports y referencias
Imports (instrucción), espacio de nombres y tipo .NET
Escribir código en soluciones de Office
Convenciones de nomenclatura de Visual Basic
27/11/2019 • 3 minutes to read • Edit Online

Al asignar un nombre a un elemento en la aplicación Visual Basic, el primer carácter de ese nombre debe ser un
carácter alfabético o un carácter de subrayado. Sin embargo, tenga en cuenta que los nombres que empiezan por
un carácter de subrayado no son compatibles con la independencia del lenguaje y los componentes
independientes del lenguaje (CLS).
Las sugerencias siguientes se aplican a la asignación de nombres.
Comience cada palabra independiente en un nombre con una letra mayúscula, como en FindLastRecord y
RedrawMyForm .

Los nombres de función y método de inicio con un verbo, como en InitNameArray o CloseDialog .
Empiece la clase, la estructura, el módulo y los nombres de propiedad con un nombre, como en
EmployeeName o CarAccessory .

Comience los nombres de interfaz con el prefijo "I", seguido de un sustantivo o un sustantivo, como
IComponent , o con un adjetivo que describa el comportamiento de la interfaz, como IPersistable . No use
el carácter de subrayado y use las abreviaturas con moderación, ya que las abreviaturas pueden causar
confusión.
Comience los nombres de los controladores de eventos con un nombre que describa el tipo de evento
seguido del sufijo " EventHandler ", como en " MouseEventHandler ".
En los nombres de las clases de argumento de evento, incluya el sufijo " EventArgs ".
Si un evento tiene un concepto de "Before" o "after", use un sufijo en el pasado o en el pasado, como en "
ControlAdd " o " ControlAdded ".

Para términos largos o usados con frecuencia, use abreviaturas para mantener las longitudes de nombre
razonables, por ejemplo, "HTML", en lugar de "Lenguaje de marcado de hipertexto". En general, los
nombres de variable de más de 32 caracteres son difíciles de leer en un monitor establecido en una
resolución baja. Además, asegúrese de que las abreviaturas son coherentes en toda la aplicación. El cambio
aleatorio de un proyecto entre "HTML" y "Lenguaje de marcado de hipertexto" puede producir confusión.
Evite usar nombres en un ámbito interno que coincidan con los nombres de un ámbito externo. Se pueden
producir errores si se tiene acceso a la variable equivocada. Si se produce un conflicto entre una variable y
la palabra clave con el mismo nombre, debe identificar la palabra clave anteponiendo la biblioteca de tipos
adecuada. Por ejemplo, si tiene una variable denominada Date , puede usar la función de Date intrínseca
solo mediante una llamada a DateTime.Date.

Vea también
Palabras clave como nombres de elementos en código
Me, My, MyBase y MyClass
Nombres de elementos declarados
Convenciones de código y estructura de programas
Referencia del lenguaje Visual Basic
Convenciones de código de Visual Basic
27/11/2019 • 11 minutes to read • Edit Online

Microsoft desarrolla ejemplos y documentación que siguen las instrucciones de este tema. Si sigue las mismas
convenciones de codificación, puede obtener las siguientes ventajas:
El código tendrá un aspecto coherente, de modo que los lectores puedan centrarse mejor en el contenido,
no en el diseño.
Los lectores entienden el código con más rapidez, ya que pueden hacer suposiciones basadas en la
experiencia anterior.
Puede copiar, cambiar y mantener el código más fácilmente.
Ayuda a asegurarse de que el código muestra "prácticas recomendadas" para Visual Basic.

Convenciones de nomenclatura
Para obtener información sobre las directrices de nomenclatura, vea el tema directrices de nomenclatura .
No use "mi" o "mi" como parte de un nombre de variable. Esta práctica crea confusión con los objetos My .
No es necesario cambiar los nombres de los objetos en el código generado automáticamente para que se
ajusten a las instrucciones.

Convenciones de diseño
Inserte tabuladores como espacios y use la sangría inteligente con sangrías de cuatro espacios.
Utilice la lista descriptiva (cambio de formato) del código para volver a dar formato al código en el
editor de código. Para obtener más información, vea Opciones, editor de texto, básico (Visual Basic).
Use solo una instrucción por línea. No use el carácter separador de línea de Visual Basic (:).
Evite el uso del carácter de continuación de línea explícita "" en favor de la continuación de línea implícita
siempre que el lenguaje lo permita.
Use solo una declaración por línea.
Si el listing (volver a formatear) de código no da formato a las líneas de continuación
automáticamente, Aplique sangría manualmente a las líneas de continuación en una posición de tabulación.
Sin embargo, siempre alinea a la izquierda los elementos de una lista.

a As Integer,
b As Integer

Agregue al menos una línea en blanco entre las definiciones de método y propiedad.

Convenciones de los comentarios


Coloque los comentarios en una línea independiente, en lugar de al final de una línea de código.
Inicie el texto del comentario con una letra mayúscula y finalice el texto del comentario con un punto.
Inserte un espacio entre el delimitador de comentario (') y el texto del comentario.
' Here is a comment.

No incluya comentarios con bloques con formato de asteriscos.

Estructura del programa


Cuando use el método Main , utilice la construcción predeterminada para las nuevas aplicaciones de consola
y use My para los argumentos de la línea de comandos.

Sub Main()
For Each argument As String In My.Application.CommandLineArgs
' Add code here to use the string variable.
Next
End Sub

Convenciones de lenguaje
String (Tipo de datos)
Use interpolación de cadenas para concatenar cadenas cortas, como se muestra en el código siguiente.

MsgBox($"hello{vbCrLf}goodbye")

Para anexar cadenas en bucles, utilice el objeto StringBuilder.

Dim longString As New System.Text.StringBuilder


For count As Integer = 1 To 1000
longString.Append(count)
Next

Delegados relajados en controladores de eventos


No califique explícitamente los argumentos (Object y EventArgs) con los controladores de eventos. Si no está
usando los argumentos de evento que se pasan a un evento (por ejemplo, Sender como Object, e como EventArgs),
use delegados relajados y omita los argumentos de evento en el código:

Public Sub Form1_Load() Handles Form1.Load


End Sub

Tipo de datos sin signo


Utilice Integer en lugar de tipos sin signo, excepto donde sean necesarios.
Matrices
Use la sintaxis abreviada al inicializar matrices en la línea de declaración. Por ejemplo, use la sintaxis
siguiente.

Dim letters1 As String() = {"a", "b", "c"}

No use la sintaxis siguiente.

Dim letters2() As String = New String() {"a", "b", "c"}


Coloque el designador de matriz en el tipo, no en la variable. Por ejemplo, use la siguiente sintaxis:

Dim letters4 As String() = {"a", "b", "c"}

No use la sintaxis siguiente:

Dim letters3() As String = {"a", "b", "c"}

Use la sintaxis {} al declarar e inicializar matrices de tipos de datos básicos. Por ejemplo, use la siguiente
sintaxis:

Dim letters5 As String() = {"a", "b", "c"}

No use la sintaxis siguiente:

Dim letters6(2) As String


letters6(0) = "a"
letters6(1) = "b"
letters6(2) = "c"

Usar la palabra clave with


Cuando realice una serie de llamadas a un objeto, considere la posibilidad de usar la palabra clave With :

With orderLog
.Log = "Application"
.Source = "Application Name"
.MachineName = "Computer Name"
End With

Use la instrucción try... Instrucciones Catch y Using cuando se usa el control de excepciones
No use On Error Goto .
Usar la palabra clave IsNot
Use la palabra clave IsNot en lugar de Not...Is Nothing .
New (palabra clave )
Utilice la creación de instancias cortas. Por ejemplo, use la siguiente sintaxis:

Dim employees As New List(Of String)

La línea anterior es equivalente a esta:

Dim employees2 As List(Of String) = New List(Of String)

Use inicializadores de objeto para los nuevos objetos en lugar del constructor sin parámetros:

Dim orderLog As New EventLog With {


.Log = "Application",
.Source = "Application Name",
.MachineName = "Computer Name"}
Control de eventos
Use Handles en lugar de AddHandler :

Private Sub ToolStripMenuItem1_Click() Handles ToolStripMenuItem1.Click


End Sub

Use AddressOf y no cree instancias del delegado explícitamente:

Dim closeItem As New ToolStripMenuItem(


"Close", Nothing, AddressOf ToolStripMenuItem1_Click)
Me.MainMenuStrip.Items.Add(closeItem)

Al definir un evento, use la sintaxis abreviada y deje que el compilador defina el delegado:

Public Event SampleEvent As EventHandler(Of SampleEventArgs)


' or
Public Event SampleEvent(ByVal source As Object,
ByVal e As SampleEventArgs)

No Compruebe si un evento es Nothing (NULL) antes de llamar al método RaiseEvent . RaiseEvent


comprueba Nothing antes de generar el evento.
Usar miembros compartidos
Llame a Shared miembros mediante el nombre de clase, no desde una variable de instancia.
Usar literales XML
Los literales XML simplifican las tareas más comunes que se producen al trabajar con XML (por ejemplo, cargar,
consultar y transformar). Al desarrollar con XML, siga estas instrucciones:
Utilice literales XML para crear documentos y fragmentos XML en lugar de llamar directamente a las API
XML.
Importe los espacios de nombres XML en el nivel de archivo o proyecto para aprovechar las optimizaciones
de rendimiento de los literales XML.
Use las propiedades del eje XML para tener acceso a elementos y atributos en un documento XML.
Utilizar expresiones incrustadas para incluir valores y crear XML a partir de valores existentes en lugar de
utilizar llamadas API como el método Add :
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 nombres descriptivos para las variables de consulta:

Dim seattleCustomers = From cust In customers


Where cust.City = "Seattle"

Proporcione nombres para los elementos de una consulta para asegurarse de que los nombres de
propiedad de tipos anónimos se escriben en mayúsculas correctamente con la grafía Pascal:

Dim customerOrders = From customer In customers


Join order In orders
On customer.CustomerID Equals order.CustomerID
Select Customer = customer, Order = order

Cambie el nombre de las propiedades cuando puedan ser ambiguos en el resultado. Por ejemplo, si la
consulta devuelve un nombre de cliente y un identificador de pedido, cambie su nombre en lugar de
mantenerlos como Name y ID en el resultado:

Dim customerOrders2 = From cust In customers


Join ord In orders
On cust.CustomerID Equals ord.CustomerID
Select CustomerName = cust.Name,
OrderID = ord.ID

Use la inferencia de tipos en la declaración de variables de consulta y variables de intervalo:

Dim customerList = From cust In customers

Alinee las cláusulas de consulta en la instrucción From :

Dim newyorkCustomers = From cust In customers


Where cust.City = "New York"
Select cust.LastName, cust.CompanyName
Use cláusulas Where antes de otras cláusulas de consulta para que las cláusulas de consulta posteriores
operen en el conjunto de datos filtrado:

Dim newyorkCustomers2 = From cust In customers


Where cust.City = "New York"
Order By cust.LastName

Utilice la cláusula Join para definir explícitamente una operación de combinación en lugar de utilizar la
cláusula Where para definir implícitamente una operación de combinación:

Dim customerList2 = From cust In customers


Join order In orders
On cust.CustomerID Equals order.CustomerID
Select cust, order

Vea también
Instrucciones de codificación segura
Compilación condicional en Visual Basic
27/11/2019 • 5 minutes to read • Edit Online

En la compilación condicional, determinados bloques de código de un programa se compilan de forma selectiva


mientras que otros se omiten.
Por ejemplo, puede que desee escribir instrucciones de depuración que comparen la velocidad de los distintos
enfoques para la misma tarea de programación, o puede que desee localizar una aplicación para varios idiomas.
Las instrucciones de compilación condicional están diseñadas para ejecutarse durante el tiempo de compilación,
no en tiempo de ejecución.
Se denotan los bloques de código que se van a compilar condicionalmente con la Directiva #If...Then...#Else .
Por ejemplo, para crear versiones en francés y en alemán de la misma aplicación desde el mismo código fuente,
se insertan segmentos de código específicos de la plataforma en #If...Then instrucciones usando las
constantes predefinidas FrenchVersion y GermanVersion . En el ejemplo siguiente se muestra cómo:

#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

Si establece el valor de FrenchVersion constante de compilación condicional en True en tiempo de compilación,


se compila el código condicional de la versión en francés. Si establece el valor de la constante GermanVersion en
True , el compilador usa la versión en alemán. Si no se establece ninguno en True , se ejecuta el código del
último bloque de Else .

NOTE
La finalización automática no funcionará al editar código y utilizar directivas de compilación condicional si el código no
forma parte de la rama actual.

Declarar constantes de compilación condicional


Puede establecer constantes de compilación condicional de una de estas tres maneras:
En el Diseñador de proyectos
En la línea de comandos cuando se usa el compilador de línea de comandos
En el código
Las constantes de compilación condicional tienen un ámbito especial y no se puede tener acceso a ellas desde el
código estándar. El ámbito de una constante de compilación condicional depende de la forma en que se
establece. En la tabla siguiente se muestra el ámbito de las constantes declaradas con cada una de las tres
maneras mencionadas anteriormente.
C Ó M O SE ESTA B L EC E C O N STA N T Á M B ITO DE C O N STA N T

Diseñador de proyectos Público a todos los archivos del proyecto

Línea de comandos Público a todos los archivos pasados al compilador de línea


de comandos

#Const instrucción en el código Privado del archivo en el que se declara

PA RA ESTA B L EC ER C O N STA N T ES EN EL DISEÑ A DO R DE P RO Y EC TO S

-Antes de crear el archivo ejecutable, establezca las constantes en el Diseñador de proyectos siguiendo los pasos que se
indican en Administración de propiedades de soluciones y proyectos.

PA RA ESTA B L EC ER C O N STA N T ES EN L A L ÍN EA DE C O M A N DO S

-Use el modificador -d para especificar constantes de compilación condicional, como en el ejemplo siguiente:
vbc MyProj.vb /d:conFrenchVersion=–1:conANSI=0
No se requiere espacio entre el modificador -d y la primera constante. Para obtener más información, vea -define (Visual Basic).
Las declaraciones de línea de comandos invalidan las declaraciones especificadas en el Diseñador de proyectos , pero no las
borran. Los argumentos establecidos en el Diseñador de proyectos permanecen en vigor para las compilaciones
posteriores.
Al escribir constantes en el propio código, no hay ninguna regla estricta en cuanto a su ubicación, ya que su ámbito es todo el
módulo en el que se declaran.

PA RA ESTA B L EC ER C O N STA N T ES EN EL C Ó DIGO

-Coloque las constantes en el bloque de declaración del módulo en el que se usan. Esto ayuda a mantener el código
organizado y más fácil de leer.

Temas relacionados
T ÍT ULO DESC RIP C IÓ N

Convenciones de código y estructura de programas Proporciona sugerencias para facilitar la lectura y el


mantenimiento del código.

Referencia
#Const (directiva)
#If...Then...#Else (directivas)
-define (Visual Basic)
Cómo: Interrumpir y combinar instrucciones en
código (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Al escribir el código, puede crear a veces instrucciones largas que requieren un desplazamiento horizontal en el
editor de código. Aunque esto no afecta al modo en que se ejecuta el código, dificulta la lectura del código tal y
como aparece en el monitor. En tales casos, debería considerar la posibilidad de dividir la única instrucción larga
en varias líneas.

Para dividir una sola instrucción en varias líneas


Use el carácter de continuación de línea, que es un carácter de subrayado ( _ ), en el punto en el que desea que se
interrumpa la línea. El carácter de subrayado debe ir inmediatamente precedido de un espacio y seguido
inmediatamente de un terminador de línea (retorno de carro) o (a partir de la versión 16,0) un comentario
seguido de un retorno de carro.

NOTE
En algunos casos, si se omite el carácter de continuación de línea, el compilador Visual Basic continuará implícitamente la
instrucción en la siguiente línea de código. Para obtener una lista de los elementos de sintaxis para los que puede omitir el
carácter de continuación de línea, vea "continuación de línea implícita" en las instrucciones.

En el ejemplo siguiente, la instrucción se divide en cuatro líneas con caracteres de continuación de línea que
terminan todo excepto la última línea.

cmd.CommandText = _
"SELECT * FROM Titles JOIN Publishers " _
& "ON Publishers.PubId = Titles.PubID " _
& "WHERE Publishers.State = 'CA'"

El uso de esta secuencia hace que el código sea más fácil de leer, tanto en línea como en el momento de su
impresión.
El carácter de continuación de línea debe ser el último carácter de una línea. No puede seguirlo con nada más en
la misma línea.
Existen algunas limitaciones en cuanto a dónde se puede usar el carácter de continuación de línea; por ejemplo,
no se puede utilizar en medio de un nombre de argumento. Puede dividir una lista de argumentos con el carácter
de continuación de línea, pero los nombres individuales de los argumentos deben permanecer intactos.
No se puede continuar un comentario mediante un carácter de continuación de línea. El compilador no examina
los caracteres de un comentario para obtener un significado especial. Para un Comentario de varias líneas, repita
el símbolo de comentario ( ' ) en cada línea.
Aunque la colocación de cada instrucción en una línea independiente es el método recomendado, Visual Basic
también permite colocar varias instrucciones en la misma línea.

Para colocar varias instrucciones en la misma línea


Separe las instrucciones con dos puntos ( : ), como en el ejemplo siguiente:
text1.Text = "Hello" : text1.BackColor = System.Drawing.Color.Red

Vea también
Convenciones de código y estructura de programas
Instrucciones
Cómo: Contraer y ocultar secciones de código (Visual
Basic)
27/11/2019 • 2 minutes to read • Edit Online

La Directiva #Region permite contraer y ocultar secciones de código en archivos de Visual Basic. La Directiva
#Region permite especificar un bloque de código que se puede expandir o contraer cuando se usa el editor de
código de Visual Studio. La capacidad de ocultar el código de forma selectiva facilita la administración y la lectura
de los archivos. Para obtener más información, vea Esquematización.
las directivas de #Region admiten la semántica de bloques de código como #If...#End If . Esto significa que no
pueden comenzar en un bloque y finalizar en otro; el inicio y el final deben estar en el mismo bloque. las directivas
de #Region no se admiten en funciones.

Para contraer y ocultar una sección de código


Coloque la sección de código entre las instrucciones #Region y #End Region , como en el ejemplo siguiente:

#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

El bloque #Region se puede usar varias veces en un archivo de código; por lo tanto, los usuarios pueden definir
sus propios bloques de procedimientos y clases que, a su vez, se pueden contraer. #Region bloques también se
pueden anidar dentro de otros bloques de #Region .

NOTE
Ocultar código no impide que se compile y no afecta a #If...#End If instrucciones.

Vea también
Compilación condicional
#Region (directiva)
#If...Then...#Else (directivas)
Esquematización
Cómo: Aplicar etiquetas a las instrucciones (Visual
Basic)
27/11/2019 • 2 minutes to read • Edit Online

Los bloques de instrucciones se componen de líneas de código delimitadas por dos puntos. Se dice que las líneas
de código precedidas de una cadena o un entero de identificación están etiquetadas. Las etiquetas de instrucción
se usan para marcar una línea de código para identificarla para su uso con instrucciones como On Error Goto .
Las etiquetas pueden ser válidas Visual Basic identificadores, como los que identifican elementos de
programación, o literales enteros. Una etiqueta debe aparecer al principio de una línea de código fuente y debe ir
seguida de dos puntos, independientemente de si va seguido de una instrucción en la misma línea.
El compilador identifica las etiquetas comprobando si el principio de la línea coincide con cualquier identificador
ya definido. Si no es así, el compilador supone que es una etiqueta.
Las etiquetas tienen su propio espacio de declaración y no interfieren con otros identificadores. El ámbito de una
etiqueta es el cuerpo del método. La declaración de etiqueta tiene prioridad en cualquier situación ambigua.

NOTE
Las etiquetas solo se pueden usar en instrucciones ejecutables dentro de métodos.

Para etiquetar una línea de código


Coloque un identificador seguido de un signo de dos puntos, al principio de la línea de código fuente.
Por ejemplo, las siguientes líneas de código se etiquetan con Jump y 120 , respectivamente:

Jump: FileOpen(1, "testFile", OpenMode.Input)


' ...
120: FileClose(1)

Vea también
Instrucciones
Nombres de elementos declarados
Convenciones de código y estructura de programas
Caracteres especiales en código (Visual Basic)
27/11/2019 • 6 minutes to read • Edit Online

A veces, es necesario usar caracteres especiales en el código, es decir, caracteres que no son alfabéticos o
numéricos. Los caracteres de puntuación y especiales del juego de caracteres Visual Basic tienen varios usos, desde
organizar el texto del programa hasta definir las tareas que realiza el compilador o el programa compilado. No
especifican que se deba realizar una operación.

Paréntesis
Use paréntesis al definir un procedimiento, como un Sub o Function . Debe incluir todas las listas de argumentos
de procedimientos entre paréntesis. También puede usar paréntesis para colocar variables o argumentos en
grupos lógicos, especialmente para reemplazar el orden predeterminado de prioridad de los operadores en una
expresión compleja. En el ejemplo siguiente se ilustra esto.

Dim a, b, c, d, e As Double
a = 3.2
b = 7.6
c = 2
d = b + c / a
e = (b + c) / a

Después de la ejecución del código anterior, el valor de d es 8,225 y el valor de e es 3. El cálculo de d utiliza la
prioridad predeterminada de / sobre + y es equivalente a d = b + (c / a) . Los paréntesis en el cálculo de e
invalidan la prioridad predeterminada.

Separadores
Los separadores hacen lo que sugiere su nombre: separan secciones de código. En Visual Basic, el carácter
separador es el signo de dos puntos ( : ). Utilice separadores cuando desee incluir varias instrucciones en una sola
línea en lugar de líneas independientes. Esto ahorra espacio y mejora la legibilidad del código. En el ejemplo
siguiente se muestran tres instrucciones separadas por dos puntos.

a = 3.2 : b = 7.6 : c = 2

Para obtener más información, vea Cómo: interrumpir y combinar instrucciones en el código.
El carácter de dos puntos ( : ) también se usa para identificar una etiqueta de instrucción. Para obtener más
información, vea Cómo: etiquetar instrucciones.

Concatenación
Use el operador & para la concatenación, o vincule cadenas. No lo confunda con el operador + , que suma los
valores numéricos. Si usa el operador + para concatenar al trabajar con valores numéricos, puede obtener
resultados incorrectos. En el siguiente ejemplo se muestra cómo hacerlo.
var1 = "10.01"
var2 = 11
resultA = var1 + var2
resultB = var1 & var2

Después de la ejecución del código anterior, el valor de resultA es 21,01 y el valor de resultB es "10,0111".

Operadores de acceso a miembros


Para tener acceso a un miembro de un tipo, se usa el operador de punto ( . ) o el signo de exclamación ( ! ) entre
el nombre del tipo y el nombre del miembro.
Punto (.) Operator
Use el operador . en una clase, estructura, interfaz o enumeración como un operador de acceso a miembros. El
miembro puede ser un campo, una propiedad, un evento o un método. En el ejemplo siguiente se ilustra esto.

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()

Signo de exclamación (!) Operator


Utilice el operador ! solo en una clase o interfaz como operador de acceso a Diccionario. La clase o la interfaz
deben tener una propiedad predeterminada que acepte un único argumento de String . El identificador situado
inmediatamente después del operador de ! se convierte en el valor de argumento que se pasa a la propiedad
predeterminada como una cadena. En el siguiente ejemplo se muestra cómo hacerlo.

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

Las tres líneas de salida de MsgBox muestran el valor 32856 . La primera línea usa el acceso tradicional al index de
propiedad, el segundo hace uso del hecho de que index es la propiedad predeterminada de la clase hasDefault y
la tercera utiliza el acceso de diccionario a la clase.
Tenga en cuenta que el segundo operando del operador ! debe ser un identificador de Visual Basic válido no
incluido entre comillas dobles ( " " ). En otras palabras, no puede usar un literal de cadena o una variable de
cadena. El siguiente cambio en la última línea de la llamada MsgBox genera un error porque "X" es un literal de
cadena delimitado.
"Dictionary access returns " & hD!"X")
NOTE
Las referencias a las colecciones predeterminadas deben ser explícitas. En concreto, no se puede utilizar el operador ! en
una variable enlazada en tiempo de ejecución.

También se usa el carácter ! como carácter de tipo Single .

Vea también
Convenciones de código y estructura de programas
Caracteres de tipo
Comentarios en el código (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Cuando lea ejemplos de código, encontrará el símbolo de comentario ( ' ). Este símbolo indica al compilador de
Visual Basic que omita el texto que le sigue o el Comentario. Los comentarios son notas cortas explicativas que se
agregan al código para aportar mayor información a las personas que lo lean.
Una buena práctica de programación consiste en comenzar todos los procedimientos con un comentario breve
que describe las características funcionales del procedimiento (lo que hace). Esto ayuda al desarrollador y a los que
puedan examinar el código. Debería separar los detalles de implementación (cómo lo hace el procedimiento) de
los comentarios que describen las características funcionales. Al incluir detalles de implementación en la
descripción, recuerde actualizarlos en el momento de actualizar la función.
Los comentarios pueden ir a continuación de una instrucción en la misma línea, o pueden ocupar una línea
completa. Ambas opciones quedan reflejadas en el código siguiente.

' This is a comment beginning at the left edge of the screen.


text1.Text = "Hi!" ' This is an inline comment.

Si el comentario necesita más de una línea, utilice el símbolo de comentario en cada línea, como se muestra en el
siguiente ejemplo:

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

Instrucciones sobre los comentarios


La tabla siguiente proporciona directrices generales sobre los tipos de comentarios que pueden preceder una
sección de código. Estas son sugerencias; Visual Basic no aplica reglas para agregar comentarios. Escriba lo que
considere más conveniente, para uso propio o para cualquier otra persona que lea el código.

Tipo de comentario Descripción del comentario

Propósito Describe qué hace el procedimiento (no cómo lo hace).

Supuestos Enumera cada variable externa, control, archivo abierto u otro


elemento al cual el procedimiento tenga acceso.

Efectos Enumera cada variable externa, control o archivo que esté


afectado, y el efecto que tienen (únicamente si no es
evidente).

Entradas Especifica el propósito del argumento.

Valores devueltos Explica los valores que devuelve el procedimiento

Recuerde los siguientes puntos:


Cada declaración de variable importante debe incluir un comentario anterior que describa el uso de la
variable que se declara.
Las variables, controles y procedimientos deben tener un nombre lo suficientemente claro para asegurar
que el uso de comentarios sólo sea necesario para detalles de implementación compleja.
Después de la secuencia de continuación de línea no puede escribirse un comentario en la misma línea.
Para agregar o quitar símbolos de comentario de un bloque de código, seleccione una o varias líneas de código y
elija el Comentario ( ) y Quite los comentarios ( ) en la barra de herramientas de edición .

NOTE
También puede agregar comentarios al código poniendo la palabra clave REM antes del texto. Sin embargo, el símbolo de
' y el comentario /botones sin Comentario son más fáciles de usar y requieren menos espacio y memoria.

Vea también
Instinto básico: documentar el código con comentarios XML
Crear documentación XML
Etiquetas XML para comentarios
Convenciones de código y estructura de programas
REM (instrucción)
Palabras clave como nombres de elementos en
código (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Cualquier elemento de programa, como una variable, una clase o un miembro, puede tener el mismo nombre que
una palabra clave restringida. Por ejemplo, puede crear una variable denominada Loop . Sin embargo, para hacer
referencia a su versión del mismo, que tiene el mismo nombre que la palabra clave de Loop restringida, debe
precederlo con una cadena de calificación completa o encerrarlo entre corchetes ( [ ] ), como se muestra en el
ejemplo siguiente.

' 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

Si no hace ninguno de estos, Visual Basic asume el uso de la palabra clave intrínseca Loop y genera un error, como
en el ejemplo siguiente:
' The following statement causes a compiler error.

Loop.Visible = True

Puede usar corchetes al hacer referencia a formularios y controles, y al declarar una variable o definir un
procedimiento con el mismo nombre que una palabra clave restringida. Puede ser fácil olvidarse de calificar
nombres o incluir corchetes y, por tanto, introducir errores en el código y dificultar su lectura. Por esta razón, se
recomienda no usar palabras clave restringidas como nombres de elementos de programa. Sin embargo, si una
versión futura de Visual Basic define una nueva palabra clave que entra en conflicto con un nombre de formulario
o control existente, puede usar esta técnica al actualizar el código para que funcione con la nueva versión.

NOTE
El programa también podría incluir nombres de elementos proporcionados por otros ensamblados a los que se hace
referencia. Si estos nombres entran en conflicto con palabras clave restringidas, la colocación de los corchetes hace que Visual
Basic los interprete como elementos definidos.

Vea también
Convenciones de nomenclatura de Visual Basic
Convenciones de código y estructura de programas
Palabras clave
Me, My, MyBase y MyClass en Visual Basic
21/03/2020 • 2 minutes to read • Edit Online

Me , My MyBase , MyClass , y en Visual Basic tienen nombres similares, pero diferentes propósitos. En este tema
se describe cada una de estas entidades para distinguirlas.

Yo
La Me palabra clave proporciona una manera de hacer referencia a la instancia específica de una clase o
estructura en la que el código se está ejecutando actualmente. Me se comporta como una variable de objeto o una
variable de estructura que hace referencia a la instancia actual. El Me uso es especialmente útil para pasar
información sobre la instancia que se está ejecutando actualmente de una clase o estructura a un procedimiento
de otra clase, estructura o módulo.
Por ejemplo, supongamos que tiene el siguiente procedimiento en un módulo.

Sub ChangeFormColor(FormName As Form)


Randomize()
FormName.BackColor = Color.FromArgb(Rnd() * 256, Rnd() * 256, Rnd() * 256)
End Sub

Puede llamar a este procedimiento y Form pasar la instancia actual de la clase como argumento mediante la
instrucción siguiente.

ChangeFormColor(Me)

My
La My característica proporciona un acceso fácil e intuitivo a varias clases de .NET Framework, lo que permite al
usuario de Visual Basic interactuar con el equipo, la aplicación, la configuración, los recursos, etc.

MyBase
La MyBase palabra clave se comporta como una variable de objeto que hace referencia a la clase base de la
instancia actual de una clase. MyBase se utiliza comúnmente para tener acceso a los miembros de la clase base que
se reemplazan o sombrean en una clase derivada. MyBase.New se utiliza para llamar explícitamente a un
constructor de clase base desde un constructor de clase derivada.

MyClass
La MyClass palabra clave se comporta como una variable de objeto que hace referencia a la instancia actual de
una clase como implementada originalmente. MyClass es similar Me a , pero todas las llamadas NotOverridable al
método en él se tratan como si el método fuera .

Consulte también
Fundamentos de la herencia
Limitaciones de Visual Basic
27/11/2019 • 2 minutes to read • Edit Online

Las versiones anteriores de Visual Basic los límites aplicados en el código, como la longitud de los nombres de
variable, el número de variables permitidas en los módulos y el tamaño del módulo. En Visual Basic .NET, estas
restricciones se han reducido, lo que le aporta mayor libertad para escribir y organizar el código.
Los límites físicos dependen más en la memoria en tiempo de ejecución que en las consideraciones en tiempo de
compilación. Si usa prácticas de programación prudentes y divide aplicaciones grandes en varias clases y módulos,
hay muy pocas probabilidades de encontrar una limitación de Visual Basic interna.
A continuación se indican algunas limitaciones que pueden surgir en casos extremos:
Longitud del nombre. Hay un número máximo de caracteres para el nombre de cada elemento de
programación declarado. Este máximo se aplica a toda la cadena de calificación si el nombre del elemento
está calificado. Vea Declared Element Names.
Longitud de línea. Hay un máximo de 65535 caracteres en una línea física de código fuente. La línea de
código fuente lógica puede ser más larga si usa caracteres de continuación de línea. Vea Cómo: interrumpir
y combinar instrucciones en el código.
Dimensiones de la matriz. Hay un número máximo de dimensiones que puede declarar para una matriz.
Esto limita el número de índices que puede utilizar para especificar un elemento de la matriz. Vea
dimensiones de la matriz en Visual Basic.
Longitud de la cadena. Hay un número máximo de caracteres Unicode que se pueden almacenar en una
sola cadena. Vea tipo de datos de cadena.
Longitud de la cadena de entorno. Hay un máximo de 32768 caracteres para cualquier cadena de
entorno utilizada como argumento de la línea de comandos. Se trata de una limitación en todas las
plataformas.

Vea también
Convenciones de código y estructura de programas
Convenciones de nomenclatura de Visual Basic
Características del lenguaje Visual Basic
08/01/2020 • 5 minutes to read • Edit Online

En los temas siguientes se presentan y describen los componentes esenciales de Visual Basic, un lenguaje de
programación orientado a objetos. Después de crear la interfaz de usuario para su aplicación con formularios y
controles, debe escribir el código que define el comportamiento de la aplicación. Como con cualquier lenguaje de
programación moderno, Visual Basic admite una serie de elementos de lenguaje y construcciones de
programación comunes.
Si ha programado en otros lenguajes, gran parte del material tratado en esta sección le resultará familiar. Aunque
la mayoría de las construcciones son similares a las de otros lenguajes, la naturaleza orientada a eventos de Visual
Basic presenta algunas diferencias sutiles.
Si está familiarizado con la programación, el material de esta sección sirve como introducción a los bloques de
creación básicos para escribir código. Una vez que comprenda los conceptos básicos, puede crear aplicaciones
eficaces mediante Visual Basic.

Esta sección
Matrices
Explica cómo hacer el código más compacto y eficaz mediante la declaración y utilización de matrices, que
contienen varios valores relacionados.
Inicializadores de colección
Describe los inicializadores de colección, que permiten crear una colección y rellenarla con un conjunto inicial de
valores.
Constantes y enumeraciones
Explica el almacenamiento de valores inmutables para su uso repetido, incluidos los conjuntos de valores de
constantes relacionadas.
Flujo de control
Muestra cómo regular el flujo de la ejecución del programa.
Tipos de datos
Describe qué tipos de datos puede contener un elemento de programación y cómo almacenarlos.
Elementos declarados
Abarca la programación de elementos que puede declarar, sus nombres y características, y cómo el compilador
resuelve las referencias a ellos.
Delegados
Se proporciona una introducción a los delegados y se explica cómo se usan en Visual Basic.
Enlace en tiempo de compilación y en tiempo de ejecución
Describe los enlaces, que realiza el compilador cuando se asigna un objeto a una variable de objeto, y las
diferencias entre los objetos con enlace anticipado y con enlace en tiempo de ejecución.
Tipos de error
Proporciona información general sobre los errores de sintaxis, errores en tiempo de ejecución y errores lógicos.
Eventos
Muestra cómo declarar y utilizar eventos.
Interfaces
Describe qué son las interfaces y cómo usarlas en las aplicaciones.
LINQ
Proporciona vínculos a temas que presentan características de Language-Integrated Query (LINQ) y programación.
Objetos y clases
Proporciona información general sobre objetos y clases, cómo se utilizan, las relaciones que mantienen entre sí y
las propiedades, los métodos y los eventos que exponen.
Operadores y expresiones
Describe los elementos de código que manipulan elementos que contienen valores, cómo utilizarlos de forma
eficaz y cómo combinarlos para producir nuevos valores.
Procedimientos
Describe los procedimientos Sub , Function , Property y Operator , así como temas avanzados, como
procedimientos recursivos y sobrecargados.
Instrucciones
Describe las instrucciones de declaración y ejecutables.
Cadenas
Proporciona vínculos a temas que describen los conceptos básicos sobre el uso de cadenas en Visual Basic.
Variables
Presenta las variables y describe cómo utilizarlas en Visual Basic.
XML
Proporciona vínculos a temas en los que se describe cómo usar XML en Visual Basic.

Secciones relacionadas
Colecciones
Describe algunos de los tipos de colecciones proporcionadas por .NET Framework. Muestra cómo usar colecciones
sencillas y colecciones de pares clave-valor.
Referencia del lenguaje Visual Basic
Proporciona información de referencia sobre diversos aspectos de la programación de Visual Basic.
Matrices en Visual Basic
27/11/2019 • 46 minutes to read • Edit Online

Una matriz es un conjunto de valores, que son elementosdenominados, que están relacionados lógicamente
entre sí. Por ejemplo, una matriz puede consistir en el número de alumnos de cada grado en una escuela
gramatical; cada elemento de la matriz es el número de alumnos en un solo grado. Del mismo modo, una
matriz puede constar de las calificaciones de un estudiante para una clase. cada elemento de la matriz es un
solo grado.
Es posible que las variables individuales almacenen cada uno de los elementos de datos. Por ejemplo, si
nuestra aplicación analiza las calificaciones de estudiante, podemos usar una variable independiente para la
calificación de cada estudiante, como englishGrade1 , englishGrade2 , etc. Este enfoque tiene tres limitaciones
principales:
Tenemos que saber en tiempo de diseño exactamente cuántos grados es necesario controlar.
Administrar rápidamente un gran número de calificaciones se vuelve difícil. Esto, a su vez, hace que una
aplicación tenga mucho más probabilidades de tener errores graves.
Es difícil de mantener. Cada nuevo grado que agregues requiere que la aplicación se modifique, se vuelva a
compilar y se vuelva a implementar.
Mediante el uso de una matriz, puede hacer referencia a estos valores relacionados con el mismo nombre y
usar un número denominado Índice o subíndice para identificar un elemento individual en función de su
posición en la matriz. Los índices de una matriz van de 0 a uno menos que el número total de elementos de la
matriz. Cuando se usa Visual Basic sintaxis para definir el tamaño de una matriz, se especifica su índice más
alto, no el número total de elementos de la matriz. Puede trabajar con la matriz como una unidad y la
capacidad de recorrer en iteración sus elementos le libera de tener que saber exactamente cuántos elementos
contiene en tiempo de diseño.
Veamos algunos ejemplos rápidos antes de la explicación:

' 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(3, 2) {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}}

' Declare a jagged array


Dim sales()() As Double = New Double(11)() {}

Elementos de matriz en una matriz simple


Vamos a crear una matriz denominada students para almacenar el número de alumnos en cada grado en una
escuela gramatical. Los índices de los elementos van del 0 al 6. Usar esta matriz es más sencillo que declarar
siete variables.
En la ilustración siguiente se muestra la students matriz. Para cada elemento de la matriz:
El índice del elemento representa el curso (el índice 0 representa la guardería).
El valor que se encuentra en el elemento representa el número de estudiantes en dicho curso.

El ejemplo siguiente contiene el código Visual Basic que crea y usa la matriz:

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

En el ejemplo se hace tres cosas:


Declara una matriz de students con siete elementos. El número 6 en la declaración de la matriz indica el
último índice de la matriz; es uno menos que el número de elementos de la matriz.
Asigna valores a cada elemento de la matriz. Se obtiene acceso a los elementos de matriz utilizando el
nombre de la matriz y se incluye el índice del elemento individual entre paréntesis.
Muestra cada valor de la matriz. En el ejemplo se usa una instrucción For para tener acceso a cada
elemento de la matriz por su número de índice.
En el ejemplo anterior, la matriz de students es una matriz unidimensional porque utiliza un índice. Una matriz
que usa más de un índice o subíndice se denomina multidimensional. Para obtener más información, vea el
resto de este artículo y las dimensiones de la matriz en Visual Basic.

Crear una matriz


Puede definir el tamaño de una matriz de varias maneras:
Puede especificar el tamaño cuando se declara la matriz:

' 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

Puede usar una cláusula New para proporcionar el tamaño de una matriz cuando se crea:

' 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

Si tiene una matriz existente, puede volver a definir su tamaño mediante la instrucción ReDim . Puede
especificar que la instrucción ReDim Mantenga los valores que se encuentran en la matriz o puede especificar
que cree una matriz vacía. El ejemplo siguiente muestra los diferentes usos de la instrucción ReDim para
modificar el tamaño de una matriz existente.

' 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 obtener más información, vea la instrucción ReDim.

Almacenar valores en una matriz


Puede tener acceso a cada ubicación en una matriz mediante un índice del tipo Integer . Puede almacenar y
recuperar los valores en una matriz haciendo referencia a cada ubicación de la matriz usando su índice entre
paréntesis. Los índices de matrices multidimensionales se separan mediante comas (,). Necesita un índice para
cada dimensión de la matriz.
En el ejemplo siguiente se muestran algunas instrucciones que almacenan y recuperan valores en las matrices.
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

Rellenar una matriz con literales de matriz


Mediante el uso de un literal de matriz, puede rellenar una matriz con un conjunto inicial de valores al mismo
tiempo que se crea. Un literal de matriz consta de una lista de valores separados por comas entre llaves ( {} ).
Cuando se crea una matriz mediante un literal de matriz, puede proporcionar el tipo de matriz o usar la
inferencia de tipo para determinar el tipo de matriz. En el ejemplo siguiente se muestran ambas opciones.

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

Cuando se usa la inferencia de tipos, el tipo de la matriz viene determinado por el tipo dominante en la lista de
valores literales. El tipo dominante es el tipo al que se pueden ampliar todos los demás tipos de la matriz. Si no
se puede determinar este tipo único, el tipo dominante es el tipo único al que todos los demás tipos de la
matriz se pueden restringir. Si no se puede determinar ninguno de estos tipos únicos, el tipo dominante es
Object . Por ejemplo, si la lista de valores que se proporciona al literal de matriz contiene valores de tipo
Integer , Long y Double , la matriz resultante es de tipo Double . Dado que Integer y Long se amplían solo a
Double , Double es el tipo dominante. Para obtener más información, consulta Widening and Narrowing
Conversions.

NOTE
Solo se puede usar la inferencia de tipos para las matrices definidas como variables locales en un miembro de tipo. Si
falta una definición de tipo explícita, las matrices definidas con literales de matriz en el nivel de clase son de tipo
Object[] . Para obtener más información, vea inferencia de tipo local.

Tenga en cuenta que en el ejemplo anterior se define values como una matriz de tipo Double aunque todos
los literales de matriz sean de tipo Integer . Puede crear esta matriz porque los valores del literal de matriz
pueden ampliarse a Double valores.
También puede crear y rellenar una matriz multidimensional utilizando literales de matriz anidados. Los
literales de matriz anidados deben tener un número de dimensiones que sea coherente con la matriz
resultante. En el ejemplo siguiente se crea una matriz bidimensional de enteros utilizando literales de matriz
anidados.

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

Cuando se usan literales de matriz anidados para crear y rellenar una matriz, se produce un error si el número
de elementos de los literales de matriz anidados no coincide. También se produce un error si declara
explícitamente que la variable de matriz tiene un número diferente de dimensiones que los literales de matriz.
Al igual que en el caso de las matrices unidimensionales, puede confiar en la inferencia de tipos al crear una
matriz multidimensional con literales de matriz anidados. El tipo deducido es el tipo dominante para todos los
valores de todos los literales de matriz para todos los niveles de anidamiento. En el ejemplo siguiente se crea
una matriz bidimensional de tipo Double[,] a partir de valores de tipo Integer y Double .

Dim arr = {{1, 2.0}, {3, 4}, {5, 6}, {7, 8}}

Para consultar ejemplos adicionales, vea Cómo: Inicializar una variable de matriz en Visual Basic.

Recorrer en iteración una matriz


Cuando recorre en iteración una matriz, tiene acceso a cada elemento de la matriz desde el índice más bajo
hasta el más alto o de mayor a menor. Normalmente, use la ... Instrucción siguiente o ... Instrucción siguiente
para recorrer en iteración los elementos de una matriz. Si no conoce los límites superiores de la matriz, puede
llamar al método Array.GetUpperBound para obtener el valor más alto del índice. Aunque el valor de índice
más bajo es casi siempre 0, puede llamar al método Array.GetLowerBound para obtener el valor más bajo del
índice.
En el ejemplo siguiente se recorre en iteración una matriz unidimensional mediante la instrucción For...Next .

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

En el ejemplo siguiente se recorre en iteración una matriz multidimensional mediante una instrucción
For...Next . El método GetUpperBound tiene un parámetro que especifica la dimensión. GetUpperBound(0)
devuelve el índice más alto de la primera dimensión y GetUpperBound(1) devuelve el índice más alto de la
segunda dimensión.

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

En el ejemplo siguiente se utiliza una para cada... Instrucción siguientepara recorrer en iteración una matriz
unidimensional y una matriz bidimensional.

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

Tamaño de la matriz
El tamaño de una matriz es el producto de las longitudes de todas sus dimensiones. Representa el número total
de elementos contenidos actualmente en la matriz. Por ejemplo, en el ejemplo siguiente se declara una matriz
bidimensional con cuatro elementos en cada dimensión. Como muestra la salida del ejemplo, el tamaño de la
matriz es 16 (o (3 + 1) * (3 + 1).
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

NOTE
Esta explicación del tamaño de la matriz no se aplica a las matrices escalonadas. Para obtener información sobre las
matrices escalonadas y determinar el tamaño de una matriz escalonada, consulte la sección matrices escalonadas .

Puede encontrar el tamaño de una matriz mediante la propiedad Array.Length . Puede buscar la longitud de
cada dimensión de una matriz multidimensional mediante el método Array.GetLength.
Puede cambiar el tamaño de una variable de matriz asignando un nuevo objeto de matriz o usando la
instrucción ReDim instrucción . En el ejemplo siguiente se usa la instrucción ReDim para cambiar una matriz de
100 elementos a una matriz de elementos 51.

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

Hay varios aspectos que se deben tener en cuenta cuando se trabaja con el tamaño de una matriz.

Longitud de la dimensión El índice de cada dimensión es de base 0, lo que significa


que va desde 0 hasta su límite superior. Por lo tanto, la
longitud de una dimensión determinada es uno mayor que
el límite superior declarado de esa dimensión.

Límites de longitud La longitud de cada dimensión de una matriz se limita al


valor máximo del tipo de datos Integer , que es
Int32.MaxValue o (2 ^ 31)-1. Sin embargo, el tamaño total
de una matriz también está limitado por la memoria
disponible en el sistema. Si intenta inicializar una matriz que
supera la cantidad de memoria disponible, el tiempo de
ejecución produce una OutOfMemoryException.

Tamaño y tamaño de elemento El tamaño de la matriz es independiente del tipo de datos


de sus elementos. El tamaño siempre representa el número
total de elementos, no el número de bytes que consumen
en la memoria.
Consumo de memoria No es seguro dar nada por supuesto en lo que respecta al
modo de almacenar una matriz en la memoria. El
almacenamiento varía en función de las plataformas de
diferentes anchos de datos, por lo que la misma matriz
puede utilizar más memoria en un sistema de 64 bits que en
un sistema de 32 bits. Según la configuración del sistema
cuando inicializa una matriz, Common Language Runtime
(CLR) puede asignar el almacenamiento para empaquetar
los elementos tan juntos como sea posible o para alinearlos
todos en los límites naturales del hardware. Asimismo, una
matriz requiere una sobrecarga de almacenamiento para
obtener su información de control y esta sobrecarga
aumenta con cada dimensión agregada.

El tipo de matriz
Cada matriz tiene un tipo de datos, que difiere del tipo de datos de sus elementos. No existe ningún tipo de
datos para todas las matrices. En su lugar, el tipo de datos de una matriz lo determina el número de
dimensiones, o rango, de la matriz y el tipo de datos de los elementos de la matriz. Dos variables de matriz son
del mismo tipo de datos solo cuando tienen el mismo rango y sus elementos tienen el mismo tipo de datos.
Las longitudes de las dimensiones de una matriz no influyen en el tipo de datos de la matriz.
Cada matriz hereda la clase System.Array y puede declarar una variable del tipo Array , pero no puede crear
una matriz del tipo Array . Por ejemplo, aunque el código siguiente declara la variable de arr para que sea de
tipo Array y llama al método Array.CreateInstance para crear una instancia de la matriz, el tipo de la matriz
demuestra ser Object [].

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[]

Además, la Instrucción ReDim no puede funcionar en una variable declarada de tipo Array . Por estos motivos,
y para la seguridad de tipos, es aconsejable declarar cada matriz como un tipo específico.
Puede averiguar el tipo de datos de una matriz o de sus elementos de varias maneras.
Puede llamar al método GetType en la variable para obtener un objeto Type que represente el tipo en
tiempo de ejecución de la variable. El objeto Type contiene amplia información en sus propiedades y
métodos.
Puede pasar la variable a la función TypeName para obtener un String con el nombre de tipo en tiempo de
ejecución.
En el ejemplo siguiente se llama al método GetType y a la función TypeName para determinar el tipo de una
matriz. El tipo de matriz es Byte(,) . Tenga en cuenta que la propiedad Type.BaseType también indica que el
tipo base de la matriz de bytes es la clase Array.

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(,)

Matrices como valores devueltos y parámetros


Para devolver una matriz desde un procedimiento Function , especifique el tipo de datos de matriz y el número
de dimensiones como tipo de valor devuelto de la Instrucción Function. Dentro de la función, declare una
variable de matriz local con el mismo tipo de datos y número de dimensiones. En la Instrucción Return, incluya
la variable de matriz local sin paréntesis.
Para especificar una matriz como parámetro para un procedimiento Sub o Function , defina el parámetro
como una matriz con un tipo de datos especificado y el número de dimensiones. En la llamada al
procedimiento, pase una variable de matriz con el mismo tipo de datos y número de dimensiones.
En el ejemplo siguiente, la función GetNumbers devuelve un Integer() , una matriz unidimensional de tipo
Integer . El procedimiento ShowNumbers acepta un argumento Integer() .

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

En el ejemplo siguiente, la función GetNumbersMultiDim devuelve un Integer(,) , una matriz bidimensional de


tipo Integer . El procedimiento ShowNumbersMultiDim acepta un argumento Integer(,) .

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

Matrices escalonadas
A veces la estructura de datos de la aplicación es bidimensional pero no rectangular. Por ejemplo, puede usar
una matriz para almacenar datos sobre la temperatura alta de cada día del mes. La primera dimensión de la
matriz representa el mes, pero la segunda dimensión representa el número de días, y el número de días de un
mes no es uniforme. Una matriz escalonada, que también se denomina matriz de matrices, está diseñada para
estos escenarios. Una matriz escalonada es una matriz cuyos elementos también son matrices. Una matriz
escalonada y cada elemento de una matriz escalonada pueden tener una o más dimensiones.
En el ejemplo siguiente se utiliza una matriz de meses, donde cada elemento es una matriz de días. En el
ejemplo se usa una matriz escalonada porque los distintos meses tienen un número diferente de días. En el
ejemplo se muestra cómo crear una matriz escalonada, asignarle valores y recuperar y mostrar sus valores.

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

En el ejemplo anterior se asignan valores a la matriz escalonada en función de cada elemento mediante un
bucle For...Next . También puede asignar valores a los elementos de una matriz escalonada utilizando literales
de matriz anidados. Sin embargo, el intento de usar literales de matriz anidados (por ejemplo,
Dim valuesjagged = {{1, 2}, {2, 3, 4}} ) genera el error del compilador BC30568. Para corregir el error,
incluya los literales de matriz internos entre paréntesis. Los paréntesis fuerzan la evaluación de la expresión
literal de matriz y los valores resultantes se usan con el literal de matriz externo, como se muestra en el
ejemplo siguiente.
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

Una matriz escalonada es una matriz unidimensional cuyos elementos contienen matrices. Por lo tanto, la
propiedad Array.Length y el método Array.GetLength(0) devuelven el número de elementos de la matriz
unidimensional y Array.GetLength(1) produce una IndexOutOfRangeException porque una matriz escalonada
no es multidimensional. El número de elementos de cada submatriz se determina mediante la recuperación del
valor de la propiedad Array.Length de cada submatriz. En el ejemplo siguiente se muestra cómo determinar el
número de elementos de una matriz escalonada.

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

Matrices de longitud cero


Visual Basic distingue entre una matriz no inicializada (una matriz cuyo valor es Nothing ) y una matriz de
longitud cero o una matriz vacía (una matriz que no tiene elementos). Una matriz no inicializada es aquella que
no se ha acotado o que no tiene asignado ningún valor. Por ejemplo:

Dim arr() As String

Una matriz de longitud cero se declara con una dimensión de-1. Por ejemplo:

Dim arrZ(-1) As String

Puede que tenga que crear una matriz de longitud cero en las circunstancias siguientes:
Sin arriesgarse a una excepción NullReferenceException, el código debe tener acceso a los miembros de
la clase Array, como Length o Rank, o llamar a una función Visual Basic como UBound.
Para simplificar el código, no tiene que comprobar Nothing como caso especial.
El código interactúa con una interfaz de programación de aplicaciones (API) que requiere pasar una
matriz de longitud cero a uno o más procedimientos o que devuelve una matriz de longitud cero desde
uno o más procedimientos.

Dividir una matriz


En algunos casos, puede que necesite dividir una matriz única en varias matrices. Esto implica identificar el
punto o los puntos en los que se va a dividir la matriz y, a continuación, spitting la matriz en dos o más
matrices independientes.

NOTE
En esta sección no se explica la división de una cadena única en una matriz de cadenas basada en algún delimitador. Para
obtener información sobre cómo dividir una cadena, vea el método String.Split.

Los criterios más comunes para dividir una matriz son:


Número de elementos de la matriz. Por ejemplo, puede dividir una matriz de más de un número
especificado de elementos en un número de partes aproximadamente iguales. Para este propósito,
puede utilizar el valor devuelto por el método Array.Length o Array.GetLength.
El valor de un elemento, que actúa como delimitador que indica dónde se debe dividir la matriz. Para
buscar un valor específico, puede llamar a los métodos Array.FindIndex y Array.FindLastIndex.
Una vez que haya determinado los índices en los que se debe dividir la matriz, puede crear las matrices
individuales llamando al método Array.Copy.
En el ejemplo siguiente se divide una matriz en dos matrices de aproximadamente el mismo tamaño. (Si el
número total de elementos de matriz es impar, la primera matriz tiene un elemento más que el segundo).

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

En el ejemplo siguiente se divide una matriz de cadenas en dos matrices en función de la presencia de un
elemento cuyo valor es "Zzz", que actúa como delimitador de la matriz. Las nuevas matrices no incluyen el
elemento que contiene el delimitador.
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

Unir matrices
También puede combinar varias matrices en una sola matriz mayor. Para ello, también se usa el método
Array.Copy.

NOTE
En esta sección no se explica cómo combinar una matriz de cadenas en una sola cadena. Para obtener información sobre
cómo combinar una matriz de cadenas, vea el método String.Join.

Antes de copiar los elementos de cada matriz en la nueva matriz, primero debe asegurarse de que ha
inicializado la matriz para que sea lo suficientemente grande como para dar cabida a la nueva matriz. Hay dos
maneras de hacerlo:
Use la instrucción ReDim Preserve para expandir dinámicamente la matriz antes de agregarle nuevos
elementos. Esta es la técnica más sencilla, pero puede producir una degradación del rendimiento y un
consumo excesivo de memoria cuando se copian matrices de gran tamaño.
Calcule el número total de elementos necesarios para la nueva matriz grande y, a continuación, agregue los
elementos de cada matriz de origen a él.
En el ejemplo siguiente se usa el segundo método para agregar cuatro matrices con diez elementos cada una a
una sola matriz.
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.

Puesto que en este caso las matrices de origen son pequeñas, también podemos expandir dinámicamente la
matriz a medida que se agregan los elementos de cada nueva matriz a ella. En el siguiente ejemplo se realiza
esto.
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.

Colecciones como alternativa a las matrices


Las matrices son muy útiles para crear y trabajar con un número fijo de objetos fuertemente tipados. Las
colecciones proporcionan una manera más flexible de trabajar con grupos de objetos. A diferencia de las
matrices, que requieren que se cambie explícitamente el tamaño de una matriz con la instrucción ReDim , las
colecciones crecen y se reducen dinámicamente a medida que cambian las necesidades de una aplicación.
Cuando se usa ReDim para redimensionar una matriz, Visual Basic crea una nueva matriz y libera la anterior.
Esto requiere tiempo de ejecución. Por lo tanto, si el número de elementos con los que trabaja cambia con
frecuencia, o si no puede predecir el número máximo de elementos que necesita, normalmente obtendrá un
mejor rendimiento si usa una colección.
Para algunas colecciones, puede asignar una clave a cualquier objeto que incluya en la colección para, de este
modo, recuperar rápidamente el objeto con la clave.
Si la colección contiene elementos de un solo tipo de datos, puede usar una de las clases del espacio de
nombres System.Collections.Generic . Una colección genérica cumple la seguridad de tipos para que ningún
otro tipo de datos se pueda agregar a ella.
Para más información sobre las colecciones, vea Colecciones.

Temas relacionados
T ÉRM IN O DEF IN IC IÓ N

Array Dimensions in Visual Basic Explica el rango y las dimensiones de las matrices.

Cómo: Inicializar una variable de matriz en Visual Basic Describe cómo se llenan las matrices con valores iniciales.

Cómo: Ordenar una matriz en Visual Basic Muestra cómo ordenar alfabéticamente los elementos de
una matriz.

Asignar una matriz a otra Describe las reglas y los pasos para asignar una matriz a
otra variable de matriz.

Solución de problemas de matrices Describe algunos problemas comunes que surgen al trabajar
con matrices.

Vea también
System.Array
Dim (instrucción)
ReDim (instrucción)
Inicializadores de colección (Visual Basic)
27/11/2019 • 10 minutes to read • Edit Online

Los inicializadores de colección proporcionan una sintaxis abreviada que permite crear una colección y rellenarla
con un conjunto inicial de valores. Los inicializadores de colección son útiles cuando se crea una colección a partir
de un conjunto de valores conocidos, como una lista de opciones de menú o categorías, un conjunto inicial de
valores numéricos, una lista estática de cadenas como nombres de días o meses, o ubicaciones geográficas como
una lista de estados usada para la validación.
Para más información sobre las colecciones, vea Colecciones.
Para identificar un inicializador de colección, use la palabra clave From seguida de llaves ( {} ). Esto es similar a la
sintaxis de los literales de matriz que se describe en Arrays (Matrices). En los ejemplos siguientes se muestran
varias maneras de usar inicializadores de colección para crear colecciones.

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

NOTE
C# también proporciona inicializadores de colección. Los inicializadores de colección de C# proporcionan la misma
funcionalidad que los inicializadores de colección de Visual Basic. Para obtener más información sobre los inicializadores de
colección de C#, vea Inicializadores de objeto y de colección.

Sintaxis
Un inicializador de colección consta de una lista de valores separados por comas que están entre llaves ( {} ),
precedidos por la palabra clave From , como se muestra en el código siguiente.

Dim names As New List(Of String) From {"Christa", "Brian", "Tim"}

Cuando se crea una colección, como List<T> o Dictionary<TKey,TValue>, debe proporcionar el tipo de colección
antes del inicializador de colección, como se muestra en el código siguiente.

Public Class AppMenu


Public Property Items As List(Of String) =
New List(Of String) From {"Home", "About", "Contact"}
End Class
NOTE
No se puede combinar un inicializador de colección y un inicializador de objeto para inicializar el mismo objeto de colección.
Puede usar inicializadores de objeto para inicializar objetos en un inicializador de colección.

Crear una colección mediante un inicializador de colección


Cuando crea una colección mediante un inicializador de colección, cada valor que se proporciona en el
inicializador de colección se pasa al método Add correspondiente de la colección. Por ejemplo, si crea List<T>
mediante un inicializador de colección, cada valor de cadena del inicializador de colección se pasa al método Add.
Si quiere crear una colección mediante un inicializador de colección, el tipo especificado debe ser un tipo de
colección válido. Las clases que implementan la interfaz IEnumerable<T> o que heredan la clase CollectionBase
son algunos ejemplos de tipos de colección válidos. El tipo especificado también debe exponer un método Add
que cumpla los criterios siguientes.
El método Add debe estar disponible en el ámbito en el que se llama al inicializador de colección. El
método Add no tiene que ser público si el inicializador de colección se usa en un escenario en el que se
puede obtener acceso a los métodos no públicos de la colección.
El método Add debe ser un miembro de instancia o un miembro Shared de la clase de colección, o bien
un método de extensión.
Debe existir un método Add que se pueda asociar, en función de las reglas de resolución de sobrecarga, a
los tipos que se proporcionan en el inicializador de colección.
Por ejemplo, en el ejemplo de código siguiente se muestra cómo se crea una colección List(Of Customer)
mediante un inicializador de colección. Cuando se ejecuta el código, se pasa cada objeto Customer al método
Add(Customer) de la lista genérica.

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/")
}

En el ejemplo de código siguiente se muestra código equivalente que no usa un inicializador de colección.

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/"))

Si la colección tiene un método Add que tiene parámetros que coinciden con el constructor para el objeto
Customer , los valores de parámetro para el método Add se pueden anidar dentro de inicializadores de colección,
como se describe en la sección siguiente. Si la colección no tiene un método Add , puede crear uno como un
método de extensión. Para obtener un ejemplo de cómo crear un método Add como un método de extensión
para una colección, vea How to: Create an Add Extension Method Used by a Collection Initializer (Cómo: Crear un
método de extensión Add usado por un inicializador de colección). Para obtener un ejemplo de cómo crear una
colección personalizada que pueda usarse con un inicializador de colección, vea How to: Create a Collection Used
by a Collection Initializer (Cómo: Crear una colección usada por un inicializador de colección).

Anidar inicializadores de colección


Puede anidar los valores de un inicializador de colección para identificar una sobrecarga específica de un método
Add para la colección que se va a crear. Los valores pasados al método Add deben separarse con comas e
incluirse entre llaves ( {} ), tal como se haría en un literal de matriz o un inicializador de colección.
Cuando se crea una colección mediante el uso de valores anidados, cada elemento de la lista de valores anidados
se pasa como argumento al método Add que coincida con los tipos de elementos. Por ejemplo, en el ejemplo de
código siguiente se crea un Dictionary<TKey,TValue> en que las claves son de tipo Integer y los valores son de
tipo String . Cada una de las listas de valores anidados se asocia al método Add para el Dictionary .

Dim days = New Dictionary(Of Integer, String) From


{{0, "Sunday"}, {1, "Monday"}}

El ejemplo de código anterior es equivalente al código siguiente.

Dim days = New Dictionary(Of Integer, String)


days.Add(0, "Sunday")
days.Add(1, "Monday")

Solo se envían listas de valores anidados del primer nivel de anidamiento al método Add del tipo de colección.
Los niveles de anidamiento más profundos se tratan como literales de matriz y no habrá coincidencias de las
listas de valores anidados con el método Add de ninguna colección.

Temas relacionados
T ÍT ULO DESC RIP C IÓ N

Crear un método de extensión Add usado por un inicializador Muestra cómo crear un método de extensión denominado
de colección Add que se puede usar para rellenar una colección con los
valores de un inicializador de colección.

Crear una colección usada por un inicializador de colección Muestra cómo habilitar el uso de un inicializador de colección
mediante la inclusión de un método Add en una clase de
colección que implementa IEnumerable .

Vea también
Colecciones
Matrices
Inicializadores de objeto: Tipos con nombre y anónimos
New (operador)
Propiedades autoimplementadas
Cómo: Inicializar una variable de matriz en Visual Basic
Inferencia de tipo de variable local
Tipos anónimos
Introducción a LINQ en Visual Basic
Crear una lista de elementos
Constantes y enumeraciones en Visual Basic
27/11/2019 • 2 minutes to read • Edit Online

Las constantes son una forma de usar nombres significativos en lugar de un valor que no cambia. Las constantes
almacenan valores que, como su nombre indica, permanecen constantes durante la ejecución de una aplicación.
Puede usar constantes para proporcionar nombres descriptivos, en lugar de números, de forma que el código sea
más legible.
Las enumeraciones proporcionan una forma cómoda de trabajar con conjuntos de constantes relacionadas y
asociar valores constantes con nombres. Por ejemplo, puede declarar una enumeración para un conjunto de
constantes de tipo entero asociadas con los días de la semana y, después, usar los nombres de los días en lugar de
sus valores enteros en el código.

Esta sección
T ÉRM IN O DEF IN IC IÓ N

Información general sobre las constantes En los temas de esta sección se describen las constantes y sus
usos.

Información general sobre las enumeraciones En los temas de esta sección se describen las enumeraciones y
sus usos.

Secciones relacionadas
T ÉRM IN O DEF IN IC IÓ N

Const (instrucción) Se describe la instrucción Const , que se usa para declarar


constantes.

Enum (instrucción) Se describe la instrucción Enum , que se usa para crear


enumeraciones.

Option Explicit (instrucción) Se describe la instrucción Option Explicit , que se usa en el


nivel de módulo para exigir la declaración explícita de todas las
variables de ese módulo.

Option Infer (instrucción) Se describe la instrucción Option Infer , que permite el uso
de la inferencia de tipo de variable local en la declaración de
variables.

Option Strict (instrucción) Se describe la instrucción Option Strict , que restringe las
conversiones de tipos de datos implícitos solo a conversiones
de ampliación, no permite el enlace en tiempo de ejecución y
no permite tipos implícitos que dan como resultado un tipo
Object .
Flujo de control en Visual Basic
27/11/2019 • 2 minutes to read • Edit Online

Si un programa no se regula, procede a través de las instrucciones que contiene de principio a fin. Algunos
programas muy simples pueden escribirse únicamente con este flujo unidireccional. Pero gran parte del
rendimiento y la utilidad de un lenguaje de programación se debe a la capacidad de cambiar el orden de ejecución
mediante instrucciones de control y bucles.
Las estructuras de control permiten regular el flujo de la ejecución del programa. Mediante el uso de estructuras
de control, puede escribir Visual Basic código que toma decisiones o que repite las acciones. Otras estructuras de
control permiten garantizar la eliminación de un recurso o ejecutar una serie de instrucciones en la misma
referencia de objeto.

Esta sección
Estructuras de decisión
Describe las estructuras de control que se usan para la bifurcación.
Estructuras de bucle
Describe las estructuras de control que se usan para repetir procesos.
Estructuras de control adicionales
Describe las estructuras de control que se usan para la eliminación de recursos y el acceso a objetos.
Estructuras de control anidadas
Trata sobre las estructuras de control contenidas en otras estructuras de control.

Secciones relacionadas
Resumen de flujo de control
Proporciona vínculos a páginas de referencia del lenguaje sobre este tema.
Tipos de datos en Visual Basic
27/11/2019 • 2 minutes to read • Edit Online

El tipo de datos de un elemento de programación hace referencia al tipo de datos que puede contener y cómo
almacena los datos. Los tipos de datos se aplican a todos los valores que se pueden almacenar en la memoria
del equipo o participar en la evaluación de una expresión. Cada variable, literal, constante, enumeración,
propiedad, parámetro de procedimiento, argumento de procedimiento y valor devuelto de un procedimiento
tiene un tipo de datos.

Tipos de datos declarados


Define un elemento de programación con una instrucción de declaración y especifica su tipo de datos con la
cláusula As . En la tabla siguiente se muestran las instrucciones que usa para declarar diversos elementos.

EL EM EN TO DE P RO GRA M A C IÓ N DEC L A RA C IÓ N DE T IP O S DE DATO S

Variable En una instrucción Dim

Dim amount As Double

Static yourName As String

Public billsPaid As Decimal = 0

Literal Con un carácter de tipo literal; consulte "Caracteres de tipo


literal" en Caracteres de tipo

Dim searchChar As Char = "." C

Constante En una instrucción Const

Const modulus As Single = 4.17825F

Enumeración En una instrucción Enum

Public Enum colors

Propiedad En una instrucción Property

Property region() As String

Parámetro de procedimiento En una instrucción Sub, instrucción Function o una


instrucción Operator

Sub addSale(ByVal amount As Double)

Argumento de procedimiento En el código de llamada; cada argumento es un elemento de


programación que ya se declaró, o bien una expresión que
contiene los elementos declarados

subString = Left( inputString , 5 )


EL EM EN TO DE P RO GRA M A C IÓ N DEC L A RA C IÓ N DE T IP O S DE DATO S

Valor devuelto de un procedimiento En una instrucción Function o una instrucción Operator

Function convert(ByVal b As Byte) As String

Para ver una lista de los tipos de datos de Visual Basic, consulte Tipos de datos.

Vea también
Caracteres de tipo
Tipos de datos básicos
Tipos de datos compuestos
Generic Types in Visual Basic
Value Types and Reference Types
Conversiones de tipos en Visual Basic
Estructuras
Tuplas
Solución de problemas de tipos de datos
Tipos de datos
Uso eficiente de tipos de datos
Caracteres de tipo (Visual Basic)
27/11/2019 • 7 minutes to read • Edit Online

Además de especificar un tipo de datos en una instrucción de declaración, puede forzar el tipo de datos de
algunos elementos de programación con un carácter de tipo. El carácter de tipo debe ir inmediatamente
después del elemento, sin caracteres intermedios de ningún tipo.
El carácter de tipo no forma parte del nombre del elemento. Se puede hacer referencia a un elemento definido
con un carácter de tipo sin el carácter de tipo.

Caracteres de tipo de identificador


Visual Basic proporciona un conjunto de caracteres de tipo de identificador que puede usar en una declaración
para especificar el tipo de datos de una variable o constante. En la tabla siguiente se muestran los caracteres de
tipo de identificador disponibles con ejemplos de uso.

C A RÁ C T ER DE T IP O DE
IDEN T IF IC A DO R T IP O DE DATO S E JEM P LO

% Integer Dim L%

& Long Dim M&

@ Decimal Const W@ = 37.5

! Single Dim Q!

# Double Dim X#

$ String Dim V$ = "Secret"

No existen caracteres de tipo identificador para los tipos de datos Boolean , Byte , Char , Date , Object ,
SByte , Short , UInteger , ULong o UShort , o para cualquier tipo de datos compuesto como matrices o
estructuras.
En algunos casos, puede anexar el carácter $ a una función de Visual Basic, por ejemplo Left$ en lugar de
Left , para obtener un valor devuelto de tipo String .

En todos los casos, el carácter de tipo de identificador debe aparecer inmediatamente después del nombre del
identificador.

Caracteres de tipo literal


Un literal es una representación textual de un valor determinado de un tipo de datos.
Tipos literales predeterminados
La forma de un literal tal como aparece en el código suele determinar su tipo de datos. En la tabla siguiente se
muestran estos tipos predeterminados.
F O RM A T EXT UA L DE L IT ERA L T IP O DE DATO S P REDET ERM IN A DO E JEM P LO

Numeric, sin parte fraccionaria Integer 2147483647

Numeric, sin parte fraccionaria, Long 2147483648


demasiado grande para Integer

Numeric, parte fraccionaria Double 1.2

Entre comillas dobles String "A"

Entre signos de número Date #5/17/1993 9:32 AM#

Tipos de literales forzados


Visual Basic proporciona un conjunto de caracteres de tipo literal, que puede usar para forzar que un literal
asuma un tipo de datos distinto del que indica su forma. Para ello, Anexe el carácter al final del literal. En la
tabla siguiente se muestran los caracteres de tipo literal disponibles con ejemplos de uso.

C A RÁ C T ER DE T IP O L IT ERA L T IP O DE DATO S E JEM P LO

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

UI UInteger M = 347UI

UL ULong N = 347UL

C Char Q = "."C

No existen caracteres de tipo literal para los tipos de datos Boolean , Byte , Date , Object , SByte o String ,o
para cualquier tipo de datos compuesto como matrices o estructuras.
Los literales también pueden usar los caracteres de tipo de identificador ( % , & , @ , ! , # , $ ), como pueden
ser variables, constantes y expresiones. Sin embargo, los caracteres de tipo literal ( S , I , L , D , F , R , C )
solo se pueden usar con literales.
En todos los casos, el carácter de tipo literal debe seguir inmediatamente al valor literal.

Literales hexadecimales, binarios y octales


Normalmente, el compilador interpreta un literal entero para que esté en el sistema numérico decimal (base
10). También puede definir un literal entero como un número hexadecimal (base 16) con el prefijo &H , como
un número binario (base 2) con el prefijo &B y como un número octal (base 8) con el prefijo &O . Los dígitos
que siguen al prefijo deben ser adecuados para el sistema numérico. En la tabla siguiente se muestra esto.

VA LO RES DE DÍGITO S
B A SE N UM ÉRIC A P REF IJO VÁ L IDO S E JEM P LO

Hexadecimal (base 16) &H 0-9 y A-F &HFFFF

Binario (base 2) &B 0-1 &B01111100

Octal (base 8) &O 0-7 &O77

A partir de Visual Basic 2017, puede usar el carácter de subrayado ( _ ) como separador de grupos para
mejorar la legibilidad de un literal entero. En el ejemplo siguiente se usa el carácter _ para agrupar un literal
binario en grupos de 8 bits:

Dim number As Integer = &B00100010_11000101_11001111_11001101

Puede seguir un literal con prefijo con un carácter de tipo literal. En el ejemplo siguiente se muestra esto.

Dim counter As Short = &H8000S


Dim flags As UShort = &H8000US

En el ejemplo anterior, counter tiene el valor decimal de-32768 y flags tiene el valor decimal de + 32768.
A partir de Visual Basic 15,5, también puede usar el carácter de subrayado ( _ ) como separador inicial entre el
prefijo y los dígitos hexadecimales, binarios o octales. Por ejemplo:

Dim number As Integer = &H_C305_F860

Para usar el carácter de subrayado como separador inicial, debe agregar el elemento siguiente al archivo del
proyecto de Visual Basic (*.vbproj):

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Para obtener más información, consulte configuración de la versióndel lenguaje Visual Basic .

Vea también
Tipos de datos
Tipos de datos básicos
Value Types and Reference Types
Conversiones de tipos en Visual Basic
Solución de problemas de tipos de datos
Declaración de variables
Tipos de datos
Tipos de datos básicos (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Visual Basic proporciona un conjunto de tipos de datos predefinidos, que puede usar para muchos de los
elementos de programación. En esta sección se describen estos tipos y cómo usarlos.

NOTE
Cada tipo de datos elemental de Visual Basic es compatible con una estructura o una clase que se encuentra en el espacio
de nombres System. El compilador usa cada palabra clave de tipo de datos como alias para la clase o estructura subyacente.
Por ejemplo, la declaración de una variable mediante la palabra reservada Byte es igual que la declaración mediante el
nombre completo de la estructura System.Byte.

Esta sección
Tipos de datos numéricos
Describe los tipos numéricos enteros y no enteros.
Tipos de datos de caracteres
Describe los tipos Char y String .
Tipos de datos varios
Describe los tipos Boolean , Date y Object .

Secciones relacionadas
Tipos de datos
Presenta los tipos de datos Visual Basic y describe cómo usarlos.
Tipos de datos
Proporciona información general sobre los tipos de datos básicos proporcionados por Visual Basic.
Tipos de datos numéricos (Visual Basic)
27/11/2019 • 8 minutes to read • Edit Online

Visual Basic proporciona varios tipos de datos numéricos para administrar números en varias representaciones.
Los tipos enteros representan solo números enteros (positivos, negativos y cero), y los tipos no enteros
representan números con valores enteros y fraccionarios.
Para ver una tabla que muestra una comparación en paralelo de los tipos de datos Visual Basic, vea tipos de datos.

Tipos numéricos enteros


Los tipos de datos enteros son aquellos que solo representan números sin partes fraccionarias.
Los tipos de datos enteros con signo son el tipo de datos sbyte (8 bits), el tipo de datos Short (16 bits), el tipo de
datos Integer (32 bits) y el tipo de datos Long (64 bits). Si una variable siempre almacena enteros en lugar de
números fraccionarios, declárelo como uno de estos tipos.
Los tipos enteros sin signo son el tipo de datos byte (8 bits), el tipo de datos ushort (16 bits), el tipo de datos
UInteger (32 bits) y el tipo de datos ulong (64 bits). Si una variable contiene datos binarios o datos de naturaleza
desconocida, declárelo como uno de estos tipos.
Rendimiento
Las operaciones aritméticas son más rápidas con tipos enteros que con otros tipos de datos. Son más rápidos con
los tipos Integer y UInteger de Visual Basic.
Enteros grandes
Si necesita contener un entero mayor que el Integer puede contener el tipo de datos, puede utilizar el tipo de
datos Long en su lugar. Long variables pueden contener números comprendidos entre-
9.223.372.036.854.775.808 y 9.223.372.036.854.775.807. Las operaciones con Long son ligeramente más lentas
que con Integer .
Si necesita valores incluso mayores, puede usar el tipo de datos decimal. Puede contener números entre-
79.228.162.514.264.337.593.543.950.335 y 79.228.162.514.264.337.593.543.950.335 en una variable Decimal si
no usa ninguna posición decimal. Sin embargo, las operaciones con números Decimal son considerablemente
más lentas que con cualquier otro tipo de datos numéricos.
Enteros pequeños
Si no necesita el intervalo completo del tipo de datos Integer , puede usar el tipo de datos Short , que puede
contener enteros de-32.768 a 32.767. En el intervalo de enteros más pequeño, el tipo de datos SByte contiene
enteros de-128 a 127. Si tiene un número muy grande de variables que contienen pequeños enteros, en ocasiones,
el Common Language Runtime puede almacenar las variables Short y SByte de manera más eficaz y ahorrar
consumo de memoria. Sin embargo, las operaciones con Short y SByte son ligeramente más lentas que con
Integer .

Enteros sin signo


Si sabe que la variable nunca necesita contener un número negativo, puede usar los tipos sin signo Byte , UShort ,
UInteger y ULong . Cada uno de estos tipos de datos puede contener un entero positivo dos veces mayor que el
tipo con signo correspondiente ( SByte , Short , Integer y Long ). En cuanto al rendimiento, cada tipo sin signo es
exactamente tan eficaz como su tipo con signo correspondiente. En concreto, UInteger recursos compartidos con
Integer la distinción de ser el más eficaz de todos los tipos de datos numéricos elementales.
Tipos numéricos no enteros
Los tipos de datos no integrales son aquellos que representan números con enteros y partes fraccionarias.
Los tipos de datos numéricos no integrales son Decimal (punto fijo de 128 bits), tipo de datos único (punto
flotante de 32 bits) y tipo de datos Double (punto flotante de 64 bits). Todos ellos son tipos firmados. Si una
variable puede contener una fracción, declárela como uno de estos tipos.
Decimal no es un tipo de datos de punto flotante. los números Decimal tienen un valor entero binario y un factor
de escala entero que especifica qué parte del valor es una fracción decimal.
Puede usar variables de Decimal para valores de moneda. La ventaja es la precisión de los valores. El tipo de datos
Double es más rápido y requiere menos memoria, pero está sujeto a errores de redondeo. El tipo de datos
Decimal conserva una precisión completa de 28 posiciones decimales.

Los números de punto flotante ( Single y Double ) tienen intervalos mayores que Decimal números, pero pueden
estar sujetos a errores de redondeo. Los tipos de punto flotante admiten menos dígitos significativos que Decimal
pero pueden representar valores de mayor magnitud.
Los valores de número no integral se pueden expresar como mmmEeee, en los que MMM es la mantisa (los
dígitos significativos) y EEE es el exponente (una potencia de 10). Los valores positivos más altos de los tipos no
integrales son 7,9228162514264337593543950335 E + 28 para Decimal , 3.4028235 E + 38 para Single y
1.79769313486231570 E + 308 para Double .
Rendimiento
Double es el más eficaz de los tipos de datos fraccionarios, ya que los procesadores de las plataformas actuales
realizan operaciones de punto flotante de doble precisión. Sin embargo, las operaciones con Double no son tan
rápidas como con los tipos enteros como Integer .
Pequeñas magnitudes
En el caso de los números con la menor magnitud posible (más cercana a 0), Double variables pueden contener
números tan pequeños como-4.94065645841246544 E-324 para los valores negativos y 4.94065645841246544
E-324 para los valores positivos.
Números fraccionarios pequeños
Si no necesita el intervalo completo del tipo de datos Double , puede usar el tipo de datos Single , que puede
contener números de punto flotante de-3.4028235 E + 38 a 3.4028235 E + 38. Las magnitudes más pequeñas de
las variables de Single son-401298e E-45 para los valores negativos y 401298e E-45 para los valores positivos.
Si tiene un número muy grande de variables que contienen números de punto flotante pequeños, a veces el
Common Language Runtime puede almacenar las variables Single de forma más eficaz y ahorrar consumo de
memoria.

Vea también
Tipos de datos básicos
Tipos de datos de caracteres
Tipos de datos varios
Solución de problemas de tipos de datos
Llamar a una función de Windows que adopta tipos sin signo
Tipos de datos de caracteres (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Visual Basic proporciona tipos de datos de caracteres para tratar con caracteres imprimibles y que se pueda
mostrar. Aunque ambos tratan con caracteres Unicode, Char contiene un solo carácter, mientras que String
contiene un número indefinido de caracteres.
Para obtener una tabla en la que se muestra una comparación en paralelo de los tipos de datos Visual Basic, vea
tipos de datos.

Char (tipo)
El tipo de datos Char es un único carácter Unicode de dos bytes (16 bits). Si una variable siempre almacena
exactamente un carácter, declárelo como Char . Por ejemplo:

' Initialize the prefix variable to the character 'a'.


Dim prefix As Char = "a"

Cada valor posible de una variable Char o String es un punto de código, o código de carácter, en el juego de
caracteres Unicode. Los caracteres Unicode incluyen el juego de caracteres ASCII básico, otras letras, acentos,
símbolos de moneda, fracciones, diacríticos y símbolos matemáticos y técnicos.

NOTE
El juego de caracteres Unicode reserva los puntos de código D800 a DFFF (de 55296 a 55551 decimal) para los pares
suplentes, que requieren valores de 2 16 bits para representar un solo punto de código. Una variable Char no puede
contener un par suplente y una String usa dos posiciones para contener este tipo de par.

Para obtener más información, vea Char (tipo de datos).

Tipo de cadena
El tipo de datos String es una secuencia de cero o más caracteres Unicode de dos bytes (16 bits). Si una variable
puede contener un número indefinido de caracteres, declárelo como String . Por ejemplo:

' Initialize the name variable to "Monday".


Dim name As String = "Monday"

Para obtener más información, vea String (tipo de datos).

Vea también
Tipos de datos básicos
Tipos de datos compuestos
Generic Types in Visual Basic
Value Types and Reference Types
Conversiones de tipos en Visual Basic
Solución de problemas de tipos de datos
Caracteres de tipo
Tipos de datos variados (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Visual Basic proporciona varios tipos de datos que no están orientados a números o caracteres. En su lugar, se
ocupan de los datos especializados, como los valores sí/no, los valores de fecha y hora y las direcciones de objeto.
Para ver una tabla que muestra una comparación en paralelo de los tipos de datos Visual Basic, vea tipos de datos.

Tipo booleano
El tipo de datos Boolean es un valor sin signo que se interpreta como True o False . El ancho de los datos
depende de la plataforma de implementación. Si una variable solo puede contener valores de dos Estados, como
true/false, yes/no o ON/OFF, declárela como Boolean .

Tipo de fecha
El tipo de datos Date es un valor de 64 bits que contiene información de fecha y hora. Cada incremento representa
100 nanosegundos de tiempo transcurrido desde el inicio (12:00 A.M.) del 1 de enero del año 1 del calendario
gregoriano. Si una variable puede contener un valor de fecha, un valor de hora o ambos, declárelo como Date .

Tipo de objeto
El tipo de datos Object es una dirección de 32 bits que apunta a una instancia de objeto dentro de la aplicación o
en alguna otra aplicación. Una variable de Object puede hacer referencia a cualquier objeto que la aplicación
reconozca o a datos de cualquier tipo de datos. Esto incluye los dos tipos de valor, como Integer , Boolean y las
instancias de la estructura, y los tipos de referencia, que son instancias de los objetos creados a partir de clases
como String y Form, y las instancias de matriz.
Si una variable almacena un puntero a una instancia de una clase que no conoce en tiempo de compilación, o si
puede apuntar a datos de varios tipos de datos, declárelo como Object .
La ventaja del tipo de datos Object es que se puede usar para almacenar datos de cualquier tipo de datos. El
inconveniente es que se incurre en operaciones adicionales que tardan más tiempo de ejecución y hacen que la
aplicación funcione más lentamente. Si usa una variable de Object para los tipos de valor, incurrirá en la
conversión boxing y la conversión unboxing. Si se usa para los tipos de referencia, se incurre en el enlace en
tiempo de ejecución.

Vea también
Caracteres de tipo
Tipos de datos básicos
Tipos de datos numéricos
Tipos de datos de caracteres
Solución de problemas de tipos de datos
Enlace en tiempo de compilación y en tiempo de ejecución
Tipos de datos compuestos (Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

Además de los tipos de datos elementales Visual Basic proporciona, también puede ensamblar elementos de tipos
diferentes para crear tipos de datos compuestos como estructuras, matrices y clases. Puede crear tipos de datos
compuestos a partir de tipos elementales y de otros tipos compuestos. Por ejemplo, puede definir una matriz de
elementos de estructura o una estructura con miembros de matriz.

Tipos de datos
Un tipo compuesto es diferente del tipo de datos de cualquiera de sus componentes. Por ejemplo, una matriz de
elementos Integer no es del tipo de datos Integer .
Normalmente, un tipo de datos de matriz se representa mediante el tipo de elemento, paréntesis y comas según
sea necesario. Por ejemplo, una matriz unidimensional de elementos String se representa como String() y una
matriz bidimensional de elementos Boolean se representa como Boolean(,) .

Tipos de estructura
No hay ningún tipo de datos único que incluya todas las estructuras. En su lugar, cada definición de una estructura
representa un tipo de datos único, incluso si dos estructuras definen elementos idénticos en el mismo orden. Sin
embargo, si crea dos o más instancias de la misma estructura, Visual Basic considera que son del mismo tipo de
datos.

Tuplas
Una tupla es una estructura ligera que contiene dos o más campos cuyos tipos están predefinidos. Las tuplas se
admiten a partir de Visual Basic 2017. Las tuplas se suelen usar para devolver varios valores de una sola llamada
al método sin tener que pasar argumentos por referencia o empaquetar los campos devueltos en una estructura o
clase más pesada. Vea el tema sobre tuplas para obtener más información sobre las tuplas.

Tipos de matriz
No hay ningún tipo de datos único que comprenda todas las matrices. El tipo de datos de una instancia
determinada de una matriz viene determinado por lo siguiente:
El hecho de ser una matriz
Rango (número de dimensiones) de la matriz.
El tipo de elemento de la matriz.
En concreto, la longitud de una dimensión determinada no forma parte del tipo de datos de la instancia. En el
ejemplo siguiente se ilustra esto.

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) {}

En el ejemplo anterior, las variables de matriz arrayA y arrayB se consideran del mismo tipo de datos, Byte() ,
aunque se hayan inicializado a longitudes diferentes. Las variables arrayB y arrayC no son del mismo tipo
porque sus tipos de elemento son diferentes. Las variables arrayC y arrayD no son del mismo tipo porque sus
rangos son diferentes. Las variables arrayD y arrayE tienen el mismo tipo, Short(,) , porque sus rangos y tipos
de elemento son los mismos, aunque aún no se ha inicializado arrayD .
Para obtener más información sobre las matrices, vea matrices.

Tipos de clase
No hay ningún tipo de datos único que incluya todas las clases. Aunque una clase puede heredar de otra clase,
cada una es un tipo de datos independiente. Varias instancias de la misma clase tienen el mismo tipo de datos. Si
asigna una variable de instancia de clase a otra, y no solo tienen el mismo tipo de datos, apuntan a la misma
instancia de clase en la memoria.
Para obtener más información sobre las clases, vea objetos y clases.

Vea también
Tipos de datos
Tipos de datos básicos
Generic Types in Visual Basic
Value Types and Reference Types
Conversiones de tipos en Visual Basic
Estructuras
Solución de problemas de tipos de datos
Contener más de un valor en una variable
Cómo: Contener más de un valor en una variable
(Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Una variable contiene más de un valor si se declara como un tipo de datos compuesto.
Los tipos de datos compuestos incluyen estructuras, matrices y clases. Una variable de un tipo de datos compuesto
puede contener una combinación de tipos de datos básicos y otros tipos compuestos. Las estructuras y las clases
pueden contener código y datos.

Para contener más de un valor en una variable


1. Determine qué tipo de datos compuesto desea usar para la variable.
2. Si el tipo de datos compuesto todavía no está definido, debe definirlo para que la variable pueda usarlo.
Defina una estructura con una instrucción Structure.
Defina una matriz con una instrucción Dim.
Defina una clase con una instrucción de clase.
3. Declare la variable con una instrucción Dim .
4. Siga el nombre de la variable con una cláusula As .
5. Siga la palabra clave As con el nombre del tipo de datos compuesto adecuado.

Vea también
Tipos de datos
Caracteres de tipo
Tipos de datos compuestos
Estructuras
Matrices
Objetos y clases
Value Types and Reference Types
Tipos genéricos en Visual Basic (Visual Basic)
27/11/2019 • 14 minutes to read • Edit Online

Un tipo genérico es un elemento de programación único que se adapta para ejecutar la misma funcionalidad
para distintos tipos de datos. Cuando se define una clase o un procedimiento genérico, no es necesario definir
una versión independiente para cada tipo de datos para el que quiera ejecutar esa funcionalidad.
Una analogía es un juego de destornilladores con puntas extraíbles. Inspeccione el tornillo que quiere roscar y
seleccione la punta adecuada (plana, de cruz o de estrella). Una vez insertada la punta correcta en el mango del
destornillador, realiza la misma función exacta con el destornillador, es decir, roscar el tornillo.

Al definir un tipo genérico, lo puede parametrizar con uno o más tipos de datos. Esto permite que el código que
los usa se adapte los tipos de datos a sus requisitos. Su código puede declarar varios elementos de
programación diferentes a partir del elemento genérico y cada uno de ellos actúa en un conjunto distinto de
tipos de datos. Pero todos los elementos declarados funcionan con la misma lógica, independientemente de los
tipos de datos que usen.
Por ejemplo, puede que quiera crear y usar una clase de cola que funcione en un tipo de datos concreto, como
String . Puede declarar esta clase desde System.Collections.Generic.Queue<T>, como se muestra en el
ejemplo siguiente.

Public stringQ As New System.Collections.Generic.Queue(Of String)

Ahora puede usar stringQ para trabajar exclusivamente con valores String . Dado que stringQ es específico
de String en lugar de generalizarse para los valores Object , no dispone de enlace en tiempo de ejecución ni
conversión de tipos. Esto ahorra tiempo de ejecución y reduce los errores de tiempo de ejecución.
Para obtener más información sobre el uso de un tipo genérico, vea How to: Use a Generic Class.

Ejemplo de una clase genérica


En el ejemplo siguiente se muestra un esquema de definición de una clase genérica.

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

En el esquema anterior, t es un parámetro de tipo, es decir, un marcador de posición para un tipo de datos
proporcionado al declarar la clase. En otro lugar del código, puede declarar distintas versiones de classHolder
proporcionando diversos tipos de datos para t . En el ejemplo siguiente se muestran dos declaraciones de
este tipo.

Public integerClass As New classHolder(Of Integer)


Friend stringClass As New classHolder(Of String)

Las instrucciones anteriores declaran clases construidas, en las que un tipo específico reemplaza el parámetro
de tipo. Este reemplazo se propaga por todo el código en la clase construida. En el ejemplo siguiente se
muestra el aspecto del procedimiento processNewItem en integerClass .

Public Sub processNewItem(ByVal newItem As Integer)


Dim tempItem As Integer
' Inserted code now processes an Integer item.
End Sub

Para obtener un ejemplo más completo, vea Cómo: definir una clase que pueda proporcionar la misma
funcionalidad en tipos de datos diferentes.

Elementos de programación válidos


Puede definir y usar clases genéricas, estructuras, interfaces, procedimientos y delegados. Tenga en cuenta que
el .NET Framework define varias clases, estructuras e interfaces genéricas que representan los elementos
genéricos que se usan habitualmente. El espacio de nombres System.Collections.Generic proporciona
diccionarios, listas, colas y pilas. Antes de definir su propio elemento genérico, vea si ya está disponible en
System.Collections.Generic.
Los procedimientos no son tipos, pero puede definir y usar procedimientos genéricos. Vea Generic Procedures
in Visual Basic.

Ventajas de los tipos genéricos


Un tipo genérico sirve como base para declarar varios elementos de programación diferentes, cada uno de los
cuales actúa en un tipo de datos específico. Las alternativas a un tipo genérico son:
1. Un tipo único que actúe en el tipo de datos Object .
2. Un conjunto de versiones del tipo específicas del tipo , cada una de las cuales esté codificada por
separado y actúe en un tipo de datos concreto, como String , Integer o un tipo definido por el usuario,
como customer .
Un tipo genérico tiene las ventajas siguientes sobre estas alternativas:
Seguridad de tipos. Los tipos genéricos fuerzan la comprobación de tipos en tiempo de compilación.
Los tipos basados en Object aceptan cualquier tipo de datos; debe escribir código para comprobar si
un tipo de datos de entrada es aceptable. Con los tipos genéricos, el compilador puede detectar errores
de coincidencia de tipo antes del tiempo de ejecución.
Rendimiento. No es necesario que los tipos genéricos apliquen la conversión boxing y unboxinging a
los datos, ya que cada uno está diseñado para un tipo de datos. Las operaciones basadas en Object
deben aplicar la conversión boxing a los tipos de datos de entrada para convertirlos a Object y aplicar
la conversión unboxing a los datos destinados a la salida. La conversión boxing y la conversión unboxing
reducen el rendimiento.
Los tipos basados en Object también se enlazan en tiempo de ejecución, lo que significa que el acceso
a sus miembros requiere código adicional en tiempo de ejecución. Esto también reduce el rendimiento.
Consolidación del código. El código de un tipo genérico debe definirse una sola vez. Un conjunto de
versiones específicas del tipo de un tipo debe replicar el mismo código en cada versión, a excepción del
tipo de datos específico de la versión. Con los tipos genéricos, las versiones específicas del tipo se
generan a partir del tipo genérico original.
Reutilización del código. El código que no depende de un tipo de datos determinado se puede
reutilizar con distintos tipos de datos si es genérico. A menudo se puede reutilizar incluso con un tipo de
datos no previsto originalmente.
Compatibilidad con IDE. Si usa un tipo construido declarado a partir de un tipo genérico, el entorno
de desarrollo integrado (IDE) puede proporcionarle más soporte mientras desarrolla el código. Por
ejemplo, IntelliSense puede mostrarle las opciones específicas del tipo de un argumento para un
constructor o un método.
Algoritmos genéricos. Los algoritmos abstractos que son independientes del tipo son buenos
candidatos para los tipos genéricos. Por ejemplo, un procedimiento genérico que ordena los elementos
mediante la interfaz IComparable puede usarse con cualquier tipo de datos que implemente
IComparable.

Restricciones
Aunque el código de una definición de tipo genérico debe ser tan independiente del tipo como sea posible,
puede que tenga que requerir una funcionalidad concreta de cualquier tipo de datos proporcionado a su tipo
genérico. Por ejemplo, si desea comparar dos elementos con el fin de ordenarlos o intercalarlos, su tipo de
datos debe implementar la interfaz IComparable . Para imponer este requisito, puede agregar una restricción al
parámetro de tipo.
Ejemplo de una restricción
En el ejemplo siguiente se muestra un esquema de definición de una clase con una restricción que requiere que
el argumento de tipo implemente IComparable.

Public Class itemManager(Of t As IComparable)


' Insert code that defines class members.
End Class

Si el código subsiguiente intenta construir una clase a partir de itemManager proporcionando un tipo que no
implemente IComparable, el compilador indicará un error.
Tipos de restricciones
La restricción puede especificar los requisitos siguientes en cualquier combinación:
El argumento de tipo debe implementar una o varias interfaces
El argumento de tipo debe ser del tipo de una clase como máximo, o bien heredarse a lo sumo de una
clase.
El argumento de tipo debe exponer un constructor sin parámetros accesible para el código que crea
objetos a partir de él.
El argumento de tipo debe ser un tipo de referenciao un tipo de valor.
Si necesita imponer más que un requisito, use una lista de restricciones separadas por comas entre llaves ( { }
). Para requerir un constructor accesible, incluya la palabra clave New Operator en la lista. Para requerir un tipo
de referencia, incluya la palabra clave Class ; para requerir un tipo de valor, incluya la palabra clave Structure
.
Para más información sobre las restricciones, vea Type List.
Ejemplo de varias restricciones
En el ejemplo siguiente se muestra un esquema de definición de una clase genérica con una lista de
restricciones en el parámetro de tipo. En el código que crea una instancia de esta clase, el argumento de tipo
debe implementar ambas interfaces IComparable y IDisposable , ser un tipo de referencia y exponer un
constructor sin parámetros accesible.

Public Class thisClass(Of t As {IComparable, IDisposable, Class, New})


' Insert code that defines class members.
End Class

Condiciones importantes
Los tipos genéricos introducen y usan las condiciones siguientes:
Tipo genérico. Definición de clase, estructura, interfaz, procedimiento o delegado para la que
proporciona al menos un tipo de datos cuando la declara.
Parámetro de tipo. En una definición de tipo genérico, marcador de posición para un tipo de datos que
proporciona al declarar el tipo.
Argumento de tipo. Tipo de datos específico que reemplaza un parámetro de tipo cuando declara un
tipo construido a partir de un tipo genérico.
Restricción. Condición en un parámetro de tipo que restringe el argumento de tipo puede proporcionar
para este. Una restricción puede requerir que el argumento de tipo implemente una interfaz
determinada, sea de una clase concreta o se herede de esta, tenga un constructor sin parámetros
accesible o sea un tipo de referencia o un tipo de valor. Puede combinar estas restricciones, pero puede
especificar una clase como máximo.
Tipo construido. Clase, estructura, interfaz, procedimiento o delegado que se declara a partir de un tipo
genérico proporcionando argumentos de tipo para sus parámetros de tipo.

Vea también
Tipos de datos
Caracteres de tipo
Value Types and Reference Types
Conversiones de tipos en Visual Basic
Solución de problemas de tipos de datos
Tipos de datos
Of
As
Object Data Type
Covarianza y contravarianza
Iteradores
Cómo: Definir una clase que pueda proporcionar la
misma funcionalidad en tipos de datos diferentes
(Visual Basic)
27/11/2019 • 7 minutes to read • Edit Online

Puede definir una clase desde la que se puedan crear objetos que proporcionen una funcionalidad idéntica en
tipos de datos diferentes. Para ello, especifique uno o más parámetros de tipo en la definición. Posteriormente, la
clase puede servir de plantilla para los objetos que usan distintos tipos de datos. Una clase definida de esta
manera se denomina clase genérica.
La ventaja de definir una clase genérica es que se define una sola vez y, después, el código puede usarla para crear
muchos objetos que emplean una gran variedad de tipos de datos. El resultado es rendimiento mayor que al
definir la clase con el tipo Object .
Además de clases, también puede definir y usar estructuras genéricas, interfaces, procedimientos y delegados.
Para definir una clase con un parámetro de tipo
1. Defina la clase de la manera normal.
2. Agregue (Of typeparameter ) inmediatamente después del nombre de clase para especificar un
parámetro de tipo.
3. Si tiene más de un parámetro de tipo, realice una lista separada por comas entre paréntesis. No repita la
palabra clave Of .
4. Si el código realiza operaciones en un parámetro de tipo distintas de la asignación simple, siga ese
parámetro de tipo con una cláusula As para agregar una o más restricciones. Una restricción garantiza que
el tipo proporcionado para ese parámetro de tipo satisfaga un requisito como el siguiente:
Admitir una operación, como > , que realice el código.
Admita a un miembro, como un método, al que accede el código.
Exponer un constructor sin parámetros.
Si no especifica ninguna restricción, las únicas operaciones y miembros que el código podrá usar son las
que admite el Object Data Type. Para obtener más información, consulta Type List.
5. Identifique cada miembro de clase que deba declararse con un tipo suministrado y declárelo As
typeparameter . Esto se aplica al almacenamiento interno, los parámetros de procedimiento y los valores
devueltos.
6. Asegúrese de que el código solo usa operaciones y métodos admitidos por cualquier tipo de datos que
pueda proporcionar a itemType .
En el ejemplo siguiente se define una clase que administra una lista muy simple. Contiene la lista de la
matriz interna items y el código que la usa puede declarar el tipo de datos de los elementos de la lista. Un
constructor con parámetros permite que el código de uso establezca el límite superior de items y el
constructor sin parámetros lo establece en 9 (para un total de 10 elementos).
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

Puede declarar una clase de simpleList para que contenga una lista de valores Integer , otra para que
contenga una lista de valores String y otra para que contenga valores Date . Excepto para el tipo de datos
de los miembros de la lista, los objetos creados a partir de todas estas clases se comportan exactamente
igual.
El argumento de tipo que el código que lo usa proporciona a itemType puede ser un tipo intrínseco como
Boolean o Double , una estructura, una enumeración o cualquier tipo de clase, incluida una que defina la
aplicación.
Puede probar la clase simpleList con el siguiente código.

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

Vea también
Tipos de datos
Generic Types in Visual Basic
Independencia del lenguaje y componentes independientes del lenguaje
Of
Lista de tipos
Utilizar una clase genérica
Object Data Type
Cómo: Usar clases genéricas (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Las clases que toman parámetros de tipo se denominan clases genéricas. Si usa una clase genérica, puede
generar una clase construida a partir de ella proporcionando un argumento de tipo para cada uno de estos
parámetros. Después, puede declarar una variable del tipo de clase construida, crear una instancia de la clase
construida y asignarla a esa variable.
Además de clases, también puede definir y usar estructuras genéricas, interfaces, procedimientos y delegados.
En el procedimiento siguiente se toma una clase genérica definida en el .NET Framework y se crea una instancia a
partir de ella.
Para usar una clase que toma un parámetro de tipo
1. Al principio del archivo de código fuente, incluya una instrucción Imports (espacio de nombres de .net y
tipo) para importar el espacio de nombres System.Collections.Generic. Esto le permite hacer referencia a la
clase System.Collections.Generic.Queue<T> sin tener que usar su nombre completo para diferenciarla de
otras clases queue, como System.Collections.Queue.
2. Cree el objeto de la manera normal, pero agregue (Of type) inmediatamente después del nombre de
clase.
En el ejemplo siguiente se usa la misma clase (System.Collections.Generic.Queue<T>) para crear dos
objetos queue que contienen elementos de distintos tipos de datos. Agrega elementos al final de cada cola
y, después, quita y muestra los elementos de la parte delantera de cada cola.

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

Vea también
Tipos de datos
Generic Types in Visual Basic
Independencia del lenguaje y componentes independientes del lenguaje
Of
Imports (instrucción), espacio de nombres y tipo .NET
Definir una clase que pueda proporcionar la misma funcionalidad en tipos de datos diferentes
Iteradores
Procedimientos genéricos en Visual Basic
27/11/2019 • 5 minutes to read • Edit Online

Un procedimiento genérico, también denominado método genérico, es un procedimiento definido con al menos
un parámetro de tipo. Esto permite que el código de llamada adapte los tipos de datos a sus requisitos cada vez
que llama al procedimiento.
Un procedimiento no es genérico simplemente en virtud de definirse dentro de una clase genérica o en una
estructura genérica. Para que sea genérico, el procedimiento debe tomar al menos un parámetro de tipo, además
de los parámetros normales que puede llevar a cabo. Una clase o estructura genérica puede contener
procedimientos no genéricos, y una clase, estructura o módulo no genéricos pueden contener procedimientos
genéricos.
Un procedimiento genérico puede usar sus parámetros de tipo en su lista de parámetros normal, en su tipo de
valor devuelto si tiene uno, y en su código de procedimiento.

Inferencia de tipos
Puede llamar a un procedimiento genérico sin proporcionar ningún argumento de tipo. Si se llama de esta
manera, el compilador intenta determinar los tipos de datos adecuados que se van a pasar a los argumentos de
tipo del procedimiento. Esto se denomina inferencia de tipos. En el código siguiente se muestra una llamada en la
que el compilador deduce que debe pasar el tipo String al parámetro de tipo t .

Public Sub testSub(Of t)(ByVal arg As t)


End Sub
Public Sub callTestSub()
testSub("Use this string")
End Sub

Si el compilador no puede inferir los argumentos de tipo del contexto de la llamada, notifica un error. Una posible
causa de este error es que la clasificación de una matriz no coincide. Por ejemplo, supongamos que define un
parámetro normal como una matriz de un parámetro de tipo. Si llama al procedimiento genérico que proporciona
una matriz de un rango diferente (número de dimensiones), la incoherencia provocará un error en la inferencia de
tipos. En el código siguiente se muestra una llamada en la que se pasa una matriz bidimensional a un
procedimiento que espera una matriz unidimensional.

Public Sub demoSub(Of t)(ByVal arg() As t)


End Sub

Public Sub callDemoSub()


Dim twoDimensions(,) As Integer
demoSub(twoDimensions)
End Sub

Solo se puede invocar la inferencia de tipos si se omiten todos los argumentos de tipo. Si proporciona un
argumento de tipo, debe proporcionarlos todos.
La inferencia de tipos solo se admite para los procedimientos genéricos. No se puede invocar la inferencia de tipos
en clases, estructuras, interfaces o delegados genéricos.

Ejemplo
Descripción
En el ejemplo siguiente se define un procedimiento genérico Function para buscar un elemento determinado en
una matriz. Define un parámetro de tipo y lo usa para construir los dos parámetros en la lista de parámetros.
Código

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

Comentarios
En el ejemplo anterior se requiere la capacidad de comparar searchValue con cada elemento de searchArray .
Para garantizar esta capacidad, restringe el parámetro de tipo T para implementar la interfaz de
IComparable<T>. El código utiliza el método CompareTo en lugar del operador = , porque no hay ninguna
garantía de que un argumento de tipo proporcionado para T admita el operador = .
Puede probar el procedimiento findElement con el código siguiente.

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

Las llamadas anteriores a MsgBox Mostrar "0", "1" y "-1", respectivamente.

Vea también
Generic Types in Visual Basic
Definir una clase que pueda proporcionar la misma funcionalidad en tipos de datos diferentes
Utilizar una clase genérica
Procedimientos
Argumentos y parámetros de procedimiento
Lista de tipos
Lista de parámetros
Tipos que admiten valores null (Visual Basic)
27/03/2020 • 11 minutes to read • Edit Online

A veces se trabaja con un tipo de valor que no tiene un valor definido en determinadas circunstancias. Por
ejemplo, un campo de una base de datos podría tener que distinguir entre tener un valor asignado que sea
significativo y no tener un valor asignado. Los tipos de valor se pueden extender para tomar sus valores normales
o un valor nulo. Dicha extensión se denomina tipo que acepta valores NULL.
Cada tipo de valor que acepta Nullable<T> valores NULL se construye a partir de la estructura genérica.
Considere una base de datos que realiza un seguimiento de las actividades relacionadas con el trabajo. En el
ejemplo siguiente Boolean se construye un tipo que acepta valores NULL y se declara una variable de ese tipo.
Puede escribir la declaración de tres maneras:

Dim ridesBusToWork1? As Boolean


Dim ridesBusToWork2 As Boolean?
Dim ridesBusToWork3 As Nullable(Of Boolean)

La ridesBusToWork variable puede contener True un valor False de , un valor de , o ningún valor en absoluto. Su
valor predeterminado inicial no es ningún valor en absoluto, lo que en este caso podría significar que la
información aún no se ha obtenido para esta persona. Por el False contrario, podría significar que la
información se ha obtenido y la persona no viaja en el autobús al trabajo.
Puede declarar variables y propiedades con tipos de valor que aceptan valores NULL y puede declarar una matriz
con elementos de un tipo de valor que acepta valores NULL. Puede declarar procedimientos con tipos de valor
que aceptan valores NULL Function como parámetros y puede devolver un tipo de valor que acepta valores
NULL de un procedimiento.
No se puede construir un tipo que acepta valores String NULL en un tipo de referencia como una matriz, una o
una clase. El tipo subyacente debe ser un tipo de valor. Para obtener más información, vea Tipos de valor y tiposde
referencia .

Uso de una variable de tipo que acepta valores NULL


Los miembros más importantes de un HasValue Value tipo de valor que acepta valores NULL son sus
propiedades. Para una variable de un HasValue tipo de valor que acepta valores NULL, le indica si la variable
contiene un valor definido. Si HasValue True es , puede leer Valueel valor de . Tenga en HasValue Value cuenta
ReadOnly que ambas y son propiedades.

Valores predeterminados
Cuando se declara una variable con un HasValue tipo de valor False que acepta valores NULL, su propiedad tiene
un valor predeterminado de . Esto significa que, de forma predeterminada, la variable no tiene ningún valor
definido, en lugar del valor predeterminado de su tipo de valor subyacente. En el ejemplo siguiente, la variable
numberOfChildren inicialmente no tiene ningún Integer valor definido, aunque el valor predeterminado del tipo
es 0.

Dim numberOfChildren? As Integer

Un valor nulo es útil para indicar un valor indefinido o desconocido. Si numberOfChildren se hubiera Integer
declarado como , no habría ningún valor que pudiera indicar que la información no está disponible actualmente.
Almacenar valores
Almacenar un valor en una variable o propiedad de un tipo de valor que acepta valores NULL de la manera típica.
En el ejemplo siguiente se numberOfChildren asigna un valor a la variable declarada en el ejemplo anterior.

numberOfChildren = 2

Si una variable o propiedad de un tipo de valor que acepta valores NULL contiene un valor definido, puede hacer
que vuelva a su estado inicial de no tener un valor asignado. Para ello, establezca la variable Nothing o propiedad
en , como se muestra en el ejemplo siguiente.

numberOfChildren = Nothing

NOTE
Aunque puede Nothing asignar a una variable de un tipo de Nothing valor que acepta valores NULL, no puede probarlo
mediante el signo igual. La comparación que someVar = Nothing utiliza el signo Nothing igual, , siempre se evalúa como .
Puede probar la propiedad HasValue de False la variable para Is IsNot , o probar mediante el operador or.

Recuperación de valores
Para recuperar el valor de una variable de un tipo HasValue de valor que acepta valores NULL, primero debe
probar su propiedad para confirmar que tiene un valor. Si intenta leer el HasValue valor False cuando es ,
InvalidOperationException Visual Basic produce una excepción. En el ejemplo siguiente se muestra
numberOfChildren la forma recomendada de leer la variable de los ejemplos anteriores.

If numberOfChildren.HasValue Then
MsgBox("There are " & CStr(numberOfChildren) & " children.")
Else
MsgBox("It is not known how many children there are.")
End If

Comparación de tipos que aceptan valores NULL


Cuando se Boolean utilizan variables que aceptan valores True NULL False en Nothing expresiones booleanas,
el resultado puede ser , , o . La siguiente es la And Or tabla de la verdad para y . Dado b1 b2 que y ahora
tienen tres valores posibles, hay nueve combinaciones para evaluar.

B1 B2 B1 Y B2 B1 O B2

Nothing Nothing Nothing Nothing

Nothing True Nothing True

Nothing False False Nothing

True Nothing Nothing True

True True True True

True False False True


B1 B2 B1 Y B2 B1 O B2

False Nothing False Nothing

False True False True

False False False False

Cuando el valor de una Nothing variable o true expresión false booleana es , no es ni . Considere el ejemplo
siguiente.

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

En este b1 And b2 ejemplo, Nothing se evalúa como . Como resultado, Else la cláusula se If ejecuta en cada
instrucción y la salida es la siguiente:
Expression is not true

Expression is not false

NOTE
AndAlso y OrElse , que utilizan la evaluación de cortocircuito, deben evaluar Nothing sus segundos operandos cuando
el primero se evalúa como .

Propagación
Si uno o ambos de los operandos de una operación aritmética, de comparación, de desplazamiento o de tipo es
un tipo de valor que acepta valores NULL, el resultado de la operación también es un tipo de valor que acepta
valores NULL. Si ambos operandos tienen Nothing valores que no lo son, la operación se realiza en los valores
subyacentes de los operandos, como si ninguno de los dos fuera un tipo de valor que acepta valores NULL. En el
ejemplo siguiente, las variables compare1 y sum1 se escriben implícitamente. Si descansa el puntero del mouse
sobre ellos, verá que el compilador deduce tipos de valor que aceptan valores NULL para ambos.
' 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}")

Si uno o ambos operandos Nothing tienen un Nothing valor de , el resultado será .

' 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>")}")

Uso de tipos que aceptan valores NULL con datos


Una base de datos es uno de los lugares más importantes para usar tipos de valor que aceptan valores NULL. No
todos los objetos de base de datos admiten actualmente tipos de valor que aceptan valores NULL, pero sí los
adaptadores de tabla generados por el diseñador. Consulte Compatibilidad con TableAdapter para tipos que
aceptan valores NULL.

Vea también
InvalidOperationException
HasValue
Tipos de datos
Tipos de valor y tipos de referencia
Solución de problemas de los tipos de datos
Rellenar conjuntos de datos mediante TableAdapters
Operador If
Inferencia de tipo de variable local
Operador Is
Operador IsNot
Tipos de valor que aceptan valores NULL (C-)
Tipos de valor y tipos de referencia
23/10/2019 • 5 minutes to read • Edit Online

Hay dos tipos de tipos en Visual Basic: tipos de referencia y tipos de valor. Las variables de tipos de referencia
almacenan referencias en sus datos (objetos), mientras que las variables de tipos de valor contienen
directamente los datos. Con los tipos de referencia, dos variables pueden hacer referencia al mismo objeto y,
por lo tanto, las operaciones en una variable pueden afectar al objeto al que hace referencia la otra variable.
Con los tipos de valor, cada variable tiene su propia copia de los datos y no es posible que las operaciones en
una variable afecten a la otra (excepto en el caso del modificador ByRef en parámetros).

Tipos de valor
Un tipo de datos es un tipo de valor si contiene los datos dentro de su propia asignación de memoria. Entre los
tipos de valor se incluyen los siguientes:
Todos los tipos de datos numéricos
Boolean , Char y Date

Todas las estructuras, incluso si sus miembros son tipos de referencia


Las enumeraciones, ya que su tipo subyacente siempre es SByte , Short , Integer , Long , Byte ,
UShort , UInteger o ULong

Cada estructura es un tipo de valor, incluso si contiene miembros de tipo de referencia. Por esta razón, las
estructuras .NET Framework implementan tipos de valor como Char y Integer .
Puede declarar un tipo de valor mediante la palabra clave Reserved, por ejemplo, Decimal . También puede usar
la palabra clave New para inicializar un tipo de valor. Esto es especialmente útil si el tipo tiene un constructor
que toma parámetros. Un ejemplo de esto es el constructor de Decimal(Int32, Int32, Int32, Boolean, Byte), que
crea un nuevo valor de Decimal a partir de los elementos proporcionados.

Tipos de referencia
Un tipo de referencia almacena una referencia a sus datos. Entre los tipos de referencia se incluyen los
siguientes:
String

Todas las matrices, incluso si sus elementos son tipos de valor


Tipos de clase, como Form
Delegados
Una clase es un tipo de referencia. Tenga en cuenta que cada matriz es un tipo de referencia, incluso si sus
miembros son tipos de valor.
Puesto que cada tipo de referencia representa una clase de .NET Framework subyacente, debe usar la palabra
clave New Operator al inicializarla. La siguiente instrucción Inicializa una matriz.

Dim totals() As Single = New Single(8) {}


Elementos que no son tipos
Los elementos de programación siguientes no se califican como tipos, ya que no se puede especificar ninguno
de ellos como un tipo de datos para un elemento declarado:
Espacios de nombres
Módulos
Events
Propiedades y procedimientos
Variables, constantes y campos

Trabajar con el tipo de datos Object


Puede asignar un tipo de referencia o un tipo de valor a una variable del tipo de datos Object . Una variable
Object siempre contiene una referencia a los datos, nunca los propios datos. Sin embargo, si asigna un tipo de
valor a una variable Object , se comporta como si tuviera sus propios datos. Para obtener más información, vea
Object Data Type.
Puede averiguar si una variable Object está actuando como un tipo de referencia o un tipo de valor pasándola
al método IsReference de la clase Information del espacio de nombres Microsoft.VisualBasic.
Information.IsReference devuelve True si el contenido de la variable Object representa un tipo de referencia.

Vea también
Tipos de valor que aceptan valores NULL
Conversiones de tipos en Visual Basic
Structure (instrucción)
Uso eficiente de tipos de datos
Tipo de objeto de datos
Tipos de datos
Conversiones de tipos en Visual Basic
27/11/2019 • 2 minutes to read • Edit Online

El proceso de cambiar un valor de un tipo de datos a otro se denomina conversión. Las conversiones son de
ampliación o de restricción, en función de las capacidades de datos de los tipos implicados. También son
implícitas o explícitas, dependiendo de la sintaxis del código fuente.

Esta sección
Conversiones de ampliación y de restricción
Explica las conversiones clasificadas por si el tipo de destino puede contener los datos.
Conversiones implícitas y explícitas
Describe las conversiones clasificadas por si Visual Basic las realiza automáticamente.
Conversiones entre cadenas y otros tipos
Muestra la conversión entre cadenas y valores numéricos, de Boolean o de fecha y hora.
Cómo: convertir un objeto en otro tipo en Visual Basic
Muestra cómo convertir una variable de Object en cualquier otro tipo de datos.
Conversiones de matriz
Le guía por el proceso de conversión entre matrices de tipos de datos diferentes.

Secciones relacionadas
Tipos de datos
Presenta los tipos de datos Visual Basic y describe cómo usarlos.
Tipos de datos
Enumera los tipos de datos básicos proporcionados por Visual Basic.
Solución de problemas de tipos de datos
Describe algunos problemas comunes que pueden surgir al trabajar con tipos de datos.
Conversiones de ampliación y de restricción (Visual
Basic)
27/11/2019 • 9 minutes to read • Edit Online

Una consideración importante con la conversión de tipos es si el resultado de la conversión está dentro del
intervalo del tipo de datos de destino.
Una conversión de ampliación cambia un valor a un tipo de datos que puede permitir cualquier valor posible de
los datos originales. Las conversiones de ampliación conservan el valor de origen, pero pueden cambiar su
representación. Esto sucede si se convierte de un tipo entero a Decimal , o de Char a String .
Una conversión de restricción cambia un valor a un tipo de datos que no pueda mantener algunos de los
valores posibles. Por ejemplo, un valor fraccionario se redondea cuando se convierte en un tipo entero y un tipo
numérico que se convierte en Boolean se reduce a True o False .

Conversiones de ampliación
En la tabla siguiente se muestran las conversiones de ampliación estándar.

T IP O DE DATO S SE A M P L ÍA A LO S T IP O S DE DATO S 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

Integer 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

Double Double

Cualquier tipo enumerado (enumeración) Su tipo entero subyacente y cualquier tipo al que se amplíe
el tipo subyacente.
T IP O DE DATO S SE A M P L ÍA A LO S T IP O S DE DATO S

Char Char , String

Matriz Char Char matriz, String

Cualquier tipo Objeto

Cualquier tipo derivado Cualquier tipo base del que se derive 3 .

Cualquier tipo Cualquier interfaz que implemente.

Nothing Cualquier tipo de datos o tipo de objeto.

1 por definición, cada tipo de datos se amplía a sí mismo.


2 las conversiones de Integer , UInteger , Long , ULong o Decimal a Single o Double pueden provocar la
pérdida de precisión, pero nunca en pérdida de magnitud. En este sentido, no incurre en la pérdida de
información.
3 podría parecer sorprendente que una conversión de un tipo derivado a uno de sus tipos base sea de
ampliación. La justificación es que el tipo derivado contiene todos los miembros del tipo base, por lo que se
califica como una instancia del tipo base. En la dirección opuesta, el tipo base no contiene ningún miembro
nuevo definido por el tipo derivado.
Las conversiones de ampliación siempre se realizan correctamente en tiempo de ejecución y nunca provocan
pérdida de datos. Siempre se pueden realizar de forma implícita, ya sea que la instrucción Option Strict
establezca el modificador de comprobación de tipos en On o en Off .

Conversiones de restricción
Entre las conversiones de restricción estándar se incluyen las siguientes:
Las direcciones inversas de las conversiones de ampliación en la tabla anterior (excepto en que cada tipo
se amplía a sí mismo)
Conversiones en cualquier dirección entre Boolean y cualquier tipo numérico
Conversiones de cualquier tipo numérico a cualquier tipo enumerado ( Enum )
Conversiones en cualquier dirección entre la cadena y cualquier tipo numérico, Boolean o fecha
Conversiones de un tipo de datos o de un tipo de objeto a un tipo derivado de él
Las conversiones de restricción no siempre se realizan correctamente en tiempo de ejecución y pueden producir
un error o provocar la pérdida de datos. Se produce un error si el tipo de datos de destino no puede recibir el
valor que se está convirtiendo. Por ejemplo, una conversión numérica puede producir un desbordamiento. El
compilador no permite realizar conversiones de restricción implícitamente a menos que la instrucción Option
Strict establezca el modificador de comprobación de tipos en Off .

NOTE
Se suprime el error de conversión de restricción para las conversiones de los elementos de una colección de
For Each…Next a la variable de control de bucle. Para obtener más información y ejemplos, vea la sección acerca de las
conversiones de restricción en for each... Instrucción siguiente.
Cuándo usar las conversiones de restricción
Se usa una conversión de restricción cuando se sabe que el valor de origen se puede convertir al tipo de datos
de destino sin errores o pérdidas de datos. Por ejemplo, si tiene una String que sabe que contiene "true" o
"false", puede utilizar la palabra clave CBool para convertirla en Boolean .

Excepciones durante la conversión


Dado que las conversiones de ampliación siempre se realizan correctamente, no inician excepciones. Cuando se
producen errores en las conversiones de restricción, normalmente se producen las excepciones siguientes:
InvalidCastException: Si no se define ninguna conversión entre los dos tipos
OverflowException: (solo tipos enteros) si el valor convertido es demasiado grande para el tipo de
destino
Si una clase o estructura define una función ctype para actuar como un operador de conversión hacia o desde
esa clase o estructura, ese CType puede producir cualquier excepción que considere adecuada. Además, ese
CType podría llamar a Visual Basic funciones o métodos de .NET Framework, que a su vez podrían producir una
variedad de excepciones.

Cambios durante las conversiones de tipos de referencia


Una conversión de un tipo de referencia solo copia el puntero en el valor. El propio valor no se copia ni se
modifica de ninguna manera. Lo único que puede cambiar es el tipo de datos de la variable que contiene el
puntero. En el ejemplo siguiente, el tipo de datos se convierte de la clase derivada a su clase base, pero el objeto
al que apuntan ambas variables ahora no cambia.

' 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

Vea también
Tipos de datos
Conversiones de tipos en Visual Basic
Conversiones implícitas y explícitas
Conversiones entre cadenas y otros tipos
Cómo: convertir un objeto en otro tipo en Visual Basic
Conversiones de matriz
Tipos de datos
Funciones de conversión de tipos
Conversiones implícita y explícita (Visual Basic)
27/11/2019 • 9 minutes to read • Edit Online

Una conversión implícita no requiere ninguna sintaxis especial en el código fuente. En el ejemplo siguiente,
Visual Basic convierte implícitamente el valor de k en un valor de punto flotante de precisión sencilla antes de
asignarlo a q .

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

Una conversión explícita utiliza una palabra clave de conversión de tipos. Visual Basic proporciona varias
palabras clave, que convierten una expresión entre paréntesis en el tipo de datos deseado. Estas palabras clave
actúan como funciones, pero el compilador genera el código insertado, por lo que la ejecución es ligeramente
más rápida que con una llamada de función.
En la siguiente extensión del ejemplo anterior, la palabra clave CInt convierte de nuevo el valor de q en un
entero antes de asignarlo a k .

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

Palabras clave para conversiones


En la tabla siguiente se muestran las palabras clave de conversión disponibles.

PA L A B RA C L AVE DE C O N VERSIÓ N DE C O N VIERT E UN A EXP RESIÓ N A L T IP O T IP O S DE DATO S P ERM IT IDO S DE L A


T IP O S DE DATO S EXP RESIÓ N Q UE SE VA A C O N VERT IR

CBool Boolean (tipo de datos) Cualquier tipo numérico (incluido


Byte , SByte y tipos enumerados),
String``Object

CByte Byte (tipo de datos) Cualquier tipo numérico (incluido


SByte y tipos enumerados),
Boolean , String``Object

CChar Char (tipo de datos) String , Object

CDate Date (tipo de datos) String , Object

CDbl Double (tipos de datos) Cualquier tipo numérico (incluido


Byte , SByte y tipos enumerados),
Boolean , String``Object
PA L A B RA C L AVE DE C O N VERSIÓ N DE C O N VIERT E UN A EXP RESIÓ N A L T IP O T IP O S DE DATO S P ERM IT IDO S DE L A
T IP O S DE DATO S EXP RESIÓ N Q UE SE VA A C O N VERT IR

CDec Decimal (tipo de datos) Cualquier tipo numérico (incluido


Byte , SByte y tipos enumerados),
Boolean , String``Object

CInt Integer (tipo de datos) Cualquier tipo numérico (incluido


Byte , SByte y tipos enumerados),
Boolean , String``Object

CLng Long (tipo de datos) Cualquier tipo numérico (incluido


Byte , SByte y tipos enumerados),
Boolean , String``Object

CObj Object Data Type Cualquier tipo

CSByte SByte (tipo de datos) Cualquier tipo numérico (incluido


Byte y tipos enumerados), Boolean ,
String``Object

CShort Short (tipo de datos) Cualquier tipo numérico (incluido


Byte , SByte y tipos enumerados),
Boolean , String``Object

CSng Single (tipo de datos) Cualquier tipo numérico (incluido


Byte , SByte y tipos enumerados),
Boolean , String``Object

CStr String (tipo de datos) Cualquier tipo numérico (incluido


Byte , SByte y tipos enumerados),
Boolean , Char , Char array,
Date``Object

CType Tipo especificado después de la coma ( Al convertir a un tipo de datos


, ) elemental (incluida una matriz de un
tipo elemental), los mismos tipos que
se permiten para la palabra clave de
conversión correspondiente

Al convertir a un tipo de datos


compuesto, las interfaces que
implementa y las clases de las que
hereda

Al convertir a una clase o estructura en


la que se ha sobrecargado CType , esa
clase o estructura

CUInt UInteger (tipo de datos) Cualquier tipo numérico (incluido


Byte , SByte y tipos enumerados),
Boolean , String``Object

CULng ULong (tipo de datos) Cualquier tipo numérico (incluido


Byte , SByte y tipos enumerados),
Boolean , String``Object
PA L A B RA C L AVE DE C O N VERSIÓ N DE C O N VIERT E UN A EXP RESIÓ N A L T IP O T IP O S DE DATO S P ERM IT IDO S DE L A
T IP O S DE DATO S EXP RESIÓ N Q UE SE VA A C O N VERT IR

CUShort UShort (tipo de datos) Cualquier tipo numérico (incluido


Byte , SByte y tipos enumerados),
Boolean , String``Object

La función CType
La función ctype funciona con dos argumentos. El primero es la expresión que se va a convertir y el segundo es
el tipo de datos de destino o la clase de objeto. Tenga en cuenta que el primer argumento debe ser una
expresión, no un tipo.
CType es una función insertada, lo que significa que el código compilado realiza la conversión, a menudo sin
generar una llamada de función. Esto mejora el rendimiento.
Para obtener una comparación de CType con las otras palabras clave de conversión de tipos, vea el operador
DirectCast y el operador TryCast.
Tipos elementales
El siguiente ejemplo muestra el uso de CType .

k = CType(q, Integer)
' The following statement coerces w to the specific object class Label.
f = CType(w, Label)

Tipos compuestos
Puede usar CType para convertir valores en tipos de datos compuestos y en tipos elementales. También se
puede utilizar para forzar una clase de objeto al tipo de una de sus interfaces, como en el ejemplo siguiente.

' 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 también puede convertir tipos de datos de matriz, como en el ejemplo siguiente.

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 obtener más información y un ejemplo, vea conversiones de matrices.


Tipos que definen CType
Puede definir CType en una clase o estructura que haya definido. Esto le permite convertir valores a y desde el
tipo de la clase o estructura. Para obtener más información y un ejemplo, vea Cómo: definir un operador de
conversión.
NOTE
Los valores utilizados con una palabra clave de conversión deben ser válidos para el tipo de datos de destino o se produce
un error. Por ejemplo, si intenta convertir un Long en un Integer , el valor de la Long debe estar dentro del intervalo
válido para el tipo de datos Integer .

Cau t i on

Si se especifica CType para convertir de un tipo de clase a otro, se produce un error en tiempo de ejecución si el
tipo de origen no se deriva del tipo de destino. Este tipo de error produce una excepción InvalidCastException.
Sin embargo, si uno de los tipos es una estructura o clase definida, y si ha definido CType en esa estructura o
clase, una conversión puede realizarse correctamente si cumple los requisitos de la CType . Vea Cómo: definir un
operador de conversión.
La realización de una conversión explícita también se conoce como convertir una expresión en un tipo de datos
o clase de objeto determinado.

Vea también
Conversiones de tipos en Visual Basic
Conversiones entre cadenas y otros tipos
Cómo: convertir un objeto en otro tipo en Visual Basic
Estructuras
Tipos de datos
Funciones de conversión de tipos
Solución de problemas de tipos de datos
Conversiones entre cadenas y otros tipos (Visual
Basic)
27/11/2019 • 4 minutes to read • Edit Online

Puede convertir un valor numérico, de Boolean o de fecha y hora en un String . También puede convertir en la
dirección inversa, de un valor de cadena a numérico, Boolean o Date , siempre que el contenido de la cadena
pueda interpretarse como un valor válido del tipo de datos de destino. Si no es así, se produce un error en tiempo
de ejecución.
Las conversiones de todas estas asignaciones, en cualquier dirección, son conversiones de restricción. Debe utilizar
las palabras clave de conversión de tipos ( CBool , CByte , CDate , CDbl , CDec , CInt , CLng , CSByte , CShort ,
CSng , CStr , CUInt , CULng , CUShort y CType ). Las funciones Format y Val proporcionan un control adicional
sobre las conversiones entre cadenas y números.
Si ha definido una clase o estructura, puede definir operadores de conversión de tipos entre String y el tipo de la
clase o estructura. Para obtener más información, consulta How to: Define a Conversion Operator.

Conversión de números en cadenas


Puede usar la función Format para convertir un número en una cadena con formato, que puede incluir no solo los
dígitos adecuados, sino también símbolos de formato como un signo de moneda (por ejemplo, $ ), separadores
de miles o símbolos de agrupación de dígitos (como , ) y un separador decimal (como . ). Format usa
automáticamente los símbolos apropiados de acuerdo con la configuración regional especificada en el Panel de
control de Windows.
Tenga en cuenta que el operador de concatenación ( & ) puede convertir un número en una cadena
implícitamente, como se muestra en el ejemplo siguiente.

' The following statement converts count to a String value.


Str = "The total count is " & count

Conversión de cadenas en números


Puede utilizar la función Val para convertir explícitamente los dígitos de una cadena en un número. Val lee la
cadena hasta que encuentra un carácter que no sea un dígito, un espacio, una tabulación, un salto de línea o un
punto. Las secuencias "& O" y "& H" modifican la base del sistema numérico y finalizan el análisis. Hasta que deja
de leer, Val convierte todos los caracteres adecuados en un valor numérico. Por ejemplo, la siguiente instrucción
devuelve el valor 141.825 .
Val(" 14 1.825 miles")

Cuando Visual Basic convierte una cadena en un valor numérico, usa la configuración de Opciones regionales
especificada en el panel de control de Windows para interpretar el separador de miles, el separador decimal y el
símbolo de moneda. Esto significa que una conversión podría realizarse con una configuración, pero no con otra.
Por ejemplo, "$14.20" es aceptable en la configuración regional de inglés (Estados Unidos), pero no en la
configuración regional en francés.

Vea también
Conversiones de tipos en Visual Basic
Conversiones de ampliación y de restricción
Conversiones implícitas y explícitas
Cómo: convertir un objeto en otro tipo en Visual Basic
Conversiones de matriz
Tipos de datos
Funciones de conversión de tipos
Desarrollo de aplicaciones localizadas y globalizadas
Cómo: Convertir un objeto en otro tipo en Visual
Basic
08/01/2020 • 2 minutes to read • Edit Online

Para convertir una variable de Object en otro tipo de datos, use una palabra clave de conversión como CType
function.

Ejemplo
En el ejemplo siguiente se convierte una variable de Object en un Integer y un String .

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

Si sabe que el contenido de una variable Object es de un tipo de datos determinado, es mejor convertir la
variable a ese tipo de datos. Si continúa usando la variable Object , incurrirá en la conversión boxing y la
conversión unboxing (para un tipo de valor) o en el enlace en tiempo de ejecución (para un tipo de referencia).
Estas operaciones tienen un tiempo de ejecución adicional y hacen que el rendimiento sea más lento.

Compilar el código
Para este ejemplo se necesita:
Una referencia al espacio de nombres System.

Vea también
Object
Conversiones de tipos en Visual Basic
Conversiones de ampliación y de restricción
Conversiones implícitas y explícitas
Conversiones entre cadenas y otros tipos
Conversiones de matriz
Estructuras
Tipos de datos
Funciones de conversión de tipos
Conversión de matrices (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Puede convertir un tipo de matriz en un tipo de matriz diferente siempre que se cumplan las siguientes
condiciones:
Rango igual. Los rangos de las dos matrices deben ser iguales, es decir, deben tener el mismo número de
dimensiones. Sin embargo, no es necesario que las longitudes de las dimensiones respectivas sean las
mismas.
Tipo de datos de elemento. Los tipos de datos de los elementos de ambas matrices deben ser tipos de
referencia. No se puede convertir una matriz de Integer en una matriz de Long , o incluso en una matriz
de Object , ya que se implica al menos un tipo de valor. Para obtener más información, consulta Value
Types and Reference Types.
Conver tibility. Una conversión, ya sea de ampliación o de restricción, debe ser posible entre los tipos de
elemento de las dos matrices. Un ejemplo en el que se produce un error en este requisito es un intento de
conversión entre una matriz de String y una matriz de una clase derivada de System.Attribute. Estos dos
tipos no tienen nada en común y no existe ninguna conversión de ningún tipo entre ellos.
Una conversión de un tipo de matriz a otro es la ampliación o la restricción, dependiendo de si la conversión de
los elementos respectivos es de ampliación o reducción. Para obtener más información, consulta Widening and
Narrowing Conversions.

Conversión a una matriz de objetos


Cuando se declara una matriz de Object sin inicializarla, su tipo de elemento se Object siempre y cuando
permanezca sin inicializar. Cuando se establece en una matriz de una clase específica, toma el tipo de esa clase.
Sin embargo, su tipo subyacente sigue siendo Object y, posteriormente, puede establecerlo en otra matriz de una
clase no relacionada. Dado que todas las clases se derivan de Object , puede cambiar el tipo de elemento de la
matriz de cualquier clase a cualquier otra clase.
En el ejemplo siguiente, no existe ninguna conversión entre tipos student y String , pero ambos derivan de
Object , por lo que todas las asignaciones son válidas.

' 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 subyacente de una matriz


Si declara originalmente una matriz con una clase concreta, su tipo de elemento subyacente es esa clase. Si
posteriormente lo establece en una matriz de otra clase, debe haber una conversión entre las dos clases.
En el ejemplo siguiente, students es una matriz de student . Dado que no existe ninguna conversión entre
String y student , se produce un error en la última instrucción.
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

Vea también
Tipos de datos
Conversiones de tipos en Visual Basic
Conversiones implícitas y explícitas
Conversiones entre cadenas y otros tipos
Cómo: convertir un objeto en otro tipo en Visual Basic
Tipos de datos
Funciones de conversión de tipos
Matrices
Estructuras (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Una estructura es una generalización del tipo definido por el usuario (UDT) que admiten las versiones
anteriores de Visual Basic. Además de los campos, las estructuras pueden exponer propiedades, métodos y
eventos. Una estructura puede implementar una o más interfaces, y puede declarar niveles de acceso
individuales para cada campo.
Puede combinar elementos de datos de tipos diferentes para crear una estructura. Una estructura asocia uno o
más elementos entre sí y con la propia estructura. Cuando se declara una estructura, se convierte en un tipo de
datos compuestoy se pueden declarar variables de ese tipo.
Las estructuras son útiles cuando se desea que una sola variable contenga varios datos relacionados. Por
ejemplo, puede que desee conservar el nombre de un empleado, la extensión de teléfono y el salario juntos.
Puede usar varias variables para esta información, o puede definir una estructura y utilizarla para una única
variable de empleado. La ventaja de la estructura se hace patente cuando tiene muchos empleados y, por tanto,
muchas instancias de la variable.

Esta sección
Declarar una estructura
Muestra cómo declarar una estructura y sus elementos.
Variables de estructura
Describe la asignación de una estructura a una variable y el acceso a sus elementos.
Estructuras y otros elementos de programación
Resume cómo interactúan las estructuras con matrices, objetos, procedimientos y entre sí.
Estructuras y clases
Describe las similitudes y diferencias entre estructuras y clases.

Secciones relacionadas
Tipos de datos
Presenta los tipos de datos Visual Basic y describe cómo usarlos.
Tipos de datos
Enumera los tipos de datos básicos proporcionados por Visual Basic.
Cómo: Declarar una estructura (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Una declaración de estructura se inicia con la instrucción Structurey finaliza con la instrucción End Structure .
Entre estas dos instrucciones debe declarar al menos un elemento. Los elementos pueden ser de cualquier tipo de
datos, pero al menos uno debe ser una variable no compartida o un evento no personalizado no compartido.
No se puede inicializar ninguno de los elementos de la estructura en la declaración de la estructura. Cuando se
declara una variable para que sea de un tipo de estructura, se asignan valores a los elementos accediendo a ellas a
través de la variable.
Para obtener una explicación de las diferencias entre las estructuras y las clases, vea estructuras y clases.
Para fines de demostración, considere una situación en la que desea realizar un seguimiento del nombre de un
empleado, la extensión de teléfono y el salario. Una estructura le permite hacer esto en una sola variable.
Para declarar una estructura
1. Cree las instrucciones de inicio y finalización de la estructura.
Puede especificar el nivel de acceso de una estructura mediante la palabra clave Public, Protected, Friendo
Private , o puede dejar que se Public de forma predeterminada.

Private Structure employee


End Structure

2. Agregue elementos al cuerpo de la estructura.


Una estructura debe tener al menos un elemento. Debe declarar cada elemento y especificar un nivel de
acceso para él. Si usa la instrucción Dim sin palabras clave, el valor predeterminado de accesibilidad es
Public .

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

El campo salary del ejemplo anterior es Private , lo que significa que es inaccesible fuera de la estructura,
incluso desde la clase contenedora. Sin embargo, el procedimiento giveRaise es Public , por lo que se
puede llamar desde fuera de la estructura. Del mismo modo, puede generar el evento salaryReviewTime
desde fuera de la estructura.
Además de las variables, los procedimientos de Sub y los eventos, también puede definir constantes,
procedimientos de Function y propiedades en una estructura. Puede designar como máximo una
propiedad como la propiedad predeterminada, siempre que tome al menos un argumento. Puede controlar
un evento con un procedimiento compartido Sub . Para obtener más información, vea Cómo: declarar y
llamar a una propiedad predeterminada en Visual Basic.
Vea también
Tipos de datos
Tipos de datos básicos
Tipos de datos compuestos
Value Types and Reference Types
Estructuras
Solución de problemas de tipos de datos
Variables de estructura
Estructuras y otros elementos de programación
Estructuras y clases
Tipo de datos definido por el usuario
Variables de estructura (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Una vez creada una estructura, puede declarar variables de nivel de procedimiento y de nivel de módulo como ese
tipo. Por ejemplo, puede crear una estructura que registre información sobre un sistema informático. En el
siguiente ejemplo se muestra cómo hacerlo.

Public Structure systemInfo


Public cPU As String
Public memory As Long
Public purchaseDate As Date
End Structure

Ahora puede declarar variables de ese tipo. La siguiente declaración ilustra esto.

Dim mySystem, yourSystem As systemInfo

NOTE
En las clases y los módulos, las estructuras declaradas con la instrucción Dim tienen como valor predeterminado el acceso
público. Si desea que una estructura sea privada, asegúrese de que la declara mediante la palabra clave Private .

Acceso a los valores de la estructura


Para asignar y recuperar valores de los elementos de una variable de estructura, se usa la misma sintaxis que se
usa para establecer y obtener propiedades en un objeto. Coloque el operador de acceso a miembros ( . ) entre el
nombre de la variable de estructura y el nombre del elemento. En el ejemplo siguiente se obtiene acceso a los
elementos de las variables declaradas previamente como tipo systemInfo .

mySystem.cPU = "486"
Dim tooOld As Boolean
If yourSystem.purchaseDate < #1/1/1992# Then tooOld = True

Asignar variables de estructura


También puede asignar una variable a otra si ambos son del mismo tipo de estructura. Esto copia todos los
elementos de una estructura en los elementos correspondientes de la otra. La siguiente declaración ilustra esto.

yourSystem = mySystem

Si un elemento de estructura es un tipo de referencia, como un String , Object o una matriz, se copia el puntero a
los datos. En el ejemplo anterior, si systemInfo hubiera incluido una variable de objeto, el ejemplo anterior habría
copiado el puntero de mySystem a yourSystem y un cambio en los datos del objeto a través de una estructura sería
efectivo al obtener acceso a través de la otra estructura.

Vea también
Tipos de datos
Tipos de datos básicos
Tipos de datos compuestos
Value Types and Reference Types
Estructuras
Solución de problemas de tipos de datos
Declarar una estructura
Estructuras y otros elementos de programación
Estructuras y clases
Structure (instrucción)
Estructuras y otros elementos de programación
(Visual Basic)
21/03/2020 • 4 minutes to read • Edit Online

Puede utilizar estructuras junto con matrices, objetos y procedimientos, así como entre sí. Las interacciones
utilizan la misma sintaxis que estos elementos utilizan individualmente.

NOTE
No se puede inicializar ninguno de los elementos de estructura en la declaración de estructura. Puede asignar valores solo a
elementos de una variable que se ha declarado como de un tipo de estructura.

Estructuras y matrices
Una estructura puede contener una matriz como uno o varios de sus elementos. Esto se ilustra en el siguiente
ejemplo.

Public Structure systemInfo


Public cPU As String
Public memory As Long
Public diskDrives() As String
Public purchaseDate As Date
End Structure

Tiene acceso a los valores de una matriz dentro de una estructura de la misma manera que tiene acceso a una
propiedad en un objeto. Esto se ilustra en el siguiente ejemplo.

Dim mySystem As systemInfo


ReDim mySystem.diskDrives(3)
mySystem.diskDrives(0) = "1.44 MB"

También puede declarar una matriz de estructuras. Esto se ilustra en el siguiente ejemplo.

Dim allSystems(100) As systemInfo

Siga las mismas reglas para acceder a los componentes de esta arquitectura de datos. Esto se ilustra en el
siguiente ejemplo.

ReDim allSystems(5).diskDrives(3)
allSystems(5).CPU = "386SX"
allSystems(5).diskDrives(2) = "100M SCSI"

Estructuras y Objetos
Una estructura puede contener un objeto como uno o varios de sus elementos. Esto se ilustra en el siguiente
ejemplo.
Protected Structure userInput
Public userName As String
Public inputForm As System.Windows.Forms.Form
Public userFileNumber As Integer
End Structure

Debe utilizar una clase de objeto específica Object en una declaración de este tipo, en lugar de .

Estructuras y procedimientos
Puede pasar una estructura como argumento de procedimiento. Esto se ilustra en el siguiente ejemplo.

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

En el ejemplo anterior se pasa la estructura por referencia, lo que permite que el procedimiento modifique sus
elementos para que los cambios surtan efecto en el código de llamada. Si desea proteger una estructura contra
dicha modificación, pásela por valor.
También puede devolver una Function estructura de un procedimiento. Esto se ilustra en el siguiente ejemplo.

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

Estructuras dentro de las estructuras


Las estructuras pueden contener otras estructuras. Esto se ilustra en el siguiente ejemplo.

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

Dim allSystems(100) As systemInfo


ReDim allSystems(1).diskDrives(3)
allSystems(1).diskDrives(0).type = "Floppy"

También puede utilizar esta técnica para encapsular una estructura definida en un módulo dentro de una
estructura definida en un módulo diferente.
Las estructuras pueden contener otras estructuras a una profundidad arbitraria.

Consulte también
Tipos de datos
Tipos de datos básicos
Tipos de datos compuestos
Tipos de valores y tipos de referencias
Estructuras
Solución de problemas de tipos de datos
Cómo: Declarar una estructura
Variables de estructura
Estructuras y clases
Structure (Instrucción)
Estructuras y clases (Visual Basic)
27/11/2019 • 9 minutes to read • Edit Online

Visual Basic unifica la sintaxis de las estructuras y las clases, con el resultado de que ambas entidades admiten la
mayoría de las mismas características. Sin embargo, también hay diferencias importantes entre estructuras y
clases.
Las clases tienen la ventaja de ser tipos de referencia: pasar una referencia es más eficaz que pasar una variable
de estructura con todos sus datos. Por otro lado, las estructuras no requieren la asignación de memoria en el
montón global.
Dado que no se puede heredar de una estructura, las estructuras deben usarse solo para los objetos que no es
necesario extender. Use estructuras cuando el objeto que desea crear tenga un tamaño de instancia pequeño y
tenga en cuenta las características de rendimiento de clases frente a estructuras.

Similitudes
Las estructuras y clases son similares en los siguientes aspectos:
Ambos son tipos de contenedor , lo que significa que contienen otros tipos como miembros.
Ambos tienen miembros, que pueden incluir constructores, métodos, propiedades, campos, constantes,
enumeraciones, eventos y controladores de eventos. Sin embargo, no confunda estos miembros con los
elementos declarados de una estructura.
Los miembros de ambos pueden tener niveles de acceso individualizados. Por ejemplo, un miembro se
puede declarar Public y otro Private .
Ambos pueden implementar interfaces.
Ambos pueden tener constructores compartidos, con o sin parámetros.
Ambos pueden exponer una propiedad predeterminada, siempre que la propiedad tome al menos un
parámetro.
Ambos pueden declarar y generar eventos y ambos pueden declarar delegados.

Diferencias
Las estructuras y las clases difieren en los siguientes detalles:
Las estructuras son tipos de valor; las clases son tipos de referencia. Una variable de un tipo de estructura
contiene los datos de la estructura, en lugar de contener una referencia a los datos como un tipo de clase.
Las estructuras usan la asignación de la pila; las clases usan la asignación del montón.
De forma predeterminada, todos los elementos de estructura se Public . las variables y constantes de
clase son Private de forma predeterminada, mientras que otros miembros de clase se Public de forma
predeterminada. Este comportamiento para los miembros de clase proporciona compatibilidad con el
sistema Visual Basic de los valores predeterminados 6,0.
Una estructura debe tener al menos una variable no compartida o un elemento de evento no compartido
no personalizado; una clase puede estar completamente vacía.
Los elementos de estructura no se pueden declarar como Protected ; los miembros de clase pueden.
Un procedimiento de estructura solo puede controlar eventos si es un procedimiento compartido de Sub
y solo por medio de la instrucción AddHandler; cualquier procedimiento de clase puede controlar eventos
mediante la palabra clave Handles o la instrucción AddHandler . Para obtener más información, consulta
Eventos.
Las declaraciones de variables de estructura no pueden especificar inicializadores ni tamaños iniciales para
matrices; las declaraciones de variables de clase pueden.
Las estructuras heredan implícitamente de la clase System.ValueType y no pueden heredar de ningún otro
tipo; las clases pueden heredar de cualquier clase o de clases distintas de System.ValueType.
Las estructuras no se pueden heredar; las clases son.
Las estructuras nunca finalizan, por lo que el Common Language Runtime (CLR) nunca llama al método
Finalize en ninguna estructura; el recolector de elementos no utilizados (GC), que llama a Finalize en una
clase, finalizan las clases cuando detecta que no quedan referencias activas.
Una estructura no requiere un constructor; una clase.
Las estructuras pueden tener constructores no compartidos solo si toman parámetros; las clases pueden
tenerlos con o sin parámetros.
Cada estructura tiene un constructor público implícito sin parámetros. Este constructor inicializa todos los
elementos de datos de la estructura en sus valores predeterminados. Este comportamiento no se puede volver a
definir.

Instancias y variables
Dado que las estructuras son tipos de valor, cada variable de estructura se enlaza de forma permanente a una
instancia de la estructura individual. Pero las clases son tipos de referencia y una variable de objeto puede hacer
referencia a varias instancias de clase en momentos diferentes. Esta distinción afecta al uso de estructuras y
clases de las siguientes maneras:
Inicial. Una variable de estructura incluye implícitamente una inicialización de los elementos mediante el
constructor sin parámetros de la estructura. Por lo tanto, Dim s As struct1 es equivalente a
Dim s As struct1 = New struct1() .

Asignación de variables. Cuando se asigna una variable de estructura a otra, o se pasa una instancia de
la estructura a un argumento de procedimiento, los valores actuales de todos los elementos variables se
copian en la nueva estructura. Al asignar una variable de objeto a otra, o pasar una variable de objeto a un
procedimiento, solo se copia el puntero de referencia.
No asignar nada. Puede asignar el valor Nothing a una variable de estructura, pero la instancia continúa
asociada a la variable. Todavía puede llamar a sus métodos y obtener acceso a sus elementos de datos,
aunque la asignación reinicializa los elementos de variable.
Por el contrario, si se establece una variable de objeto en Nothing , se desasocia de cualquier instancia de
clase y no se puede tener acceso a los miembros a través de la variable hasta que se le asigne otra
instancia.
Varias instancias. Una variable de objeto puede tener asignadas instancias de clase diferentes en
momentos diferentes, y varias variables de objeto pueden hacer referencia a la misma instancia de clase al
mismo tiempo. Los cambios que realice en los valores de los miembros de clase afectan a esos miembros
cuando se obtiene acceso a ellos a través de otra variable que apunta a la misma instancia.
Los elementos de la estructura, sin embargo, están aislados dentro de su propia instancia. Los cambios en
sus valores no se reflejan en otras variables de estructura, incluso en otras instancias de la misma
declaración de Structure .
Determinar. Las pruebas de igualdad de dos estructuras deben realizarse con una prueba elemento a
elemento. Se pueden comparar dos variables de objeto mediante el método Equals. Equals indica si las
dos variables apuntan a la misma instancia.

Vea también
Tipos de datos
Tipos de datos compuestos
Value Types and Reference Types
Estructuras
Solución de problemas de tipos de datos
Estructuras y otros elementos de programación
Objetos y clases
Tuplas (Visual Basic)
27/11/2019 • 21 minutes to read • Edit Online

A partir de Visual Basic 2017, el lenguaje de Visual Basic ofrece compatibilidad integrada para tuplas que facilitan
la creación de tuplas y el acceso a los elementos de las tuplas. Una tupla es una estructura de datos ligera que
tiene un número específico y una secuencia de valores. Al crear una instancia de la tupla, se define el número y el
tipo de datos de cada valor (o elemento). Por ejemplo, una tupla de 2 (o par) tiene dos elementos. El primero
podría ser un valor Boolean , mientras que el segundo es un String . Dado que las tuplas facilitan el
almacenamiento de varios valores en un único objeto, a menudo se usan como una manera ligera de devolver
varios valores de un método.

IMPORTANT
La compatibilidad de tupla requiere el tipo de ValueTuple. Si el .NET Framework 4,7 no está instalado, debe agregar el
paquete NuGet System.ValueTuple , que está disponible en la galería de NuGet. Sin este paquete, puede obtener un error
de compilación similar al siguiente: "el tipo predefinido ' ValueTuple (de,,,) ' no está definido ni importado".

Crear instancias y usar una tupla


Cree una instancia de una tupla mediante la inclusión de los paréntesis de IM de valores delimitados por comas.
Cada uno de esos valores se convierte en un campo de la tupla. Por ejemplo, el código siguiente define un triple (o
3-tupla) con un Date como su primer valor, un String como segundo y un Boolean como el tercero.

Dim holiday = (#07/04/2017#, "Independence Day", True)

De forma predeterminada, el nombre de cada campo de una tupla se compone de la cadena Item junto con la
posición basada en uno de los campos de la tupla. En esta tupla de 3, el campo de Date es Item1 , el campo de
String es Item2 y el campo Boolean es Item3 . En el ejemplo siguiente se muestran los valores de los campos
de la tupla de la que se ha creado una instancia en la línea de código anterior.

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

Los campos de una tupla Visual Basic son de lectura y escritura; después de haber creado una instancia de una
tupla, puede modificar sus valores. En el ejemplo siguiente se modifican dos de los tres campos de la tupla creada
en el ejemplo anterior y se muestra el resultado.

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

Crear instancias y usar una tupla con nombre


En lugar de usar nombres predeterminados para los campos de una tupla, puede crear instancias de una tupla con
nombre asignando sus propios nombres a los elementos de la tupla. A continuación, se puede tener acceso a los
campos de la tupla por sus nombres asignados o por sus nombres predeterminados. En el ejemplo siguiente se
crea una instancia de la misma tupla de 3 que anteriormente, salvo que asigna explícitamente un nombre al
primer campo EventDate , el segundo Name y el tercer IsHoliday . A continuación, se muestran los valores de
campo, se modifican y se muestran los valores de campo de nuevo.

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

Nombres de elementos de tupla inferidos


A partir de Visual Basic 15,3, Visual Basic puede deducir los nombres de los elementos de tupla; no es necesario
asignarlos explícitamente. Los nombres de tupla deducidos son útiles cuando se inicializa una tupla a partir de un
conjunto de variables y se desea que el nombre del elemento de tupla sea el mismo que el nombre de la variable.
En el ejemplo siguiente se crea una tupla stateInfo que contiene tres elementos con el nombre explícito, state ,
stateName y capital . Tenga en cuenta que, al asignar nombres a los elementos, la instrucción de inicialización de
tupla simplemente asigna los elementos con nombre a los valores de las variables con el mismo nombre.

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

Dado que los elementos y las variables tienen el mismo nombre, el compilador Visual Basic puede deducir los
nombres de los campos, como se muestra en el ejemplo siguiente.

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 los nombres de elementos de tupla inferidos, debe definir la versión del compilador Visual Basic que
se va a usar en el archivo de proyecto Visual Basic (*. vbproj):

<PropertyGroup>
<LangVersion>15.3</LangVersion>
</PropertyGroup>

El número de versión puede ser cualquier versión del compilador Visual Basic a partir de 15,3. En lugar de
codificar de forma rígida una versión específica del compilador, también puede especificar "latest" como valor de
LangVersion para compilar con la versión más reciente del compilador de Visual Basic instalado en el sistema.
Para obtener más información, vea establecer la versión de lenguaje Visual Basic.
En algunos casos, el compilador de Visual Basic no puede inferir el nombre del elemento de tupla a partir del
nombre del candidato y solo se puede hacer referencia al campo de tupla usando su nombre predeterminado,
como Item1 , Item2 , etc. Entre ellas se incluyen:
El nombre del candidato es el mismo que el nombre de un miembro de la tupla, como Item3 , Rest o
ToString .

El nombre del candidato está duplicado en la tupla.


Cuando se produce un error en la inferencia de nombre de campo, Visual Basic no genera un error del compilador
ni se produce una excepción en tiempo de ejecución. En su lugar, se debe hacer referencia a los campos de tupla
por sus nombres predefinidos, como Item1 y Item2 .

Tuplas frente a estructuras


Una tupla Visual Basic es un tipo de valor que es una instancia de uno de los tipos genéricos System. ValueTuple
. Por ejemplo, la tupla holiday definida en el ejemplo anterior es una instancia de la estructura
ValueTuple<T1,T2,T3>. Está diseñado para ser un contenedor ligero para los datos. Dado que la tupla pretende
facilitar la creación de un objeto con varios elementos de datos, carece de algunas de las características que puede
tener una estructura personalizada. Entre ellas se incluyen las siguientes:
Miembros personalizados. No puede definir sus propias propiedades, métodos o eventos para una tupla.
Valida. No se pueden validar los datos asignados a los campos.
Inmutabilidad. Visual Basic tuplas son mutables. En cambio, una estructura personalizada le permite
controlar si una instancia es modificable o inmutable.
Si los miembros personalizados, la validación de propiedades y campos o la inmutabilidad son importantes, debe
utilizar la instrucción Visual Basic Structure para definir un tipo de valor personalizado.
Una tupla Visual Basic hereda los miembros de su tipo ValueTuple . Además de sus campos, se incluyen los
siguientes métodos:

M IEM B RO DESC RIP C IÓ N

CompareTo Compara la tupla actual con otra tupla con el mismo número
de elementos.

Es igual a Determina si la tupla actual es igual a otra tupla u objeto.

GetHashCode Calcula el código hash de la instancia actual.

ToString Devuelve la representación de cadena de esta tupla, que toma


la forma (Item1, Item2...) , donde Item1 y Item2
representan los valores de los campos de la tupla.

Además, los tipos de ValueTuple implementan interfaces IStructuralComparable y IStructuralEquatable, que


permiten definir comparadores de clientes.

Asignación y tuplas
Visual Basic admite la asignación entre tipos de tupla que tienen el mismo número de campos. Los tipos de campo
se pueden convertir si se cumple una de las siguientes condiciones:
El campo de origen y de destino son del mismo tipo.
Se define una conversión de ampliación (o implícita) del tipo de origen al tipo de destino.
Option Strict es On y se define una conversión de restricción (o explícita) del tipo de origen al tipo de
destino. Esta conversión puede producir una excepción si el valor de origen está fuera del intervalo del tipo
de destino.
Otras conversiones no se tienen en cuenta para las asignaciones. Echemos un vistazo a los tipos de asignaciones
que se permiten entre los tipos de tupla.
Tenga en cuenta estas variables que se usan en los ejemplos siguientes:

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

Las dos primeras variables, unnamed y anonymous , no tienen nombres semánticos proporcionados para los
campos. Los nombres de campo son los Item1 predeterminados y Item2 . Las dos últimas variables, named y
differentName tienen nombres de campo semánticos. Tenga en cuenta que estas dos tuplas tienen nombres
diferentes para los campos.
Las cuatro de estas tuplas tienen el mismo número de campos (denominado "aridad") y los tipos de esos campos
son idénticos. Por consiguiente, todas estas asignaciones funcionan:

' 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 los nombres de las tuplas no se asignan. Los valores de los campos se asignan según el orden de los
campos de la tupla.
Por último, observe que podemos asignar la tupla named a la tupla conversion , aunque el primer campo de la
named sea un Integer y el primer campo de conversion sea una Long . Esta asignación se realiza correctamente
porque la conversión de un Integer en un Long es una conversión de ampliación.

' 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)
Las tuplas con distintos números de campos no son asignables:

' 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 devueltos del método


Un método solo puede devolver un valor. Sin embargo, a menudo le gustaría que una llamada al método devuelva
varios valores. Hay varias maneras de solucionar esta limitación:
Puede crear una clase o estructura personalizada cuyas propiedades o campos representen los valores
devueltos por el método. Por lo tanto, es una solución pesada; requiere que se defina un tipo personalizado
cuyo único propósito sea recuperar valores de una llamada al método.
Puede devolver un valor único desde el método y devolver los valores restantes pasándolos por referencia
al método. Esto implica la sobrecarga de crear instancias de una variable y los riesgos que sobrescriben
involuntariamente el valor de la variable que se pasa por referencia.
Puede usar una tupla, que proporciona una solución ligera para recuperar varios valores devueltos.
Por ejemplo, los métodos Tr yParse en .net devuelven un valor Boolean que indica si la operación de análisis se
realizó correctamente. El resultado de la operación de análisis se devuelve en una variable que se pasa por
referencia al método. Normalmente, una llamada a un método de análisis como Int32.TryParse tiene un aspecto
similar al siguiente:

Dim numericString As String = "123456"


Dim number As Integer
Dim result = Int32.TryParse(numericString, number)
Console.WriteLine($"{If(result, $"Success: {number:N0}", "Failure")}")
' Output: 123,456

Podemos devolver una tupla a partir de la operación de análisis si encapsulamos la llamada al método
Int32.TryParse en nuestro propio método. En el ejemplo siguiente, NumericLibrary.ParseInteger llama al método
Int32.TryParse y devuelve una tupla con nombre con dos elementos.

Imports System.Globalization

Public Module NumericLibrary


Public Function ParseInteger(value As String) As (Success As Boolean, Number As Int32)
Dim number As Integer
Return (Int32.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, number), number)
End Function
End Module

Después, puede llamar al método con código como el siguiente:

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
Visual Basic tuplas y tuplas en el .NET Framework
Una tupla Visual Basic es una instancia de uno de los tipos genéricos System. ValueTuple , que se introdujeron
en el .NET Framework 4,7. El .NET Framework también incluye un conjunto de clases genéricas System. Tuple .
Sin embargo, estas clases difieren de las tuplas Visual Basic y los tipos genéricos System. ValueTuple de varias
maneras:
Los elementos de las clases de tupla son propiedades denominadas Item1 , Item2 , etc. En Visual Basic
tuplas y los tipos ValueTuple , los elementos de tupla son campos.
No se pueden asignar nombres descriptivos a los elementos de una instancia de tupla o de una instancia
de ValueTuple . Visual Basic permite asignar nombres que comunican el significado de los campos.
Las propiedades de una instancia de tupla son de solo lectura; las tuplas son inmutables. En Visual Basic
tuplas y los tipos ValueTuple , los campos de tupla son de lectura y escritura. las tuplas son mutables.
Los tipos de tupla genéricos son tipos de referencia. El uso de estos tipos de tupla implica la asignación de
objetos. En rutas de acceso activas, esto puede suponer un importante impacto en el rendimiento de la
aplicación. Visual Basic tuplas y los tipos ValueTuple son tipos de valor.
Los métodos de extensión de la clase TupleExtensions facilitan la conversión entre Visual Basic tuplas y objetos de
tupla de .net. El método ToTuple convierte una tupla Visual Basic en un objeto de tupla de .net y el método
ToValueTuple convierte un objeto de tupla de .net en una tupla Visual Basic.
En el ejemplo siguiente se crea una tupla, se convierte en un objeto de tupla de .net y se vuelve a convertir en una
tupla Visual Basic. A continuación, en el ejemplo se compara esta tupla con la original para asegurarse de que son
iguales.

Module Example
Sub Main()
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)}")
Console.ReadLine()
End Sub
End Module
' 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

Vea también
Referencia del lenguaje Visual Basic
Uso eficiente de tipos de datos (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

A las variables no declaradas y a las variables declaradas sin un tipo de datos se les asigna el tipo de datos
Object . Esto facilita la escritura rápida de programas, pero puede hacer que se ejecuten más lentamente.

Establecimiento fuerte de tipos


La especificación de tipos de datos para todas las variables se conoce como fuertementetipados. El uso de tipos
fuertemente tipados tiene varias ventajas:
Habilita la compatibilidad con IntelliSense para las variables. Esto le permite ver sus propiedades y otros
miembros a medida que escribe en el código.
Aprovecha la comprobación del tipo de compilador. Esto detecta instrucciones que pueden producir
errores en tiempo de ejecución debido a errores como el desbordamiento. También detecta llamadas a
métodos en objetos que no las admiten.
Esto da como resultado una ejecución más rápida del código.

Tipos de datos más eficaces


En el caso de las variables que nunca contienen fracciones, los tipos de datos enteros son más eficaces que los
tipos no enteros. En Visual Basic, Integer y UInteger son los tipos numéricos más eficaces.
En el caso de los números fraccionarios, Double es el tipo de datos más eficaz, ya que los procesadores de las
plataformas actuales realizan operaciones de punto flotante de doble precisión. Sin embargo, las operaciones
con Double no son tan rápidas como con los tipos enteros como Integer .

Especificar el tipo de datos


Use la instrucción Dim para declarar una variable de un tipo específico. Puede especificar su nivel de acceso
simultáneamente mediante la palabra clave Public, Protected, Friendo Private , como en el ejemplo siguiente.

Private x As Double
Protected s As String

Conversión de caracteres
Las funciones AscW y ChrW funcionan en Unicode. Debe utilizarlos en su preferencia Asc y Chr , que deben
traducirse dentro y fuera de Unicode.

Vea también
Asc
AscW
Chr
ChrW
Tipos de datos
Tipos de datos numéricos
Declaración de variables
Usar IntelliSense
Solucionar problemas de tipos de datos (Visual
Basic)
27/11/2019 • 14 minutes to read • Edit Online

En esta página se enumeran algunos problemas comunes que pueden producirse al realizar operaciones en
tipos de datos intrínsecos.

Las expresiones de punto flotante no se comparan como iguales


Al trabajar con números de punto flotante (tipo de datos único y tipo de datos Double), recuerde que se
almacenan como fracciones binarias. Esto significa que no pueden contener una representación exacta de
cualquier cantidad que no sea una fracción binaria (de la forma k/(2 ^ n), donde k y n son enteros). Por
ejemplo, 0,5 (= 1/2) y 0,3125 (= 5/16) se pueden conservar como valores precisos, mientras que 0,2 (= 1/5)
y 0,3 (= 3/10) solo pueden ser aproximaciones.
Debido a este imprecisión, no se puede confiar en los resultados exactos cuando se trabaja en valores de
punto flotante. En concreto, dos valores que son teóricamente iguales pueden tener representaciones
ligeramente diferentes.

PA RA C O M PA RA R L A S C A N T IDA DES DE P UN TO F LOTA N T E

1. Calcule el valor absoluto de su diferencia mediante el método Abs de la clase Math en el espacio de nombres System.
2. determinar una diferencia máxima aceptable, por lo que puede considerar que las dos cantidades son iguales a efectos
prácticos si su diferencia no es mayor.
3. Compare el valor absoluto de la diferencia con la diferencia aceptable.

En el ejemplo siguiente se muestra la comparación incorrecta y correcta de dos valores Double .

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

En el ejemplo anterior se usa el método ToString de la estructura Double para que pueda especificar mejor
precisión de la que utiliza la palabra clave CStr . El valor predeterminado es 15 dígitos, pero el formato
"G17" lo extiende hasta 17 dígitos.

El operador mod no devuelve un resultado preciso


Debido a la imprecisión del almacenamiento de punto flotante, el operador mod puede devolver un
resultado inesperado cuando al menos uno de los operandos es de punto flotante.
El tipo de datos decimal no utiliza la representación de punto flotante. Muchos números que son inexactos
en Single y Double son exactos en Decimal (por ejemplo 0,2 y 0,3). Aunque la aritmética es más lenta en
Decimal que en el punto flotante, podría merecer la pena la disminución del rendimiento para lograr una
mejor precisión.

PA RA B USC A R EL RESTO EN T ERO DE L A S C A N T IDA DES DE P UN TO F LOTA N T E

1. declarar las variables como Decimal .


2. Use el carácter de tipo literal D para forzar que los literales Decimal , en caso de que sus valores sean demasiado
grandes para el tipo de datos Long .

En el ejemplo siguiente se muestran los posibles imprecisión de operandos de punto flotante.

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

En el ejemplo anterior se usa el método ToString de la estructura Double para que pueda especificar mejor
precisión de la que utiliza la palabra clave CStr . El valor predeterminado es 15 dígitos, pero el formato
"G17" lo extiende hasta 17 dígitos.
Dado que zeroPointTwo es Double , su valor para 0,2 es una fracción binaria repetida infinitamente con un
valor almacenado de 0.20000000000000001. La división de 2,0 por esta cantidad produce
9.9999999999999995 con un resto de 0.19999999999999991.
En la expresión de decimalRemainder , el carácter de tipo literal D obliga a ambos operandos a Decimal y
0,2 tiene una representación precisa. Por lo tanto, el operador Mod produce el resto esperado de 0,0.

Tenga en cuenta que no es suficiente declarar decimalRemainder como Decimal . También debe forzar la
Decimal de los literales, o usar Double de forma predeterminada y decimalRemainder recibe el mismo valor
inexacto que doubleRemainder .

El tipo Boolean no se convierte en un tipo numérico con precisión


Los valores de tipo de datos booleanos no se almacenan como números y los valores almacenados no
están diseñados para ser equivalentes a números. Por compatibilidad con versiones anteriores, Visual Basic
proporciona palabras clave de conversión (función ctype, CBool , CInt , etc.) para realizar conversiones
entre tipos Boolean y numéricos. Sin embargo, a veces otros lenguajes realizan estas conversiones de
manera diferente, al igual que los métodos de .NET Framework.
Nunca debe escribir código que se base en valores numéricos equivalentes para True y False . Siempre
que sea posible, debe restringir el uso de Boolean variables a los valores lógicos para los que están
diseñadas. Si debe mezclar Boolean y valores numéricos, asegúrese de que comprende el método de
conversión que seleccione.
Conversión en Visual Basic
Cuando se usa el CType o CBool palabras clave de conversión para convertir tipos de datos numéricos en
Boolean , 0 se convierte en False y todos los demás valores se True . Al convertir Boolean valores a tipos
numéricos mediante las palabras clave de conversión, False se convierte en 0 y True se convierte en-1.
Conversión en el marco de trabajo
El método ToInt32 de la clase Convert en el espacio de nombres System convierte True en + 1.
Si debe convertir un valor de Boolean en un tipo de datos numérico, tenga cuidado con el método de
conversión que use.

El literal de carácter genera un error del compilador


En ausencia de caracteres de tipo, Visual Basic asume los tipos de datos predeterminados para los literales.
El tipo predeterminado para un literal de carácter, entre comillas ( " " ), es String .
El tipo de datos String no se amplía al tipo de datos char. Esto significa que, si desea asignar un literal a
una variable Char , debe realizar una conversión de restricción o forzar el literal al tipo de Char .

PA RA C REA R UN L IT ERA L C H A R PA RA A SIGN A RLO A UN A VA RIA B L E O C O N STA N T E

1. declare la variable o constante como Char .


2. Escriba el valor de carácter entre comillas ( " " ).
3. Siga las comillas dobles de cierre con el carácter de tipo literal C para forzar que el literal Char . Esto es necesario si el
modificador de comprobación de tipo (Option Strict Statement) es On y es deseable en cualquier caso.

En el ejemplo siguiente se muestran las asignaciones correctas y erróneas de un literal a una variable de
Char .

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")

Siempre hay un riesgo en el uso de conversiones de restricción, ya que pueden producir errores en tiempo
de ejecución. Por ejemplo, una conversión de String a Char puede producir un error si el valor de String
contiene más de un carácter. Por lo tanto, es mejor programar para usar el carácter de tipo C .

Error de conversión de cadena en tiempo de ejecución


El tipo de datos de cadena participa en muy pocas conversiones de ampliación. String se amplía solo a sí
mismo y Object , y solo Char y Char() (una matriz de Char ) se amplía a String . Esto se debe a que
String variables y constantes pueden contener valores que otros tipos de datos no pueden contener.

Cuando el modificador de comprobación de tipo (Option Strict Statement) está On , el compilador no


permite todas las conversiones de restricción implícitas. Esto incluye los que implican String . El código
todavía puede usar palabras clave de conversión, como CStr y CType, que dirigen el .NET Framework para
intentar la conversión.
NOTE
Se suprime el error de conversión de restricción para las conversiones de los elementos de una colección de
For Each…Next a la variable de control de bucle. Para obtener más información y ejemplos, vea la sección acerca de
las conversiones de restricción en for each... Instrucción siguiente.

Protección de conversión de restricción


El inconveniente de las conversiones de restricción es que pueden producir errores en tiempo de ejecución.
Por ejemplo, si una variable String contiene algo distinto de "true" o "false", no se puede convertir en
Boolean . Si contiene caracteres de puntuación, se produce un error en la conversión a cualquier tipo
numérico. A menos que sepa que la variable de String siempre contiene valores que el tipo de destino
puede aceptar, no debe intentar realizar una conversión.
Si debe convertir de String a otro tipo de datos, el procedimiento más seguro consiste en incluir la
conversión intentada en la instrucción try... Detectar... Finally. Esto le permite tratar con un error en tiempo
de ejecución.
Matrices de caracteres
Un solo Char y una matriz de elementos de Char se amplían a String . Sin embargo, String no se
amplía a Char() . Para convertir un valor de String en una matriz de Char , puede utilizar el método
ToCharArray de la clase System.String.
Valores sin sentido
En general, los valores String no son significativos en otros tipos de datos y la conversión es muy artificial
y peligrosa. Siempre que sea posible, debe restringir el uso de String variables a las secuencias de
caracteres para las que están diseñadas. Nunca debe escribir código que se base en valores equivalentes en
otros tipos.

Vea también
Tipos de datos
Caracteres de tipo
Value Types and Reference Types
Conversiones de tipos en Visual Basic
Tipos de datos
Funciones de conversión de tipos
Uso eficiente de tipos de datos
Elementos declarados en Visual Basic
27/11/2019 • 2 minutes to read • Edit Online

Un elemento declarado es un elemento de programación que se define en una instrucción de declaración. Entre los
elementos declarados se incluyen variables, constantes, enumeraciones, clases, estructuras, módulos, interfaces,
procedimientos, parámetros de procedimientos, valores devueltos de función, referencias a procedimientos
externos, operadores, propiedades, eventos y delegados.
Entre las instrucciones de declaración se incluyen las siguientes:
Dim (instrucción)
Const (instrucción)
Enum (instrucción)
Class (instrucción)
Structure (instrucción)
Module (instrucción)
Interface (instrucción)
Function (instrucción)
Sub (instrucción)
Declare (instrucción)
Operator Statement
Property (instrucción)
Event (instrucción)
Delegate (instrucción)

Esta sección
Nombres de elementos declarados
Se describe cómo asignar un nombre a elementos y usar mayúsculas o minúsculas.
Características de los elementos declarados
Se tratan características, como el ámbito, que poseen elementos declarados.
Referencias a elementos declarados
Se describe cómo el compilador compara una referencia con una declaración y cómo calificar un nombre.

Secciones relacionadas
Convenciones de código y estructura de programas
Se muestran instrucciones para hacer que el código sea más fácil de leer, comprender y mantener.
Instrucciones
Se describen las instrucciones que asignan un nombre y definen procedimientos, variables, matrices y constantes.
Contextos de declaración y niveles de acceso predeterminados
Se enumeran los tipos de elementos declarados y se muestra para cada uno de ellos su instrucción de declaración,
en qué contexto se pueden declarar y su nivel de acceso predeterminado.
Delegados (Visual Basic)
27/11/2019 • 9 minutes to read • Edit Online

Los delegados son objetos que hacen referencia a métodos. A veces se describen como punteros de función con
seguridad de tipos porque son similares a los punteros de función utilizados en otros lenguajes de programación.
Pero a diferencia de los punteros de función, los delegados Visual Basic son un tipo de referencia basado en la
clase System.Delegate. Los delegados pueden hacer referencia a los métodos compartidos, métodos a los que se
puede llamar sin una instancia específica de una clase, y a los métodos de instancia.

Delegados y eventos
Los delegados son útiles en situaciones donde es necesario un intermediario entre un procedimiento que realiza
la llamada y el procedimiento que la recibe. Por ejemplo, puede que necesite un objeto que provoca que los
eventos puedan llamar a controladores de eventos diferentes en distintas circunstancias. Lamentablemente, el
objeto que provoca los eventos no puede conocer de antemano qué controlador de eventos controla un evento
específico. Visual Basic permite asociar dinámicamente controladores de eventos con eventos mediante la
creación de un delegado cuando se usa la instrucción AddHandler . En tiempo de ejecución, el delegado reenvía las
llamadas al controlador de eventos adecuado.
Aunque puede crear sus propios delegados, en la mayoría de los casos Visual Basic crea el delegado y se encarga
de los detalles. Por ejemplo, una instrucción Event define implícitamente una clase delegada denominada
<EventName>EventHandler como una clase anidada de la clase que contiene la instrucción Event , y con la misma
firma que el evento. La instrucción AddressOf crea implícitamente una instancia de un delegado que hace
referencia a un procedimiento específico. Las dos líneas de código siguientes son equivalentes. En la primera
línea, verá que la creación explícita de una instancia de EventHandler , con una referencia al método
Button1_Click enviada como argumento. La segunda línea es una manera más práctica de conseguir el mismo
resultado.

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

Puede utilizar la forma abreviada para crear delegados en cualquier lugar en que el compilador puede determinar
el tipo de delegado en función del contexto.

Declaración de eventos que usan un tipo de delegado existente


En algunas situaciones, puede declarar un evento para utilizar un tipo de delegado existente como su delegado
subyacente. La sintaxis siguiente muestra cómo:

Delegate Sub DelegateType()


Event AnEvent As DelegateType

Esto es útil cuando desea enrutar diversos eventos hacia el mismo controlador.

Variables y parámetros delegados


Puede utilizar delegados para otras tareas relacionadas sin eventos, como un subproceso libre, o con
procedimientos que necesiten llamar a diferentes versiones de funciones en tiempo de ejecución.
Por ejemplo, suponga que tiene una aplicación de anuncios clasificados que incluye un cuadro de lista con los
nombres de los automóviles. Los anuncios se ordenan por título, que suele ser la marca del automóvil. Se puede
plantear un problema si algunos coches incluyen el año del automóvil antes de la marca. El problema es que la
funcionalidad de ordenación integrada del cuadro de lista ordena únicamente por códigos de caracteres; coloca
todos los anuncios que empiezan con las fechas primero, seguidos de los anuncios que empiezan con la marca.
Para solucionar este problema, puede crear un procedimiento de ordenación en una clase que usa la ordenación
alfabética estándar en la mayoría de los cuadros de lista, pero puede cambiar en tiempo de ejecución al
procedimiento de ordenación personalizado para los anuncios de los automóviles. Para ello, pasa el
procedimiento de ordenación personalizado a la clase de ordenación en tiempo de ejecución, mediante el uso de
delegados.

Expresiones lambda y AddressOf


Cada clase delegada define un constructor que se pasa la especificación de un método de objeto. Un argumento
para un constructor delegado debe ser una referencia a un método o una expresión lambda.
Para especificar una referencia a un método, utilice la siguiente sintaxis:
AddressOf [ expression .] methodName
El tipo de tiempo de compilación de expression debe ser el nombre de una clase o una interfaz que contiene un
método del nombre especificado cuya firma coincida con la firma de la clase delegada. methodName puede ser un
método compartido o un método de instancia. methodName no es opcional, incluso si se crea un delegado para el
método predeterminado de la clase.
Para especificar una expresión lambda, utilice la siguiente sintaxis:
Function ([ parm As type , parm2 As type2 , ...]) expression

En el ejemplo siguiente se muestran las expresiones lambda y AddressOf usadas para especificar la referencia de
un delegado.
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

La firma de la función debe coincidir con la del tipo de delegado. Para obtener más información sobre las
expresiones lambda, vea Expresiones lambda. Para obtener más ejemplos de expresión lambda y asignaciones de
AddressOf a delegados, vea Conversión de delegado flexible.
Temas relacionados
T ÍT ULO DESC RIP C IÓ N

Invocar un método delegado Proporciona un ejemplo que muestra cómo asociar un


método a un delegado y después invocar ese método a
través del delegado.

Paso de procedimientos a otro procedimiento en Visual Basic Muestra cómo utilizar los delegados para pasar un
procedimiento a otro procedimiento.

Conversión de delegado flexible Describe cómo asignar subfunciones y funciones a delegados


o controladores incluso cuando sus firmas no son idénticas.

Eventos Proporciona información general sobre eventos en Visual


Basic.
Enlace en tiempo de compilación y en tiempo de
ejecución (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

El compilador de Visual Basic realiza un proceso denominado binding cuando se asigna un objeto a una variable
de objeto. Un objeto se enlaza de manera anticipada cuando se asigna a una variable que se declara de un tipo de
objeto específico. Los objetos enlazados de manera anticipada permiten al compilador asignar memoria y realizar
otras optimizaciones antes de que se ejecute la aplicación. Por ejemplo, el fragmento de código siguiente declara
que una variable es de tipo FileStream:

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

Como FileStream es un tipo de objeto específico, la instancia asignada a FS se enlaza de manera anticipada.
Por el contrario, un objeto se enlaza en tiempo de ejecución cuando se asigna a una variable que se declara como
variable de tipo Object . Los objetos de este tipo pueden contener referencias a cualquier objeto, pero carecen de
muchas de las ventajas de los objetos con enlaces anticipados. Por ejemplo, el fragmento de código siguiente
declara una variable de objeto para contener un objeto devuelto por la función CreateObject :

' 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

Ventajas del enlace anticipado


Debe utilizar objetos con enlace anticipado siempre que sea posible, ya que permiten al compilador realizar
importantes optimizaciones que producen aplicaciones más eficientes. Los objetos con enlace anticipado son
considerablemente más rápidos que los objetos con enlace en tiempo de ejecución y permiten que el código sea
más fácil de leer y mantener, ya que declaran exactamente qué clase de objetos se están utilizando. Otra ventaja
del enlace en tiempo de compilación es que permite características útiles como la finalización automática de
código y la ayuda dinámica, ya que el entorno de desarrollo integrado (IDE) de Visual Studio puede determinar
exactamente el tipo de objeto con el que está trabajando mientras edita el codifica. El enlace anticipado reduce el
número y la gravedad de los errores en tiempo de ejecución porque permite que el compilador notifique errores
cuando se compila un programa.
NOTE
El enlace en tiempo de ejecución solo puede utilizarse para acceder a miembros de tipo declarados como Public . El acceso
a miembros declarados como Friend o Protected Friend produce un error en tiempo de ejecución.

Vea también
CreateObject
Duración de los objetos: cómo se crean y destruyen
Object Data Type
Tipos de error (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

En Visual Basic, los errores se dividen en una de estas tres categorías: errores de sintaxis, errores en tiempo de
ejecución y errores lógicos.

Errores de sintaxis
Los errores de sintaxis son los que aparecen mientras se escribe código. Si usa Visual Studio, Visual Basic
comprueba el código a medida que lo escribe en la ventana del Editor de código y le alerta Si comete un
error, como la escritura incorrecta de una palabra o el uso de un elemento del lenguaje de forma incorrecta. Si
se compila desde la línea de comandos, Visual Basic muestra un error del compilador con información sobre el
error de sintaxis. Los errores de sintaxis son el tipo más común de errores. Puede corregirlas fácilmente en el
entorno de codificación en cuanto se produzcan.

NOTE
La instrucción Option Explicit es un medio para evitar errores de sintaxis. Obliga a declarar, de antemano, todas las
variables que se van a usar en la aplicación. Por lo tanto, cuando esas variables se usan en el código, los errores
tipográficos se detectan inmediatamente y se pueden corregir.

Errores en tiempo de ejecución


Los errores en tiempo de ejecución son aquellos que aparecen solo después de compilar y ejecutar el código.
Estos incluyen código que puede parecer correcto en que no tiene errores de sintaxis, pero que no se ejecutará.
Por ejemplo, puede escribir correctamente una línea de código para abrir un archivo. Pero si el archivo no existe,
la aplicación no puede abrir el archivo y produce una excepción. Puede corregir la mayoría de los errores en
tiempo de ejecución volviendo a escribir el código defectuoso o usando el control de excepcionesy, a
continuación, volviendo a compilarlo y volver a ejecutarlo.

Errores lógicos
Los errores lógicos son los que aparecen una vez que la aplicación está en uso. Suelen ser suposiciones
defectuosas realizadas por el desarrollador o resultados no deseados o inesperados en respuesta a las acciones
del usuario. Por ejemplo, una clave mal escrita podría proporcionar información incorrecta a un método, o
puede suponer que siempre se suministra un valor válido a un método cuando no es el caso. Aunque los
errores lógicos se pueden controlar mediante el control de excepciones (por ejemplo, comprobando si un
argumento es Nothing e iniciando una ArgumentNullException), lo más habitual es que se solucionen
corrigiendo el error en la lógica y volviendo a compilar la aplicación.

Vea también
Try...Catch...Finally (instrucción)
Conceptos básicos del depurador
Eventos (Visual Basic)
21/03/2020 • 13 minutes to read • Edit Online

Aunque puede visualizar un proyecto de Visual Studio como una serie de procedimientos que se ejecutan en una
secuencia, en realidad, la mayoría de los programas están controlados por eventos, lo que significa que el flujo
de ejecución está determinado por ocurrencias externas denominadas eventos.
Un evento es una señal que comunica a una aplicación que ha sucedido algo importante. Por ejemplo, cuando un
usuario hace clic en un control en un formulario, el formulario puede provocar un evento Click y llamar a un
procedimiento que controla el evento. Los eventos también permiten que las tareas independientes se
comuniquen. Por ejemplo, supongamos que la aplicación realiza una tarea de ordenación de manera
independiente a la aplicación principal. Si un usuario cancela la ordenación, la aplicación puede enviar un evento
de cancelación que indica al proceso de ordenación que se detenga.

Conceptos y términos de eventos


En esta sección se describen los términos y conceptos utilizados con los eventos en Visual Basic.
Declarar eventos
Puede declarar eventos dentro de clases, estructuras, módulos e interfaces con la palabra clave Event , como en
el ejemplo siguiente:

Event AnEvent(ByVal EventNumber As Integer)

Provocar eventos
Un evento es como un mensaje que anuncia que ha sucedido algo importante. La acción de difundir el mensaje
se denomina generar el evento. En Visual Basic, se RaiseEvent generan eventos con la instrucción, como en el
ejemplo siguiente:

RaiseEvent AnEvent(EventNumber)

Los eventos deben generarse dentro del ámbito de la clase, del módulo o de la estructura donde se declaran. Por
ejemplo, una clase derivada no puede generar eventos heredados de una clase base.
Remitentes de eventos
Cualquier objeto capaz de generar un evento es un remitente del evento, lo que también se conoce como origen
del evento. Los formularios, controles y objetos definidos por el usuario son ejemplos de remitentes de eventos.
Controladores de eventos
Los controladores de eventos son procedimientos que se invocan cuando se produce un evento correspondiente.
Puede utilizar cualquier subrutina válida con una firma coincidente como un controlador de eventos. Sin
embargo, no se puede utilizar una función como un controlador de eventos, porque no devolverá un valor al
origen del evento.
Visual Basic usa una convención de nomenclatura estándar para los controladores de eventos que combina el
nombre del remitente del evento, un carácter de subrayado y el nombre del evento. Por ejemplo, el evento
Click de un botón con nombre button1 se denominaría Sub button1_Click .
NOTE
Se recomienda utilizar esta convención de nomenclatura al definir controladores de eventos para sus propios eventos, pero
no es necesario; puede utilizar cualquier nombre de subrutina válido.

Asociación de eventos con controladores de eventos


Antes de poder utilizar un controlador de eventos, primero debe asociarlo con un evento mediante la utilización
de la instrucción Handles o AddHandler .
WithEvents y la cláusula Handles
La instrucción WithEvents y la cláusula Handles proporcionan una forma declarativa de especificar
controladores de eventos. Un evento generado por un objeto declarado con la palabra clave WithEvents puede
controlarse mediante cualquier procedimiento con una instrucción Handles para ese evento, tal como se
muestra en el ejemplo siguiente:

' 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

La instrucción WithEvents y la cláusula Handles suelen ser la mejor opción para controladores de eventos,
porque la sintaxis declarativa que utilizan hace que el control de eventos sea más fácil de codificar, leer y depurar.
Sin embargo, tenga en cuenta las siguientes limitaciones en el uso de variables WithEvents :
No puede usar una variable WithEvents como una variable de objeto. Es decir, no puede declararla como
Object : debe especificar el nombre de clase al declarar la variable.

Dado que los eventos compartidos no están WithEvents vinculados a instancias de clase, no se puede
usar para controlar mediante declaración los eventos compartidos. De forma similar, no puede usar
WithEvents o Handles para controlar eventos desde Structure . En ambos casos, puede usar la
instrucción AddHandler para controlar dichos eventos.
No puede crear matrices de las variables WithEvents .
Las variables WithEvents permiten que un único controlador de eventos controle uno o varios tipos de eventos,
o bien que uno o varios controladores de eventos controlen el mismo tipo de eventos.
Aunque la cláusula Handles es la forma estándar de asociar un evento con un controlador de eventos, tiene la
limitación de que solo puede asociar eventos con controladores de eventos en tiempo de compilación.
En algunos casos, como con eventos asociados con formularios o controles, Visual Basic elimina
automáticamente un controlador de eventos vacío y lo asocia a un evento. Por ejemplo, al hacer doble clic en un
botón de comando de un WithEvents formulario en modo de diseño, Visual Basic crea un controlador de
eventos vacío y una variable para el botón de comando, como en el código siguiente:

Friend WithEvents Button1 As System.Windows.Forms.Button


Protected Sub Button1_Click() Handles Button1.Click
End Sub

AddHandler y RemoveHandler
La instrucción AddHandler es similar a la cláusula Handles por el hecho de que ambas permiten especificar un
controlador de eventos. Sin embargo, AddHandler , que se utiliza con RemoveHandler , aporta más flexibilidad que
la cláusula Handles , ya que permite agregar, eliminar y cambiar de forma dinámica el controlador de eventos
asociado con un evento. Si desea controlar eventos compartidos o eventos de una estructura, debe utilizar
AddHandler .

AddHandler adopta dos argumentos: el nombre de un evento de un remitente de eventos como un control y una
expresión que evalúa a un delegado. No es necesario especificar explícitamente la clase delegada al utilizar
AddHandler , puesto que la instrucción AddressOf siempre devuelve una referencia al delegado. En el ejemplo
siguiente se asocia un controlador de eventos a un evento generado por un objeto:

AddHandler Obj.XEvent, AddressOf Me.XEventHandler

RemoveHandler , que desconecta un evento de un controlador de eventos, utiliza la misma sintaxis que
AddHandler . Por ejemplo:

RemoveHandler Obj.XEvent, AddressOf Me.XEventHandler

En el ejemplo siguiente, un controlador de eventos está asociado a un evento, y se genera el evento. El


controlador de eventos detecta el evento y muestra un mensaje.
A continuación, se quita el primer controlador de eventos y se asocia otro diferente al evento. Cuando se vuelve a
generar el evento, se muestra un mensaje diferente.
Por último, se quita el segundo controlador de eventos, y el evento se genera por tercera vez. Dado que ya no
hay ningún controlador de eventos asociado al evento, no se realiza ninguna acción.
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

Control de eventos heredados de una clase base


Clases derivadas: clases que heredan características de una clase base, que pueden controlar eventos generados
por su clase base con la instrucción Handles MyBase .
Para controlar eventos de una clase base
Declare un controlador de eventos en la clase derivada; para ello, agregue una instrucción
Handles MyBase. eventname a la línea de declaración del procedimiento del controlador de eventos, donde
eventname es el nombre del evento de la clase base que se va a controlar. Por ejemplo:

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
Secciones relacionadas
T ÍT ULO DESC RIP C IÓ N

Tutorial: Declarar y provocar eventos Proporciona una descripción detallada de cómo declarar y
generar eventos para una clase.

Tutorial: Controlar eventos Muestra cómo escribir un procedimiento de controlador de


eventos.

Cómo: Declarar eventos personalizados para evitar bloqueos Muestra cómo definir un evento personalizado que permite
invocar a sus controladores de eventos de forma asincrónica.

Cómo: Declarar eventos personalizados para conservar Muestra cómo definir un evento personalizado que utiliza la
memoria memoria solo cuando se controla el evento.

Solucionar problemas de controladores de eventos Enumera los problemas habituales que se producen con los
heredados en Visual Basic controladores de eventos en componentes heredados.

Eventos Proporciona una descripción general del modelo de eventos


de .NET Framework.

Crear controladores de eventos en Windows Forms Describe cómo trabajar con eventos asociados a objetos de
Windows Forms.

Delegados Proporciona información general sobre delegados en Visual


Basic.
Interfaces (Visual Basic)
27/11/2019 • 10 minutes to read • Edit Online

Las interfaces definen las propiedades, los métodos y los eventos que pueden implementar las clases. Las
interfaces permiten definir características como grupos pequeños de propiedades, métodos y eventos
estrechamente relacionados; esto reduce los problemas de compatibilidad porque se pueden desarrollar
implementaciones mejoradas para las interfaces sin comprometer el código existente. En cualquier momento se
pueden agregar nuevas características mediante el desarrollo de implementaciones e interfaces adicionales.
Hay otras razones por las que se podrían usar las interfaces en vez de la herencia de clases:
Las interfaces se adaptan mejor a situaciones en las que las aplicaciones necesitan que muchos tipos de
objetos posiblemente no relacionados proporcionen una funcionalidad determinada.
Las interfaces son más flexibles que las clases base porque se puede definir una sola implementación que
implemente varias interfaces.
Las interfaces funcionan mejor en situaciones en las que no es necesario heredar la implementación de
una clase base.
Las interfaces son útiles cuando no se puede usar la herencia de clases. Por ejemplo, las estructuras no
pueden heredar de clases, pero pueden implementar interfaces.

Declarar interfaces
Las definiciones de interfaz se encuentran dentro de las instrucciones Interface y End Interface . Después de la
instrucción Interface , puede agregar una instrucción Inherits opcional que muestra una o varias interfaces
heredadas. Las instrucciones Inherits deben preceder a todas las demás instrucciones de la declaración a
excepción de los comentarios. El resto de instrucciones de la definición de interfaz deben ser instrucciones
Event , Sub , Function , Property , Interface , Class , Structure y Enum . Las interfaces no pueden contener
código de implementación ni instrucciones asociadas al código de implementación, como End Sub o
End Property .

En un espacio de nombres, las instrucciones de interfaz son Friend de forma predeterminada, pero también se
pueden declarar explícitamente como Public o Friend . Las interfaces definidas dentro de clases, módulos,
interfaces y estructuras son Public de forma predeterminada, pero también se pueden declarar explícitamente
como Public , Friend , Protected o Private .

NOTE
La palabra clave Shadows puede aplicarse a todos los miembros de interfaz. La palabra clave Overloads puede aplicarse
a las instrucciones Sub , Function y Property que se declaran en una definición de interfaz. Además, las instrucciones
Property pueden tener los modificadores Default , ReadOnly o WriteOnly . No se permite ningún otro modificador (
Public , Private , Friend , Protected , Shared , Overrides , MustOverride o Overridable ). Para obtener más
información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y niveles de acceso
predeterminados).

Por ejemplo, el código siguiente define una interfaz con una función, una propiedad y un evento.
Interface IAsset
Event ComittedChange(ByVal Success As Boolean)
Property Division() As String
Function GetID() As Integer
End Interface

Implementar interfaces
La Visual Basic palabra reservada Implements se usa de dos maneras. La instrucción Implements significa que
una clase o estructura implementa una interfaz. La palabra clave Implements significa que un miembro de clase
o de estructura implementa un miembro de interfaz específico.
Implements (Instrucción)
Si una clase o estructura implementa una o más interfaces, debe incluir la instrucción Implements
inmediatamente después de la instrucción Class o Structure . La instrucción Implements requiere una lista
separada por comas de las interfaces que implementará una clase. La clase o estructura debe implementar todos
los miembros de interfaz mediante la palabra clave Implements .
Implements (palabra clave )
La palabra clave Implements requiere una lista separada por comas de los miembros de interfaz que se
implementarán. Por lo general solo se especifica un miembro de interfaz, pero pueden especificarse varios. La
especificación de un miembro de interfaz consta del nombre de la interfaz —que debe especificarse en una
instrucción implements dentro de la clase—, un punto y el nombre de la función miembro, propiedad o evento
que se va a implementar. El nombre de un miembro que implementa un miembro de interfaz puede usar
cualquier identificador legal y no se limita a la Convención de InterfaceName_MethodName utilizada en versiones
anteriores de Visual Basic.
Por ejemplo, el código siguiente muestra cómo declarar una subrutina denominada Sub1 que implementa un
método de una interfaz:

Class Class1
Implements interfaceclass.interface2

Sub Sub1(ByVal i As Integer) Implements interfaceclass.interface2.Sub1


End Sub
End Class

Los tipos de parámetro y los tipos devueltos del miembro implementador deben coincidir con la declaración de
miembro o de propiedad de interfaz de la interfaz. La manera más habitual de implementar un elemento de una
interfaz es mediante un miembro que tenga el mismo nombre que la interfaz, tal como se muestra en el ejemplo
anterior.
Para declarar la implementación de un método de interfaz, puede usar cualquier atributo permitido en las
declaraciones de método de instancia, incluidos Overloads , Overrides , Overridable , Public , Private ,
Protected , Friend , Protected Friend , MustOverride , Default y Static . El atributo Shared no está permitido,
ya que define una clase en lugar de un método de instancia.
Con Implements también se puede escribir un único método que implemente varios métodos definidos en una
interfaz, como en el ejemplo siguiente:
Class Class2
Implements I1, I2

Protected Sub M1() Implements I1.M1, I1.M2, I2.M3, I2.M4


End Sub
End Class

Se puede usar un miembro privado para implementar un miembro de interfaz. Cuando un miembro privado
implementa un miembro de una interfaz, ese miembro pasa a estar disponible por medio de la interfaz incluso si
no está disponible directamente en las variables de objeto de la clase.
Ejemplos de implementación de interfaces
Las clases que implementan una interfaz deben implementar todas sus propiedades, métodos y eventos.
En el ejemplo siguiente se definen dos interfaces. La segunda interfaz, Interface2 , hereda Interface1 y define
un método y una propiedad adicionales.

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

En el ejemplo siguiente se implementa Interface1 , la interfaz definida en el ejemplo anterior:

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

En el ejemplo final se implementa Interface2 , incluido un método heredado de Interface1 :

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

Puede implementar una propiedad de solo lectura con una propiedad de lectura y escritura (es decir, no tiene
que declararla de solo lectura en la clase implementadora). Al implementar una interfaz, se implementarán al
menos los miembros que declara la interfaz, pero se puede ofrecer más funcionalidad como, por ejemplo,
permitir que se pueda escribir en la propiedad.

Temas relacionados
T ÍT ULO DESC RIP C IÓ N

Tutorial: Crear e implementar interfaces Proporciona un procedimiento detallado que le guiará por el
proceso de definición e implementación de su propia interfaz.

Varianza en interfaces genéricas Describe la covarianza y contravarianza en las interfaces


genéricas y proporciona una lista de interfaces genéricas
variantes en .NET Framework.
Tutorial: Crear e implementar interfaces (Visual Basic)
27/11/2019 • 7 minutes to read • Edit Online

Las interfaces describen las características de las propiedades, los métodos y los eventos, pero dejan los detalles de
la implementación hasta estructuras o clases.
En este tutorial se muestra cómo declarar e implementar una interfaz.

NOTE
En este tutorial no se proporciona información sobre cómo crear una interfaz de usuario.

NOTE
Es posible que el equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario
de Visual Studio en las siguientes instrucciones. La edición de Visual Studio que se tenga y la configuración que se utilice
determinan estos elementos. Para obtener más información, vea Personalizar el IDE.

Para definir una interfaz


1. Abra un proyecto Aplicación Windows de Visual Basic nuevo.
2. Agregue un nuevo módulo al proyecto haciendo clic en Agregar módulo en el menú proyecto .
3. Asigne al nuevo módulo el nombre Module1.vb y haga clic en Agregar . Se muestra el código para el nuevo
módulo.
4. Defina una interfaz denominada TestInterface dentro de Module1 escribiendo Interface TestInterface
entre las instrucciones Module y End Module y, a continuación, presione Entrar. El Editor de código aplica
sangría a la palabra clave Interface y agrega una instrucción End Interface para formar un bloque de
código.
5. Defina una propiedad, un método y un evento para la interfaz colocando el siguiente código entre las
instrucciones Interface y End Interface :

Property Prop1() As Integer


Sub Method1(ByVal X As Integer)
Event Event1()

Implementación
Es posible que observe que la sintaxis usada para declarar miembros de interfaz es diferente de la sintaxis utilizada
para declarar miembros de clase. Esta diferencia refleja el hecho de que las interfaces no pueden contener código
de implementación.
Para implementar la interfaz
1. Agregue una clase denominada ImplementationClass agregando la siguiente instrucción a Module1 ,
después de la instrucción End Interface , pero antes de la instrucción End Module y, a continuación,
presione ENTRAR:
Class ImplementationClass

Si está trabajando en el entorno de desarrollo integrado, el Editor de código proporciona una instrucción
End Class coincidente al presionar entrar.

2. Agregue la siguiente instrucción Implements a ImplementationClass , que nombra la interfaz que la clase
implementa:

Implements TestInterface

Cuando se enumeran por separado de otros elementos en la parte superior de una clase o estructura, la
instrucción Implements indica que la clase o estructura implementa una interfaz.
Si está trabajando en el entorno de desarrollo integrado, el Editor de código implementa los miembros de
clase requeridos por TestInterface al presionar entrar y puede omitir el paso siguiente.
3. Si no está trabajando en el entorno de desarrollo integrado, debe implementar todos los miembros de la
interfaz MyInterface . Agregue el código siguiente a ImplementationClass para implementar Event1 ,
Method1 y Prop1 :

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

La instrucción Implements denomina la interfaz y el miembro de interfaz que se está implementando.


4. Complete la definición de Prop1 agregando un campo privado a la clase que almacenó el valor de la
propiedad:

' Holds the value of the property.


Private pval As Integer

Devuelve el valor de la pval del descriptor de acceso get de la propiedad.

Return pval

Establezca el valor de pval en el descriptor de acceso set de propiedad.

pval = value

5. Agregue el código siguiente para completar la definición de Method1 .

MsgBox("The X parameter for Method1 is " & X)


RaiseEvent Event1()
Para probar la implementación de la interfaz
1. Haga clic con el botón secundario en el formulario de inicio del proyecto en el Explorador de soluciones y
haga clic en Ver código . El editor muestra la clase del formulario de inicio. De forma predeterminada, el
formulario de inicio se denomina Form1 .
2. Agregue el siguiente testInstance campo a la clase Form1 :

Dim WithEvents testInstance As TestInterface

Al declarar testInstance como WithEvents , la clase Form1 puede controlar sus eventos.
3. Agregue el siguiente controlador de eventos a la clase Form1 para controlar los eventos generados por
testInstance :

Sub EventHandler() Handles testInstance.Event1


MsgBox("The event handler caught the event.")
End Sub

4. Agregue una subrutina denominada Test a la clase Form1 para probar la clase de implementación:

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

El procedimiento Test crea una instancia de la clase que implementa MyInterface , asigna esa instancia al
campo testInstance , establece una propiedad y ejecuta un método a través de la interfaz.
5. Agregue código para llamar al procedimiento Test desde el procedimiento Form1 Load del formulario de
Inicio:

Private Sub Form1_Load(ByVal sender As System.Object,


ByVal e As System.EventArgs) Handles MyBase.Load
Test() ' Test the class.
End Sub

6. Ejecute el procedimiento Test presionando F5. Se muestra el mensaje "Prop1 se estableció en 9". Después
de hacer clic en aceptar, se muestra el mensaje "el parámetro X de method1 es 5". Haga clic en aceptar y se
mostrará el mensaje "el controlador de eventos detectó el evento".

Vea también
Implements (instrucción)
Interfaces
Interface (instrucción)
Event (instrucción)
LINQ en Visual Basic
08/01/2020 • 3 minutes to read • Edit Online

Esta sección contiene información general, ejemplos e información general que le ayudará a entender y usar
Visual Basic y Language-Integrated Query (LINQ).

Esta sección
Introducción a LINQ en Visual Basic
Proporciona una introducción a los proveedores, operadores, estructuras de consulta y características de lenguaje
de LINQ.
Cómo: Consultar una base de datos
Proporciona un ejemplo de cómo conectarse a una base de datos de SQL Server y ejecutar una consulta mediante
LINQ.
Cómo: Llamar a un procedimiento almacenado
Proporciona un ejemplo de cómo conectarse a una base de datos de SQL Server y llamar a un procedimiento
almacenado mediante LINQ.
Cómo: Modificar datos en una bases de datos
Proporciona un ejemplo de cómo conectarse a una base de datos de SQL Server y recuperar y modificar datos
mediante LINQ.
Cómo: Combinar datos con cláusulas Join
Proporciona ejemplos de cómo combinar datos de una manera similar a las combinaciones de la base de datos
mediante LINQ.
Cómo: Ordenar los resultados de una consulta
Proporciona un ejemplo de cómo ordenar los resultados de una consulta mediante LINQ.
Cómo: Filtrar los resultados de una consulta
Proporciona un ejemplo de cómo incluir criterios de búsqueda en una consulta mediante LINQ.
Cómo: Hacer el recuento, la suma o el promedio de datos
Proporciona ejemplos de cómo incluir funciones de agregado para realizar el recuento, la suma o el promedio de
los datos devueltos por una consulta mediante LINQ.
Cómo: Buscar los valores máximo y mínimo en el resultado de una consulta
Proporciona ejemplos de cómo incluir funciones de agregado para determinar los valores mínimo y máximo de
los datos devueltos por una consulta mediante LINQ.
Devolver el resultado de una consulta con LINQ como tipo específico
Proporciona un ejemplo de cómo devolver los resultados de una consulta LINQ como un tipo específico en lugar
de como un tipo anónimo.

Vea también
LINQ (Language Integrated Query)
Información general sobre LINQ to XML en Visual Basic
Información general de LINQ to DataSet
LINQ to SQL
Objetos y clases de Visual Basic
08/01/2020 • 24 minutes to read • Edit Online

Un objeto es una combinación de código y datos que se pueden tratar como una unidad. Un objeto puede ser
una parte de una aplicación, como un control o un formulario. Toda la aplicación también puede ser un objeto.
Cuando se crea una aplicación en Visual Basic, se trabaja constantemente con objetos. Puede usar los objetos
proporcionados por Visual Basic, como los controles, los formularios y los objetos de acceso a datos. También
puede utilizar objetos de otras aplicaciones dentro de la aplicación Visual Basic. Incluso puede crear sus propios
objetos y definir propiedades y métodos adicionales para ellos. Los objetos actúan como bloques de
compilación prefabricados que permiten escribir un fragmento de código de una vez y utilizarlo una y otra vez.
En este tema se proporciona información detallada sobre los objetos.

Objetos y clases
Cada objeto de Visual Basic se define mediante una clase. Una clase describe las variables, las propiedades, los
procedimientos y los eventos de un objeto. Los objetos son instancias de clases; puede crear tantos objetos
como sean necesarios una vez que haya definido una clase.
Para comprender la relación entre un objeto y su clase, piense en las galletas y en su molde. El molde de la
galleta es la clase. Define las características de cada galleta, por ejemplo, tamaño y forma. La clase se usa para
crear objetos. Los objetos son las galletas.
Debe crear un objeto para poder acceder a sus miembros.
Para crear un objeto a partir de una clase
1. Determine en qué clase desea crear un objeto.
2. Escriba una instrucción Dim para crear una variable a la que pueda asignar una instancia de clase. La
variable debe ser del tipo de la clase deseada.

Dim nextCustomer As customer

3. Agregue la palabra clave Nuevo operador para inicializar la variable en una nueva instancia de la clase.

Dim nextCustomer As New customer

4. Ahora puede tener acceso a los miembros de la clase a través de la variable de objeto.

nextCustomer.accountNumber = lastAccountNumber + 1

NOTE
Siempre que sea posible, debe declarar la variable para que sea del tipo de clase al que pretende asignarla. Esto se
denomina enlace anticipado. Si no conoce el tipo de clase en tiempo de compilación, puede invocar el enlace en tiempo
de ejecución mediante la declaración de la variable para que sea del tipo de datos de objeto. Sin embargo, el enlace en
tiempo de ejecución puede ralentizar el rendimiento y limitar el acceso a los miembros del objeto de tiempo de ejecución.
Para más información, vea Declaración de variables de objeto.
Varias instancias
Los objetos recién creados a partir de una clase suelen ser idénticos entre sí. Una vez que existen como objetos
individuales, sin embargo, sus variables y propiedades se pueden cambiar independientemente de las otras
instancias. Por ejemplo, si agrega tres casillas a un formulario, cada objeto de casilla es una instancia de la clase
CheckBox. Los objetos CheckBox individuales comparten un conjunto común de características y funciones
(propiedades, variables, procedimientos y eventos) que define la clase. Sin embargo, cada uno tiene su propio
nombre, pueden habilitarse y deshabilitarse por separado y se pueden colocar en una ubicación distinta en el
formulario.

Miembros de objetos
Un objeto es un elemento de una aplicación, que representa una instancia de una clase. Los campos, las
propiedades, los métodos y los eventos son los bloques de compilación de objetos y constituyen sus
miembros.
Acceso a miembros
Para acceder al miembro de un objeto, especifique, en este mismo orden, el nombre de la variable de objeto, un
punto ( . ) y el nombre del miembro. En el ejemplo siguiente se establece la propiedad Text de un objeto Label.

warningLabel.Text = "Data not saved"

Lista de miembros de IntelliSense


IntelliSense muestra los miembros de una clase cuando invoca su opción Lista de miembros, por ejemplo, al
escribir un punto ( . ) como un operador de acceso a miembros. Si escribe el punto después del nombre de
una variable declarada como una instancia de esa clase, IntelliSense muestra todos los miembros de instancia y
ningún miembro compartido. Si escribe el punto después del nombre de clase, IntelliSense muestra todos los
miembros compartidos y ningún miembro de instancia. Para obtener más información, vea Usar IntelliSense.
Campos y propiedades
Los campos y las propiedades representan información almacenada en un objeto. Puede recuperar y establecer
sus valores con instrucciones de asignación de la misma forma en que se recuperan y establecen las variables
locales en un procedimiento. En el ejemplo siguiente se recupera la propiedad Width y se establece la
propiedad ForeColor de un objeto Label.

Dim warningWidth As Integer = warningLabel.Width


warningLabel.ForeColor = System.Drawing.Color.Red

Tenga en cuenta que a un campo también se le denomina variable de miembro.


Use procedimientos de propiedad cuando:
Necesite controlar cuándo y cómo se establece o recupera un valor.
La propiedad tiene un conjunto bien definido de valores que precisan de validación.
La configuración del valor genera algún cambio perceptible en el estado del objeto, como una propiedad
IsVisible .

La configuración de la propiedad provoca cambios en otras variables internas o en los valores de otras
propiedades.
Es necesario realizar una serie de pasos antes de que la propiedad se pueda establecer o recuperar.
Utilice campos cuando:
El valor sea de un tipo de autovalidación. Por ejemplo, se produce un error o una conversión de datos
automática si un valor distinto de True o False se asigna a una variable Boolean .
Cualquier valor del intervalo admitido por el tipo de datos es válido. Esto mismo sucede con muchas
propiedades del tipo Single o Double .
La propiedad es un tipo de datos String , y no hay ninguna restricción del tamaño o el valor de la
cadena.
Para más información, vea Procedimientos de propiedad.
Métodos
Un método es una acción que un objeto puede realizar. Por ejemplo, Add es un método del objeto ComboBox
que agrega una entrada nueva al cuadro combinado.
En el ejemplo siguiente se muestra el método Start de un objeto Timer.

Dim safetyTimer As New System.Windows.Forms.Timer


safetyTimer.Start()

Tenga en cuenta que un método es simplemente un procedimiento que se expone mediante un objeto.
Para más información, vea Procedimientos en Visual Basic.
eventos
Un evento es una acción reconocida por un objeto, como hacer clic con el ratón o presionar una tecla, para la
que puede escribir código para que responda. Los eventos pueden producirse como resultado de una acción
del usuario o código de programa, o puede provocarlos el sistema. Se dice que el código que señala un evento
genera el evento y el código que responde a él se dice que lo controla.
También puede desarrollar sus propios eventos personalizados para que los generen sus objetos y los
controlen otros objetos. Para más información, vea Eventos.
Miembros de instancia y miembros compartidos
Cuando se crea un objeto de una clase, el resultado es una instancia de esa clase. Los miembros no declarados
con la palabra clave Shared son miembros de instancia, que pertenecen estrictamente a esa instancia concreta.
Un miembro de instancia en una instancia es independiente del mismo miembro en otra instancia de la misma
clase. Por ejemplo, una variable de miembro de instancia puede tener valores diferentes en instancias distintas.
Los miembros declarados con la palabra clave Shared son miembros compartidos, que pertenecen a la clase
como un todo y no a una instancia determinada. Un miembro compartido existe solo una vez,
independientemente del número de instancias de su clase, o incluso si no crea ninguna. Una variable de
miembro compartido, por ejemplo, tiene un único valor, que está disponible para todo el código que puede
tener acceso a la clase.
Acceso a miembros no compartidos
Par a ac c eder a u n m i em br o n o c o m par t i do de u n o bj et o

1. Asegúrese de que el objeto se crea a partir de su clase y de que se asigna a una variable de objeto.

Dim secondForm As New System.Windows.Forms.Form

2. En la instrucción que tiene acceso al miembro, coloque detrás del nombre de la variable de objeto el
operador de acceso a miembro ( . ) y, a continuación, el nombre del miembro.

secondForm.Show()
Acceso a miembros compartidos
Par a ac c eder a u n m i em br o c o m par t i do de u n o bj et o

Coloque detrás el nombre de clase el operador de acceso a miembro ( . ) y, a continuación, el nombre


del miembro. Siempre debe acceder a un miembro Shared del objeto directamente a través del nombre
de clase.

MsgBox("This computer is called " & Environment.MachineName)

Si ya ha creado un objeto de la clase, también puede acceder a un miembro Shared a través de la


variable del objeto.
Diferencias entre clases y módulos
La diferencia principal entre clases y módulos es que pueden crearse instancias de clases como objetos, pero
no de los módulos estándar. Como solo hay una copia de los datos de un módulo estándar, cuando una parte
del programa cambia una variable pública en un módulo estándar, cualquier otra parte del programa obtiene el
mismo valor si lee luego esa variable. En cambio, los datos de objeto existen por separado para cada objeto con
instancias. Otra diferencia es que, a diferencia de los módulos estándar, las clases pueden implementar
interfaces.

NOTE
Cuando el modificador Shared se aplica a un miembro de clase, se asocia a la propia clase, en lugar de a una instancia
particular de una clase. Al miembro se accede directamente con el nombre de clase, de la misma forma que se accede a
los miembros del módulo.

Las clases y los módulos también emplean ámbitos diferentes para sus miembros. Los miembros definidos
dentro de una clase tienen el ámbito de una instancia específica de la clase y solo durante la vigencia del
objeto. Para acceder a miembros de clase desde fuera de una clase, debe utilizar nombres completos con el
formato de Objeto.Miembro.
Por otro lado, los miembros declarados dentro de un módulo son de acceso público de forma predeterminada
a través de cualquier código que pueda tener acceso al módulo. Esto significa que las variables de un módulo
estándar son variables globales porque son visibles desde cualquier parte del proyecto y, además, existen
durante la vigencia del programa.

Reutilización de clases y objetos


Los objetos permiten declarar variables y procedimientos una vez, para luego reutilizarlos siempre que sea
necesario. Por ejemplo, si desea agregar un corrector ortográfico a una aplicación, podría definir todas las
variables y funciones compatibles para proporcionar la funcionalidad de revisión ortográfica. Si crea el
corrector ortográfico como una clase, puede reutilizarlo en otras aplicaciones mediante la incorporación de una
referencia al ensamblado compilado. Mejor aún, puede ahorrarse trabajo mediante el uso de una clase de
corrector ortográfico que otra persona ya ha desarrollado.
El .NET Framework proporciona muchos ejemplos de componentes que están disponibles para su uso. En el
ejemplo siguiente se usa la clase TimeZone en el espacio de nombres System. TimeZone proporciona
miembros que permiten recuperar información sobre la zona horaria del equipo actual.
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""."
MsgBox(s)
End Sub

En el ejemplo anterior, la primera instrucción Dim declara una variable de objeto del tipo TimeZone y le asigna
un objeto TimeZone que devuelve la propiedad CurrentTimeZone.

Relaciones entre objetos


Los objetos pueden relacionarse entre sí de varias maneras. Los tipos principales de relación son jerárquica y
de contención.
Relación jerárquica
Cuando las clases se derivan de clases más fundamentales, se dice que tienen una relación jerárquica. Las
jerarquías de clases son útiles cuando se describen elementos que constituyen un subtipo de una clase más
general.
En el ejemplo siguiente, suponga que quiere definir un tipo especial de Button que actúa como un Button
normal, pero también expone un método que invierte los colores de primer plano y de fondo.
Para definir una clase derivada de una clase ya existente
1. Use una instrucción Class para definir una clase desde la que crear el objeto que necesita.

Public Class reversibleButton

Asegúrese de que una instrucción End Class sigue a la última línea de código de la clase. De forma
predeterminada, el entorno de desarrollo integrado (IDE) genera automáticamente End Class al escribir
una instrucción Class .
2. Siga a la instrucción Class inmediatamente con una instrucción Inherits. Especifique la clase de la que
deriva la nueva clase.

Inherits System.Windows.Forms.Button

La nueva clase hereda todos los miembros definidos por la clase base.
3. Agregue el código para los miembros adicionales que la clase derivada expone. Por ejemplo, puede
agregar un método reverseColors y la clase derivada podría tener el aspecto siguiente:

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
Si crea un objeto de la clase reversibleButton , este puede acceder a todos los miembros de la clase
Button, así como al método reverseColors y a todos los miembros nuevos que defina en
reversibleButton .

Las clases derivadas heredan miembros de la clase en que se basan, lo que permite agregar complejidad a
medida que progresa en una jerarquía de clases. Para más información, vea Fundamentos de la herencia.
Compilar el código
Asegúrese de que el compilador puede tener acceso a la clase de la que pretende derivar la nueva clase. Esto
puede conllevar su nombre completo, como en el ejemplo anterior, o la identificación de su espacio de
nombres en una Instrucción Imports (Tipo y espacio de nombres de .NET). Si la clase está en un proyecto
diferente, tendrá que agregar una referencia a ese proyecto. Para más información, vea Administrar referencias
en un proyecto.
Relaciones de contención
Otra forma de relacionar ese objeto es mediante una relación de contención. Los objetos contenedores
lógicamente encapsulan otros objetos. Por ejemplo, el objeto OperatingSystem contiene lógicamente un objeto
Version, el cual devuelve a través de su propiedad Version. Tenga en cuenta que el objeto contenedor no
contiene ningún otro objeto físicamente.
Colecciones
Un tipo concreto de contención de objeto se representa mediante colecciones. Las colecciones son grupos de
objetos similares que se pueden enumerar. Visual Basic admite una sintaxis específica en la ... Instrucción
siguiente que permite recorrer en iteración los elementos de una colección. Además, las colecciones suelen
permitir usar un Item[String] para recuperar elementos en función de su índice o asociándolos con una cadena
única. Las colecciones pueden ser más fáciles de utilizar que las matrices puesto que permiten agregar o quitar
elementos sin utilizar índices. Debido a su facilidad de uso, las colecciones se utilizan a menudo para almacenar
formularios y controles.

Temas relacionados
Tutorial: definir clases
Proporciona una descripción detallada sobre cómo crear una clase.
Propiedades y métodos sobrecargados
Propiedades y métodos sobrecargados
Fundamentos de la herencia
Se tratan los modificadores de herencia, con la sustitución de métodos y propiedades, MyClass y MyBase.
Duración de los objetos: cómo se crean y destruyen
Describe cómo crear y eliminar instancias de clase.
Tipos anónimos
Describe cómo crear y usar tipos anónimos que permiten crear objetos sin escribir una definición de clase para
el tipo de datos.
Inicializadores de objeto: Tipos con nombre y anónimos
Explica los inicializadores de objeto, que se usan para crear instancias de tipos con nombre y anónimos
mediante una sola expresión.
Cómo: deducir tipos y nombres de propiedades en declaraciones de tipos anónimos
Explica cómo deducir tipos y nombres de propiedades en declaraciones de tipos anónimos. Proporciona
ejemplos de inferencia correcta e incorrecta.
Operadores y expresiones en Visual Basic
27/11/2019 • 3 minutes to read • Edit Online

Un operador es un elemento de código que realiza una operación en uno o más elementos de código que
contienen valores. Los elementos de valor incluyen variables, constantes, literales, propiedades, devoluciones de
procedimientos Function y Operator y expresiones.
Una expresión es una serie de elementos de valor combinados con operadores, lo que produce un nuevo valor.
Los operadores actúan en los elementos de valor mediante cálculos, comparaciones y otras operaciones.

Tipos de operadores
Visual Basic proporciona los siguientes tipos de operadores:
Los operadores aritméticos realizan cálculos familiares en valores numéricos, incluido el desplazamiento
de los patrones de bits.
Los operadores de comparación comparan dos expresiones y devuelven un valor Boolean que representa
el resultado de la comparación.
Los operadores de concatenación unen varias cadenas en una sola.
Los operadores lógicos y bit a bit de Visual Basic combinan valores Boolean o numéricos y devuelven un
resultado del mismo tipo de datos que los valores.
Los elementos de valor que se combinan con un operador se denominan operandos de ese operador. Los
operadores combinados con elementos de valor forman expresiones, salvo el operador de asignación, que forma
una instrucción. Para obtener más información, vea Instrucciones (Guía de programación de C#).

Evaluación de expresiones
El resultado final de una expresión representa un valor, que suele ser de un tipo de datos conocido, como un tipo
Boolean , String o numérico.

A continuación se muestran ejemplos de expresiones.


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.

Varios operadores pueden realizar acciones en una sola expresión o instrucción, como se muestra en el ejemplo
siguiente.
x = 45 + y * z ^ 2

En el ejemplo anterior, Visual Basic realiza las operaciones en la expresión del lado derecho del operador de
asignación ( = ) y, a continuación, asigna el valor resultante a la variable x a la izquierda. No hay ningún límite
práctico al número de operadores que se pueden combinar en una expresión, pero es necesario conocer la
prioridad de operadores en Visual Basic para asegurarse de que se obtienen los resultados esperados.

Vea también
Operadores
Combinación eficaz de operadores
Instrucciones
Procedimientos en Visual Basic
27/11/2019 • 7 minutes to read • Edit Online

Un procedimiento es un bloque de instrucciones Visual Basic delimitadas por una instrucción de declaración (
Function , Sub , Operator , Get , Set ) y una declaración End coincidente. Todas las instrucciones ejecutables en
Visual Basic deben estar dentro de algún procedimiento.

Llamada a un procedimiento
Cuando invoca un procedimiento desde otra parte del código, está realizando una llamada a procedimiento.
Cuando el procedimiento termina de ejecutarse, devuelve el control al código que lo ha invocado, el cual se
conoce como código de llamada. El código de llamada es una instrucción, o una expresión de una instrucción, que
especifica el procedimiento por el nombre y le transfiere el control.

Devolución desde un procedimiento


Un procedimiento devuelve el control al código de llamada cuando termina de ejecutarse. Para ello, puede usar
una instrucción Return, la instrucción Exit adecuada para el procedimiento o la instrucción End <keyword>
Statement del procedimiento. A continuación, el control pasa al código de llamada seguido del punto de la
llamada a procedimiento.
Con una instrucción Return , el control vuelve inmediatamente al código de llamada. Las instrucciones que
siguen la instrucción Return no se ejecutan. Puede tener más de una instrucción Return en el mismo
procedimiento.
Con una instrucción Exit Sub o Exit Function , el control vuelve inmediatamente al código de llamada.
Las instrucciones que siguen la instrucción Exit no se ejecutan. Puede tener más de una instrucción
Exit en el mismo procedimiento. Además, puede combinar instrucciones Return y Exit en el mismo
procedimiento.
Si un procedimiento no tiene instrucciones Return o Exit , concluye con una instrucción End Sub o
End Function , End Get , o End Set posterior a la última instrucción del cuerpo del procedimiento. La
instrucción End devuelve inmediatamente el control al código de llamada. Solo puede tener una
instrucción End en un procedimiento.

Parámetros y argumentos
En la mayoría de los casos, un procedimiento necesita operar en datos diferentes cada vez que se llama. Puede
pasar esta información al procedimiento como parte de la llamada a procedimiento. El procedimiento define cero
o más parámetros, cada uno de los cuales representa un valor que espera que le pase. Cada parámetro de la
definición del procedimiento tiene un argumento correspondiente en la llamada a procedimiento. Un argumento
representa el valor que pasa al parámetro correspondiente en una llamada a procedimiento determinada.

Tipos de procedimientos
Visual Basic usa varios tipos de procedimientos:
Los procedimientos Sub realizan acciones, pero no devuelven un valor al código de llamada.
Los procedimientos de control de eventos son procedimientos Sub que se ejecutan en respuesta a un
evento debido a las acciones del usuario o a un incidente en un programa.
Los procedimientos Function devuelven un valor al código de llamada. Pueden realizar otras acciones
antes de devolver el valor.
Algunas funciones escritas en C# devuelven un valor devuelto de referencia. Los autores de llamadas a
funciones pueden modificar el valor devuelto. Esta modificación se refleja en el estado del objeto al que se
ha llamado. A partir de Visual Basic 2017, el código de Visual Basic puede consumir referencias de valores
devueltos, aunque no puede devolver un valor por la referencia. Para obtener más información, consulte
Valores devueltos de referencia.
Los procedimientos Property devuelven y asignan valores de propiedades en objetos o módulos.
Los procedimientos Operator definen el comportamiento de un operador estándar cuando uno de los
operandos (o ambos) es una clase definida recientemente o una estructura.
Los procedimientos genéricos de Visual Basic definen uno o varios parámetros de tipo además de sus
parámetros normales, por lo que el código de llamada puede pasar tipos de datos determinados cada vez
que se hace una llamada.

Procedimientos y código estructurado


Cada línea de código ejecutable de la aplicación debe formar parte de algún procedimiento, como Main ,
calculate o Button1_Click . Si subdivide los procedimientos grandes en partes más pequeñas, la aplicación será
más legible.
Los procedimientos son útiles para realizar tareas repetitivas o compartidas, como cálculos usados
frecuentemente, la manipulación y el control de texto, o las operaciones de bases de datos. Puede llamar un
procedimiento desde muchos lugares diferentes del código, por lo que puede usar los procedimientos como
bloques de creación para la aplicación.
Estructurar el código con procedimientos le ofrece las ventajas siguientes:
Los procedimientos permiten desglosar los programas en unidades lógicas discretas. Puede depurar
unidades independientes más fácilmente que todo un programa sin procedimientos.
Después de desarrollar procedimientos para su uso en un programa, se pueden usar en otros, a menudo
con poca o ninguna modificación. Esto ayuda a evitar la duplicación de código.

Vea también
Crear un procedimiento
Subprocedimientos
Procedimientos de función
Procedimientos de propiedades
Procedimientos de operadores
Argumentos y parámetros de procedimiento
Procedimientos recursivos
Sobrecarga de procedimientos
Generic Procedures in Visual Basic
Objetos y clases
Instrucciones en Visual Basic
21/03/2020 • 23 minutes to read • Edit Online

Una instrucción en Visual Basic es una instrucción completa. Puede contener palabras clave, operadores,
variables, constantes y expresiones. Cada instrucción pertenece a una de las siguientes categorías:
Declaraciones , que nombran una variable, constante o procedimiento, y también pueden especificar un
tipo de datos.
Executable Statements , que inician acciones. Estas instrucciones pueden llamar a un método o
función, y pueden recorrer en bucle o bifurcar a través de bloques de código. Las instrucciones
ejecutables incluyen instrucciones de asignación , que asignan un valor o una expresión a una
variable o constante.
En este tema se describe cada categoría. Además, en este tema se describe cómo combinar varias instrucciones
en una sola línea y cómo continuar una instrucción en varias líneas.

Instrucciones de declaración
Las instrucciones de declaración se utilizan para asignar un nombre y definir procedimientos, variables,
propiedades, matrices y constantes. Al declarar un elemento de programación, también puede definir su tipo de
datos, nivel de acceso y ámbito. Para obtener más información, vea Características de elementos declarados.
El ejemplo siguiente contiene tres declaraciones.

Public Sub ApplyFormat()


Const limit As Integer = 33
Dim thisWidget As New widget
' Insert code to implement the procedure.
End Sub

La primera declaración es la Sub declaración. Junto con End Sub su instrucción coincidente, applyFormat
declara un procedimiento denominado . También especifica que applyFormat Public es , lo que significa que
cualquier código que puede hacer referencia a él puede llamarlo.
La segunda declaración es la Const instrucción, que declara la constante, limit especificando el Integer tipo
de datos y un valor de 33.
La tercera declaración es la Dim instrucción, que declara la variable thisWidget . El tipo de datos es un objeto
específico, es decir, un objeto creado a partir de la Widget clase. Puede declarar una variable para que sea de
cualquier tipo de datos elemental o de cualquier tipo de objeto que se expone en la aplicación que está
utilizando.
Valores iniciales
Cuando se ejecuta el código que contiene una instrucción de declaración, Visual Basic reserva la memoria
necesaria para el elemento declarado. Si el elemento contiene un valor, Visual Basic lo inicializa en el valor
predeterminado para su tipo de datos. Para obtener más información, consulte "Comportamiento" en Dim
(instrucción).
Puede asignar un valor inicial a una variable como parte de su declaración, como se muestra en el ejemplo
siguiente.
Dim m As Integer = 45
' The preceding declaration creates m and assigns the value 45 to it.

Si una variable es una variable de objeto, puede crear explícitamente una instancia de su clase cuando la declare
mediante la palabra clave New Operator, como se muestra en el ejemplo siguiente.

Dim f As New System.Windows.Forms.Form()

Tenga en cuenta que el valor inicial que especifique en una instrucción de declaración no se asigna a una
variable hasta que la ejecución alcanza su instrucción de declaración. Hasta ese momento, la variable contiene
el valor predeterminado para su tipo de datos.

Declaraciones ejecutables
Una instrucción ejecutable realiza una acción. Puede llamar a un procedimiento, bifurcara a otro lugar del
código, recorrer varias instrucciones o evaluar una expresión. Una instrucción de asignación es un caso especial
de una instrucción ejecutable.
En el ejemplo If...Then...Else siguiente se utiliza una estructura de control para ejecutar diferentes bloques
de código en función del valor de una variable. Dentro de cada bloque For...Next de código, un bucle ejecuta
un número especificado de veces.

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

La instrucción del ejemplo anterior comprueba el clockwise valor del parámetro . Si el True valor es
If
spinClockwise , aWidget llama al método de . Si el False valor es spinCounterClockwise , aWidget llama al
método de . La If...Then...Else estructura de End If control termina con .
El For...Next bucle dentro de cada bloque llama al método adecuado revolutions un número de veces igual
al valor del parámetro.

Declaraciones de asignación
Las instrucciones de asignación llevan a cabo operaciones de asignación, = que consisten en tomar el valor en
el lado derecho del operador de asignación ( ) y almacenarlo en el elemento de la izquierda, como en el ejemplo
siguiente.

v = 42

En el ejemplo anterior, la instrucción de asignación v almacena el valor literal 42 en la variable .


Elementos de programación elegibles
El elemento de programación en el lado izquierdo del operador de asignación debe ser capaz de aceptar y
almacenar un valor. Esto significa que debe ser una variable o propiedad que no sea ReadOnly, o debe ser un
elemento de matriz. En el contexto de una instrucción de asignación, un elemento de este tipo a veces se
denomina lvalue, para "valor izquierdo."
El valor en el lado derecho del operador de asignación se genera mediante una expresión, que puede constar de
cualquier combinación de literales, constantes, variables, propiedades, elementos de matriz, otras expresiones o
llamadas de función. Esto se ilustra en el siguiente ejemplo.

x = y + z + FindResult(3)

En el ejemplo anterior se agrega y el valor mantenido z en variable al valor mantenido en findResult


variable y, a continuación, se agrega el valor devuelto por la llamada a la función . A continuación, el valor total
x de esta expresión se almacena en variable .

Tipos de datos en extractos de asignación


Además de los valores numéricos, el operador de asignación también puede asignar String valores, como se
muestra en el ejemplo siguiente.

Dim a, b As String
a = "String variable assignment"
b = "Con" & "cat" & "enation"
' The preceding statement assigns the value "Concatenation" to b.

También puede Boolean asignar valores, Boolean mediante un Boolean literal o una expresión, como se
muestra en el ejemplo siguiente.

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.

Del mismo modo, puede asignar valores Char Date adecuados Object a los elementos de programación del
tipo de datos , , o . También puede asignar una instancia de objeto a un elemento declarado como de la clase
desde la que se crea esa instancia.
Declaraciones de asignación compuesta
Las instrucciones de asignación compuesta realizan primero una operación en una expresión antes de asignarla
a un elemento de programación. En el ejemplo siguiente se += muestra uno de estos operadores, , que
incrementa el valor de la variable en el lado izquierdo del operador por el valor de la expresión de la derecha.

n += 1

En el ejemplo anterior se agrega n 1 al valor de n , y, a continuación, almacena ese nuevo valor en . Es un


equivalente abreviado de la siguiente declaración:

n = n + 1

Se puede realizar una variedad de operaciones de asignación de compuestos utilizando operadores de este
tipo. Para obtener una lista de estos operadores y más información sobre ellos, consulte Operadores de
asignación.
El operador de &= asignación de concatenación ( ) es útil para agregar una cadena al final de cadenas ya
existentes, como se muestra en el ejemplo siguiente.

Dim q As String = "Sample "


q &= "String"
' q now contains "Sample String".

Escriba Conversiones en extractos de asignación


El valor que asigne a una variable, propiedad o elemento de matriz debe ser de un tipo de datos adecuado para
ese elemento de destino. En general, debe intentar generar un valor del mismo tipo de datos que el del
elemento de destino. Sin embargo, algunos tipos se pueden convertir a otros tipos durante la asignación.
Para obtener información sobre la conversión entre tipos de datos, vea Conversionesde tipos en Visual Basic .
En resumen, Visual Basic convierte automáticamente un valor de un tipo determinado a cualquier otro tipo al
que se amplía. Una conversión de ampliación es una que siempre se realiza correctamente en tiempo de
ejecución y no pierde ningún dato. Por ejemplo, Visual Basic Integer convierte Double un valor Integer en
cuando Double sea apropiado, porque se amplía a . Para obtener más información, consulta Widening and
Narrowing Conversions.
Las conversiones de restricción (aquellas que no se están ampliando) conllevan un riesgo de error en tiempo de
ejecución o de pérdida de datos. Puede realizar una conversión de restricción explícitamente mediante una
función de conversión de Option Strict Off tipos, o puede indicar al compilador que realice todas las
conversiones implícitamente estableciendo . Para obtener más información, vea Conversiones implícitas y
explícitas.

Poner varias declaraciones en una línea


Puede tener varias instrucciones en una sola línea : separadas por el carácter de dos puntos ( ). Esto se ilustra
en el siguiente ejemplo.

Dim sampleString As String = "Hello World" : MsgBox(sampleString)

Aunque ocasionalmente es conveniente, esta forma de sintaxis hace que el código sea difícil de leer y mantener.
Por lo tanto, se recomienda que mantenga una instrucción en una línea.

Continuar con una declaración sobre varias líneas


Una instrucción normalmente cabe en una línea, pero cuando es demasiado larga, puede continuarla en la
siguiente línea utilizando una secuencia de continuación de línea, que consta de un espacio seguido de un
carácter de subrayado ( _ ) seguido de un retorno de carro. En el ejemplo MsgBox siguiente, la instrucción
ejecutable se continúa en dos líneas.

Public Sub DemoBox()


Dim nameVar As String
nameVar = "John"
MsgBox("Hello " & nameVar _
& ". How are you?")
End Sub

Continuación implícita de la línea


En muchos casos, puede continuar una instrucción en la _ siguiente línea consecutiva sin usar el carácter de
subrayado ( ). Los siguientes elementos de sintaxis continúan implícitamente la instrucción en la siguiente línea
de código.
Después de , una coma ( ). Por ejemplo:

Public Function GetUsername(ByVal username As String,


ByVal delimiter As Char,
ByVal position As Integer) As String

Return username.Split(delimiter)(position)
End Function

Después de un paréntesis abierto ( ( ) o ) antes de un paréntesis de cierre ( ). Por ejemplo:

Dim username = GetUsername(


Security.Principal.WindowsIdentity.GetCurrent().Name,
CChar("\"),
1
)

Después de una { llave abierta ( ) o } antes de una llave de cierre ( ). Por ejemplo:

Dim customer = New Customer With {


.Name = "Terry Adams",
.Company = "Adventure Works",
.Email = "terry@www.adventure-works.com"
}

Para obtener más información, vea Inicializadores de objeto: tipos con nombre y anónimos o
inicializadores de colección.
Después de una <%= expresión incrustada abierta ( ) o %> antes del cierre de una expresión incrustada ( )
dentro de un literal XML. Por ejemplo:

Dim customerXml = <Customer>


<Name>
<%=
customer.Name
%>
</Name>
<Email>
<%=
customer.Email
%>
</Email>
</Customer>

Para obtener más información, consulte Expresiones incrustadas en XML.


Después del operador & de concatenación ( ). Por ejemplo:

cmd.CommandText =
"SELECT * FROM Titles JOIN Publishers " &
"ON Publishers.PubId = Titles.PubID " &
"WHERE Publishers.State = 'CA'"

Para obtener más información, consulte Operadores enumerados por funcionalidad.


Después de = &= los := += operadores de asignación ( , , , -= ,, *= , /= , \= , ^= , <<= . >>= Por
ejemplo:
Dim fileStream =
My.Computer.FileSystem.
OpenTextFileReader(filePath)

Para obtener más información, consulte Operadores enumerados por funcionalidad.


Después de + - los / * operadores binarios ( ^ >> , << And , AndAlso Or , OrElse Like , Xor
Mod <> , < , , > , <= , >= , , , , , ) dentro de una expresión. Por ejemplo:

Dim memoryInUse =
My.Computer.Info.TotalPhysicalMemory +
My.Computer.Info.TotalVirtualMemory -
My.Computer.Info.AvailablePhysicalMemory -
My.Computer.Info.AvailableVirtualMemory

Para obtener más información, consulte Operadores enumerados por funcionalidad.


Después Is IsNot de los operadores. Por ejemplo:

If TypeOf inStream Is
IO.FileStream AndAlso
inStream IsNot
Nothing Then

ReadFile(inStream)

End If

Para obtener más información, consulte Operadores enumerados por funcionalidad.


Después de un . carácter calificador de miembro ( ) y antes del nombre del miembro. Por ejemplo:

Dim fileStream =
My.Computer.FileSystem.
OpenTextFileReader(filePath)

Sin embargo, debe incluir un _ carácter de continuación de línea With ( ) después de un carácter
calificador de miembro cuando utilice la instrucción o proporcione valores en la lista de inicialización
para un tipo. Considere la posibilidad de romper la = línea después With del operador de asignación
(por ejemplo, ) cuando utilice instrucciones o listas de inicialización de objetos. Por ejemplo:
' 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 obtener más información, consulte Con... Finalizar con inicializadores de instrucción u objeto: tipos
con nombre y anónimos.
Después de un . calificador de propiedad de eje XML ( o .@ o ... ). Sin embargo, debe incluir un _
carácter de continuación de línea With ( ) cuando especifique un calificador de miembro cuando utilice
la palabra clave. Por ejemplo:

Dim customerName = customerXml.


<Name>.Value

Dim customerEmail = customerXml...


<Email>.Value

Para obtener más información, consulte Propiedades del eje XML.


Después de un signo menor que (<) > o antes de un signo mayor que ( ) cuando se especifica un
atributo. También después de un > signo mayor que ( ) cuando se especifica un atributo. Sin embargo,
debe incluir un _ carácter de continuación de línea ( ) al especificar atributos de nivel de ensamblado o
de nivel de módulo. Por ejemplo:

<
Serializable()
>
Public Class Customer
Public Property Name As String
Public Property Company As String
Public Property Email As String
End Class

Para obtener más información, consulte Introducción a los atributos.


Antes y después Aggregate Distinct de From Group By los Group Join Join operadores de consulta ( ,
Into On , Ascending , Descending , , , Take Take While Where In Let Order By , Select , Skip ,
Skip While , , , , , y ). No puede romper una línea entre las palabras clave de Order By los Group Join
Take While operadores Skip While de consulta que se componen de varias palabras clave ( , , , y ). Por
ejemplo:

Dim vsProcesses = From proc In


Process.GetProcesses
Where proc.MainWindowTitle.Contains("Visual Studio")
Select proc.ProcessName, proc.Id,
proc.MainWindowTitle

Para obtener más información, consulte Consultas.


Después In de For Each la palabra clave en una instrucción. Por ejemplo:

For Each p In
vsProcesses

Console.WriteLine("{0}" & vbTab & "{1}" & vbTab & "{2}",


p.ProcessName,
p.Id,
p.MainWindowTitle)
Next

Para obtener más información, consulte Para cada... Siguiente instrucción.


Después From de la palabra clave en un inicializador de colección. Por ejemplo:

Dim days = New List(Of String) From


{
"Mo", "Tu", "We", "Th", "F", "Sa", "Su"
}

Para obtener más información, vea Inicializadores de colección.

Adición de comentarios
El código fuente no siempre se explica por sí mismo, incluso para el programador que lo escribió. Para ayudar a
documentar su código, por lo tanto, la mayoría de los programadores hacen uso liberal de los comentarios
incrustados. Los comentarios en el código pueden explicar un procedimiento o una instrucción particular a
cualquier persona que lo lea o trabaje con él más adelante. Visual Basic omite los comentarios durante la
compilación y no afectan al código compilado.
Las líneas de comentario comienzan ' con REM un apóstrofo ( ) o seguido de un espacio. Se pueden agregar
en cualquier parte del código, excepto dentro de una cadena. Para anexar un comentario a una instrucción,
inserte un apóstrofo o REM después de la instrucción, seguido del comentario. Los comentarios también
pueden ir en su propia línea separada. En el ejemplo siguiente se muestran estas posibilidades.

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

Comprobación de errores de compilación


Si, después de escribir una línea de código, la línea se muestra con un subrayado azul ondulado (también puede
aparecer un mensaje de error), hay un error de sintaxis en la instrucción. Debe averiguar qué tiene que ver con
la instrucción (buscando en la lista de tareas o pasando el cursor sobre el error con el puntero del mouse y
leyendo el mensaje de error) y corregirlo. Hasta que haya corregido todos los errores de sintaxis en el código, el
programa no se compilará correctamente.

Secciones relacionadas
T ÉRM IN O DEF IN IC IÓ N

Operadores de asignación Proporciona vínculos a páginas de = *= referencia &= de


lenguaje que cubren operadores de asignación como , , y .

Operadores y expresiones Muestra cómo combinar elementos con operadores para


producir nuevos valores.

Interrumpir y combinar instrucciones en código Muestra cómo dividir una sola instrucción en varias líneas y
cómo colocar varias instrucciones en la misma línea.

Aplicar etiquetas a las instrucciones Muestra cómo etiquetar una línea de código.
Cadenas en Visual Basic
27/11/2019 • 2 minutes to read • Edit Online

En esta sección se describen los conceptos básicos del uso de cadenas en Visual Basic.

Esta sección
Introducción a las cadenas en Visual Basic
Muestra temas en los que se describen los conceptos básicos del uso de cadenas en Visual Basic.
Cómo: Crear cadenas mediante un objeto StringBuilder en Visual Basic
Muestra cómo crear eficazmente una cadena larga a partir de varias cadenas más pequeñas.
Buscar en una cadena
Muestra cómo se determina el índice de la primera aparición de una subcadena.
Conversión entre cadenas y otros tipos de datos en Visual Basic
Enumera temas en los que se describe cómo convertir cadenas en otros tipos de datos.
Validar cadenas en Visual Basic
Enumera temas en los que se explica cómo validar cadenas.
Tutorial: Cifrar y descifrar cadenas en Visual Basic
Muestra cómo cifrar y descifrar cadenas mediante la versión del proveedor de servicios criptográficos del
algoritmo 3DES (Triple Data Encryption Standard).

Vea también
Características del lenguaje Visual Basic
Variables en Visual Basic
27/11/2019 • 3 minutes to read • Edit Online

A menudo tiene que almacenar valores al realizar cálculos con Visual Basic. Por ejemplo, tal vez le interese calcular
varios valores, compararlos y realizar diversas operaciones con ellos, según el resultado de la comparación. Para
poder compararlos, debe conservar los valores.

Uso
Visual Basic, al igual que la mayoría de los lenguajes de programación, utiliza variables para almacenar valores. Las
variables tienen un nombre (la palabra que se usa para hacer referencia al valor contenido por la variable). Las
variables también tienen un tipo de datos (que determina el tipo de datos que puede almacenar la variable). Las
variables pueden representar una matriz si tienen que almacenar un conjunto indexado de elementos de datos
estrechamente relacionados.
La inferencia de tipo de variable local permite declarar variables sin especificar explícitamente un tipo de datos. En
su lugar, el compilador deduce el tipo de la variable a partir del tipo de la expresión de inicialización. Para obtener
más información, vea Local Type Inference (Inferencia de tipo de variable local) y Option Infer Statement
(Instrucción Option Infer).

Asignar valores
Para realizar cálculos y asignar el resultado a una variable debe usar instrucciones de asignación, como se muestra
en el ejemplo siguiente.

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

NOTE
El signo igual ( = ) de este ejemplo es un operador de asignación, no un operador de igualdad. El valor se asigna a la variable
applesSold .

Para obtener más información, vea How to: Move Data Into and Out of a Variable (Cómo: Introducir y extraer los
datos de una variable).

Variables y propiedades
Al igual que una variable, una propiedad representa un valor al que se puede tener acceso, pero es más compleja
que una variable. Una propiedad usa bloques de código que controlan cómo establecer y recuperar su valor. Para
obtener más información, vea Differences Between Properties and Variables in Visual Basic (Diferencias entre
propiedades y variables en Visual Basic).

Vea también
Declaración de variables
Variables de objeto
Solución de problemas de variables
Introducir y extraer los datos de una variable
Diferencias entre propiedades y variables en Visual Basic
Inferencia de tipo de variable local
XML en Visual Basic
27/11/2019 • 2 minutes to read • Edit Online

Visual Basic proporciona compatibilidad con lenguajes integrados que le permite interactuar con LINQ to XML.

En esta sección
En los temas de esta sección se presenta el uso de LINQ to XML con Visual Basic.

T EM A DESC RIP C IÓ N

Información general sobre LINQ to XML en Visual Basic Describe cómo Visual Basic admite LINQ to XML.

Crear XML en Visual Basic Describe cómo crear objetos de literales XML mediante el uso
de LINQ to XML.

Manipular XML en Visual Basic Describe cómo cargar y analizar XML mediante Visual Basic.

Obtener acceso a XML en Visual Basic Describe las propiedades de eje XML y los métodos LINQ to
XML para tener acceso a elementos y atributos XML.

Vea también
System.Xml.Linq
Literales XML
Propiedades del eje XML
LINQ to XML
Interoperabilidad COM (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

El Modelo de objetos componentes (COM) permite que un objeto exponga su funcionalidad a otros componentes
y aplicaciones host. La mayoría del software actual incluye objetos COM. Aunque los ensamblados .NET son la
mejor opción para las aplicaciones nuevas, en ocasiones deberá usar objetos COM. En esta sección se tratan
algunos de los problemas asociados con la creación y el uso de objetos COM con Visual Basic.

Esta sección
Introducción a la interoperabilidad COM
Proporciona información general sobre la interoperabilidad COM.
Cómo: Hacer referencia a objetos COM desde Visual Basic
Describe cómo agregar referencias a objetos COM que tienen bibliotecas de tipos.
Trabajar con controles ActiveX
Muestra cómo usar los controles ActiveX existentes para agregar características al cuadro de herramientas de
Visual Studio.
Tutorial: Llamar a las API de Windows
Describe el proceso de llamar a las API que forman parte del sistema operativo Windows.
Llamar a las API de Windows
Muestra cómo definir y llamar a la función MessageBox en User32.dll.
Llamar a una función de Windows que adopta tipos sin signo
Muestra cómo llamar a una función de Windows que tiene un parámetro de un tipo sin signo.
Tutorial: Crear objetos COM con Visual Basic
Describe el proceso de crear objetos COM con y sin la plantilla de clase COM.
Solución de problemas de interoperabilidad
Trata algunos de los problemas que pueden producirse al usar COM.
Interoperabilidad COM en aplicaciones .NET Framework
Proporciona información general sobre cómo usar objetos COM y .NET Framework en la misma aplicación.
Tutorial: Implementación de la herencia mediante objetos COM
Describe cómo usar objetos COM existentes como base para nuevos objetos.

Secciones relacionadas
Interoperating with Unmanaged Code (Interoperar con código no administrado)
Describe los servicios de interoperabilidad proporcionados por Common Language Runtime.
Exponer componentes COM en .NET Framework
Describe el proceso de llamar a tipos COM mediante la interoperabilidad COM.
Exponer componentes de .NET Framework en COM
Describe la preparación y el uso de tipos administrados desde COM.
Aplicar atributos de interoperabilidad
Describe los atributos que se pueden usar al trabajar con código no administrado.
Información general sobre la interoperabilidad COM
(Visual Basic)
27/11/2019 • 6 minutes to read • Edit Online

El modelo de objetos componentes (COM) permite a un objeto exponer su funcionalidad a otros componentes y a
las aplicaciones host. Aunque los objetos COM son fundamentales para la programación de Windows durante
muchos años, las aplicaciones diseñadas para el Common Language Runtime (CLR) ofrecen muchas ventajas.
.NET Framework aplicaciones reemplazarán finalmente a las que se desarrollaron con COM. Hasta entonces, puede
que tenga que usar o crear objetos COM mediante Visual Studio. La interoperabilidad con COM, o la
interoperabilidad com, le permite usar objetos com existentes mientras realiza la transición al .NET Framework a su
propio ritmo.
Mediante el .NET Framework para crear componentes COM, puede usar la interoperabilidad COM sin registro. Esto
le permite controlar qué versión de DLL está habilitada cuando se instala más de una versión en un equipo y
permite a los usuarios finales usar XCOPY o FTP para copiar la aplicación en un directorio adecuado en su equipo
donde se puede ejecutar. Para obtener más información, consulte interoperabilidad com sin registro.

Código administrado y datos


El código desarrollado para el .NET Framework se conoce como código administradoy contiene metadatos
utilizados por el CLR. Los datos utilizados por .NET Framework aplicaciones se denominan datos administrados
porque el tiempo de ejecución administra tareas relacionadas con datos, como la asignación y la recuperación de
memoria y la comprobación de tipos. De forma predeterminada, Visual Basic .NET utiliza código y datos
administrados, pero puede tener acceso al código no administrado y a los datos de objetos COM mediante
ensamblados de interoperabilidad (que se describen más adelante en esta página).

Assemblies
Un ensamblado es el bloque de creación principal de una aplicación .NET Framework. Se trata de una colección de
funciones que se compila, se versionan e implementan como una sola unidad de implementación que contiene
uno o varios archivos. Cada ensamblado contiene un manifiesto de ensamblado.

Bibliotecas de tipos y manifiestos de ensamblado


Las bibliotecas de tipos describen las características de los objetos COM, como los nombres de los miembros y los
tipos de datos. Los manifiestos de ensamblado realizan la misma función para .NET Framework aplicaciones.
Incluyen información acerca de lo siguiente:
Identidad del ensamblado, versión, referencia cultural y firma digital.
Archivos que componen la implementación del ensamblado.
Tipos y recursos que componen el ensamblado. Esto incluye los que se exportan desde él.
Dependencias en tiempo de compilación de otros ensamblados.
Permisos necesarios para que el ensamblado se ejecute correctamente.
Para obtener más información sobre los ensamblados y los manifiestos de ensamblado, vea ensamblados en .net.
Importar y exportar bibliotecas de tipos
Visual Studio contiene una utilidad, Tlbimp, que le permite importar información de una biblioteca de tipos en una
aplicación .NET Framework. Puede generar bibliotecas de tipos a partir de ensamblados mediante la utilidad
Tlbexp.
Para obtener información acerca de Tlbimp y Tlbexp, vea Tlbimp. exe (importador de la biblioteca de tipos) y
Tlbexp. exe (exportador de la biblioteca de tipos).

Ensamblados de interoperabilidad
Los ensamblados de interoperabilidad son .NET Framework ensamblados que se enlazan entre código
administrado y no administrado, asignando miembros de objetos COM a miembros administrados de .NET
Framework equivalentes. Los ensamblados de interoperabilidad creados por Visual Basic .NET controlan muchos
de los detalles del trabajo con objetos COM, como el cálculo de referencias de interoperabilidad.

Serialización de interoperabilidad
Todas las aplicaciones .NET Framework comparten un conjunto de tipos comunes que permiten la
interoperabilidad de objetos, independientemente del lenguaje de programación que se use. Los parámetros y los
valores devueltos de los objetos COM a veces utilizan tipos de datos que difieren de los usados en código
administrado. El cálculo de referencias de interoperabilidad es el proceso de empaquetar parámetros y devolver
valores en tipos de datos equivalentes a medida que se mueven a objetos com y desde ellos. Para obtener más
información, consulte serialización de interoperabilidad.

Vea también
Interoperabilidad COM
Tutorial: Implementación de la herencia mediante objetos COM
Interoperating with Unmanaged Code (Interoperar con código no administrado)
Solución de problemas de interoperabilidad
Ensamblados de .NET
TlbImp.exe (Importador de la biblioteca de tipos)
Tlbexp.exe (Exportador de la biblioteca de tipos)
Serialización de interoperabilidad
Interoperabilidad COM sin registro
Cómo: Hacer referencia a objetos COM desde Visual
Basic
23/10/2019 • 4 minutes to read • Edit Online

En Visual Basic, la adición de referencias a objetos COM que tienen bibliotecas de tipos requiere la creación de un
ensamblado de interoperabilidad para la biblioteca COM. Las referencias a los miembros del objeto COM se
enrutan al ensamblado de interoperabilidad y, a continuación, se reenvían al objeto COM real. Las respuestas del
objeto COM se enrutan al ensamblado de interoperabilidad y se reenvían a la aplicación .NET Framework.
Puede hacer referencia a un objeto COM sin utilizar un ensamblado de interoperabilidad incrustando la
información de tipo para el objeto COM en un ensamblado .NET. Para insertar información de tipo, establezca la
propiedad Embed Interop Types en True para la referencia al objeto COM. Si va a compilar mediante el
compilador de línea de comandos, utilice la opción /link para hacer referencia a la biblioteca COM. Para obtener
más información, vea -Link (Visual Basic).
Visual Basic crea automáticamente ensamblados de interoperabilidad al agregar una referencia a una biblioteca de
tipos desde el entorno de desarrollo integrado (IDE). Al trabajar desde la línea de comandos, puede usar la utilidad
TlbImp para crear manualmente ensamblados de interoperabilidad.
Para agregar referencias a objetos COM
1. En el menú proyecto , elija Agregar referencia y, a continuación, haga clic en la pestaña com del cuadro
de diálogo.
2. Seleccione el componente que desea usar en la lista de objetos COM.
3. Para simplificar el acceso al ensamblado de interoperabilidad, agregue una instrucción Imports a la parte
superior de la clase o módulo en el que va a usar el objeto COM. Por ejemplo, en el ejemplo de código
siguiente se importa el espacio de nombres INKEDLib para los objetos a los que se hace referencia en la
biblioteca de Microsoft InkEdit Control 1.0 .

Imports INKEDLib

Class Sample
Private s As IInkCursor

End Class

Para crear un ensamblado de interoperabilidad mediante Tlbimp


1. Agregue la ubicación de Tlbimp a la ruta de búsqueda, si aún no forma parte de la ruta de acceso de
búsqueda y no está actualmente en el directorio donde se encuentra.
2. Llame a Tlbimp desde un símbolo del sistema y proporcione la siguiente información:
Nombre y ubicación de la DLL que contiene la biblioteca de tipos
Nombre y ubicación del espacio de nombres donde se debe colocar la información
Nombre y ubicación del ensamblado de interoperabilidad de destino
El siguiente fragmento de código muestra un ejemplo:
Tlbimp test3.dll /out:NameSpace1 /out:Interop1.dll

Puede usar TlbImp para crear ensamblados de interoperabilidad para bibliotecas de tipos, incluso para
objetos COM no registrados. Sin embargo, los objetos COM a los que hacen referencia los ensamblados de
interoperabilidad deben estar registrados correctamente en el equipo en el que se van a utilizar. Puede
registrar un objeto COM mediante la utilidad regsvr32 incluida en el sistema operativo Windows.

Vea también
Interoperabilidad COM
TlbImp.exe (Importador de la biblioteca de tipos)
Tlbexp.exe (Exportador de la biblioteca de tipos)
Tutorial: Implementación de la herencia mediante objetos COM
Solución de problemas de interoperabilidad
Imports (instrucción), espacio de nombres y tipo .NET
Cómo: Trabajar con controles ActiveX (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Los controles ActiveX son componentes COM u objetos que se pueden insertar en una página web o en otra
aplicación para reutilizar la funcionalidad empaquetada que otra persona ha programado. Puede usar controles
ActiveX desarrollados para Visual Basic 6,0 y versiones anteriores para agregar características al cuadro de
herramientas de Visual Studio.
Para agregar controles ActiveX al cuadro de herramientas
1. En el menú herramientas , haga clic en elegir elementos del cuadro de herramientas .
Aparece el cuadro de diálogo elegir cuadro de herramientas .
2. Haga clic en la pestaña componentes com .
3. Active la casilla situada junto al control ActiveX que desee usar y, a continuación, haga clic en Aceptar .
El nuevo control aparece con las demás herramientas del cuadro de herramientas .

NOTE
Puede utilizar la utilidad Aximp para crear manualmente un ensamblado de interoperabilidad para los controles
ActiveX. Para obtener más información, vea Aximp. exe (Windows Forms importador de controles ActiveX).

Vea también
Interoperabilidad COM
Procedimiento para agregar controles ActiveX a formularios Windows Forms
Aximp.exe (Importador de controles ActiveX de Windows Forms)
Consideraciones al hospedar un control ActiveX en Windows Forms
Solución de problemas de interoperabilidad
Tutorial: Llamar a las API de Windows (Visual Basic)
27/11/2019 • 18 minutes to read • Edit Online

Las API de Windows son bibliotecas de vínculos dinámicos (dll) que forman parte del sistema operativo Windows.
Se usan para realizar tareas cuando es difícil escribir procedimientos equivalentes propios. Por ejemplo, Windows
proporciona una función denominada FlashWindowEx que le permite hacer que la barra de título de una aplicación
alterne entre sombras claras y oscuras.
La ventaja de usar las API de Windows en el código es que pueden ahorrar tiempo de desarrollo porque contienen
docenas de funciones útiles que ya están escritas y en espera de usarse. El inconveniente es que las API de
Windows pueden ser difíciles de trabajar con y Unforgiving cuando hay algún problema.
Las API de Windows representan una categoría especial de interoperabilidad. Las API de Windows no usan código
administrado, no tienen bibliotecas de tipos integrados y usan tipos de datos que son diferentes de los que se
usan con Visual Studio. Debido a estas diferencias, y dado que las API de Windows no son objetos COM, la
interoperabilidad con las API de Windows y el .NET Framework se realiza mediante la invocación de plataforma o
PInvoke. La invocación de plataforma es un servicio que permite al código administrado llamar a funciones no
administradas implementadas en archivos dll. Para obtener más información, vea consumir funciones dll no
administradas. Puede usar PInvoke en Visual Basic mediante la instrucción Declare o aplicando el atributo
DllImport a un procedimiento vacío.

Las llamadas a la API de Windows eran una parte importante de la programación de Visual Basic en el pasado,
pero rara vez son necesarias con Visual Basic .NET. Siempre que sea posible, debe usar código administrado desde
el .NET Framework para realizar tareas, en lugar de llamadas a la API de Windows. En este tutorial se proporciona
información sobre las situaciones en las que es necesario usar las API de Windows.

NOTE
Es posible que el equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario
de Visual Studio en las siguientes instrucciones. La edición de Visual Studio que se tenga y la configuración que se utilice
determinan estos elementos. Para obtener más información, vea Personalizar el IDE.

Llamadas API mediante declare


La forma más común de llamar a las API de Windows es mediante la instrucción Declare .
Para declarar un procedimiento DLL
1. Determine el nombre de la función a la que desea llamar, además de sus argumentos, tipos de argumentos
y valor devuelto, así como el nombre y la ubicación del archivo DLL que lo contiene.

NOTE
Para obtener información completa sobre las API de Windows, consulte la documentación del SDK de Win32 en la
API de Windows de Platform SDK. Para obtener más información sobre las constantes que usan las API de Windows,
examine los archivos de encabezado como Windows. h incluido con el SDK de la plataforma.

2. Abra un nuevo proyecto de aplicación para Windows; para ello, haga clic en nuevo en el menú archivo y, a
continuación, haga clic en proyecto . Aparece el cuadro de diálogo Nuevo proyecto .
3. Seleccione aplicación de Windows en la lista de plantillas de proyecto de Visual Basic. Se muestra el
nuevo proyecto.
4. Agregue la siguiente función de Declare a la clase o módulo en el que desea utilizar el archivo DLL:

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 de la instrucción Declare


La instrucción Declare incluye los siguientes elementos.
Auto (modificador)
El modificador Auto indica al tiempo de ejecución que convierta la cadena basándose en el nombre del método
de acuerdo con las reglas de Common Language Runtime (o el nombre de alias si se especifica).
Palabras clave lib y alias
El nombre que sigue a la palabra clave Function es el nombre que usa el programa para tener acceso a la función
importada. Puede ser el mismo nombre real de la función a la que se está llamando, o bien se puede usar
cualquier nombre de procedimiento válido y, a continuación, utilizar la palabra clave Alias para especificar el
nombre real de la función a la que se está llamando.
Especifique la palabra clave Lib , seguida del nombre y la ubicación del archivo DLL que contiene la función a la
que llama. No es necesario especificar la ruta de acceso de los archivos que se encuentran en los directorios del
sistema de Windows.
Use la palabra clave Alias si el nombre de la función a la que está llamando no es un nombre de procedimiento
Visual Basic válido o si está en conflicto con el nombre de otros elementos de la aplicación. Alias indica el
nombre real de la función que se va a llamar.
Declaraciones de argumentos y tipos de datos
Declare los argumentos y sus tipos de datos. Esta parte puede ser desafiante, ya que los tipos de datos que usa
Windows no se corresponden con los tipos de datos de Visual Studio. Visual Basic realiza una gran cantidad de
trabajo mediante la conversión de argumentos en tipos de datos compatibles, un proceso denominado
serialización. Puede controlar explícitamente cómo se calculan las referencias de los argumentos mediante el
MarshalAsAttribute atributo definido en el espacio de nombres System.Runtime.InteropServices.

NOTE
Las versiones anteriores de Visual Basic permitían declarar parámetros As Any , lo que significa que se pueden usar datos
de cualquier tipo de datos. Visual Basic requiere que se use un tipo de datos específico para todas las instrucciones de
Declare .

Constantes de la API de Windows


Algunos argumentos son combinaciones de constantes. Por ejemplo, la API de MessageBox que se muestra en este
tutorial acepta un argumento entero denominado Typ que controla cómo se muestra el cuadro de mensaje.
Puede determinar el valor numérico de estas constantes examinando las instrucciones #define en el archivo
WinUser. h. Los valores numéricos se suelen mostrar en formato hexadecimal, por lo que es posible que desee
usar una calculadora para agregarlos y convertirlos a decimal. Por ejemplo, si desea combinar las constantes del
estilo de exclamación MB_ICONEXCLAMATION 0x00000030 y el estilo sí/no MB_YESNO 0x00000004, puede Agregar los
números y obtener un resultado de 0x00000034 o 52 decimal. Aunque puede usar el resultado decimal
directamente, es mejor declarar estos valores como constantes en la aplicación y combinarlos mediante el
operador Or .
P a r a d e c l a r a r c o n st a n t e s p a r a l a s l l a m a d a s a l a A P I d e W i n d o w s
1. Consulte la documentación de la función de Windows a la que está llamando. Determine el nombre de las
constantes que utiliza y el nombre del archivo. h que contiene los valores numéricos de estas constantes.
2. Use un editor de texto, como el Bloc de notas, para ver el contenido del archivo de encabezado (. h) y buscar
los valores asociados a las constantes que está usando. Por ejemplo, la API de MessageBox usa el
MB_ICONQUESTION constante para mostrar un signo de interrogación en el cuadro de mensaje. La definición
de MB_ICONQUESTION está en WinUser. h y aparece de la siguiente manera:
#define MB_ICONQUESTION 0x00000020L

3. Agregue instrucciones de Const equivalentes a la clase o módulo para que estas constantes estén
disponibles para la aplicación. Por ejemplo:

Const MB_ICONQUESTION As Integer = &H20


Const MB_YESNO As Integer = &H4
Const IDYES As Integer = 6
Const IDNO As Integer = 7

P a ra l l a ma r a l p ro c e d i mi e n t o DL L

1. Agregue un botón denominado Button1 al formulario de inicio del proyecto y, a continuación, haga doble
clic en él para ver su código. Se muestra el controlador de eventos para el botón.
2. Agregue código al controlador de eventos Click para el botón que agregó, para llamar al procedimiento y
proporcione los argumentos adecuados:

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. Ejecute el proyecto presionando F5. El cuadro de mensaje se muestra con los botones sí y sin respuesta.
Haga clic en cualquiera de ellas.
Serialización de datos
Visual Basic convierte automáticamente los tipos de datos de los parámetros y los valores devueltos para las
llamadas a la API de Windows, pero puede usar el atributo MarshalAs para especificar explícitamente los tipos de
datos no administrados que una API espera. Para obtener más información sobre el cálculo de referencias de
interoperabilidad, vea serialización de interoperabilidad.
P a r a u sa r d e c l a r e y M a r sh a l A s e n u n a l l a m a d a A P I

1. Determine el nombre de la función a la que desea llamar, además de sus argumentos, tipos de datos y valor
devuelto.
2. Para simplificar el acceso al MarshalAs atributo, agregue una instrucción Imports a la parte superior del
código de la clase o módulo, como en el ejemplo siguiente:

Imports System.Runtime.InteropServices
3. Agregue un prototipo de función para la función importada a la clase o módulo que está usando y aplique
el atributo MarshalAs a los parámetros o al valor devuelto. En el ejemplo siguiente, una llamada API que
espera el tipo void* se serializa como AsAny :

Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" (


ByVal x As Short,
<MarshalAsAttribute(UnmanagedType.AsAny)>
ByVal o As Object)

Llamadas API con DllImport


El atributo DllImport proporciona una segunda manera de llamar a funciones en archivos dll sin bibliotecas de
tipos. DllImport es aproximadamente equivalente a usar una instrucción de Declare pero proporciona más
control sobre cómo se llama a las funciones.
Puede usar DllImport con la mayoría de las llamadas a la API de Windows siempre y cuando la llamada haga
referencia a un método compartido (a veces denominado static). No se pueden usar métodos que requieran una
instancia de una clase. A diferencia de Declare instrucciones, las llamadas a DllImport no pueden usar el
atributo MarshalAs .
Para llamar a una API de Windows mediante el atributo DllImport
1. Abra un nuevo proyecto de aplicación para Windows; para ello, haga clic en nuevo en el menú archivo y, a
continuación, haga clic en proyecto . Aparece el cuadro de diálogo Nuevo proyecto .
2. Seleccione aplicación de Windows en la lista de plantillas de proyecto de Visual Basic. Se muestra el
nuevo proyecto.
3. Agregue un botón denominado Button2 al formulario de inicio.
4. Haga doble clic en Button2 para abrir la vista de código del formulario.
5. Para simplificar el acceso a DllImport , agregue una instrucción de Imports a la parte superior del código
para la clase de formulario de Inicio:

Imports System.Runtime.InteropServices

6. Declare una función vacía que preceda a la instrucción End Class del formulario y asigne a la función el
nombre MoveFile .
7. Aplique los modificadores Public y Shared a la declaración de función y establezca los parámetros para
MoveFile en función de los argumentos que utiliza la función de la API de Windows:

Public Shared Function MoveFile(


ByVal src As String,
ByVal dst As String) As Boolean
' Leave the body of the function empty.
End Function

La función puede tener cualquier nombre de procedimiento válido; el atributo DllImport especifica el
nombre en el archivo DLL. También controla el cálculo de referencias de interoperabilidad para los
parámetros y los valores devueltos, por lo que puede elegir los tipos de datos de Visual Studio que son
similares a los tipos de datos que usa la API.
8. Aplique el atributo DllImport a la función vacía. El primer parámetro es el nombre y la ubicación del
archivo DLL que contiene la función a la que se está llamando. No es necesario especificar la ruta de acceso
de los archivos que se encuentran en los directorios del sistema de Windows. El segundo parámetro es un
argumento con nombre que especifica el nombre de la función en la API de Windows. En este ejemplo, el
atributo DllImport fuerza que las llamadas a MoveFile se reenvíen a MoveFileW en KERNEL32. DLL. El
método MoveFileW copia un archivo de la ruta de acceso src a la ruta de acceso dst .

<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. Agregue código al controlador de eventos Button2_Click para llamar a la función:

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. Cree un archivo denominado test. txt y colóquelo en el directorio C:\Tmp del disco duro. Cree el directorio
tmp si es necesario.
11. Presione F5 para iniciar la aplicación. Aparece el formulario principal.
12. Haga clic en BUTTON2 . Se muestra el mensaje "el archivo se ha despasado correctamente" si se puede
cambiar el archivo.

Vea también
DllImportAttribute
MarshalAsAttribute
Declare (instrucción)
Auto
Alias
Interoperabilidad COM
Crear prototipos en código administrado
Serialización de un delegado como un método de devolución de llamada
Cómo: Llamar a las API de Windows (Visual Basic)
08/01/2020 • 2 minutes to read • Edit Online

En este ejemplo se define y se llama a la función MessageBox en user32. dll y, a continuación, se le pasa una cadena.

Ejemplo
' 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 el código
Para este ejemplo se necesita:
Una referencia al espacio de nombres System.

Programación sólida
Las condiciones siguientes pueden provocar una excepción:
El método no es estático, es abstracto o se ha definido previamente. El tipo primario es una interfaz o la
longitud del nombre o DllName es cero. (ArgumentException)
El nombre o DllName es Nothing . (ArgumentNullException)
Tipo contenedor que se ha creado anteriormente mediante CreateType . (InvalidOperationException)

Vea también
Aproximación a la invocación de plataforma
Ejemplos de invocación de plataforma
Consumir funciones DLL no administradas
Definir un método con la emisión de la reflexión
Tutorial: Llamar a las API de Windows
Interoperabilidad COM
Cómo: Llamar a una función de Windows que
adopta tipos sin signo (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Si está consumiendo una clase, un módulo o una estructura que tiene miembros de tipos enteros sin signo, puede
tener acceso a estos miembros con Visual Basic.

Para llamar a una función de Windows que toma un tipo sin signo
1. Use una instrucción Declare para indicar Visual Basic qué biblioteca contiene la función, cuál es su nombre
en esa biblioteca, cuál es la secuencia de llamada y cómo convertir cadenas al llamarla.
2. En la instrucción Declare , use UInteger , ULong , UShort o Byte según corresponda para cada parámetro
con un tipo sin signo.
3. Consulte la documentación de la función de Windows a la que está llamando para buscar los nombres y
valores de las constantes que usa. Muchos de ellos se definen en el archivo WinUser. h.
4. Declare las constantes necesarias en el código. Muchas constantes de Windows son valores sin signo de 32
bits y debe declarar estas As UInteger .
5. Llame a la función de la forma normal. En el ejemplo siguiente se llama a la función de Windows
MessageBox , que toma un argumento de entero sin signo.

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

Puede probar la función messageThroughWindows con el código siguiente.

Public Sub consumeWindowsMessage()


Dim w As New windowsMessage
w.messageThroughWindows()
End Sub

Cau t i on

Los tipos de datos UInteger , ULong , UShort y SByte no forman parte de la independencia del lenguaje y
de los componentes independientes del lenguaje (CLS), por lo que el código conforme a CLS no puede
consumir un componente que los utiliza.

IMPORTANT
La realización de una llamada a código no administrado, como la interfaz de programación de aplicaciones (API) de
Windows, expone el código a posibles riesgos de seguridad.

IMPORTANT
La llamada a la API de Windows requiere el permiso del código no administrado, lo que puede afectar a su ejecución
en situaciones de confianza parcial. Para obtener más información, vea SecurityPermission y permisos de acceso del
código.

Vea también
Tipos de datos
Integer (tipo de datos)
UInteger (tipo de datos)
Declare (instrucción)
Tutorial: Llamar a las API de Windows
Tutorial: Crear objetos COM con Visual Basic
27/11/2019 • 8 minutes to read • Edit Online

Al crear nuevas aplicaciones o componentes, es mejor crear ensamblados de .NET Framework. Sin embargo, Visual
Basic también facilita la exposición de un componente de .NET Framework a COM. Esto le permite proporcionar
nuevos componentes para conjuntos de aplicaciones anteriores que requieren componentes COM. En este tutorial
se muestra cómo usar Visual Basic para exponer objetos .NET Framework como objetos COM, con y sin la plantilla
de clase COM.
La forma más fácil de exponer objetos COM es usar la plantilla de clase COM. La plantilla de clase COM crea una
nueva clase y, a continuación, configura el proyecto para generar la clase y el nivel de interoperabilidad como un
objeto COM y registrarlo en el sistema operativo.

NOTE
Aunque también puede exponer una clase creada en Visual Basic como un objeto COM para el uso de código no
administrado, no es un objeto COM verdadero y Visual Basic no puede usar. Para obtener más información, consulte
interoperabilidad com en aplicaciones .NET Framework.

NOTE
Es posible que el equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario
de Visual Studio en las siguientes instrucciones. La edición de Visual Studio que se tenga y la configuración que se utilice
determinan estos elementos. Para obtener más información, vea Personalizar el IDE.

Para crear un objeto COM mediante la plantilla de clase COM


1. Abra un nuevo proyecto de aplicación de Windows desde el menú archivo haciendo clic en nuevo
proyecto .
2. En el cuadro de diálogo nuevo proyecto , en el campo tipos de proyecto , compruebe que está
seleccionada la opción Windows. Seleccione biblioteca de clases en la lista plantillas y, a continuación,
haga clic en Aceptar . Se muestra el nuevo proyecto.
3. Seleccione Agregar nuevo elemento en el menú proyecto . Se abrirá el cuadro de diálogo Agregar
nuevo elemento .
4. Seleccione clase com en la lista de plantillas y, a continuación, haga clic en Agregar . Visual Basic agrega
una nueva clase y configura el nuevo proyecto para la interoperabilidad COM.
5. Agregue código como propiedades, métodos y eventos a la clase COM.
6. Seleccione compilar ClassLibrar y1 en el menú compilar . Visual Basic crea el ensamblado y registra el
objeto COM con el sistema operativo.

Crear objetos COM sin la plantilla de clase COM


También puede crear una clase COM manualmente en lugar de usar la plantilla de clase COM. Este procedimiento
es útil cuando se trabaja desde la línea de comandos o cuando se desea tener más control sobre cómo se definen
los objetos COM.
Para configurar el proyecto para generar un objeto COM
1. Abra un nuevo proyecto de aplicación de Windows desde el menú archivo haciendo clic en NewProject .
2. En el cuadro de diálogo nuevo proyecto , en el campo tipos de proyecto , compruebe que está
seleccionada la opción Windows. Seleccione biblioteca de clases en la lista plantillas y, a continuación,
haga clic en Aceptar . Se muestra el nuevo proyecto.
3. En el Explorador de soluciones , haga clic con el botón derecho del mouse en su proyecto y después
seleccione Propiedades . Se muestra el Diseñador de proyectos .
4. Haga clic en la pestaña Compilar .
5. Active la casilla registrar para interoperabilidad com .
Para configurar el código de la clase para crear un objeto COM
1. En Explorador de soluciones , haga doble clic en Class1. VB para mostrar su código.
2. Cambie el nombre de la clase a ComClass1 .
3. Agregue las siguientes constantes a ComClass1 . Almacenarán las constantes de identificador único global
(GUID) que los objetos COM deben tener.

Public Const ClassId As String = ""


Public Const InterfaceId As String = ""
Public Const EventsId As String = ""

4. En el menú Herramientas , haga clic en Crear GUID . En el cuadro de diálogo Crear GUID , haga clic en
Formato de Registro y luego en Copiar . Haga clic en Salir .
5. Reemplace la cadena vacía del ClassId por el GUID y quite las llaves iniciales y finales. Por ejemplo, si el
GUID proporcionado por Guidgen es "{2C8B0AEE-02C9-486e-B809-C780A11530FE}" , el código debería aparecer
de la siguiente manera.

Public Const ClassId As String = "2C8B0AEE-02C9-486e-B809-C780A11530FE"

6. Repita los pasos anteriores para las constantes InterfaceId y EventsId , como en el ejemplo siguiente.

Public Const InterfaceId As String = "3D8B5BA4-FB8C-5ff8-8468-11BF6BD5CF91"


Public Const EventsId As String = "2B691787-6ED7-401e-90A4-B3B9C0360E31"

NOTE
Asegúrese de que los GUID son nuevos y únicos; de lo contrario, el componente COM podría estar en conflicto con
otros componentes COM.

7. Agregue el atributo ComClass a ComClass1 , especificando los GUID para el identificador de clase, el
identificador de interfaz y el identificador de eventos, como en el ejemplo siguiente:

<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)>


Public Class ComClass1

8. Las clases COM deben tener un constructor de Public Sub New() sin parámetros o la clase no se registrará
correctamente. Agregue un constructor sin parámetros a la clase:
Public Sub New()
MyBase.New()
End Sub

9. Agregue propiedades, métodos y eventos a la clase, y finalice con una instrucción End Class . Seleccione
compilar solución en el menú compilar . Visual Basic crea el ensamblado y registra el objeto COM con el
sistema operativo.

NOTE
Los objetos COM generados con Visual Basic no pueden ser utilizados por otras aplicaciones Visual Basic porque no
son objetos COM verdaderos. Los intentos de agregar referencias a estos objetos COM producirán un error. Para
obtener más información, consulte interoperabilidad com en aplicaciones .NET Framework.

Vea también
ComClassAttribute
Interoperabilidad COM
Tutorial: Implementación de la herencia mediante objetos COM
#Region (directiva)
Interoperabilidad COM en aplicaciones .NET Framework
Solución de problemas de interoperabilidad
Solucionar problemas de interoperabilidad (Visual
Basic)
27/11/2019 • 18 minutes to read • Edit Online

Al interoperar entre COM y el código administrado del .NET Framework, puede encontrar uno o varios de los
siguientes problemas comunes.

Serialización de interoperabilidad
En ocasiones, puede que tenga que usar tipos de datos que no forman parte de la .NET Framework. Los
ensamblados de interoperabilidad controlan la mayor parte del trabajo de los objetos COM, pero puede que
tenga que controlar los tipos de datos que se utilizan cuando los objetos administrados se exponen a COM. Por
ejemplo, las estructuras de las bibliotecas de clases deben especificar el BStr tipo no administrado en las cadenas
enviadas a los objetos COM creados por Visual Basic 6,0 y versiones anteriores. En tales casos, puede usar el
atributo MarshalAsAttribute para que los tipos administrados se expongan como tipos no administrados.

Exportar cadenas de longitud fija a código no administrado


En Visual Basic 6,0 y versiones anteriores, las cadenas se exportan a objetos COM como secuencias de bytes sin
un carácter de terminación null. Por compatibilidad con otros lenguajes, Visual Basic .NET incluye un carácter de
terminación al exportar cadenas. La mejor manera de abordar esta incompatibilidad es exportar cadenas que
carecen del carácter de terminación como matrices de Byte o Char .

Exportar jerarquías de herencia


Las jerarquías de clases administradas se acoplan cuando se exponen como objetos COM. Por ejemplo, si define
una clase base con un miembro y, a continuación, hereda la clase base en una clase derivada que se expone como
un objeto COM, los clientes que usan la clase derivada en el objeto COM no podrán usar los miembros heredados.
Solo se puede tener acceso a los miembros de clase base desde objetos COM como instancias de una clase base y,
a continuación, solo si la clase base también se crea como un objeto COM.

Métodos sobrecargados
Aunque puede crear métodos sobrecargados con Visual Basic, no son compatibles con COM. Cuando una clase
que contiene métodos sobrecargados se expone como un objeto COM, se generan nuevos nombres de método
para los métodos sobrecargados.
Por ejemplo, considere una clase que tiene dos sobrecargas del método Synch . Cuando la clase se expone como
un objeto COM, los nuevos nombres de método generados podrían ser Synch y Synch_2 .
El cambio de nombre puede producir dos problemas para los consumidores del objeto COM.
1. Es posible que los clientes no esperen los nombres de método generados.
2. Los nombres de método generados en la clase expuesta como un objeto COM pueden cambiar cuando se
agregan nuevas sobrecargas a la clase o a su clase base. Esto puede producir problemas de control de
versiones.
Para resolver ambos problemas, asigne a cada método un nombre único, en lugar de usar sobrecarga, al
desarrollar objetos que se expondrán como objetos COM.
Uso de objetos COM mediante ensamblados de interoperabilidad
Los ensamblados de interoperabilidad se usan casi como si fueran reemplazos de código administrados para los
objetos COM que representan. Sin embargo, dado que son contenedores y no objetos COM reales, existen
algunas diferencias entre el uso de ensamblados de interoperabilidad y ensamblados estándar. Estas áreas de
diferencia incluyen la exposición de las clases y los tipos de datos de los parámetros y los valores devueltos.

Clases que se exponen como interfaces y clases


A diferencia de las clases de los ensamblados estándar, las clases COM se exponen en ensamblados de
interoperabilidad como una interfaz y una clase que representa la clase COM. El nombre de la interfaz es idéntico
al de la clase COM. El nombre de la clase de interoperabilidad es el mismo que el de la clase COM original, pero
con la palabra "class" anexada. Por ejemplo, supongamos que tiene un proyecto con una referencia a un
ensamblado de interoperabilidad para un objeto COM. Si la clase COM se denomina MyComClass , IntelliSense y el
Examinador de objetos muestran una interfaz denominada MyComClass y una clase denominada MyComClassClass .

Crear instancias de una clase .NET Framework


Generalmente, se crea una instancia de una clase .NET Framework mediante la instrucción New con un nombre de
clase. Tener una clase COM representada por un ensamblado de interoperabilidad es el único caso en el que se
puede utilizar la instrucción New con una interfaz. A menos que use la clase COM con una instrucción Inherits ,
puede usar la interfaz de la misma forma que una clase. En el código siguiente se muestra cómo crear un objeto
de Command en un proyecto que tiene una referencia al objeto COM de la biblioteca de Microsoft Objetos de datos
ActiveX 2,8:

Dim cmd As New ADODB.Command

Sin embargo, si usa la clase COM como base para una clase derivada, debe usar la clase de interoperabilidad que
representa la clase COM, como en el código siguiente:

Class DerivedCommand
Inherits ADODB.CommandClass
End Class

NOTE
Los ensamblados de interoperabilidad implementan implícitamente interfaces que representan clases COM. No debe
intentar usar la instrucción Implements para implementar estas interfaces o se producirá un error.

Tipos de datos de parámetros y valores devueltos


A diferencia de los miembros de ensamblados estándar, los miembros de ensamblado de interoperabilidad
pueden tener tipos de datos que difieren de los usados en la declaración del objeto original. Aunque los
ensamblados de interoperabilidad convierten implícitamente los tipos COM en tipos de Common Language
Runtime compatibles, debe prestar atención a los tipos de datos que se usan en ambos lados para evitar errores
en tiempo de ejecución. Por ejemplo, en los objetos COM creados en Visual Basic 6,0 y versiones anteriores, los
valores de tipo Integer suponen el .NET Framework tipo equivalente, Short . Se recomienda usar el Examinador
de objetos para examinar las características de los miembros importados antes de usarlos.

Métodos COM de nivel de módulo


La mayoría de los objetos COM se usan al crear una instancia de una clase COM mediante la palabra clave New y,
a continuación, llamar a los métodos del objeto. Una excepción a esta regla implica objetos COM que contienen
AppObj o GlobalMultiUse clases COM. Estas clases son similares a los métodos de nivel de módulo en Visual
Basic clases .NET. Visual Basic 6,0 y versiones anteriores crean implícitamente instancias de estos objetos por
primera vez que se llama a uno de sus métodos. Por ejemplo, en Visual Basic 6,0 puede Agregar una referencia a
la biblioteca de objetos de Microsoft DAO 3,6 y llamar al método DBEngine sin crear primero una instancia:

Dim db As DAO.Database
' Open the database.
Set db = DBEngine.OpenDatabase("C:\nwind.mdb")
' Use the database object.

Visual Basic .NET requiere que siempre se creen instancias de objetos COM antes de poder usar sus métodos. Para
usar estos métodos en Visual Basic, declare una variable de la clase deseada y use la palabra clave New para
asignar el objeto a la variable de objeto. La palabra clave Shared se puede usar cuando se desea asegurarse de
que solo se crea una instancia de la clase.

' 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

Errores no controlados en los controladores de eventos


Un problema común de interoperabilidad implica errores en los controladores de eventos que controlan los
eventos generados por objetos COM. Estos errores se omiten a menos que compruebe específicamente si hay
errores mediante instrucciones On Error o Try...Catch...Finally . Por ejemplo, el ejemplo siguiente es de un
proyecto Visual Basic .NET que tiene una referencia al objeto COM de la biblioteca de Microsoft Objetos de datos
ActiveX 2,8.
' 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 ejemplo genera un error según lo esperado. Sin embargo, si intenta usar el mismo ejemplo sin el bloque
Try...Catch...Finally , el error se omite como si utilizara la instrucción OnError Resume Next . Sin el control de
errores, se produce un error en la división por cero de forma silenciosa. Dado que tales errores nunca generan
errores de excepción no controlados, es importante usar algún tipo de control de excepciones en los
controladores de eventos que controlan los eventos de los objetos COM.
Descripción de los errores de interoperabilidad COM
Sin el control de errores, las llamadas de interoperabilidad a menudo generan errores que proporcionan poca
información. Siempre que sea posible, utilice el control de errores estructurado para proporcionar más
información acerca de los problemas cuando se producen. Esto puede ser especialmente útil al depurar
aplicaciones. Por ejemplo:

Try
' Place call to COM object here.
Catch ex As Exception
' Display information about the failed call.
End Try

Puede encontrar información como la descripción del error, HRESULT y el origen de los errores COM mediante el
examen del contenido del objeto de excepción.

Problemas de controles ActiveX


La mayoría de los controles ActiveX que funcionan con Visual Basic 6,0 funcionan con Visual Basic .NET sin
problemas. Las excepciones principales son los controles de contenedor o los controles que contienen
visualmente otros controles. A continuación se indican algunos ejemplos de controles anteriores que no
funcionan correctamente con Visual Studio:
Control de marco de Microsoft Forms 2,0
Control de flechas, también conocido como control de número
Control de pestaña Sheridan
Solo existen algunas soluciones alternativas para los problemas de control ActiveX no admitidos. Puede migrar los
controles existentes a Visual Studio si es el propietario del código fuente original. De lo contrario, puede consultar
a los proveedores de software para actualizarlos. Versiones de controles compatibles con NET para reemplazar
controles ActiveX no compatibles.

Pasar propiedades ReadOnly de controles ByRef


A veces Visual Basic .NET genera errores COM como "error 0x800A017F CTL_E_SETNOTSUPPORTED", cuando se
pasan ReadOnly propiedades de algunos controles ActiveX anteriores como parámetros ByRef a otros
procedimientos. Las llamadas a procedimientos similares desde Visual Basic 6,0 no generan un error, y los
parámetros se tratan como si se hubieran pasado por valor. El mensaje de error de Visual Basic .NET indica que
está intentando cambiar una propiedad que no tiene una propiedad Set procedimiento.
Si tiene acceso al procedimiento al que se llama, puede evitar este error si usa la palabra clave ByVal para
declarar los parámetros que aceptan ReadOnly propiedades. Por ejemplo:

Sub ProcessParams(ByVal c As Object)


'Use the arguments here.
End Sub

Si no tiene acceso al código fuente para el procedimiento al que se llama, puede forzar que la propiedad se pase
por valor agregando un conjunto adicional de corchetes alrededor del procedimiento que realiza la llamada. Por
ejemplo, en un proyecto que tenga una referencia al objeto COM de la biblioteca de Microsoft Objetos de datos
ActiveX 2,8, puede usar:

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

Implementar ensamblados que exponen la interoperabilidad


La implementación de ensamblados que exponen interfaces COM presenta algunos desafíos únicos. Por ejemplo,
un posible problema se produce cuando las aplicaciones independientes hacen referencia al mismo ensamblado
COM. Esta situación es habitual cuando se instala una nueva versión de un ensamblado y otra aplicación sigue
usando la versión anterior del ensamblado. Si desinstala un ensamblado que comparte un archivo DLL, puede
hacer que no esté disponible de forma involuntaria para los demás ensamblados.
Para evitar este problema, debe instalar los ensamblados compartidos en la caché de ensamblados global (GAC) y
utilizar un módulo CRT para el componente. Si no puede instalar la aplicación en la GAC, debe instalarse en
CommonFilesFolder en un subdirectorio específico de la versión.
Los ensamblados que no se comparten se deben ubicar en paralelo en el directorio con la aplicación que realiza la
llamada.
Vea también
MarshalAsAttribute
Interoperabilidad COM
TlbImp.exe (Importador de la biblioteca de tipos)
Tlbexp.exe (Exportador de la biblioteca de tipos)
Tutorial: Implementación de la herencia mediante objetos COM
Inherits (instrucción)
Caché global de ensamblados
Interoperabilidad COM en aplicaciones .NET
Framework (Visual Basic)
20/02/2020 • 2 minutes to read • Edit Online

Si desea usar objetos COM y .NET Framework objetos en la misma aplicación, debe abordar las diferencias en la
forma en que los objetos existen en la memoria. Un objeto de .NET Framework se encuentra en la memoria
administrada (la memoria controlada por el Common Language Runtime) y puede moverse por el tiempo de
ejecución según sea necesario. Un objeto COM se encuentra en la memoria no administrada y no se espera que
se mueva a otra ubicación de memoria. Visual Studio y el .NET Framework proporcionan herramientas para
controlar la interacción de estos componentes administrados y no administrados. Para obtener más información
sobre el código administrado, vea Common Language Runtime.
Además de usar objetos COM en aplicaciones .NET, puede que también desee usar Visual Basic para desarrollar
objetos accesibles desde código no administrado a través de COM.
Los vínculos de esta página proporcionan detalles sobre las interacciones entre los objetos COM y .NET
Framework.

Secciones relacionadas

Interoperabilidad COM Proporciona vínculos a temas que tratan sobre la


interoperabilidad COM en Visual Basic, incluidos objetos
COM, controles ActiveX, archivos dll de Win32, objetos
administrados y herencia de objetos COM.

Interoperating with Unmanaged Code (Interoperar con Describe brevemente algunos de los problemas de
código no administrado) interacción entre el código administrado y no administrado, y
proporciona vínculos para seguir estudiando.

Contenedores COM Describe los contenedores a los que se puede llamar en


tiempo de ejecución, que permiten que el código
administrado llame a métodos COM, y a contenedores COM
Invocables, que permiten a los clientes COM llamar a
métodos de objeto .NET.

Interoperabilidad COM avanzada Proporciona vínculos a temas que tratan sobre la


interoperabilidad COM con respecto a contenedores,
excepciones, herencia, subprocesamiento, eventos,
conversiones y serialización.

TlbImp.exe (Importador de la biblioteca de tipos) Describe la herramienta que se puede usar para convertir las
definiciones de tipos que se encuentran en una biblioteca de
tipos COM en definiciones equivalentes en un ensamblado
de Common Language Runtime.
Tutorial: Implementar la herencia mediante objetos
COM (Visual Basic)
27/11/2019 • 11 minutes to read • Edit Online

Puede derivar Visual Basic clases de Public clases de objetos COM, incluso las creadas en versiones anteriores
de Visual Basic. Las propiedades y los métodos de las clases heredadas de objetos COM se pueden invalidar o
sobrecargar del mismo modo que las propiedades y los métodos de cualquier otra clase base se pueden invalidar
o sobrecargar. La herencia de objetos COM resulta útil cuando tiene una biblioteca de clases existente que no
desea volver a compilar.
En el procedimiento siguiente se muestra cómo utilizar Visual Basic 6,0 para crear un objeto COM que contenga
una clase y, a continuación, utilizarlo como clase base.

NOTE
Es posible que el equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario
de Visual Studio en las siguientes instrucciones. La edición de Visual Studio que se tenga y la configuración que se utilice
determinan estos elementos. Para obtener más información, vea Personalizar el IDE.

Para compilar el objeto COM que se usa en este tutorial


1. En Visual Basic 6,0, abra un nuevo proyecto DLL de ActiveX. Se crea un proyecto denominado Project1 .
Tiene una clase denominada Class1 .
2. En el Explorador de proyectos , haga clic con el botón secundario en Project1 y, a continuación, haga clic
en propiedades de Project1 . Se muestra el cuadro de diálogo propiedades del proyecto .
3. En la pestaña General del cuadro de diálogo propiedades del proyecto , cambie el nombre del proyecto
escribiendo ComObject1 en el campo Nombre del proyecto .
4. En el Explorador de proyectos , haga clic con el botón secundario en Class1 y, a continuación, haga clic
en propiedades . Se muestra la ventana propiedades de la clase.
5. Cambie la propiedad Name a MathFunctions .
6. En el Explorador de proyectos , haga clic con el botón secundario en MathFunctions y, a continuación,
haga clic en Ver código . Se muestra el Editor de código .
7. Agregue una variable local para que contenga el valor de propiedad:

' Local variable to hold property value


Private mvarProp1 As Integer

8. Agregue la propiedad Let y los procedimientos de propiedad Get propiedad:


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. Agregue una función:

Function AddNumbers(
ByVal SomeNumber As Integer,
ByVal AnotherNumber As Integer) As Integer

AddNumbers = SomeNumber + AnotherNumber


End Function

10. Cree y registre el objeto COM; para ello, haga clic en crear ComObject1. dll en el menú archivo .

NOTE
Aunque también puede exponer una clase creada con Visual Basic como un objeto COM, no es un objeto COM
verdadero y no se puede usar en este tutorial. Para obtener más información, consulte interoperabilidad com en
aplicaciones .NET Framework.

Ensamblados de interoperabilidad
En el procedimiento siguiente, creará un ensamblado de interoperabilidad, que actúa como un puente entre el
código no administrado (por ejemplo, un objeto COM) y el código administrado que usa Visual Studio. El
ensamblado de interoperabilidad que Visual Basic crea controla muchos de los detalles del trabajo con objetos
COM, como el cálculo de referencias de interoperabilidad, el proceso de empaquetado de parámetros y valores
devueltos en tipos de datos equivalentes a medida que se mueven a objetos com y desde ellos. La referencia de la
aplicación Visual Basic apunta al ensamblado de interoperabilidad, no al objeto COM real.
Para usar un objeto COM con Visual Basic 2005 y versiones posteriores
1. Abra un proyecto Aplicación Windows de Visual Basic nuevo.
2. En el menú Proyecto , haga clic en Agregar referencia .
Aparecerá el cuadro de diálogo Agregar referencia .
3. En la pestaña com , haga doble clic en ComObject1 en la lista nombre de componente y haga clic en
Aceptar .
4. En el menú Proyecto , haga clic en Agregar nuevo elemento .
Se abrirá el cuadro de diálogo Agregar nuevo elemento .
5. En el panel plantillas , haga clic en clase .
El nombre de archivo predeterminado, Class1.vb , aparece en el campo nombre . Cambie este campo a
MathClass. VB y haga clic en Agregar . Esto crea una clase denominada MathClass y muestra su código.
6. Agregue el código siguiente al principio de MathClass para heredar de la clase COM.
' 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. Sobrecargue el método público de la clase base agregando el código siguiente a MathClass :

' 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. Extienda la clase heredada agregando el código siguiente a MathClass :

' The following function extends the inherited class.


Function SubtractNumbers(
ByVal SomeNumber As Integer,
ByVal AnotherNumber As Integer) As Integer

Return AnotherNumber - SomeNumber


End Function

La nueva clase hereda las propiedades de la clase base en el objeto COM, sobrecarga un método y define un
nuevo método para extender la clase.
Para probar la clase heredada
1. Agregue un botón al formulario de inicio y, a continuación, haga doble clic en él para ver su código.
2. En el procedimiento del controlador de eventos Click del botón, agregue el código siguiente para crear
una instancia de MathClass y llamar a los métodos sobrecargados:

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. Ejecute el proyecto presionando F5.


Al hacer clic en el botón del formulario, se llama primero al método AddNumbers con números de tipo de datos de
Short y Visual Basic elige el método adecuado de la clase base. La segunda llamada a AddNumbers se dirige al
método de sobrecarga desde MathClass . La tercera llamada llama al método SubtractNumbers , que extiende la
clase. Se establece la propiedad de la clase base y se muestra el valor.
Pasos siguientes
Es posible que haya observado que la función sobrecargada AddNumbers parece tener el mismo tipo de datos que
el método heredado de la clase base del objeto COM. Esto se debe a que los argumentos y los parámetros del
método de la clase base se definen como enteros de 16 bits en Visual Basic 6,0, pero se exponen como enteros de
16 bits de tipo Short en versiones posteriores de Visual Basic. La nueva función acepta enteros de 32 bits y
sobrecarga la función de clase base.
Al trabajar con objetos COM, asegúrese de comprobar el tamaño y los tipos de datos de los parámetros. Por
ejemplo, cuando se usa un objeto COM que acepta un objeto de colección Visual Basic 6,0 como argumento, no se
puede proporcionar una colección de una versión posterior de Visual Basic.
Se pueden invalidar las propiedades y los métodos heredados de las clases COM, lo que significa que puede
declarar una propiedad o un método local que reemplace una propiedad o un método heredado de una clase
COM base. Las reglas para reemplazar propiedades COM heredadas son similares a las reglas para invalidar otras
propiedades y métodos con las siguientes excepciones:
Si invalida cualquier propiedad o método heredado de una clase COM, debe invalidar todas las demás
propiedades y métodos heredados.
Las propiedades que usan ByRef parámetros no se pueden invalidar.

Vea también
Interoperabilidad COM en aplicaciones .NET Framework
Inherits (instrucción)
Short (tipo de datos)
Referencia del lenguaje Visual Basic
08/01/2020 • 3 minutes to read • Edit Online

En esta sección se proporciona información de referencia sobre diversos aspectos del lenguaje Visual Basic.

Esta sección
Convenciones tipográficas y de código
Resume la forma en que se da formato a las palabras clave, los marcadores de posición y otros elementos del
lenguaje en la documentación de Visual Basic.
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Enumera las clases y los módulos del espacio de nombres Microsoft.VisualBasic, con vínculos a sus funciones
miembro, métodos, propiedades, constantes y enumeraciones.
Palabras clave
Enumera todas las palabras clave de Visual Basic y proporciona vínculos a más información.
Atributos (Visual Basic)
Documenta los atributos disponibles en Visual Basic.
Constantes y enumeraciones
Documenta las constantes y enumeraciones disponibles en Visual Basic.
Tipos de datos
Documenta los tipos de datos disponibles en Visual Basic.
Directivas
Documenta las directivas de compilador disponibles en Visual Basic.
Funciones
Documenta las funciones en tiempo de ejecución disponibles en Visual Basic.
Modificadores
Enumera los modificadores en tiempo de ejecución de Visual Basic y proporciona vínculos a más información.
Módulos
Documenta los módulos disponibles en Visual Basic y sus miembros.
Nothing
Describe el valor predeterminado de cualquier tipo de datos.
Objects
Documenta los objetos disponibles en Visual Basic y sus miembros.
Operadores
Documenta los operadores disponibles en Visual Basic.
Propiedades
Documenta las propiedades disponibles en Visual Basic.
Consultas
Proporciona información de referencia sobre el uso de expresiones LINQ (Language-Integrated Query) en el
código.
Instrucciones
Documenta la declaración y las instrucciones ejecutables disponibles en Visual Basic.
Etiquetas XML para comentarios
Describe los comentarios de documentación para los que se proporciona IntelliSense en el editor de código de
Visual Basic.
Propiedades del eje XML
Proporciona vínculos a información sobre el uso de propiedades de eje XML para tener acceso a XML
directamente en el código.
Literales XML
Proporciona vínculos a información sobre el uso de literales XML para incorporar XML directamente en el
código.
Mensajes de error
Proporciona una lista de Visual Basic los mensajes de error del compilador y en tiempo de ejecución, y ayuda
para controlarlos.

Secciones relacionadas
Compilador de línea de comandos de Visual Basic
Describe cómo usar el compilador de línea de comandos como alternativa a la compilación de programas desde
el entorno de desarrollo integrado (IDE) de Visual Studio.
Seleccione la versión de idioma de Visual Basic
23/10/2019 • 5 minutes to read • Edit Online

Valor predeterminado es la última versión principal del lenguaje que se ha liberado el compilador de Visual
Basic. Puede elegir compilar cualquier proyecto con una versión nueva del lenguaje. Elegir la versión más
reciente del lenguaje permite que el proyecto use las últimas características de ese lenguaje. En otros
escenarios, puede ser necesario validar que un proyecto se compile correctamente cuando se usa una versión
anterior del lenguaje.
Esta capacidad hace que la decisión de instalar nuevas versiones del SDK y las herramientas en el entorno de
desarrollo no esté vinculada a la decisión de incorporar nuevas características del lenguaje en un proyecto.
Puede instalar el SDK y las herramientas más recientes en el equipo de compilación. Cada proyecto se puede
configurar para que, durante su compilación, se use una versión de lenguaje específica.
Hay tres maneras de establecer la versión de idioma:
Editar manualmente el .vbproj archivo
Establezca la versión de idioma para varios proyectos en un subdirectorio
Configurar la -langversion opción del compilador

Edite el archivo vbproj


Puede establecer la versión de idioma su .vbproj archivo. Agregue el siguiente elemento:

<PropertyGroup>
<LangVersion>latest</LangVersion>
</PropertyGroup>

El valor latest usa la versión secundaria más reciente del lenguaje Visual Basic. Los valores válidos son:

VA LO R SIGN IF IC A DO

default El compilador acepta toda la sintaxis de lenguaje válida de la


última versión principal que puede admitir.

9 El compilador acepta solo la sintaxis que se incluye en Visual


Basic 9.0 o inferior.

10 El compilador acepta solo la sintaxis que se incluye en Visual


Basic 10.0 o inferior.

11 El compilador acepta solo la sintaxis que se incluye en Visual


Basic 11.0 o inferior.

12 El compilador acepta solo la sintaxis que se incluye en Visual


Basic 12.0 o inferior.

14 El compilador acepta solo la sintaxis que se incluye en Visual


Basic 14.0 o inferior.
VA LO R SIGN IF IC A DO

15 El compilador acepta solo la sintaxis que se incluye en Visual


Basic 15.0 o inferior.

15.3 El compilador acepta solo la sintaxis que se incluye en Visual


Basic 15.3 o inferior.

15.5 El compilador acepta solo la sintaxis que se incluye en Visual


Basic 15.5 o inferior.

15.8 El compilador acepta solo la sintaxis que se incluye en Visual


Basic 15,8 o inferior.

latest El compilador acepta toda la sintaxis de lenguaje válida que


puede admitir.

Las cadenas especiales default y latest se resuelven en las versiones de lenguaje principal y secundaria
respectivamente más recientes que haya instaladas en el equipo de compilación.

Configurar varios proyectos


Puede crear un archivo Director y.build.props que contenga el elemento <LangVersion> para configurar
varios directorios. Por lo general, esto se hace en el directorio de la solución. Agregue lo siguiente a un archivo
Director y.build.props en el directorio de la solución:

<Project>
<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>
</Project>

Ahora, las compilaciones en cada subdirectorio del directorio que contiene ese archivo usará la sintaxis de la
versión 15.5 de Visual Basic. Para obtener más información, consulte el artículo Personalizar una compilación.

Establecer la opción del compilador langversion


Puede usar la opción de la línea de comandos -langversion . Para obtener más información, consulte el artículo
sobre la opción del compilador -langversion. Puede ver una lista de los valores válidos escribiendo
vbc -langversion:? .
Convenciones tipográficas y de código (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

En Visual Basic documentación se utilizan las siguientes convenciones tipográficas y de código.

Convenciones tipográficas
E JEM P LO DESC RIP C IÓ N

Sub , If , ChDir , Print , True , Debug Las palabras clave específicas del lenguaje y los miembros en
tiempo de ejecución tienen letras mayúsculas iniciales y tienen
el formato que se muestra en este ejemplo.

SmallProject , ButtonCollection Las palabras y frases que se le indiquen que escriba tienen el
formato que se muestra en este ejemplo.

Module (instrucción) Los vínculos en los que puede hacer clic para ir a otra página
de ayuda tienen el formato que se muestra en este ejemplo.

Object, variablename, argumentList Los marcadores de posición para la información


proporcionada se formatean como se muestra en este
ejemplo.

[Shadows], [ expressionList ] En la sintaxis, los elementos opcionales se incluyen entre


corchetes.

{ Public | Friend | Private } En la sintaxis, cuando debe elegir entre dos o más elementos,
los elementos se incluyen entre llaves y se separan mediante
barras verticales.

Debe seleccionar uno y solo uno de los elementos.

[ Protected | Friend ] En la sintaxis, cuando se tiene la opción de seleccionar entre


dos o más elementos, los elementos se incluyen entre
corchetes y se separan mediante barras verticales.

Puede seleccionar cualquier combinación de elementos o


ningún elemento.

[{ ByVal | ByRef }] En la sintaxis, cuando se puede seleccionar no más de un


elemento, pero también se pueden omitir los elementos por
completo, los elementos se incluyen entre corchetes y se
separan mediante barras verticales.

memberName1, memberName2, memberName3 Varias instancias del mismo marcador de posición se


diferencian en los subíndices, tal y como se muestra en el
ejemplo.
E JEM P LO DESC RIP C IÓ N

Nombredemiembro1 En la sintaxis, se usa un botón de puntos suspensivos (...) para


indicar un número indefinido de elementos del tipo
... inmediatamente delante de los puntos suspensivos.

memberNameN En el código, los puntos suspensivos indican que el código se


ha omitido por razones de claridad.

ESC, ENTRAR Los nombres de clave y las secuencias de teclas del teclado
aparecen en todas las letras mayúsculas.

ALT+F1 Cuando aparecen signos más (+) entre los nombres de clave,
se debe mantener presionada una tecla mientras se presiona
la otra. Por ejemplo, ALT + F1 significa mantener presionada la
tecla ALT mientras se presiona la tecla F1.

Convenciones de código
E JEM P LO DESC RIP C IÓ N

sampleString = "Hello, world!" Los ejemplos de código aparecen en una fuente de punto fijo
y tienen el formato que se muestra en este ejemplo.

La instrucción anterior establece el valor de sampleString Los elementos de código del texto explicativo aparecen en una
en "Hello, World!" fuente de punto fijo, tal como se muestra en este ejemplo.

' This is a comment. Los comentarios de código se introducen mediante un


apóstrofo (') o la palabra clave REM.
REM This is also a comment.

sampleVar = "This is an " _ Un espacio seguido de un carácter de subrayado (_) al final de


una línea indica que la instrucción continúa en la línea
& "example" _ siguiente.

& " of how to continue code."

Vea también
Referencia del lenguaje Visual Basic
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Convenciones de nomenclatura de Visual Basic
Interrumpir y combinar instrucciones en código
Comentarios en código
Miembros de la biblioteca en tiempo de ejecución
de Visual Basic
27/11/2019 • 2 minutes to read • Edit Online

El espacio de nombres Microsoft.VisualBasic contiene las clases, los módulos, las constantes y las
enumeraciones que constituyen la biblioteca en tiempo de ejecución de Visual Basic. Estos miembros de
Biblioteca proporcionan procedimientos, propiedades y valores constantes que puede usar en el código. Cada
módulo y clase representa una categoría determinada de funcionalidad.

Clase Microsoft. VisualBasic. Collection

Add Clear Contains Count

GetEnumerator Item[String] Remove

Microsoft. VisualBasic. ComClassAttribute (clase)

ClassID EventID InterfaceID InterfaceShadows

Clase Microsoft. VisualBasic. ControlChars

Back Cr CrLf FormFeed

Lf NewLine NullChar Quote

Tab VerticalTab

Clase 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

Microsoft. VisualBasic. ErrObject (clase)

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

Clase 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

Clase 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

Microsoft. VisualBasic. VBFixedArrayAttribute (clase)

Bounds Length

Clase Microsoft. VisualBasic. VBFixedStringAttribute

Length

Módulo Microsoft. VisualBasic. VbMath

Randomize Rnd

Constantes y enumeraciones de Microsoft. VisualBasic


El espacio de nombres Microsoft.VisualBasic proporciona constantes y enumeraciones como parte de la
biblioteca en tiempo de ejecución Visual Basic. Puede usar estos valores constantes en el código. Cada
enumeración representa una categoría determinada de funcionalidad. Para obtener más información, vea
constantes y enumeraciones.

Vea también
Constantes y enumeraciones
Palabras clave
Palabras clave de Visual Basic
27/11/2019 • 7 minutes to read • Edit Online

En las tablas siguientes se enumeran todas las palabras clave del lenguaje Visual Basic.

Palabras clave reservadas


Las palabras clave siguientes están reservadas, lo que significa que no se pueden usar como nombres para
elementos de programación, como variables o procedimientos. Para omitir esta restricción, incluya el
nombre entre corchetes ( [] ). Para obtener más información, vea "Escaped Names" (Nombres con carácter
de escape) en Declared Element Names (Nombres de elementos declarados).

NOTE
No se recomienda usar nombres con carácter de escape, ya que puede hacer que el código sea complicado de leer y
producir pequeños errores difíciles de detectar.

AddHandler AddressOf Alias And

AndAlso As Boolean ByRef

Byte ByVal Call Case

Catch CBool CByte CChar

CDate CDbl CDec Char

CInt Class Constraint Class (instrucción) 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 (instrucción)

End <palabra clave> EndIf Enum Erase

Error Event Salir False

Finally For (en For…Next) For Each…Next Friend


Function Get GetType GetXMLNamespace

Global GoSub GoTo Handles

If If() Implements Implements (instrucción)

Imports (espacio de Imports (espacio de In In (modificador genérico)


nombres y tipo .NET) nombres XML)

Inherits Integer Interface Is

IsNot Let Lib Like

Long Loop Me Mod

Módulo Module (instrucción) MustInherit MustOverride

MyBase MyClass NameOf Espacio de nombres

Narrowing New Constraint New (operador) Siguiente

Next (en Resume) Not Nothing NotInheritable

NotOverridable Objeto Of On

Operator Opción Opcional Or

OrElse Out (modificador genérico) Sobrecargas Overridable

Overrides ParamArray Partial Private

Property Protected Public RaiseEvent

ReadOnly ReDim REM RemoveHandler

Resume Return SByte Seleccionar

Set Shadows Shared Short

Single Static Step Stop

String Structure Constraint Structure (instrucción) Sub

SyncLock Then Throw En

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

<<=

NOTE
EndIf , GoSub , Variant y Wend se conservan como palabras clave reservadas, aunque ya no se usan en Visual
Basic. El significado de la palabra clave Let ha cambiado. Ahora se usa Let en las consultas LINQ. Para obtener
más información, vea Let Clause (Cláusula Let).

Palabras clave no reservadas


Las palabras clave siguientes no están reservadas, lo que significa que puede usarlas como nombres para
los elementos de programación. Aun así, no se recomienda que lo haga, ya que puede hacer que el código
sea complicado de leer y producir pequeños errores difíciles de detectar.

Aggregate Ansi Ensamblado Async

Auto Await Binary Compare

Custom Distinct Equals Explicit

From Group By Group Join Into

IsFalse IsTrue Iterator Join

Key Mid Off Order By

Preserve Skip Skip While Strict

Take Take While Texto Unicode

Until Where Yield #ExternalSource

#Region
Temas relacionados
T ÍT ULO DESC RIP C IÓ N

Resumen de matrices Enumera los elementos del lenguaje que se usan para
crear, definir y usar matrices.

Resumen de objetos de colección Enumera los elementos del lenguaje que se usan para las
colecciones.

Resumen de flujo de control Enumera las instrucciones que se usan para crear bucles y
controlar el flujo del procedimiento.

Resumen de conversión Enumera las funciones que se usan para convertir


números, fechas, horas y cadenas.

Data Types Summary Enumera tipos de datos. También enumera las funciones
que se usan para convertir entre tipos de datos y
comprobar tipos de datos.

Resumen de fechas y horas Enumera los elementos del lenguaje que se usan para las
fechas y horas.

Resumen de constantes y declaraciones Enumera las instrucciones que se usan para declarar
variables, constantes, clases, módulos y otros elementos
de programación. También enumera los elementos del
lenguaje que se usan para obtener información sobre los
objetos, controlar eventos e implementar la herencia.

Resumen de archivos y directorios Enumera las funciones que se usan para controlar el
sistema de archivos y procesar archivos.

Resumen de errores Enumera los elementos del lenguaje que se usan para
detectar y devolver valores de errores en tiempo de
ejecución.

Resumen financiero Enumera las funciones que se usan para realizar cálculos
financieros.

Resumen de entrada y salida Enumera las funciones que se usan para leer y escribir en
archivos, administrar archivos e imprimir la salida.

Resumen de información e interacción Enumera las funciones que se usan para ejecutar otros
programas, obtener argumentos de línea de comandos,
manipular objetos COM, recuperar información de color y
usar cuadros de diálogo de control.

Resumen de funciones matemáticas Enumera las funciones que se usan para realizar cálculos
trigonométricos y otros cálculos matemáticos.

Referencia de My Enumera los objetos contenidos en My , una característica


que proporciona acceso a los métodos, las propiedades y
los eventos usados con frecuencia del equipo en el que se
ejecuta la aplicación, la aplicación actual, los recursos de la
aplicación, la configuración de la aplicación, etc.
T ÍT ULO DESC RIP C IÓ N

Resumen de operadores Enumera expresiones de asignación y comparación y otros


operadores.

Resumen del Registro Enumera las funciones que se usan para leer, guardar y
eliminar la configuración del programa.

Resumen de manipulación de cadenas Enumera las funciones que se usan para manipular
cadenas.

Vea también
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Resumen de matrices (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Las palabras clave del lenguaje Visual Basic y los miembros de las bibliotecas en tiempo de ejecución están
organizados por uso y propósito.

A C C IÓ N L A N GUA GE, EL EM EN TO

Comprobar una matriz. IsArray

Declarar e inicializar una matriz. Dim, Private, Public, ReDim

Buscar los límites de una matriz. LBound, UBound

Volver a inicializar una matriz. Borrar, ReDim

Vea también
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Resumen de objetos de colección (Visual Basic)
10/01/2020 • 2 minutes to read • Edit Online

Las palabras clave del lenguaje Visual Basic y los miembros de las bibliotecas en tiempo de ejecución están
organizados por uso y propósito.

A C C IÓ N DE L A N GUA GE, EL EM EN TO

Crear un objeto Collection . Collection

Agregar un elemento a una colección. Add

Quitar un objeto de una colección. Remove

Hacer referencia a un elemento en una colección. Item[String]

Devolver una referencia a una interfaz IEnumerator. IEnumerable.GetEnumerator

Vea también
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Resumen de flujos de control (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Las palabras clave del lenguaje Visual Basic y los miembros de las bibliotecas en tiempo de ejecución están
organizados por uso y propósito.

A C C IÓ N L A N GUA GE, EL EM EN TO

Bifurcar. Goto, en el error

Salir o detener el programa. Finalizar, salir, detener

Bucle. . .. Bucle, for... Siguiente, para cada... Después, while... End


while, with

Tomar decisiones. Choose, si... Después... En caso contrario, Seleccione Case,


Switch

Utilizar procedimientos. Call, function, Property, Sub

Vea también
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Resumen de conversión (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Las palabras clave del lenguaje Visual Basic y los miembros de las bibliotecas en tiempo de ejecución están
organizados por uso y propósito.

A C C IÓ N L A N GUA GE, EL EM EN TO

Convierte el valor ANSI en una cadena. Chr, ChrW

Convertir una cadena a minúsculas o mayúsculas. Format, LCase,UCase

Convertir la fecha en el número de serie. DateSerial, DateValue

Convertir el número decimal en otras bases. Hex, Oct

Convierte el número en una cadena. Format, Str

Convierte un tipo de datos en otro. CBool, CByte, CDate, CDbl, CDEC, cint, CLng, CSng, CShort,
CStr, CType, Fix, Int

Convertir la fecha a día, mes, día de la semana o año. Day, Month, Weekday, Year

Convierta la hora en horas, minutos o segundos. Hour, Minute, Second

Convierte una cadena en un valor ASCII. Asc, AscW

Convertir una cadena en un número. Val

Convertir la hora en el número de serie. TimeSerial, TimeValue

Vea también
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Resumen de tipos de datos (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Las palabras clave del lenguaje Visual Basic y los miembros de las bibliotecas en tiempo de ejecución están
organizados por uso y propósito.

A C C IÓ N L A N GUA GE, EL EM EN TO

Convertir entre tipos de datos CBool, CByte, CChar, CDate, CDbl, CDEC, cint, CLng, CObj,
CShort, CSng, CStr, Fix, Int

Establecer tipos de datos intrínsecos Boolean, byte, Char, Date, decimal, Double, Integer, Long,
Object, Short, Single, String

Comprobar tipos de datos IsArray, IsDate, IsDBNull, IsError, IsNothing, IsNumeric,


IsReference

Vea también
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Resumen de fechas y horas (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Las palabras clave del lenguaje Visual Basic y los miembros de las bibliotecas en tiempo de ejecución están
organizados por uso y propósito.

A C C IÓ N L A N GUA GE, EL EM EN TO

Obtener la hora o la fecha actual. Now, Today, TimeOfDay

Ejecutar cálculos de fechas. DateAdd, DateDiff, DatePart

Devolver una fecha. DateSerial, DateValue, MonthName, WeekdayName

Devolver una hora. TimeSerial, TimeValue

Establecer la fecha o la hora. DateString, TimeOfDay, TimeString, Today

Establecer la duración de un proceso. Timer

Vea también
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Resumen de constantes y declaraciones (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Las palabras clave del lenguaje Visual Basic y los miembros de las bibliotecas en tiempo de ejecución están
organizados por uso y propósito.

A C C IÓ N L A N GUA GE, EL EM EN TO

Asignar un valor. Get, Property

Declarar variables o constantes. Const, Dim, Private, Protected, Public, Shadows, Sharedy static

Declarar una clase, un delegado, una enumeración, un Clase, delegado, enumeración, módulo, espacio de nombres,
módulo, un espacio de nombres o una estructura. estructura

Crear objetos. CreateObject, GetObject, nuevo

Obtener información acerca de un objeto. GetType, IsArray, IsDate, IsDBNull, IsError, IsNothing,
IsNumeric, IsReference, SystemTypeName, TypeName,
VarTypeVbTypeName

Hacer referencia al objeto actual. Me

Requerir declaraciones explícitas de variables. Option Explicit, Option Strict

Controlar eventos. AddHandler, Event, RaiseEvent, RemoveHandler

Implementar la herencia. Inherits, MustInherit, MustOverride, MyBase, MyClass, New,


NotInheritable, NotOverridable, Overloads, Overridable,
invalidaciones

Vea también
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Resumen de directorios y archivos (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Las palabras clave del lenguaje Visual Basic y los miembros de las bibliotecas en tiempo de ejecución están
organizados por uso y propósito.
La característica My proporciona una mayor productividad y rendimiento en las operaciones de E/S de archivo que
si se utilizan estos miembros. Para obtener más información, consulta FileSystem.

A C C IÓ N EL EM EN TO DEL L EN GUA JE

Cambiar un directorio o una carpeta. ChDir

Cambiar la unidad. ChDrive

Copiar un archivo. FileCopy

Crear un directorio o una carpeta. MkDir

Quitar un directorio o una carpeta. RmDir

Cambiar el nombre de un archivo, directorio o carpeta. Rename

Devolver la ruta de acceso actual. CurDir

Devolver la marca de fecha y hora de un archivo. FileDateTime

Devolver los atributos de archivo, directorio o carpeta. GetAttr

Devolver la longitud de un archivo. FileLen

Devolver el nombre o la etiqueta de volumen de un archivo. Dir

Establecer la información de atributos para un archivo. SetAttr

Vea también
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Leer archivos
Escritura en archivos
Creación, eliminación y movimiento de archivos y directorios
Análisis de archivos de texto con el objeto TextFieldParser
Resumen de errores (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Las palabras clave del lenguaje Visual Basic y los miembros de las bibliotecas en tiempo de ejecución están
organizados por uso y propósito.

A C C IÓ N L A N GUA GE, EL EM EN TO

Generar errores en tiempo de ejecución. Clear, ErrorRaise

Obtener excepciones. GetException

Proporcionar información sobre errores. Err

Interceptar errores en tiempo de ejecución. En el error, reanudar, probar... Detectar... Por último

Proporcionar el número de línea del error. Erl

Proporcionar el código de error del sistema. LastDllError

Vea también
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Resumen financiero (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Las palabras clave del lenguaje Visual Basic y los miembros de las bibliotecas en tiempo de ejecución están
organizados por uso y propósito.

A C C IÓ N L A N GUA GE, EL EM EN TO

Calcular la amortización. DDB, SLN, SYD

Calcular el valor futuro. FV

Calcular el tipo de interés. Rate

Calcular la tasa interna de retorno. IRR, MIRR

Calcular el número de períodos. NPer

Calcular los pagos. IPmt, Pmt, PPmt

Calcular el valor actual. NPV, PV

Vea también
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Resumen de información e interacción (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Las palabras clave del lenguaje Visual Basic y los miembros de las bibliotecas en tiempo de ejecución están
organizados por uso y propósito.

A C C IÓ N L A N GUA GE, EL EM EN TO

Ejecutar otros programas. AppActivate, Shell

Llamar a un método o a una propiedad. CallByName

Emitir un sonido desde el equipo. Beep

Proporcionar una cadena de la línea de comandos. Command

Manipular objetos COM. CreateObject, GetObject

Recuperar información de color. QBColor, RGB

Controlar cuadros de diálogo. InputBox, MsgBox

Vea también
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Resumen de entrada y salida (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Las palabras clave del lenguaje Visual Basic y los miembros de las bibliotecas en tiempo de ejecución están
organizados por uso y propósito.

A C C IÓ N L A N GUA GE, EL EM EN TO

Tener acceso o crear un archivo. FileOpen

Cerrar archivos. FileClose, Reset

Controlar la apariencia de los resultados. Format, Print, SPC, TAB, FileWidth

Copiar un archivo. FileCopy

Obtener información acerca de un archivo. EOF, FileAttr, FileDateTime, FileLen, FreeFile, GetAttr, Loc, LOF,
Seek

Obtener o proporcionar información del usuario o para el InputBox, MsgBox


usuario a través de un cuadro de diálogo de control.

Administrar archivos. Dir, Kill, Lock, Unlock

Leer de un archivo. FileGet, FileGetObject, Input, InputString, LineInput

Devolver el tamaño de un archivo. FileLen

Establecer u obtener atributos de un archivo. FileAttr, GetAttr, SetAttr

Establecer la posición de lectura/escritura en un archivo. Seek

Escribir en un archivo. FilePut, FilePutObject, Print, Write, WriteLine

Vea también
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Resumen de funciones matemáticas (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Las palabras clave del lenguaje Visual Basic y los miembros de las bibliotecas en tiempo de ejecución están
organizados por uso y propósito.

A C C IÓ N L A N GUA GE, EL EM EN TO

Derivar funciones trigonométricas. Atan, Cos, Sin, Tan

Cálculos generales. Exp, Log, Sqrt

Generar números aleatorios. Randomize, Rnd

Obtener el valor absoluto. Abs

Obtener el signo de una expresión. Sign

Ejecutar conversiones numéricas. Fix, Int

Vea también
Funciones matemáticas derivadas
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Funciones matemáticas derivadas (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

En la tabla siguiente se muestran las funciones matemáticas no intrínsecas que se pueden derivar de las funciones
matemáticas intrínsecas del objeto System.Math. Puede tener acceso a las funciones matemáticas intrínsecas
agregando Imports System.Math al archivo o proyecto.

F UN C IÓ N EQ UIVA L EN T ES DERIVA DO S

Secante (s (x)) 1/cos (x)

Cosecante (CSC (x)) 1/sin (x)

Cotangente (CTAN (x)) 1/tan (x)

Seno inverso (ASIN (x)) Atan (x/sqrt (-x * x + 1))

Coseno inverso (ACOS (x)) Atan (-x/sqrt (-x * x + 1)) + 2 * atan (1)

Secante inversa (ASEC (x)) 2 * atan (1) – atan (signo (x)/raiz (x * x – 1))

Cosecación inversa (ACSC (x)) Atan (signo (x)/raiz (x * x – 1))

Cotangente inversa (ACOT (x)) 2 * atan (1)-atan (x)

Seno hiperbólico (SENOH (x)) (Exp (x) – exp (-x))/2

Coseno hiperbólico (cosh (x)) (Exp (x) + exp (-x))/2

Tangente hiperbólica (tanh (x)) (Exp (x) – exp (-x))/(exp (x) + exp (-x))

Secante hiperbólica (SECH (x)) 2/(exp (x) + exp (-x))

Cosecante hiperbólica (Csch (x)) 2/(exp (x) – exp (-x))

Cotangente hiperbólica (coth (x)) (Exp (x) + exp (-x))/(exp (x) – exp (-x))

Seno hiperbólico inverso (Asinh (x)) Log (x + sqrt (x * x + 1))

Coseno hiperbólico inverso (Acosh (x)) Log (x + sqrt (x * x – 1))

Tangente hiperbólica inversa (Atanh (x)) Log((1 + x) / (1 – x)) / 2

Secante hiperbólica inversa (AsecH (x)) Log ((sqrt (-x * x + 1) + 1)/x)

Cosecante hiperbólica inversa (Acsch (x)) Log ((signo (x) * sqrt (x * x + 1) + 1)/x)

Cotangente hiperbólica inversa (Acoth (x)) Log((x + 1) / (x – 1)) / 2


Vea también
Funciones matemáticas
Referencia de My (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

La característica My hace que la programación sea más rápida y sencilla, ya que le proporciona acceso intuitivo a
métodos, propiedades y eventos de uso frecuente. En esta tabla se enumeran los objetos incluidos en My y las
acciones que se pueden realizar con cada uno.

A C C IÓ N O B JETO

Obtener acceso a la información y los servicios de la El objeto My.Application consta de las clases siguientes:
aplicación.
ApplicationBase proporciona miembros que están disponibles
en todos los proyectos.

WindowsFormsApplicationBase proporciona miembros


disponibles en aplicaciones de Windows Forms.

ConsoleApplicationBase proporciona miembros disponibles en


aplicaciones de consola.

Acceso al equipo host y sus recursos, servicios y datos. My.Computer (Computer)

Obtener acceso a los formularios en el proyecto actual. My.Forms (objeto)

Acceso al registro de la aplicación. My.Application.Log (Log)

Obtener acceso a la solicitud Web actual. My.Request (objeto)

Obtener acceso a los elementos de recursos. My.Resources (objeto)

Obtener acceso a la respuesta web actual. My.Response (objeto)

Acceso a la configuración del nivel de usuario y aplicación. My.Settings (objeto)

Acceso al contexto de seguridad del usuario actual. My.User (User)

Obtener acceso a los servicios Web XML a los que hace My.WebServices (objeto)
referencia el proyecto actual.

Vea también
Información general sobre el modelo de aplicaciones de Visual Basic
Desarrollo con la función My
Resumen de operadores (Visual Basic)
19/12/2019 • 2 minutes to read • Edit Online

Las palabras clave del lenguaje Visual Basic y los miembros de las bibliotecas en tiempo de ejecución están
organizados por uso y propósito.

. EL EM EN TO DEL L EN GUA JE

Operadores aritméticos ^, –, *, /, \, Mod, +, =

Asignación =, ^=, *=, /=, \=, +=, -=, &=

Comparación =, <>, <, >, <=, >=, como, es

Concatenación &, +

Operadores lógicos y bit a bit Not, and, or, XOR, AndAlso, OrElse

Operaciones varias AddressOf, Await, GetType

Vea también
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Resumen del Registro (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Las palabras clave del lenguaje de Visual Studio y los miembros de la biblioteca en tiempo de ejecución se
organizan por propósito y uso.
Si utiliza la característica My , consigue una mayor productividad y rendimiento en las operaciones del Registro que
con estos elementos. Para obtener más información, consulta RegistryProxy.

A C C IÓ N EL EM EN TO DEL L EN GUA JE

Eliminar la configuración del programa. DeleteSetting

Leer la configuración del programa. GetSetting, GetAllSettings

Guardar la configuración del programa. SaveSetting

Vea también
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Leer y escribir en el Registro
Resumen de manipulaciones de cadenas (Visual
Basic)
27/11/2019 • 2 minutes to read • Edit Online

Las palabras clave del lenguaje Visual Basic y los miembros de las bibliotecas en tiempo de ejecución están
organizados por uso y propósito.

A C C IÓ N L A N GUA GE, EL EM EN TO

Comparar dos cadenas. StrComp

Convertir cadenas. StrConv

Invertir una cadena. InStrRev, StrReverse

Convertir en mayúsculas o minúsculas. Format, LCase, UCase

Crear una cadena de caracteres repetidos. Space, StrDup

Buscar la longitud de una cadena. Len

Dar formato a una cadena. Format, FormatCurrency, FormatDateTime, FormatNumber,


FormatPercent

Manipular cadenas. InStr, Left, LTrim, Mid, Right, RTrim, Trim

Establecer reglas de comparación de cadenas. Option Compare

Trabajar con valores ASCII y ANSI. Asc, AscW, Chr, ChrW

Reemplazar una subcadena especificada. Replace

Devolver una matriz de cadenas basada en un filtro. Filter

Devolver un número de subcadenas especificado. Split, Join

Vea también
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Atributos de Visual Basic
27/11/2019 • 2 minutes to read • Edit Online

Visual Basic proporciona varios atributos que permiten a los objetos interoperar con código no administrado y un
atributo que permite tener acceso a los miembros de módulo sin el nombre de módulo. En la tabla siguiente se
enumeran los atributos usados por Visual Basic.

ComClassAttribute Indica al compilador que agregue metadatos que permitan


que una clase se exponga como un objeto COM.

HideModuleNameAttribute Permite tener acceso a los miembros de módulo usando solo


la calificación necesaria para el módulo.

VBFixedArrayAttribute Indica que una matriz de una estructura o una variable no


local se debe tratar como una matriz de longitud fija.

VBFixedStringAttribute Indica que una cadena se debe tratar como si fuera una
longitud fija.

Vea también
Información general de atributos
Constantes y enumeraciones (Visual Basic)
10/01/2020 • 7 minutes to read • Edit Online

Visual Basic proporciona varias constantes y enumeraciones predefinidas para los desarrolladores. Las constantes
almacenan valores que permanecen constantes a lo largo de la ejecución de una aplicación. Las enumeraciones
proporcionan una forma cómoda de trabajar con conjuntos de constantes relacionadas y asociar valores
constantes con nombres.

Constantes
Constantes de compilación condicional
En la tabla siguiente se enumeran las constantes predefinidas disponibles para la compilación condicional.

C O N STA N T E DESC RIP C IÓ N

CONFIG Cadena que corresponde a la configuración actual del cuadro


de configuración de soluciones activo en el
Configuration Manager .

DEBUG Boolean valor que se puede establecer en el cuadro de


diálogo propiedades del proyecto . De forma
predeterminada, la configuración de depuración de un
proyecto define DEBUG . Cuando se define DEBUG , Debug
métodos de clase generan la salida en la ventana de salida .
Cuando no se define, Debug métodos de clase no se
compilan y no se generan resultados de depuración.

TARGET Una cadena que representa el tipo de salida del proyecto o la


configuración de la opción de destino de línea de comandos.
Los valores posibles de TARGET son:

-"winexe" para una aplicación Windows.


-"exe" para una aplicación de consola.
-"Library" para una biblioteca de clases.
-"Module" para un módulo.
-La opción -target se puede establecer en el entorno de
desarrollo integrado de Visual Studio. Para obtener más
información, vea -target (Visual Basic).

TRACE Boolean valor que se puede establecer en el cuadro de


diálogo propiedades del proyecto . De forma
predeterminada, todas las configuraciones de un proyecto
definen TRACE . Cuando se define TRACE , Trace métodos de
clase generan la salida en la ventana de salida . Cuando no
se define, Trace métodos de clase no se compilan y no se
genera ninguna salida Trace .

VBC_VER Un número que representa la versión de Visual Basic, en


major. formato secundario .

Constantes de impresión y visualización


Al llamar a las funciones de impresión y visualización, puede usar las siguientes constantes en el código en lugar
de los valores reales.
C O N STA N T E DESC RIP C IÓ N

vbCrLf Combinación de caracteres de retorno de carro/avance de


carro.

vbCr Carácter de retorno de carro.

vbLf Carácter de avance de la alimentación.

vbNewLine Carácter de nueva línea.

vbNullChar Carácter nulo.

vbNullString No es lo mismo que una cadena de longitud cero (""); se usa


para llamar a procedimientos externos.

vbObjectError Número de error. Los números de error definidos por el


usuario deberían ser mayores que este valor. Por ejemplo:

Err.Raise(Number) = vbObjectError + 1000

vbTab Carácter de tabulación.

vbBack Carácter de retroceso.

vbFormFeed No se utiliza en Microsoft Windows.

vbVerticalTab No es útil en Microsoft Windows.

Enumeraciones
En la tabla siguiente se enumeran y se describen las enumeraciones proporcionadas por Visual Basic.

EN UM ERA C IÓ N DESC RIP C IÓ N

AppWinStyle Indica el estilo de ventana que se va a utilizar para el


programa invocado al llamar a la función Shell.

AudioPlayMode Indica cómo reproducir sonidos al llamar a los métodos de


audio.

BuiltInRole Indica el tipo de rol que se comprueba cuando se llama al


método IsInRole.

CallType Indica el tipo de procedimiento que se debe invocar al llamar


a la función CallByName.

CompareMethod Indica cómo comparar las cadenas cuando se llama a las


funciones de comparación.

DateFormat Indica cómo se muestran las fechas al llamar a la función


FormatDateTime.
EN UM ERA C IÓ N DESC RIP C IÓ N

DateInterval Indica cómo determinar y dar formato a los intervalos de


fecha al llamar a funciones relacionadas con fechas.

DeleteDirectoryOption Especifica qué se hace cuando un directorio que se va a


eliminar contiene archivos o directorios.

DueDate Indica cuándo vencen los pagos al llamar a métodos


financieros.

FieldType Indica si los campos de texto son delimitados o de ancho fijo.

FileAttribute Indica los atributos de archivo que se deben utilizar al llamar


a las funciones de acceso a archivos.

FirstDayOfWeek Indica el primer día de la semana que se utiliza al llamar a


funciones relacionadas con fechas.

FirstWeekOfYear Indica la primera semana del año que se utiliza al llamar a


funciones relacionadas con fechas.

MsgBoxResult Indica qué botón se ha presionado en un cuadro de mensaje,


devuelto por la función MsgBox.

MsgBoxStyle Indica qué botones se mostrarán cuando se llama a la función


MsgBox.

OpenAccess Indica cómo abrir un archivo al llamar a funciones de acceso a


archivos.

OpenMode Indica cómo abrir un archivo al llamar a funciones de acceso a


archivos.

OpenShare Indica cómo abrir un archivo al llamar a funciones de acceso a


archivos.

RecycleOption Especifica si un archivo debe eliminarse de manera


permanente o colocarse en la papelera de reciclaje.

SearchOption Especifica si se buscan todos o sólo los directorios de nivel


superior.

TriState Indica un valor Boolean o si se debe usar el valor


predeterminado al llamar a funciones de formato numérico.

UICancelOption Especifica qué se debe hacer si el usuario hace clic en


Cancelar durante una operación.

UIOption Especifica si se muestra o no un cuadro de diálogo de


progreso al copiar, eliminar o mover archivos o directorios.

VariantType Indica el tipo de un objeto de variante, devuelto por la


función VarType.
EN UM ERA C IÓ N DESC RIP C IÓ N

VbStrConv Indica qué tipo de conversión se realiza cuando se llama a la


función StrConv.

Vea también
Referencia del lenguaje Visual Basic
Información general sobre las constantes
Información general sobre las enumeraciones
Resumen de tipos de datos (Visual Basic)
27/11/2019 • 7 minutes to read • Edit Online

En la tabla siguiente se muestran los tipos de datos de Visual Basic, sus tipos de Common Language
Runtime de soporte, su asignación de almacenamiento nominal y sus intervalos de valores.

EST RUC T URA DE T IP O S A SIGN A C IÓ N DE


DE C O M M O N L A N GUA GE A L M A C EN A M IEN TO
T IP O DE VISUA L B A SIC RUN T IM E N O M IN A L IN T ERVA LO DE VA LO RES

Boolean Boolean Depende de la True o False


implementación de la
plataforma

Byte Byte 1 byte de 0 a 255 (sin signo)

Char (carácter único) Char 2 bytes de 0 a 65535 (sin signo)

Date DateTime 8 bytes 0:00:00 (medianoche) el 1


de enero de 0001 a las
11:59:59 P.M. del 31 de
diciembre de 9999

Decimal Decimal 16 bytes 0 a +/-


79.228.162.514.264.337.5
93.543.950.335 (+/-7.9...E
+ 28) † sin separador
decimal; de 0 a +/-
7,922816251426433759
3543950335 con 28
posiciones a la derecha del
decimal;

el número más pequeño


distinto de cero es +/-
0,000000000000000000
0000000001 (+/-1E-28) †

Double (punto flotante de Double 8 bytes -1.79769313486231570


precisión doble) e + 308 a-
4.94065645841246544
E-324 † para los valores
negativos;

4.94065645841246544
e-324 a
1.79769313486231570 E
+ 308 † para valores
positivos

Integer Int32 4 bytes de-2.147.483.648 a


2.147.483.647 (con signo)
EST RUC T URA DE T IP O S A SIGN A C IÓ N DE
DE C O M M O N L A N GUA GE A L M A C EN A M IEN TO
T IP O DE VISUA L B A SIC RUN T IM E N O M IN A L IN T ERVA LO DE VA LO RES

Long (entero largo) Int64 8 bytes de-


9.223.372.036.854.775.80
8a
9.223.372.036.854.775.80
7 (9.2... E + 18 †) (con
signo)

Objeto Object (clase) 4 bytes en la plataforma Cualquier tipo se puede


de 32 bits almacenar en una variable
de tipo Object
8 bytes en la plataforma
de 64 bits

SByte SByte 1 byte de-128 a 127 (con signo)

Short (entero corto) Int16 2 bytes de-32.768 a 32.767 (con


signo)

Single (punto flotante de Single 4 bytes -3.4028235 e + 38 a-


precisión sencilla) 401298e E-45 † para los
valores negativos;

401298e e-45 a
3.4028235 E + 38 † para
los valores positivos

Cadena (longitud variable) String (clase) Depende de la de 0 a aproximadamente


implementación de la 2 mil millones caracteres
plataforma Unicode

UInteger UInt32 4 bytes de 0 a 4.294.967.295 (sin


signo)

ULong UInt64 8 bytes de 0 a


18446744073709551615
(1.8... E + 19 †) (sin signo)

Definido por el usuario (hereda de ValueType) Depende de la Cada miembro de la


(estructura) implementación de la estructura tiene un
plataforma intervalo determinado por
su tipo de datos e
independiente de los
intervalos de los demás
miembros.

UShort UInt16 2 bytes de 0 a 65.535 (sin signo)

†En notación científica, "E" hace referencia a una potencia de 10. Por tanto, 3.56 E + 2 significa 3,56 x 102 o
356 y 3.56 e-2 significa 3,56/102 o 0,0356.

NOTE
Para las cadenas que contienen texto, utilice la función StrConv para convertir de un formato de texto a otro.
Además de especificar un tipo de datos en una instrucción de declaración, puede forzar el tipo de datos de
algunos elementos de programación mediante el uso de un carácter de tipo. Vea caracteres de tipo.

Consumo de memoria
Cuando se declara un tipo de datos elemental, no es seguro suponer que el consumo de memoria es el
mismo que su asignación de almacenamiento nominal. Esto se debe a las siguientes consideraciones:
Asignación de almacenamiento. El Common Language Runtime puede asignar
almacenamiento basado en las características actuales de la plataforma en la que se ejecuta la
aplicación. Si la memoria está casi llena, puede empaquetar los elementos declarados lo más juntos
posible. En otros casos, puede alinear sus direcciones de memoria con límites de hardware
naturales para optimizar el rendimiento.
Ancho de la plataforma. La asignación de almacenamiento en una plataforma de 64 bits es
diferente de la asignación en una plataforma de 32 bits.
Tipos de datos compuestos
Las mismas consideraciones se aplican a cada miembro de un tipo de datos compuesto, como una
estructura o una matriz. No se puede confiar simplemente en sumar las asignaciones de almacenamiento
nominal de los miembros del tipo. Además, hay otras consideraciones, como las siguientes:
Administrativos. Algunos tipos compuestos tienen requisitos de memoria adicionales. Por
ejemplo, una matriz utiliza memoria adicional para la propia matriz y también para cada
dimensión. En una plataforma de 32 bits, esta sobrecarga es actualmente de 12 bytes más 8 bytes
para cada dimensión. En una plataforma de 64 bits, se duplica este requisito.
Diseño de almacenamiento. No se puede suponer de forma segura que el orden de
almacenamiento en memoria es el mismo que el orden de declaración. No puede incluso hacer
suposiciones sobre la alineación de bytes, como un límite de 2 o 4 bytes. Si va a definir una clase o
estructura y necesita controlar el diseño de almacenamiento de sus miembros, puede aplicar el
atributo StructLayoutAttribute a la clase o estructura.
Sobrecarga de objetos
Un Object que hace referencia a cualquier tipo de datos elemental o compuesto usa 4 bytes además de
los datos contenidos en el tipo de datos.

Vea también
StrConv
StructLayoutAttribute
Funciones de conversión de tipos
Resumen de conversión
Caracteres de tipo
Uso eficiente de tipos de datos
Boolean (Tipo de datos, Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Contiene valores que solo pueden ser True o False . Las palabras clave True y False corresponden a los
dos Estados de las variables Boolean .

Comentarios
Utilice el tipo de datos booleano (Visual Basic) para contener valores de dos Estados como true/false, yes/no
o ON/OFF.
El valor predeterminado de Boolean es False .
Boolean valores no se almacenan como números y los valores almacenados no están diseñados para ser
equivalentes a números. Nunca debe escribir código que se base en valores numéricos equivalentes para
True y False . Siempre que sea posible, debe restringir el uso de Boolean variables a los valores lógicos
para los que están diseñadas.

Conversiones de tipos
Cuando Visual Basic convierte valores de tipos de datos numéricos en Boolean , 0 se convierte en False y
todos los demás valores se True . Cuando Visual Basic convierte Boolean valores en tipos numéricos, False
se convierte en 0 y True se convierte en-1.
Al convertir entre Boolean valores y tipos de datos numéricos, tenga en cuenta que los métodos de
conversión .NET Framework no siempre producen los mismos resultados que las palabras clave de
conversión Visual Basic. Esto se debe a que la conversión de Visual Basic conserva el comportamiento
compatible con versiones anteriores. Para obtener más información, vea el tema sobre el tipo Boolean no se
convierte a un tipo numérico con precisión en los tipos de datos de solución de problemas.

Sugerencias de programación
Números negativos. Boolean no es un tipo numérico y no puede representar un valor negativo. En
cualquier caso, no debe utilizar Boolean para contener valores numéricos.
Caracteres de tipo. Boolean no tiene un carácter de tipo literal o un carácter de tipo de identificador.
Tipo de marco. El tipo correspondiente en .NET Framework es la estructura System.Boolean.

Ejemplo
En el ejemplo siguiente, runningVB es una variable de Boolean , que almacena un valor de sí/no simple.

Dim runningVB As Boolean


' Check to see if program is running on Visual Basic engine.
If scriptEngine = "VB" Then
runningVB = True
End If

Vea también
System.Boolean
Tipos de datos
Funciones de conversión de tipos
Resumen de conversión
Uso eficiente de tipos de datos
Solución de problemas de tipos de datos
Función CType
Tipo de datos byte (Visual Basic)
21/03/2020 • 5 minutes to read • Edit Online

Contiene enteros sin signo de 8 bits (1 byte) que oscilan en valor de 0 a 255.

Observaciones
Utilice Byte el tipo de datos para contener datos binarios.
El valor predeterminado de Byte es 0.

Asignaciones literales
Puede declarar e Byte inicializar una variable asignándole un literal decimal, un literal hexadecimal, un literal
octal o (a partir de Visual Basic 2017) un literal binario. Si el literal entero está Byte fuera del intervalo de a
Byte.MinValue (es Byte.MaxValuedecir, si es menor o mayor que ), se produce un error de compilación.
En el ejemplo siguiente, los enteros iguales a 201 que se representan como Integer literales byte decimales,
hexadecimales y binarios se convierten implícitamente de Entero a valores.

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

NOTE
Utilice el &h prefijo &H o para denotar un &b &B literal hexadecimal, el prefijo o &o &O para denotar un literal
binario, y el prefijo o para denotar un literal octal. Los literales decimales no tienen prefijo.

A partir de Visual Basic 2017, también _ puede usar el carácter de subrayado, , como separador de dígitos para
mejorar la legibilidad, como se muestra en el ejemplo siguiente.

Dim byteValue3 As Byte = &B1100_1001


Console.WriteLine(byteValue3)
' The example displays the following output:
' 201

A partir de Visual Basic 15.5, también _ puede usar el carácter de subrayado ( ) como separador inicial entre el
prefijo y los dígitos hexadecimales, binarios u octales. Por ejemplo:

Dim number As Byte = &H_6A


Para usar el carácter de subrayado como separador inicial, debe agregar el elemento siguiente al archivo del
proyecto de Visual Basic (*.vbproj):

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Para obtener más información, consulte configuración de la versióndel lenguaje Visual Basic .

sugerencias de programación
Números negativos. Dado Byte que es un tipo sin signo, no puede representar un número negativo.
Si utiliza el operador - unario menos ( ) en Byte una expresión que se Short evalúa como tipo , Visual
Basic convierte la expresión en primer lugar.
Conversiones de formato. Cuando Visual Basic lee o escribe archivos, o cuando llama a archivos DLL,
métodos y propiedades, puede convertir automáticamente entre formatos de datos. Los datos Byte
binarios almacenados en variables y matrices se conservan durante dichas conversiones de formato. No
debe utilizar String una variable para los datos binarios, ya que su contenido puede dañarse durante la
conversión entre formatos ANSI y Unicode.
Ampliación. El Byte tipo de datos Short UShort se Integer UInteger amplía Long ULong a Decimal
Single , Double , , , , , , o . Esto significa que Byte puede convertir a cualquiera
System.OverflowException de estos tipos sin encontrar un error.
Escriba Caracteres. Byte no tiene ningún carácter de tipo literal o carácter de tipo identificador.
Tipo de Framework . El tipo correspondiente en .NET Framework es la estructura System.Byte.

Ejemplo
En el ejemplo b siguiente, es una Byte variable. Las instrucciones muestran el rango de la variable y la
aplicación de operadores de desplazamiento de bits a ella.

' 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)
Consulte también
System.Byte
Tipos de datos
Funciones de conversión de tipos
Resumen de conversión
Uso eficiente de tipos de datos
Char (Tipo de datos, Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

Contiene puntos de código sin signo de 16 bits (2 bytes) con un valor comprendido entre 0 y 65535. Cada
punto de código, o código de carácter, representa un único carácter Unicode.

Comentarios
Utilice el tipo de datos Char cuando necesite contener un solo carácter y no necesite la sobrecarga de String .
En algunos casos, puede usar Char() , una matriz de elementos Char , para contener varios caracteres.
El valor predeterminado de Char es el carácter con un punto de código de 0.

Caracteres Unicode
Los primeros 128 puntos de código (0 – 127) de Unicode corresponden a las letras y símbolos de un teclado
estándar de EE. UU. Estos primeros 128 puntos de código son los mismos que los que define el juego de
caracteres ASCII. Los dos puntos de código 128 (128 – 255) representan caracteres especiales, como Letras de
alfabetos basados en latín, acentos, símbolos de moneda y fracciones. Unicode usa los puntos de código
restantes (256-65535) para una amplia variedad de símbolos, incluidos los caracteres de texto en todo el
mundo, los signos diacríticos y los símbolos matemáticos y técnicos.
Puede usar métodos como IsDigit y IsPunctuation en una variable de Char para determinar su clasificación
Unicode.

Conversiones de tipos
Visual Basic no convierte directamente entre Char y los tipos numéricos. Puede usar la función Asc o AscW
para convertir un valor de Char en un Integer que representa su punto de código. Puede usar la función Chr
o ChrW para convertir un valor de Integer en un Char que tenga ese punto de código.
Si el modificador de comprobación de tipo ( Option Strict Statement) está activado, debe anexar el carácter de
tipo literal a un literal de cadena de un solo carácter para identificarlo como el tipo de datos Char . En el ejemplo
siguiente se ilustra esto. La primera asignación a la variable charVar genera el error del compilador BC30512
porque Option Strict está activada. La segunda se compila correctamente porque el carácter de tipo literal c
identifica el literal como un valor de Char .

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
Sugerencias de programación
Números negativos. Char es un tipo sin signo y no puede representar un valor negativo. En cualquier
caso, no debe utilizar Char para contener valores numéricos.
Consideraciones de interoperabilidad. Si la interfaz con componentes no escritos para el .NET
Framework, por ejemplo, objetos de automatización o COM, recuerde que los tipos de caracteres tienen
un ancho de datos diferente (8 bits) en otros entornos. Si pasa un argumento de 8 bits a este
componente, declárelo como Byte en lugar de Char en el nuevo código de Visual Basic.
Ampliación. El tipo de datos Char se amplía a String . Esto significa que puede convertir Char en
String y no encontrará un System.OverflowException.

Caracteres de tipo. Si se anexa el carácter de tipo literal C a un literal de cadena de un solo carácter, se
convierte al tipo de datos Char . Char no tiene ningún carácter de tipo de identificador.
Tipo de marco. El tipo correspondiente en .NET Framework es la estructura System.Char.

Vea también
System.Char
Asc
AscW
Chr
ChrW
Tipos de datos
String (tipo de datos)
Funciones de conversión de tipos
Resumen de conversión
Llamar a una función de Windows que adopta tipos sin signo
Uso eficiente de tipos de datos
Date (Tipo de datos, Visual Basic)
27/11/2019 • 6 minutes to read • Edit Online

Contiene los valores IEEE de 64 bits (8 bytes) que representan fechas comprendidas entre el 1 de enero del año
0001 hasta el 31 de diciembre del año 9999, y las horas comprendidas entre las 00:00:00 (medianoche) y las
23:59:59.9999999. Cada incremento representa 100 nanosegundos de tiempo transcurrido desde el comienzo
del 1 de enero del año 1 del calendario gregoriano. El valor máximo representa 100 nanosegundos antes del
comienzo del 1 de enero del año 10000.

Comentarios
Utilice el tipo de datos Date para contener valores de fecha, valores de hora o valores de fecha y hora.
El valor predeterminado de Date es 0:00:00 (medianoche) del 1 de enero de 0001.
Puede obtener la fecha y hora actuales desde la clase DateAndTime.

Requisitos de formato
Debe delimitar cualquier literal Date con signos de número ( # # ). Debe especificar el valor de fecha en el
formato M/d/aaaa, por ejemplo #5/31/1993# , o aaaa-MM-dd, por ejemplo #1993-5-31# . Puede usar barras
diagonales al especificar el año en primer lugar. Este requisito es independiente de la configuración regional y de
la configuración de formato de fecha y hora del equipo.
El motivo de esta restricción es que el significado del código nunca debe cambiar en función de la configuración
regional en que se ejecuta la aplicación. Suponga que codifica un literal Date de #3/4/1998# con la intención de
que signifique el 4 de marzo de 1998. En una configuración regional que use el formato mm/dd/aaaa, 3/4/1998
se compila tal como desea. Pero supongamos que implementa la aplicación en muchos países o regiones. En
una configuración regional que use el formato dd/mm/aaaa, el literal incluido en el código se compilará como 3
de abril de 1998. En una configuración local que utilice el formato aaaa/mm/dd, el literal no sería válido (1998
de abril de 0003) y generaría un error de compilación.

Soluciones
Para convertir un literal Date al formato de la configuración regional o a un formato personalizado,
proporcione el literal a la función Format especificando un formato de fecha predefinido o uno especificado por
el usuario. En el siguiente ejemplo se muestra cómo hacerlo.

MsgBox("The formatted date is " & Format(#5/31/1993#, "dddd, d MMM yyyy"))

Si lo desea, también puede utilizar uno de los constructores sobrecargados de la estructura DateTime para
ensamblar un valor de fecha y hora. En el ejemplo siguiente se crea un valor para representar 31 de mayo de
1993 a las 12:14 del mediodía.

Dim dateInMay As New System.DateTime(1993, 5, 31, 12, 14, 0)

Formato de hora
Puede especificar el valor de hora en formato de 12 horas o de 24 horas, por ejemplo, #1:15:30 PM# o
#13:15:30# . Sin embargo, si no especifica los minutos o los segundos, debe especificar AM o PM.

Valores predeterminados de fecha y hora


Si no incluye una fecha en un literal de fecha y hora, Visual Basic establece la parte de fecha del valor en el 1 de
enero de 0001. Si no incluye una hora en un literal de fecha y hora, Visual Basic establece la parte de hora del
valor en el inicio del día, es decir, medianoche (0:00:00).

Conversiones de tipos
Si convierte un valor Date al tipo String , Visual Basic representa la fecha en función del formato corto de
fecha especificado por la configuración regional en tiempo de ejecución y representa la hora de acuerdo con el
formato de hora (12 o 24 horas) especificado por la configuración regional en tiempo de ejecución.

Sugerencias de programación
Consideraciones de interoperabilidad. Si interactúa con componentes que no se han escrito para
.NET Framework, por ejemplo, objetos de automatización o COM, tenga presente que los tipos de fecha y
hora definidos en otros entornos no son compatibles con el tipo Date de Visual Basic. Al pasar un
argumento de fecha y hora a esos componentes, declárelo en el código de Visual Basic como Double en
lugar de como Date , y use los métodos de conversión DateTime.FromOADate y DateTime.ToOADate.
Caracteres de tipo. Date no tiene un carácter de tipo literal o un carácter de tipo de identificador. Sin
embargo, el compilador trata los literales incluidos entre caracteres de signo de número ( # # ) como
Date .

Tipo de marco. El tipo correspondiente en .NET Framework es la estructura System.DateTime.

Ejemplo
Una variable o constante del tipo de datos Date contiene la fecha y la hora. En el ejemplo siguiente se ilustra
esto.

Dim someDateAndTime As Date = #8/13/2002 12:14 PM#

Vea también
System.DateTime
Tipos de datos
Standard Date and Time Format Strings
Custom Date and Time Format Strings
Funciones de conversión de tipos
Resumen de conversión
Uso eficiente de tipos de datos
Decimal (Tipo de datos, Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

Contiene valores de 128 bits (16 bytes) firmados que representan números enteros de 96 bits (12 bytes)
escalados por una potencia variable de 10. El factor de escala especifica el número de dígitos a la derecha del
separador decimal; está comprendido entre 0 y 28. Con una escala de 0 (sin posiciones decimales), el mayor
valor posible es +/-79.228.162.514.264.337.593.543.950.335 (+/-7.9228162514264337593543950335E +
28). Con 28 posiciones decimales, el valor más grande es +/-7,9228162514264337593543950335 y el menor
valor distinto de cero es +/-0,0000000000000000000000000001 (+/-1E-28).

Comentarios
El tipo de datos Decimal proporciona el mayor número de dígitos significativos para un número. Admite hasta
29 dígitos significativos y puede representar valores que superan los 7,9228 x 10 ^ 28. Es especialmente
adecuado para los cálculos, como finanzas, que requieren un gran número de dígitos, pero no pueden tolerar
errores de redondeo.
El valor predeterminado de Decimal es 0.

Sugerencias de programación
Precisión. Decimal no es un tipo de datos de punto flotante. La estructura Decimal contiene un valor
entero binario, junto con un bit de signo y un factor de escala entero que especifica qué parte del valor
es una fracción decimal. Por este motivo, los números Decimal tienen una representación más precisa
en la memoria que los tipos de punto flotante ( Single y Double ).
Rendimiento. El tipo de datos Decimal es el más lento de todos los tipos numéricos. Debe sopesar la
importancia de la precisión respecto al rendimiento antes de elegir un tipo de datos.
Ampliación. El tipo de datos Decimal se amplía a Single o Double . Esto significa que puede
convertir Decimal en cualquiera de estos tipos sin encontrar un error de System.OverflowException.
Ceros a la derecha. Visual Basic no almacena ceros finales en un literal Decimal . Sin embargo, una
variable Decimal conserva los ceros finales adquiridos de cálculo. En el ejemplo siguiente se ilustra
esto.

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

La salida de MsgBox en el ejemplo anterior es la siguiente:

d1 = 2.375, d2 = 1.625, d3 = 4.000, d4 = 4

Caracteres de tipo. Al agregar el carácter de tipo literal D a un literal, el tipo de datos se convierte
forzosamente en el tipo de datos Decimal . Si se agrega el carácter de tipo identificador @ a cualquier
identificador, se convierte forzosamente al tipo Decimal .
Tipo de marco. El tipo correspondiente en .NET Framework es la estructura System.Decimal.

Intervalo
Es posible que deba usar el carácter de tipo D para asignar un valor grande a una variable o constante de
Decimal . Este requisito se debe a que el compilador interpreta un literal como Long a menos que un carácter
de tipo literal siga el literal, como se muestra en el ejemplo siguiente.

Dim bigDec1 As Decimal = 9223372036854775807 ' No overflow.


Dim bigDec2 As Decimal = 9223372036854775808 ' Overflow.
Dim bigDec3 As Decimal = 9223372036854775808D ' No overflow.

La declaración de bigDec1 no produce un desbordamiento porque el valor asignado a él está dentro del
intervalo de Long . El valor Long se puede asignar a la variable Decimal .
La declaración de bigDec2 genera un error de desbordamiento porque el valor asignado a él es demasiado
grande para Long . Dado que el literal numérico no se puede interpretar primero como Long , no se puede
asignar a la variable Decimal .
Por bigDec3 , el carácter de tipo literal D soluciona el problema obligando al compilador a interpretar el literal
como Decimal en lugar de como Long .

Vea también
System.Decimal
Decimal.Decimal
Math.Round
Tipos de datos
Single (tipo de datos)
Double (tipos de datos)
Funciones de conversión de tipos
Resumen de conversión
Uso eficiente de tipos de datos
Double (Tipo de datos, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Contiene números de punto flotante de precisión doble de IEEE 64 bits (8 bytes) que van del valor de-
1.79769313486231570 E + 308 a-4.94065645841246544 E-324 para los valores negativos y de
4.94065645841246544 E-324 a 1.79769313486231570 E + 308 para valores positivos. Los números de
precisión doble almacenan una aproximación de un número real.

Comentarios
El tipo de datos Double proporciona las magnitudes más grandes y pequeñas posibles para un número.
El valor predeterminado de Double es 0.

Sugerencias de programación
Precisión. Al trabajar con números de punto flotante, recuerde que no siempre tienen una
representación precisa en la memoria. Esto podría dar lugar a resultados inesperados de ciertas
operaciones, como la comparación de valores y el operador Mod . Para obtener más información, vea
solución de problemas de tipos de datos.
Ceros a la derecha. Los tipos de datos de punto flotante no tienen ninguna representación interna
de los caracteres cero finales. Por ejemplo, no distinguen entre 4,2000 y 4,2. Por lo tanto, los
caracteres cero finales no aparecen al mostrar o imprimir valores de punto flotante.
Caracteres de tipo. Al agregar el carácter de tipo literal R a un literal, el tipo de datos se convierte
forzosamente en el tipo de datos Double . Por ejemplo, si un valor entero va seguido de R , el valor se
cambia a un Double .

' Visual Basic expands the 4 in the statement Dim dub As Double = 4R to 4.0:
Dim dub As Double = 4.0R

Si se agrega el carácter de tipo identificador # a cualquier identificador, se convierte forzosamente al


tipo Double . En el ejemplo siguiente, la variable num se escribe como un Double :

Dim num# = 3

Tipo de marco. El tipo correspondiente en .NET Framework es la estructura System.Double.

Vea también
System.Double
Tipos de datos
Decimal (tipo de datos)
Single (tipo de datos)
Funciones de conversión de tipos
Resumen de conversión
Uso eficiente de tipos de datos
Solución de problemas de tipos de datos
Caracteres de tipo
Tipo de datos entero (Visual Basic)
21/03/2020 • 6 minutes to read • Edit Online

Contiene enteros de 32 bits con signo (4 bytes) comprendidos en el intervalo entre -2.147.483.648 y
2.147.483.647.

Observaciones
El tipo de datos Integer proporciona un rendimiento óptimo en un procesador de 32 bits. Los demás tipos
enteros son más lentos a la hora de cargarse y almacenarse en la memoria.
El valor predeterminado de Integer es 0.

Asignaciones literales
Puede declarar e Integer inicializar una variable asignándole un literal decimal, un literal hexadecimal, un
literal octal o (a partir de Visual Basic 2017) un literal binario. Si el literal entero está fuera del intervalo de
Integer (es decir, si es inferior a Int32.MinValue o mayor que Int32.MaxValue, se produce un error de
compilación.
En el ejemplo siguiente, los enteros que equivalen a 90 946 que se representan como literales binarios,
hexadecimales y decimales se asignan a valores Integer .

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

NOTE
Utilice el &h prefijo &H o para denotar un &b &B literal hexadecimal, el prefijo o &o &O para denotar un literal
binario, y el prefijo o para denotar un literal octal. Los literales decimales no tienen prefijo.

A partir de Visual Basic 2017, también _ puede usar el carácter de subrayado, , como separador de dígitos
para mejorar la legibilidad, como se muestra en el ejemplo siguiente.
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 de Visual Basic 15.5, también _ puede usar el carácter de subrayado ( ) como separador inicial entre el
prefijo y los dígitos hexadecimales, binarios u octales. Por ejemplo:

Dim number As Integer = &H_C305_F860

Para usar el carácter de subrayado como separador inicial, debe agregar el elemento siguiente al archivo del
proyecto de Visual Basic (*.vbproj):

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Para obtener más información, consulte configuración de la versióndel lenguaje Visual Basic .
Los literales numéricos I también pueden incluir Integer el carácter de tipo para denotar el tipo de datos,
como se muestra en el ejemplo siguiente.

Dim number = &H_035826I

sugerencias de programación
Consideraciones de interoperabilidad. Si está interactuando con componentes no escritos para
.NET Framework, como objetos de automatización o COM, recuerde que Integer tiene un ancho de
datos diferente (16 bits) en otros entornos. Al pasar un argumento de 16 bits a esos componentes,
declárelo en el código de Visual Basic como Short en lugar de como Integer .
Ampliación. El tipo de datos Integer se amplía a Long , Decimal , Single o Double . Esto significa
que puede convertir un tipo de datos Integer en cualquiera de estos tipos sin que se produzca un
error System.OverflowException.
Escriba Caracteres. Al agregar el carácter de tipo literal I a un literal, el tipo de datos se convierte
forzosamente en el tipo de datos Integer . Si se agrega el carácter de tipo identificador % a cualquier
identificador, se convierte forzosamente al tipo Integer .
Tipo de Framework . El tipo correspondiente en .NET Framework es la estructura System.Int32.

Intervalo
Si intenta establecer una variable de un tipo entero en un número que está fuera del intervalo
correspondiente a ese tipo, se produce un error. Si intenta establecerlo en una fracción, el número se redondea
hacia arriba o hacia abajo al valor entero más cercano. Si el número está equidistante a dos valores enteros, el
valor se redondea al entero par más próximo. Este comportamiento minimiza los errores de redondeo que se
derivan de redondear de forma consistente un valor de punto medio en una dirección única. En el código
siguiente se muestran ejemplos de redondeo.

' 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

Consulte también
System.Int32
Tipos de datos
Long (tipo de datos)
Short (tipo de datos)
Funciones de conversión de tipos
Resumen de conversión
Uso eficiente de tipos de datos
Tipo de datos long (Visual Basic)
21/03/2020 • 4 minutes to read • Edit Online

Contiene enteros de 64 bits (8 bytes) firmados que van en valor de -9,223,372,036,854,775,808 a


9,223,372,036,854,775,807 (9.2...E+18).

Observaciones
Utilice Long el tipo de datos para contener números Integer enteros que son demasiado grandes para caber
en el tipo de datos.
El valor predeterminado de Long es 0.

Asignaciones literales
Puede declarar e Long inicializar una variable asignándole un literal decimal, un literal hexadecimal, un literal
octal o (a partir de Visual Basic 2017) un literal binario. Si el literal entero está fuera del intervalo de Long (es
decir, si es inferior a Int64.MinValue o mayor que Int64.MaxValue, se produce un error de compilación.
En el ejemplo siguiente, los enteros que equivalen a 4 294 967 296 que se representan como literales binarios,
hexadecimales y decimales se asignan a valores Long .

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

NOTE
Utilice el &h prefijo &H o para denotar un &b &B literal hexadecimal, el prefijo o &o &O para denotar un literal
binario, y el prefijo o para denotar un literal octal. Los literales decimales no tienen prefijo.

A partir de Visual Basic 2017, también _ puede usar el carácter de subrayado, , como separador de dígitos
para mejorar la legibilidad, como se muestra en el ejemplo siguiente.
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 de Visual Basic 15.5, también _ puede usar el carácter de subrayado ( ) como separador inicial entre el
prefijo y los dígitos hexadecimales, binarios u octales. Por ejemplo:

Dim number As Long = &H_0FAC_0326_1489_D68C

Para usar el carácter de subrayado como separador inicial, debe agregar el elemento siguiente al archivo del
proyecto de Visual Basic (*.vbproj):

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Para obtener más información, consulte configuración de la versióndel lenguaje Visual Basic .
Los literales numéricos L también pueden incluir Long el carácter de tipo para denotar el tipo de datos,
como se muestra en el ejemplo siguiente.

Dim number = &H_0FAC_0326_1489_D68CL

sugerencias de programación
Consideraciones de interoperabilidad. Si está interactuando con componentes no escritos para
.NET Framework, por ejemplo, objetos de automatización o COM, recuerde que Long tiene un ancho de
datos diferente (32 bits) en otros entornos. Si va a pasar un argumento de 32 bits Integer a Long un
componente de este tipo, declárelo como en lugar de en el nuevo código de Visual Basic.
Ampliación. El Long tipo de datos Decimal Single se Double amplía a , , o . Esto significa que puede
convertir un tipo de datos Long en cualquiera de estos tipos sin que se produzca un error
System.OverflowException.
Escriba Caracteres. Al agregar el carácter de tipo literal L a un literal, el tipo de datos se convierte
forzosamente en el tipo de datos Long . Si se agrega el carácter de tipo identificador & a cualquier
identificador, se convierte forzosamente al tipo Long .
Tipo de Framework . El tipo correspondiente en .NET Framework es la estructura System.Int64.

Consulte también
Int64
Tipos de datos
Tipo de datos enteros
Short (tipo de datos)
Funciones de conversión de tipos
Resumen de conversión
Uso eficiente de tipos de datos
Object Data Type
27/11/2019 • 5 minutes to read • Edit Online

Contiene direcciones que hacen referencia a objetos. Puede asignar cualquier tipo de referencia (cadena,
matriz, clase o interfaz) a una variable de Object . Una variable Object también puede hacer referencia a
datos de cualquier tipo de valor (Numeric, Boolean , Char , Date , Structure o Enumeration).

Comentarios
El tipo de datos Object puede apuntar a datos de cualquier tipo de datos, incluida cualquier instancia de
objeto que la aplicación reconozca. Use Object cuando no conozca en tiempo de compilación a qué tipo de
datos puede apuntar la variable.
El valor predeterminado de Object es Nothing (una referencia nula).

Tipos de datos
Puede asignar una variable, una constante o una expresión de cualquier tipo de datos a una variable de
Object . Para determinar el tipo de datos al que hace referencia una variable Object actualmente, puede usar
el método GetTypeCode de la clase System.Type. En el ejemplo siguiente se ilustra esto.

Dim myObject As Object


' Suppose myObject has now had something assigned to it.
Dim datTyp As Integer
datTyp = Type.GetTypeCode(myObject.GetType())

El tipo de datos Object es un tipo de referencia. Sin embargo, Visual Basic trata una variable Object como un
tipo de valor cuando hace referencia a los datos de un tipo de valor.

Almacenamiento
Sea cual sea el tipo de datos al que haga referencia, una variable Object no contenga el propio valor de datos,
sino un puntero al valor. Siempre usa cuatro bytes en la memoria del equipo, pero no incluye el
almacenamiento de los datos que representan el valor de la variable. Debido al código que usa el puntero para
ubicar los datos, Object variables que contienen tipos de valor son ligeramente más lentas de tener acceso
que las variables de tipo explícito.

Sugerencias de programación
Consideraciones de interoperabilidad. Si interactúa con componentes que no se han escrito para
el .NET Framework, por ejemplo, objetos de automatización o COM, tenga en cuenta que los tipos de
puntero en otros entornos no son compatibles con el tipo de Object Visual Basic.
Rendimiento. Una variable que se declara con el tipo Object es lo suficientemente flexible como para
contener una referencia a cualquier objeto. Sin embargo, cuando se invoca un método o una propiedad
en este tipo de variable, siempre se incurre en el enlace en tiempo de ejecución (en tiempo de
ejecución). Para forzar el enlace anticipado (en tiempo de compilación) y un mejor rendimiento, declare
la variable con un nombre de clase específico o conviértala en el tipo de datos específico.
Al declarar una variable de objeto, intente usar un tipo de clase concreto, por ejemplo
OperatingSystem, en lugar del tipo de Object generalizado. También debe utilizar la clase más
específica disponible, como TextBox en lugar de Control, de modo que pueda tener acceso a sus
propiedades y métodos. Normalmente, puede usar la lista clases de la Examinador de objetos para
buscar los nombres de clase disponibles.
Ampliación. Todos los tipos de datos y todos los tipos de referencia se amplían al tipo de datos
Object . Esto significa que puede convertir cualquier tipo en Object sin encontrar un error de
System.OverflowException.
Sin embargo, si se convierte entre tipos de valor y Object , Visual Basic realiza operaciones
denominadas conversión boxing y conversión unboxing, lo que ralentiza la ejecución.
Caracteres de tipo. Object no tiene un carácter de tipo literal o un carácter de tipo de identificador.
Tipo de marco. El tipo correspondiente en el .NET Framework es la clase System.Object.

Ejemplo
En el ejemplo siguiente se muestra una variable de Object que apunta a una instancia de objeto.

Dim objDb As Object


Dim myCollection As New Collection()
' Suppose myCollection has now been populated.
objDb = myCollection.Item(1)

Vea también
Object
Tipos de datos
Funciones de conversión de tipos
Resumen de conversión
Uso eficiente de tipos de datos
Determinar si dos objetos están relacionados
Determinar si dos objetos son idénticos
Tipo de datos SByte (Visual Basic)
21/03/2020 • 5 minutes to read • Edit Online

Contiene enteros de 8 bits (1 byte) con signo que oscilan en valor de -128 a 127.

Observaciones
Utilice SByte el tipo de datos para contener valores enteros Integer que no requieren Short el ancho de datos
completo o incluso el medio ancho de datos de . En algunos casos, Common Language Runtime podría SByte
empaquetar las variables estrechamente juntas y ahorrar consumo de memoria.
El valor predeterminado de SByte es 0.

Asignaciones literales
Puede declarar e SByte inicializar una variable asignándole un literal decimal, un literal hexadecimal, un literal
octal o (a partir de Visual Basic 2017) un literal binario.
En el ejemplo siguiente, los enteros iguales a -102 que se representan SByte como literales decimales,
hexadecimales y binarios se asignan a los valores. En este ejemplo es necesario /removeintchecks compilar con
el modificador del compilador.

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

NOTE
Utilice el &h prefijo &H o para denotar un &b &B literal hexadecimal, el prefijo o &o &O para denotar un literal
binario, y el prefijo o para denotar un literal octal. Los literales decimales no tienen prefijo.

A partir de Visual Basic 2017, también _ puede usar el carácter de subrayado, , como separador de dígitos para
mejorar la legibilidad, como se muestra en el ejemplo siguiente.

Dim sbyteValue3 As SByte = &B1001_1010


Console.WriteLine(sbyteValue3)
' The example displays the following output:
' -102

A partir de Visual Basic 15.5, también _ puede usar el carácter de subrayado ( ) como separador inicial entre el
prefijo y los dígitos hexadecimales, binarios u octales. Por ejemplo:
Dim number As SByte = &H_F9

Para usar el carácter de subrayado como separador inicial, debe agregar el elemento siguiente al archivo del
proyecto de Visual Basic (*.vbproj):

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Para obtener más información, consulte configuración de la versióndel lenguaje Visual Basic .
Si el literal entero está fuera del intervalo de SByte (es decir, si es inferior a SByte.MinValue o mayor que
SByte.MaxValue, se produce un error de compilación. Cuando un literal entero no tiene sufijo, se deduce un
entero. Si el literal entero está Integer fuera del intervalo del tipo, se deduce un Long. Esto significa que, en los
ejemplos 0x9A anteriores, los literales numéricos y 0b10011010 se interpretan como enteros
SByte.MaxValuecon signo de 32 bits con un valor de 156, que supera . Para compilar correctamente código
como este que asigna un SByte entero no decimal a un , puede realizar una de las siguientes acciones:
Deshabilite las comprobaciones de límites /removeintchecks enteros compilando con el modificador del
compilador.
Utilice un carácter de tipo para definir explícitamente SByte el valor literal que desea asignar al archivo .
En el ejemplo siguiente Short se asigna SByte un valor literal negativo a un archivo . Tenga en cuenta
que, para los números negativos, se debe establecer el bit de orden superior de la palabra de orden
superior del literal numérico. En el caso de nuestro ejemplo, este Short es el bit 15 del valor literal.

Dim sByteValue1 As SByte = &HFF_9As


Dim sByteValue2 As SByte = &B1111_1111_1001_1010s
Console.WriteLine(sByteValue1)
Console.WriteLine(sByteValue2)

sugerencias de programación
Cumplimiento de CLS. El SByte tipo de datos no forma parte de Common Language Specification
(CLS), por lo que el código compatible con CLS no puede consumir un componente que lo utilice.
Ampliación. El SByte tipo de datos Short Integer se Long Decimal amplía Single a Double , , , , y .
Esto significa que SByte puede convertir a cualquiera System.OverflowException de estos tipos sin
encontrar un error.
Escriba Caracteres. SByte no tiene ningún carácter de tipo literal o carácter de tipo identificador.
Tipo de Framework . El tipo correspondiente en .NET Framework es la estructura System.SByte.

Consulte también
System.SByte
Tipos de datos
Funciones de conversión de tipos
Resumen de conversión
Short (tipo de datos)
Tipo de datos enteros
Long (tipo de datos)
Uso eficiente de tipos de datos
Tipo de datos corto (Visual Basic)
21/03/2020 • 4 minutes to read • Edit Online

Contiene enteros de 16 bits (2 bytes) con signo que oscilan en valor de -32.768 a 32.767.

Observaciones
Utilice Short el tipo de datos para contener valores enteros Integer que no requieren el ancho de datos
completo de . En algunos casos, Common Language Short Runtime puede empaquetar las variables
estrechamente juntas y ahorrar consumo de memoria.
El valor predeterminado de Short es 0.

Asignaciones literales
Puede declarar e Short inicializar una variable asignándole un literal decimal, un literal hexadecimal, un literal
octal o (a partir de Visual Basic 2017) un literal binario. Si el literal entero está fuera del intervalo de Short (es
decir, si es inferior a Int16.MinValue o mayor que Int16.MaxValue, se produce un error de compilación.
En el ejemplo siguiente, los enteros iguales a 1.034 que se representan como Integer literales Short
decimales, hexadecimales y binarios se convierten implícitamente de Entero a valores.

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

NOTE
Utilice el &h prefijo &H o para denotar un &b &B literal hexadecimal, el prefijo o &o &O para denotar un literal
binario, y el prefijo o para denotar un literal octal. Los literales decimales no tienen prefijo.

A partir de Visual Basic 2017, también _ puede usar el carácter de subrayado, , como separador de dígitos
para mejorar la legibilidad, como se muestra en el ejemplo siguiente.

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 de Visual Basic 15.5, también _ puede usar el carácter de subrayado ( ) como separador inicial entre el
prefijo y los dígitos hexadecimales, binarios u octales. Por ejemplo:

Dim number As Short = &H_3264

Para usar el carácter de subrayado como separador inicial, debe agregar el elemento siguiente al archivo del
proyecto de Visual Basic (*.vbproj):

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Para obtener más información, consulte configuración de la versióndel lenguaje Visual Basic .
Los literales numéricos S también pueden incluir Short el carácter de tipo para denotar el tipo de datos,
como se muestra en el ejemplo siguiente.

Dim number = &H_3264S

sugerencias de programación
Ampliación. El Short tipo de datos Integer Long se Decimal Single amplía Double a , , , o . Esto
significa que puede convertir un tipo de datos Short en cualquiera de estos tipos sin que se produzca
un error System.OverflowException.
Escriba Caracteres. Al agregar el carácter de tipo literal S a un literal, el tipo de datos se convierte
forzosamente en el tipo de datos Short . Short no tiene ningún carácter de tipo identificador.
Tipo de Framework . El tipo correspondiente en .NET Framework es la estructura System.Int16.

Consulte también
System.Int16
Tipos de datos
Funciones de conversión de tipos
Resumen de conversión
Tipo de datos enteros
Long (tipo de datos)
Uso eficiente de tipos de datos
Single (Tipo de datos, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Contiene números de punto flotante de precisión sencilla (4 bytes) de IEEE 32 bits con signo que van en el
valor de-3.4028235 E + 38 a-401298e E-45 para los valores negativos y desde 401298e E-45 hasta
3.4028235 E + 38 para los valores positivos. Los números de precisión sencilla almacenan una aproximación
de un número real.

Comentarios
Utilice el tipo de datos Single para contener valores de punto flotante que no requieran el ancho completo
de los datos de Double . En algunos casos, es posible que el Common Language Runtime pueda empaquetar
las variables de Single en estrecha colaboración y ahorrar consumo de memoria.
El valor predeterminado de Single es 0.

Sugerencias de programación
Precisión. Al trabajar con números de punto flotante, tenga en cuenta que no siempre tienen una
representación precisa en la memoria. Esto podría dar lugar a resultados inesperados de ciertas
operaciones, como la comparación de valores y el operador Mod . Para obtener más información, vea
solución de problemas de tipos de datos.
Ampliación. El tipo de datos Single se amplía a Double . Esto significa que puede convertir Single
a Double sin encontrar un error de System.OverflowException.
Ceros a la derecha. Los tipos de datos de punto flotante no tienen ninguna representación interna
de 0 caracteres finales. Por ejemplo, no distinguen entre 4,2000 y 4,2. Por lo tanto, los caracteres 0
finales no aparecen al mostrar o imprimir valores de punto flotante.
Caracteres de tipo. Al agregar el carácter de tipo literal F a un literal, el tipo de datos se convierte
forzosamente en el tipo de datos Single . Si se agrega el carácter de tipo identificador ! a cualquier
identificador, se convierte forzosamente al tipo Single .
Tipo de marco. El tipo correspondiente en .NET Framework es la estructura System.Single.

Vea también
System.Single
Tipos de datos
Decimal (tipo de datos)
Double (tipos de datos)
Funciones de conversión de tipos
Resumen de conversión
Uso eficiente de tipos de datos
Solución de problemas de tipos de datos
String (Tipo de datos, Visual Basic)
27/11/2019 • 6 minutes to read • Edit Online

Contiene secuencias de puntos de código sin signo de 16 bits (2 bytes) que van desde 0 hasta 65535. Cada
punto de código, o código de carácter, representa un único carácter Unicode. Una cadena puede contener entre
0 y aproximadamente 2 mil millones (2 ^ 31) caracteres Unicode.

Comentarios
Utilice el tipo de datos String para contener varios caracteres sin la sobrecarga de administración de la
matriz de Char() , una matriz de elementos Char .
El valor predeterminado de String es Nothing (una referencia nula). Tenga en cuenta que esto no es lo
mismo que la cadena vacía (valor "" ).

Caracteres Unicode
Los primeros 128 puntos de código (0 – 127) de Unicode corresponden a las letras y símbolos de un teclado
estándar de EE. UU. Estos primeros 128 puntos de código son los mismos que los que define el juego de
caracteres ASCII. Los dos puntos de código 128 (128 – 255) representan caracteres especiales, como Letras de
alfabetos basados en latín, acentos, símbolos de moneda y fracciones. Unicode utiliza el resto de puntos de
código (256-65535) para una amplia variedad de símbolos. Esto incluye los caracteres de texto, los signos
diacríticos y los símbolos matemáticos y técnicos del mundo.
Puede utilizar métodos como IsDigit y IsPunctuation en un carácter individual de una variable de String para
determinar su clasificación Unicode.

Requisitos de formato
Debe incluir un literal de String entre comillas ( " " ). Si debe incluir una comilla tipográfica como uno de los
caracteres de la cadena, utilice dos comillas contiguas ( "" ). En el ejemplo siguiente se ilustra esto.

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.")

Tenga en cuenta que las comillas contiguas que representan una comilla en la cadena son independientes de
las comillas que comienzan y finalizan el literal String .

Manipulaciones de cadenas
Una vez que se asigna una cadena a una variable String , esa cadena es inmutable, lo que significa que no se
puede cambiar su longitud o su contenido. Al modificar una cadena de alguna manera, Visual Basic crea una
nueva cadena y abandona la anterior. A continuación, la variable String señala a la nueva cadena.
Puede manipular el contenido de una variable de String mediante una variedad de funciones de cadena. En
el ejemplo siguiente se muestra la función Left
Dim S As String = "Database"
' The following statement sets S to a new string containing "Data".
S = Microsoft.VisualBasic.Left(S, 4)

Una cadena creada por otro componente se puede rellenar con espacios iniciales o finales. Si recibe este tipo
de cadena, puede usar las funciones Trim, LTrimy RTrim para quitar estos espacios.
Para obtener más información sobre las manipulaciones de cadenas, vea cadenas.

Sugerencias de programación
Números negativos. Recuerde que los caracteres que contiene String no están firmados y no
pueden representar valores negativos. En cualquier caso, no debe utilizar String para contener valores
numéricos.
Consideraciones de interoperabilidad. Si interactúa con componentes que no se han escrito para el
.NET Framework, por ejemplo, objetos de automatización o COM, recuerde que los caracteres de
cadena tienen un ancho de datos diferente (8 bits) en otros entornos. Si va a pasar un argumento de
cadena de caracteres de 8 bits a este componente, declárelo como Byte() , una matriz de elementos
Byte , en lugar de String en el nuevo código de Visual Basic.

Caracteres de tipo. Anexar el carácter de tipo de identificador $ a cualquier identificador lo


convierte al tipo de datos String . String no tiene un carácter de tipo literal. Sin embargo, el
compilador trata los literales entre comillas ( " " ) como String .
Tipo de marco. El tipo correspondiente en el .NET Framework es la clase System.String.

Vea también
System.String
Tipos de datos
Char (tipo de datos)
Funciones de conversión de tipos
Resumen de conversión
Llamar a una función de Windows que adopta tipos sin signo
Uso eficiente de tipos de datos
UInteger (tipo de datos)
21/03/2020 • 5 minutes to read • Edit Online

Contiene enteros de 32 bits sin signo (4 bytes) que varían en valor de 0 a 4.294.967.295.

Observaciones
El UInteger tipo de datos proporciona el valor sin signo más grande en el ancho de datos más eficaz.
El valor predeterminado de UInteger es 0.

Asignaciones literales
Puede declarar e UInteger inicializar una variable asignándole un literal decimal, un literal hexadecimal, un
literal octal o (a partir de Visual Basic 2017) un literal binario. Si el literal entero está fuera del intervalo de
UInteger (es decir, si es inferior a UInt32.MinValue o mayor que UInt32.MaxValue, se produce un error de
compilación.
En el ejemplo siguiente, los enteros que equivalen a 3 000 000 000 que se representan como literales binarios,
hexadecimales y decimales se asignan a valores UInteger .

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

NOTE
Utilice el &h prefijo &H o para denotar un &b &B literal hexadecimal, el prefijo o &o &O para denotar un literal
binario, y el prefijo o para denotar un literal octal. Los literales decimales no tienen prefijo.

A partir de Visual Basic 2017, también _ puede usar el carácter de subrayado, , como separador de dígitos para
mejorar la legibilidad, como se muestra en el ejemplo siguiente.
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 de Visual Basic 15.5, también _ puede usar el carácter de subrayado ( ) como separador inicial entre el
prefijo y los dígitos hexadecimales, binarios u octales. Por ejemplo:

Dim number As UInteger = &H_0F8C_0326

Para usar el carácter de subrayado como separador inicial, debe agregar el elemento siguiente al archivo del
proyecto de Visual Basic (*.vbproj):

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Para obtener más información, consulte configuración de la versióndel lenguaje Visual Basic .
Los literales numéricos UI ui también pueden incluir UInteger el carácter o tipo para denotar el tipo de
datos, como se muestra en el ejemplo siguiente.

Dim number = &H_0FAC_14D7ui

sugerencias de programación
Los UInteger Integer tipos de datos y y proporcionan un rendimiento óptimo en UShort Short un Byte
procesador SByte de 32 bits, ya que los tipos enteros más pequeños ( , , , y ), aunque usan menos bits, tardan
más tiempo en cargarse, almacenarlos y recuperarse.
Números negativos. Dado UInteger que es un tipo sin signo, no puede representar un número
negativo. Si utiliza el operador - unario menos ( ) en UInteger una expresión que se Long evalúa como
tipo , Visual Basic convierte la expresión en primer lugar.
Cumplimiento de CLS. El UInteger tipo de datos no forma parte de Common Language Specification
(CLS), por lo que el código compatible con CLS no puede consumir un componente que lo utilice.
Consideraciones de interoperabilidad. Si está interactuando con componentes no escritos para .NET
Framework, por ejemplo, objetos de automatización o COM, tenga en cuenta que tipos como uint
pueden tener un ancho de datos diferente (16 bits) en otros entornos. Si va a pasar un argumento de 16
bits UShort a UInteger un componente de este tipo, declárelo como en lugar de en el código
administrado de Visual Basic.
Ampliación. El UInteger tipo de datos Long ULong se Decimal Single amplía Double a , , , y . Esto
significa que UInteger puede convertir a cualquiera System.OverflowException de estos tipos sin
encontrar un error.
Escriba Caracteres. Anexar los caracteres UI de tipo literal UInteger a un literal lo fuerza al tipo de
datos. UInteger no tiene ningún carácter de tipo identificador.
Tipo de Framework . El tipo correspondiente en .NET Framework es la estructura System.UInt32.

Consulte también
UInt32
Tipos de datos
Funciones de conversión de tipos
Resumen de conversión
Llamar a una función de Windows que adopta tipos sin signo
Uso eficiente de tipos de datos
Tipo de datos ULong (Visual Basic)
21/03/2020 • 5 minutes to read • Edit Online

Contiene enteros de 64 bits sin signo (8 bytes) que varían en valor de 0 a 18,446,744,073,709,551,615 (más de
1,84 veces 10 x 19).

Observaciones
Utilice ULong el tipo de datos para UInteger contener datos binarios demasiado grandes para , o los valores
enteros sin signo más grandes posibles.
El valor predeterminado de ULong es 0.

Asignaciones literales
Puede declarar e ULong inicializar una variable asignándole un literal decimal, un literal hexadecimal, un literal
octal o (a partir de Visual Basic 2017) un literal binario. Si el literal entero está fuera del intervalo de ULong (es
decir, si es inferior a UInt64.MinValue o mayor que UInt64.MaxValue, se produce un error de compilación.
En el ejemplo siguiente, los enteros que equivalen a 7 934 076 125 que se representan como literales binarios,
hexadecimales y decimales se asignan a valores ULong .

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

NOTE
Utilice el &h prefijo &H o para denotar un &b &B literal hexadecimal, el prefijo o &o &O para denotar un literal
binario, y el prefijo o para denotar un literal octal. Los literales decimales no tienen prefijo.

A partir de Visual Basic 2017, también _ puede usar el carácter de subrayado, , como separador de dígitos para
mejorar la legibilidad, como se muestra en el ejemplo siguiente.
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 de Visual Basic 15.5, también _ puede usar el carácter de subrayado ( ) como separador inicial entre el
prefijo y los dígitos hexadecimales, binarios u octales. Por ejemplo:

Dim number As ULong = &H_F9AC_0326_1489_D68C

Para usar el carácter de subrayado como separador inicial, debe agregar el elemento siguiente al archivo del
proyecto de Visual Basic (*.vbproj):

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Para obtener más información, consulte configuración de la versióndel lenguaje Visual Basic .
Los literales numéricos UL ul también pueden incluir ULong el carácter o tipo para denotar el tipo de datos,
como se muestra en el ejemplo siguiente.

Dim number = &H_00_00_0A_96_2F_AC_14_D7ul

sugerencias de programación
Números negativos. Dado ULong que es un tipo sin signo, no puede representar un número negativo.
Si utiliza el operador - unario menos ( ) en ULong una expresión que se Decimal evalúa como tipo ,
Visual Basic convierte la expresión en primer lugar.
Cumplimiento de CLS. El ULong tipo de datos no forma parte de Common Language Specification
(CLS), por lo que el código compatible con CLS no puede consumir un componente que lo utilice.
Consideraciones de interoperabilidad. Si está interactuando con componentes no escritos para .NET
Framework, por ejemplo, objetos de automatización o COM, tenga en cuenta que tipos como ulong
pueden tener un ancho de datos diferente (32 bits) en otros entornos. Si va a pasar un argumento de 32
bits UInteger a ULong un componente de este tipo, declárelo como en lugar de en el código
administrado de Visual Basic.
Además, Automation no admite enteros de 64 bits en Windows 95, Windows 98, Windows ME o
Windows 2000. No se puede ULong pasar un argumento de Visual Basic a un componente de
automatización en estas plataformas.
Ampliación. El ULong tipo de datos Decimal Single se Double amplía a , , y . Esto significa que ULong
puede convertir a cualquiera System.OverflowException de estos tipos sin encontrar un error.
Escriba Caracteres. Anexar los caracteres UL de tipo literal ULong a un literal lo fuerza al tipo de
datos. ULong no tiene ningún carácter de tipo identificador.
Tipo de Framework . El tipo correspondiente en .NET Framework es la estructura System.UInt64.

Consulte también
UInt64
Tipos de datos
Funciones de conversión de tipos
Resumen de conversión
Llamar a una función de Windows que adopta tipos sin signo
Uso eficiente de tipos de datos
Tipo de datos definido por el usuario
27/11/2019 • 4 minutes to read • Edit Online

Contiene los datos en un formato definido por el usuario. La instrucción Structure define el formato.
Las versiones anteriores de Visual Basic admiten el tipo definido por el usuario (UDT). La versión actual expande el
UDT a una estructura. Una estructura es una concatenación de uno o más miembros de varios tipos de datos.
Visual Basic trata una estructura como una sola unidad, aunque también puede tener acceso a sus miembros
individualmente.

Comentarios
Defina y use un tipo de datos de estructura cuando necesite combinar varios tipos de datos en una sola unidad, o
cuando ninguno de los tipos de datos básicos satisfaga sus necesidades.
El valor predeterminado de un tipo de datos de estructura consta de la combinación de los valores
predeterminados de cada uno de sus miembros.

Formato de declaración
Una declaración de estructura comienza con la instrucción Structure y termina con la instrucción End Structure .
La instrucción Structure proporciona el nombre de la estructura, que también es el identificador del tipo de datos
que la estructura está definiendo. Otras partes del código pueden utilizar este identificador para declarar variables,
parámetros y valores devueltos por la función para que sean del tipo de datos de esta estructura.
Las declaraciones entre las instrucciones Structure y End Structure definen los miembros de la estructura.

Niveles de acceso a miembros


Debe declarar cada miembro mediante una instrucción Dim o una instrucción que especifique el nivel de acceso,
como Public, Friendo Private. Si usa una instrucción Dim , el nivel de acceso predeterminado es público.

Sugerencias de programación
Consumo de memoria. Al igual que sucede con los demás tipos de datos compuestos, no puede
calcularse de forma precisa el consumo total de memoria de una estructura sumando las asignaciones de
almacenamiento nominal de sus miembros. Es más, no puede suponerse que el orden de almacenamiento
en memoria sea el mismo que el orden de la declaración. Si necesita controlar el diseño de almacenamiento
de una estructura, puede aplicar el atributo StructLayoutAttribute a la instrucción Structure .
Consideraciones de interoperabilidad. Si interactúa con componentes que no se han escrito para el
.NET Framework, por ejemplo, objetos de automatización o COM, tenga en cuenta que los tipos definidos
por el usuario en otros entornos no son compatibles con los tipos de estructura de Visual Basic.
Ampliación. No hay ninguna conversión automática a o desde cualquier tipo de datos de estructura.
Puede definir operadores de conversión en la estructura mediante la instrucción del operadory puede
declarar que cada operador de conversión sea Widening o Narrowing .
Caracteres de tipo. Los tipos de datos de estructura no tienen un carácter de tipo literal o un carácter de
tipo de identificador.
Tipo de marco. No hay ningún tipo correspondiente en el .NET Framework. Todas las estructuras heredan
de la clase .NET Framework System.ValueType, pero ninguna estructura individual corresponde a
System.ValueType.

Ejemplo
El paradigma siguiente muestra el contorno de la declaración de una estructura.

[Public | Protected | Friend | Protected Friend | Private] Structure structname


{Dim | Public | Friend | Private} member1 As datatype1
' ...
{Dim | Public | Friend | Private} memberN As datatypeN
End Structure

Vea también
ValueType
StructLayoutAttribute
Tipos de datos
Funciones de conversión de tipos
Resumen de conversión
Structure (instrucción)
Widening
Narrowing
Estructuras
Uso eficiente de tipos de datos
Tipo de datos UShort (Visual Basic)
21/03/2020 • 4 minutes to read • Edit Online

Contiene enteros de 16 bits sin signo (2 bytes) que varían en valor de 0 a 65.535.

Observaciones
Utilice UShort el tipo de datos para Byte contener datos binarios demasiado grandes para .
El valor predeterminado de UShort es 0.

Asignaciones literales
Puede declarar e UShort inicializar una variable asignándole un literal decimal, un literal hexadecimal, un literal
octal o (a partir de Visual Basic 2017) un literal binario. Si el literal entero está fuera del intervalo de UShort (es
decir, si es inferior a UInt16.MinValue o mayor que UInt16.MaxValue, se produce un error de compilación.
En el ejemplo siguiente, los enteros iguales a 65.034 que se representan UShort como literales decimales,
hexadecimales y binarios se asignan a los valores.

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

NOTE
Utilice el &h prefijo &H o para denotar un &b &B literal hexadecimal, el prefijo o &o &O para denotar un literal
binario, y el prefijo o para denotar un literal octal. Los literales decimales no tienen prefijo.

A partir de Visual Basic 2017, también _ puede usar el carácter de subrayado, , como separador de dígitos para
mejorar la legibilidad, como se muestra en el ejemplo siguiente.

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 de Visual Basic 15.5, también _ puede usar el carácter de subrayado ( ) como separador inicial entre el
prefijo y los dígitos hexadecimales, binarios u octales. Por ejemplo:
Dim number As UShort = &H_FF8C

Para usar el carácter de subrayado como separador inicial, debe agregar el elemento siguiente al archivo del
proyecto de Visual Basic (*.vbproj):

<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>

Para obtener más información, consulte configuración de la versióndel lenguaje Visual Basic .
Los literales numéricos US us también pueden incluir UShort el carácter o tipo para denotar el tipo de datos,
como se muestra en el ejemplo siguiente.

Dim number = &H_5826us

sugerencias de programación
Números negativos. Dado UShort que es un tipo sin signo, no puede representar un número
negativo. Si utiliza el operador - unario menos ( ) en UShort una expresión que se Integer evalúa como
tipo , Visual Basic convierte la expresión en primer lugar.
Cumplimiento de CLS. El UShort tipo de datos no forma parte de Common Language Specification
(CLS), por lo que el código compatible con CLS no puede consumir un componente que lo utilice.
Ampliación. El UShort tipo de datos Integer UInteger se Long ULong amplía Decimal Single a
Double , , , , , y . Esto significa que UShort puede convertir a cualquiera System.OverflowException de
estos tipos sin encontrar un error.
Escriba Caracteres. Anexar los caracteres US de tipo literal UShort a un literal lo fuerza al tipo de
datos. UShort no tiene ningún carácter de tipo identificador.
Tipo de Framework . El tipo correspondiente en .NET Framework es la estructura System.UInt16.

Consulte también
UInt16
Tipos de datos
Funciones de conversión de tipos
Resumen de conversión
Llamar a una función de Windows que adopta tipos sin signo
Uso eficiente de tipos de datos
Directivas de Visual Basic
05/12/2019 • 2 minutes to read • Edit Online

Los temas en esta sección documentan las directivas del compilador de código fuente de Visual Basic.

Esta sección
Directiva de #Const : definir una constante del compilador
Directiva de #ExternalSource : indicar una asignación entre líneas de código fuente y texto externo al origen
#If... Then... #Else directivas : compilar bloques de código seleccionados
Directiva de #Region : contraer y ocultar secciones de código en el editor de Visual Studio
#Disable, #Enable : deshabilitar y habilitar advertencias específicas para las regiones de código.

#Disable Warning BC42356 ' suppress warning about no awaits in this method
Async Function TestAsync() As Task
Console.WriteLine("testing")
End Function
#Enable Warning BC42356

También puede deshabilitar y habilitar una lista separada por comas de códigos de advertencia.

Secciones relacionadas
Referencia del lenguaje Visual Basic
#Const (Directiva)
27/11/2019 • 2 minutes to read • Edit Online

Define constantes de compilador condicionales para Visual Basic.

Sintaxis
#Const constname = expression

Elementos
constname
Obligatorio. Nombre de la constante que se está definiendo.
expression
Obligatorio. Literal, otra constante del compilador condicional o cualquier combinación que incluya todos o todos
los operadores aritméticos o lógicos excepto Is .

Comentarios
Las constantes de compilador condicionales siempre son privadas en el archivo en el que aparecen. No se pueden
crear constantes del compilador públicas mediante la Directiva #Const ; solo puede crearlos en la interfaz de
usuario o con la opción del compilador /define .
Solo se pueden usar constantes y literales de compilador condicionales en expression . El uso de una constante
estándar definida con Const produce un error. Por el contrario, puede usar constantes definidas con la palabra
clave #Const solo para la compilación condicional. Las constantes también pueden ser undefined, en cuyo caso
tienen un valor de Nothing .

Ejemplo
En este ejemplo se usa la directiva #Const .

#Const MyLocation = "USA"


#Const Version = "8.0.0012"
#Const CustomerNumber = 36

Vea también
-define (Visual Basic)
#If...Then...#Else (directivas)
Const (instrucción)
Compilación condicional
If...Then...Else (instrucción)
#ExternalSource (Directiva)
27/11/2019 • 2 minutes to read • Edit Online

Indica una asignación entre líneas específicas de código fuente y texto externo al origen.

Sintaxis
#ExternalSource( StringLiteral , IntLiteral )
[ LogicalLine+ ]
#End ExternalSource

Elementos
StringLiteral
Ruta de acceso al origen externo.
IntLiteral
Número de línea de la primera línea del origen externo.
LogicalLine
La línea donde se produce el error en el origen externo.
#End ExternalSource
Finaliza el bloque #ExternalSource .

Comentarios
Esta directiva solo la usan el compilador y el depurador.
Un archivo de código fuente puede incluir directivas de origen externo, que indican una asignación entre líneas
específicas de código en el archivo de código fuente y texto externo al origen, como un archivo. aspx. Si se
encuentran errores en el código fuente designado durante la compilación, se identifican como procedentes del
origen externo.
Las directivas de origen externo no tienen ningún efecto en la compilación y no se pueden anidar. Están pensadas
para uso interno de la aplicación únicamente.

Vea también
Compilación condicional
#If...Then...#Else (Directivas)
27/11/2019 • 3 minutes to read • Edit Online

Compila condicionalmente bloques seleccionados de código Visual Basic.

Sintaxis
#If expression Then
statements
[ #ElseIf expression Then
[ statements ]
...
#ElseIf expression Then
[ statements ] ]
[ #Else
[ statements ] ]
#End If

Elementos
expression
Se requiere para las instrucciones #If y #ElseIf , opcional en otro lugar. Cualquier expresión, que consta
exclusivamente de una o varias constantes, literales y operadores del compilador condicionales, que se evalúa
como True o False .
statements
Obligatorio para #If bloque de instrucciones, opcional en otro lugar. Visual Basic líneas de programa o
directivas de compilador que se compilan si la expresión asociada se evalúa como True .
#End If
Finaliza el #If bloque de instrucciones.

Comentarios
En la superficie, el comportamiento de las directivas de #If...Then...#Else aparece igual que el de las
instrucciones If...Then...Else . Sin embargo, las directivas de #If...Then...#Else evalúan lo que compila el
compilador, mientras que las instrucciones If...Then...Else evalúan las condiciones en tiempo de ejecución.
La compilación condicional se usa normalmente para compilar el mismo programa para distintas plataformas.
También se usa para evitar que el código de depuración aparezca en un archivo ejecutable. El código excluido
durante la compilación condicional se omite completamente del archivo ejecutable final, por lo que no tiene
ningún efecto en el tamaño o el rendimiento.
Independientemente del resultado de cualquier evaluación, todas las expresiones se evalúan mediante
Option Compare Binary . La instrucción Option Compare no afecta a las expresiones de las instrucciones #If y
#ElseIf .

NOTE
No existe ninguna forma de una sola línea de las directivas #If , #Else , #ElseIf y #End If . No puede aparecer
ningún otro código en la misma línea que ninguna de las directivas.
Las instrucciones de un bloque de compilación condicional deben ser instrucciones lógicas completas. Por
ejemplo, no puede compilar condicionalmente solo los atributos de una función, pero puede declarar
condicionalmente la función junto con sus atributos:

#If DEBUG Then


<WebMethod()>
Public Function SomeFunction() As String
#Else
<WebMethod(CacheDuration:=86400)>
Public Function SomeFunction() As String
#End If

Ejemplo
En este ejemplo se usa la construcción #If...Then...#Else para determinar si se deben compilar ciertas
instrucciones.

#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

Vea también
#Const (directiva)
If...Then...Else (instrucción)
Compilación condicional
System.Diagnostics.ConditionalAttribute
#Region (Directiva)
27/11/2019 • 2 minutes to read • Edit Online

Contrae y oculta secciones de código en archivos de Visual Basic.

Sintaxis
#Region "identifier_string"
#End Region

Elementos
T ÉRM IN O DEF IN IC IÓ N

identifier_string Obligatorio. Cadena que actúa como título de una región


cuando esta se contrae. Las regiones están contraídas de
forma predeterminada.

#End Region Finaliza el bloque #Region .

Comentarios
La directiva #Region permite especificar un bloque de código que se puede expandir o contraer cuando se usa la
característica de esquematización del Editor de código de Visual Studio. Puede colocar, o anidar, regiones en otras
regiones para agrupar regiones similares.

Ejemplo
En este ejemplo se usa la directiva #Region .

#Region "MathFunctions"
' Insert code for the Math functions here.
#End Region

Vea también
#If...Then...#Else (directivas)
Esquematización
Contraer y ocultar secciones de código
Funciones (Visual Basic)
05/12/2019 • 2 minutes to read • Edit Online

En los temas de esta sección, se incluyen tablas de las funciones de miembro en tiempo de ejecución de Visual
Basic.

NOTE
También puede crear funciones y llamarlas. Para obtener más información, consulte Function Statement [Function
(instrucción)] y How to: Create a Procedure that Returns a Value (Cómo: Crear un procedimiento que devuelve un valor).

Esta sección
Funciones de conversión
Funciones matemáticas
Funciones de cadena
Funciones de conversión de tipos
Función CType

Secciones relacionadas
Referencia del lenguaje Visual Basic
Funciones de conversión (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Asc
AscW
CBool (función)
Función CByte
CChar (función)
CDate (función)
CDbl (función)
CDec (función)
Chr
ChrW
CInt (función)
CLng (función)
CObj función)
CSByte función)
CShort (función)
CSng (función)
CStr (función)
Función CType
CUInt función)
CULng función)
CUShort función)
Format
Hex
Oct
Str
Val

Vea también
Funciones de conversión de tipos
Conversión de tipos de datos
Funciones matemáticas (Visual Basic)
31/01/2020 • 9 minutes to read • Edit Online

Los métodos de la clase System.Math proporcionan funciones trigonométricas, logarítmicas y otras funciones
matemáticas comunes.

Notas
En la tabla siguiente se enumeran los métodos de la clase System.Math. Puede usarlos en un programa de Visual
Basic:

M ÉTO DO . N ET DESC RIP C IÓ N

Abs Devuelve el valor absoluto de un número.

Acos Devuelve el ángulo cuyo coseno es el número especificado.

Asin Devuelve el ángulo cuyo seno es el número especificado.

Atan Devuelve el ángulo cuya tangente corresponde al número


especificado.

Atan2 Devuelve el ángulo cuya tangente es el cociente de dos


números especificados.

BigMul Devuelve el producto completo de números de 2 32 bits.

Ceiling Devuelve el valor integral más pequeño que es mayor o igual


que el Decimal o Double especificado.

Cos Devuelve el coseno del ángulo especificado.

Cosh Devuelve el coseno hiperbólico del ángulo especificado.

DivRem Devuelve el cociente de los enteros con signo de 2 32 bits o


64 bits y también devuelve el resto en un parámetro de salida.

Exp Devuelve e (la base de los logaritmos naturales) elevado a la


potencia especificada.

Floor Devuelve el entero más grande que es menor o igual que el


Decimal o el número de Double especificados.

IEEERemainder Devuelve el resto que es el resultado de la división de un


número especificado por otro número especificado.

Log Devuelve el logaritmo natural (base e) de un número


especificado o el logaritmo de un número especificado en una
base especificada.
M ÉTO DO . N ET DESC RIP C IÓ N

Log10 Devuelve el logaritmo en base 10 de un número especificado.

Max Devuelve el mayor de dos números.

Min Devuelve el menor de dos números.

Pow Devuelve un número especificado elevado a la potencia


especificada.

Round Devuelve un valor Decimal o Double redondeado al valor


entero más próximo o a un número especificado de dígitos
fraccionarios.

Sign Devuelve un valor Integer que indica el signo de un


número.

Sin Devuelve el seno del ángulo especificado.

Sinh Devuelve el seno hiperbólico del ángulo especificado.

Sqrt Devuelve la raíz cuadrada de un número especificado.

Tan Devuelve la tangente del ángulo especificado.

Tanh Devuelve la tangente hiperbólica del ángulo especificado.

Truncate Calcula la parte entera de una Decimal o un número de


Double especificados.

En la tabla siguiente se enumeran los métodos de la clase System.Math que no existen en .NET Framework pero
que se agregan en .NET Standard o .NET Core:

M ÉTO DO . N ET DESC RIP C IÓ N DISP O N IB L E EN

Acosh Devuelve el ángulo cuyo coseno A partir de .NET Core 2,1 y .NET
hiperbólico es el número especificado. Standard 2,1

Asinh Devuelve el ángulo cuyo seno A partir de .NET Core 2,1 y .NET
hiperbólico es el número especificado. Standard 2,1

Atanh Devuelve el ángulo cuya tangente A partir de .NET Core 2,1 y .NET
hiperbólica es el número especificado. Standard 2,1

BitDecrement Devuelve el siguiente valor más A partir de .NET Core 3,0


pequeño menor que x .

BitIncrement Devuelve el siguiente valor más grande A partir de .NET Core 3,0
mayor que x .

Cbrt Devuelve la raíz cúbica de un número A partir de .NET Core 2,1 y .NET
especificado. Standard 2,1
M ÉTO DO . N ET DESC RIP C IÓ N DISP O N IB L E EN

Clamp Devuelve un elemento value fijado al A partir de .NET Core 2,0 y .NET
rango inclusivo de min y max . Standard 2,1

CopySign Devuelve un valor con la magnitud de A partir de .NET Core 3,0


x y el signo de y .

FusedMultiplyAdd Devuelve (x * y) + z, redondeado como A partir de .NET Core 3,0


una operación ternaria.

ILogB Devuelve el logaritmo de entero en A partir de .NET Core 3,0


base 2 de un número especificado.

Log2 Devuelve el logaritmo en base 2 de un A partir de .NET Core 3,0


número especificado.

MaxMagnitude Devuelve la magnitud mayor de dos A partir de .NET Core 3,0


números de punto flotante de precisión
doble.

MinMagnitude Devuelve la magnitud menor de dos A partir de .NET Core 3,0


números de punto flotante de precisión
doble.

ScaleB Devuelve la x * 2 ^ n calculada de A partir de .NET Core 3,0


forma eficaz.

Para usar estas funciones sin calificación, importe el espacio de nombres System.Math en el proyecto agregando el
código siguiente a la parte superior del archivo de código fuente:

Imports System.Math

Ejemplo: ABS
En este ejemplo se usa el método Abs de la clase Math para calcular el valor absoluto de un número.

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

Ejemplo: atan
En este ejemplo se usa el método Atan de la clase Math para calcular el valor de PI.

Public Function GetPi() As Double


' Calculate the value of pi.
Return 4.0 * Math.Atan(1.0)
End Function
NOTE
La clase System.Math contiene Math.PI campo constante. Puede utilizarlo en lugar de calcularlo.

Ejemplo: cos
En este ejemplo se usa el método Cos de la clase Math para devolver el coseno de un ángulo.

Public Function Sec(angle As Double) As Double


' Calculate the secant of angle, in radians.
Return 1.0 / Math.Cos(angle)
End Function

Ejemplo: EXP
En este ejemplo se usa el método Exp de la clase Math para devolver e elevado a una potencia.

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

Registro de ejemplo
En este ejemplo se usa el método Log de la clase Math para devolver el logaritmo natural de un número.

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

Ejemplo: redondeo
En este ejemplo se usa el método Round de la clase Math para redondear un número al entero más próximo.

Dim myVar2 As Double = Math.Round(2.8)


Console.WriteLine(myVar2)
' The code produces the following output:
' 3

Ejemplo: Sign
En este ejemplo se usa el método Sign de la clase Math para determinar el signo de un número.
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

Ejemplo: sin
En este ejemplo se usa el método Sin de la clase Math para devolver el seno de un ángulo.

Public Function Csc(angle As Double) As Double


' Calculate cosecant of an angle, in radians.
Return 1.0 / Math.Sin(angle)
End Function

Ejemplo: sqrt
En este ejemplo se usa el método Sqrt de la clase Math para calcular la raíz cuadrada de un número.

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

Ejemplo: tan
En este ejemplo se usa el método Tan de la clase Math para devolver la tangente de un ángulo.

Public Function Ctan(angle As Double) As Double


' Calculate cotangent of an angle, in radians.
Return 1.0 / Math.Tan(angle)
End Function

Vea también
Rnd
Randomize
NaN
Funciones matemáticas derivadas
Operadores aritméticos
Funciones de cadena (Visual Basic)
27/11/2019 • 9 minutes to read • Edit Online

En la tabla siguiente se enumeran las funciones que Visual Basic proporciona en la clase
Microsoft.VisualBasic.Strings para buscar y manipular cadenas. Se pueden considerar como Visual Basic funciones
intrínsecas; es decir, no tiene que llamarlos como miembros explícitos de una clase, como se muestra en los
ejemplos. Los métodos adicionales y, en algunos casos, métodos complementarios, están disponibles en la clase
System.String.

M ÉTO DO . N ET F RA M EW O RK DESC RIP C IÓ N

Asc, AscW Devuelve un valor Integer que representa el código de


carácter correspondiente a un carácter.

Chr, ChrW Devuelve el carácter asociado al código de carácter


especificado.

Filter Devuelve una matriz de base cero que contiene un


subconjunto de una matriz de String basada en los criterios
de filtro especificados.

Format Devuelve una cadena con formato según las instrucciones


contenidas en un formato String expresión.

FormatCurrency Devuelve una expresión con formato de valor de moneda


mediante el símbolo de moneda definido en el panel de
control del sistema.

FormatDateTime Devuelve una expresión de cadena que representa un valor de


fecha y hora.

FormatNumber Devuelve una expresión con formato de número.

FormatPercent Devuelve una expresión con formato de porcentaje (es decir,


multiplicada por 100) con un carácter % final.

InStr Devuelve un entero que especifica la posición inicial de la


primera aparición de una cadena dentro de otra.

InStrRev Devuelve la posición de la primera aparición de una cadena


dentro de otra, empezando por el lado derecho de la cadena.

Join Devuelve una cadena creada mediante la combinación de un


número de subcadenas contenidas en una matriz.

LCase Devuelve una cadena o un carácter convertido a minúsculas.

Left Devuelve una cadena que contiene un número especificado de


caracteres desde el lado izquierdo de una cadena.
M ÉTO DO . N ET F RA M EW O RK DESC RIP C IÓ N

Len Devuelve un entero que contiene el número de caracteres de


una cadena.

LSet Devuelve una cadena alineada a la izquierda que contiene la


cadena especificada ajustada a la longitud especificada.

LTrim Devuelve una cadena que contiene una copia de una cadena
especificada sin espacios iniciales.

Mid Devuelve una cadena que contiene un número especificado de


caracteres de una cadena.

Replace Devuelve una cadena en la que se ha reemplazado una


subcadena especificada por otra subcadena un número
especificado de veces.

Right Devuelve una cadena que contiene un número especificado de


caracteres del lado derecho de una cadena.

RSet Devuelve una cadena alineada a la derecha que contiene la


cadena especificada ajustada a la longitud especificada.

RTrim Devuelve una cadena que contiene una copia de una cadena
especificada sin espacios finales.

Space Devuelve una cadena que consta del número especificado de


espacios.

Split Devuelve una matriz unidimensional de base cero que


contiene un número especificado de subcadenas.

StrComp Devuelve-1, 0 o 1, en función del resultado de una


comparación de cadenas.

StrConv Devuelve una cadena convertida según lo especificado.

StrDup Devuelve una cadena o un objeto que se compone del


carácter especificado repetido el número especificado de veces.

StrReverse Devuelve una cadena en la que se invierte el orden de los


caracteres de una cadena especificada.

Trim Devuelve una cadena que contiene una copia de una cadena
especificada sin espacios iniciales ni finales.

UCase Devuelve una cadena o un carácter que contiene la cadena


especificada convertida en mayúsculas.

Puede usar la instrucción Option Compare para establecer si las cadenas se comparan mediante un criterio de
ordenación de texto que no distingue entre mayúsculas y minúsculas, determinado por la configuración regional
del sistema ( Text ) o por las representaciones binarias internas de los caracteres ( Binary ). El método de
comparación de texto predeterminado es Binary .
Ejemplo: UCase
En este ejemplo se usa la función UCase para devolver una versión en mayúsculas de una cadena.

' String to convert.


Dim lowerCase As String = "Hello World 1234"
' Returns "HELLO WORLD 1234".
Dim upperCase As String = UCase(lowerCase)

Ejemplo: LTrim
En este ejemplo se usa la función LTrim para quitar los espacios iniciales y la función RTrim para quitar los
espacios finales de una variable de cadena. Usa la función Trim para quitar ambos tipos de espacios.

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

Ejemplo: MID
En este ejemplo se usa la función Mid para devolver un número especificado de caracteres de una cadena.

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

Ejemplo: Len
En este ejemplo se usa Len para devolver el número de caracteres de una cadena.

' Initializes variable.


Dim testString As String = "Hello World"
' Returns 11.
Dim testLen As Integer = Len(testString)

Ejemplo: InStr
En este ejemplo se usa la función InStr para devolver la posición de la primera aparición de una cadena dentro
de otra.
' 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")

Ejemplo: Format
En este ejemplo se muestran varios usos de la función Format para dar formato a los valores mediante formatos
de String y formatos definidos por el usuario. En el caso del separador de fecha ( / ), el separador de hora ( : ) y
los indicadores de AM/PM ( t y tt ), la salida con formato real que muestra el sistema depende de la
configuración regional que use el código. Cuando se muestran las horas y las fechas en el entorno de desarrollo, se
usan el formato de hora corta y el formato de fecha corta de la configuración regional del código.

NOTE
En el caso de las configuraciones regionales que utilizan un reloj de 24 horas, los indicadores de AM/PM ( t y tt ) no
muestran nada.
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%")

Vea también
Palabras clave
Miembros de la biblioteca en tiempo de ejecución de Visual Basic
Resumen de manipulación de cadenas
System. String (métodos de clase)
Funciones de conversión de tipos
(Visual Basic)
27/11/2019 • 23 minutes to read • Edit Online

Estas funciones se compilan en línea, lo que significa que el código de conversión


forma parte del código que evalúa la expresión. A veces no hay ninguna llamada a un
procedimiento para realizar la conversión, lo que mejora el rendimiento. Cada función
convierte una expresión en un tipo de datos específico.

Sintaxis
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
Obligatorio. Cualquier expresión del tipo de datos de origen.

Tipo de datos de valor devuelto


El nombre de la función determina el tipo de datos del valor que devuelve, tal y como
se muestra en la tabla siguiente.

RA N GO PA RA EXPRESSION
N O M B RE DE L A F UN C IÓ N T IP O DE DATO S DEVUELTO A RGUM EN TO

CBool Boolean (tipo de datos) Cualquier expresión Char o


String o numérica válida.
RA N GO PA RA EXPRESSION
N O M B RE DE L A F UN C IÓ N T IP O DE DATO S DEVUELTO A RGUM EN TO

CByte Byte (tipo de datos) Byte.MinValue (0) a


Byte.MaxValue (255) (sin
signo); las partes
fraccionarias se redondean. 1

A partir de Visual Basic 15,8,


Visual Basic optimiza el
rendimiento de la conversión
de punto flotante a byte con
la función CByte ; Vea la
sección comentarios para
obtener más información.
Vea la sección ejemplo de
cint para obtener un
ejemplo.

CChar Char (tipo de datos) Cualquier expresión Char o


String válida; solo se
convierte el primer carácter
de un String ; el valor
puede ser de 0 a 65535 (sin
signo).

CDate Date (tipo de datos) Cualquier representación


válida de una fecha y hora.

CDbl Double (tipos de datos) -1.79769313486231570 e +


308 a-
4.94065645841246544 E-
324 para los valores
negativos;
4.94065645841246544 e-
324 a
1.79769313486231570 E +
308 para los valores
positivos.

CDec Decimal (tipo de datos) +/-


79.228.162.514.264.337.593
.543.950.335 para números
con escala cero, es decir,
números sin decimales. En el
caso de números con 28
posiciones decimales, el
intervalo es +/-
7,922816251426433759354
3950335. El número más
pequeño posible distinto de
cero es
0,000000000000000000000
0000001 (+/-1E-28).
RA N GO PA RA EXPRESSION
N O M B RE DE L A F UN C IÓ N T IP O DE DATO S DEVUELTO A RGUM EN TO

CInt Integer (tipo de datos) Int32.MinValue (-


2.147.483.648) a través de
Int32.MaxValue
(2.147.483.647); las partes
fraccionarias se redondean. 1

A partir de Visual Basic 15,8,


Visual Basic optimiza el
rendimiento de la conversión
de punto flotante a entero
con la función CInt ; Vea la
sección comentarios para
obtener más información.
Vea la sección ejemplo de
cint para obtener un
ejemplo.

CLng Long (tipo de datos) Int64.MinValue (-


9.223.372.036.854.775.808)
a través de Int64.MaxValue
(9.223.372.036.854.775.807)
; las partes fraccionarias se
redondean. 1

A partir de Visual Basic 15,8,


Visual Basic optimiza el
rendimiento de la conversión
de enteros de punto flotante
a 64 bits con la función
CLng ; Vea la sección
comentarios para obtener
más información. Vea la
sección ejemplo de cint para
obtener un ejemplo.

CObj Object Data Type Cualquier expresión válida.

CSByte SByte (tipo de datos) SByte.MinValue (-128) a


través de SByte.MaxValue
(127); las partes fraccionarias
se redondean. 1

A partir de Visual Basic 15,8,


Visual Basic optimiza el
rendimiento de la conversión
de bytes de punto flotante a
firma con la función CSByte
; Vea la sección comentarios
para obtener más
información. Vea la sección
ejemplo de cint para obtener
un ejemplo.
RA N GO PA RA EXPRESSION
N O M B RE DE L A F UN C IÓ N T IP O DE DATO S DEVUELTO A RGUM EN TO

CShort Short (tipo de datos) Int16.MinValue (-32.768) a


través de Int16.MaxValue
(32.767); las partes
fraccionarias se redondean. 1

A partir de Visual Basic 15,8,


Visual Basic optimiza el
rendimiento de la conversión
de enteros de punto flotante
a 16 bits con la función
CShort ; Vea la sección
comentarios para obtener
más información. Vea la
sección ejemplo de cint para
obtener un ejemplo.

CSng Single (tipo de datos) -3.402823 e + 38 a-


401298e E-45 para los
valores negativos; 401298e
e-45 a 3.402823 E + 38 para
los valores positivos.

CStr String (tipo de datos) Las devoluciones de CStr


dependen del argumento
expression . Vea valores
devueltos para la función
CSTR.

CUInt UInteger (tipo de datos) UInt32.MinValue (0) a


UInt32.MaxValue
(4.294.967.295) (sin signo);
las partes fraccionarias se
redondean. 1

A partir de Visual Basic 15,8,


Visual Basic optimiza el
rendimiento de la conversión
de punto flotante a entero
sin signo con la función
CUInt ; Vea la sección
comentarios para obtener
más información. Vea la
sección ejemplo de cint para
obtener un ejemplo.
RA N GO PA RA EXPRESSION
N O M B RE DE L A F UN C IÓ N T IP O DE DATO S DEVUELTO A RGUM EN TO

CULng ULong (tipo de datos) UInt64.MinValue (0) a


UInt64.MaxValue
(18446744073709551615)
(sin signo); las partes
fraccionarias se redondean. 1

A partir de Visual Basic 15,8,


Visual Basic optimiza el
rendimiento de la conversión
de punto flotante a entero
largo sin signo con la función
CULng ; Vea la sección
comentarios para obtener
más información. Vea la
sección ejemplo de cint para
obtener un ejemplo.

CUShort UShort (tipo de datos) UInt16.MinValue (0) a


UInt16.MaxValue (65.535)
(sin signo); las partes
fraccionarias se redondean. 1

A partir de Visual Basic 15,8,


Visual Basic optimiza el
rendimiento de la conversión
de enteros de punto flotante
a de 16 bits sin signo con la
función CUShort ; Vea la
sección comentarios para
obtener más información.
Vea la sección ejemplo de
cint para obtener un
ejemplo.

1 las partes fraccionarias pueden estar


sujetas a un tipo especial de redondeo
denominado redondeo bancario. Vea "Comentarios" para obtener más información.

Comentarios
Como norma general, debe usar las funciones de conversión de tipo Visual Basic en
preferencia a los métodos de .NET Framework como ToString() , ya sea en la clase
Convert o en una estructura o clase de tipo individual. Las funciones de Visual Basic
están diseñadas para una interacción óptima con el código Visual Basic y también
hacen que el código fuente sea más corto y más fácil de leer. Además, los métodos de
conversión de .NET Framework no siempre producen los mismos resultados que las
funciones de Visual Basic, por ejemplo, al convertir Boolean en Integer . Para
obtener más información, vea solución de problemas de tipos de datos.
A partir de Visual Basic 15,8, el rendimiento de la conversión de punto flotante a
entero se optimiza al pasar el valor de Single o Double devuelto por los métodos
siguientes a una de las funciones de conversión de enteros ( 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)
Esta optimización permite que el código que realiza un gran número de conversiones
de enteros se ejecute hasta dos veces más rápido. En el ejemplo siguiente se
muestran estas conversiones optimizadas de punto flotante a entero:

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

Comportamiento
Conversión. En general, puede utilizar las funciones de conversión de tipos de
datos para convertir el resultado de una operación en un tipo de datos
determinado en lugar del tipo de datos predeterminado. Por ejemplo, utilice
CDec para forzar la aritmética decimal en los casos en los que normalmente
tendría lugar la aritmética de precisión sencilla, doble precisión o entera.
Conversiones con errores. Si el expression que se pasa a la función está
fuera del intervalo del tipo de datos al que se va a convertir, se produce una
OverflowException.
Par tes fraccionarias. Al convertir un valor no entero en un tipo entero, las
funciones de conversión de enteros ( CByte , CInt , CLng , CSByte , CShort ,
CUInt , CULng y CUShort ) quitan la parte fraccionaria y redondean el valor al
entero más cercano.
Si la parte fraccionaria es exactamente 0,5, las funciones de conversión de
enteros lo redondean al entero par más cercano. Por ejemplo, 0,5 se redondea
a 0 y 1,5 y 2,5 se redondean a 2. A veces, esto se denomina redondeo
bancarioy su finalidad es compensar una diferencia que podría acumularse al
agregar muchos de estos números juntos.
CInt y CLng difieren de las funciones Int y Fix, que truncan, en lugar de
redondear, la parte fraccionaria de un número. Además, Fix y Int siempre
devuelven un valor del mismo tipo de datos que se pasa.
Conversiones de fecha y hora. Utilice la función IsDate para determinar si
un valor se puede convertir en una fecha y hora. CDate reconoce los literales
de fecha y los literales de hora, pero no los valores numéricos. Para convertir
un valor de Visual Basic Date 6,0 en un valor Date en Visual Basic 2005 o
versiones posteriores, puede usar el método DateTime.FromOADate.
Valores de fecha y hora neutros. El tipo de datos Date siempre contiene
información de fecha y hora. A efectos de la conversión de tipos, Visual Basic
considera 1/1/0001 (1 de enero del año 1) para que sea un valor neutro para la
fecha y 00:00:00 (medianoche) como valor neutro para el tiempo. Si convierte
un valor de Date en una cadena, CStr no incluye valores neutros en la
cadena resultante. Por ejemplo, si convierte #January 1, 0001 9:30:00# en una
cadena, el resultado es "9:30:00 AM"; se suprime la información de fecha. Sin
embargo, la información de fecha todavía está presente en el valor de Date
original y se puede recuperar con funciones como DatePart función.
Confidencialidad de la referencia cultural. Las funciones de conversión
de tipos que implican cadenas realizan conversiones basadas en la
configuración de la referencia cultural actual de la aplicación. Por ejemplo,
CDate reconoce los formatos de fecha según la configuración regional del
sistema. Debe proporcionar el día, el mes y el año en el orden correcto de la
configuración regional, o la fecha podría no interpretarse correctamente. No se
reconoce el formato de fecha larga si contiene una cadena de día de la semana,
como "miércoles".
Si necesita convertir a o desde una representación de cadena de un valor en un
formato distinto del especificado por la configuración regional, no puede usar
las funciones de conversión de tipo Visual Basic. Para ello, use los métodos
ToString(IFormatProvider) y Parse(String, IFormatProvider) del tipo de ese
valor. Por ejemplo, utilice Double.Parse al convertir una cadena en un Double y
use Double.ToString al convertir un valor de tipo Double en una cadena.

CType Function
La función ctype toma un segundo argumento, typename , y convierte expression en
typename , donde typename puede ser cualquier tipo de datos, estructura, clase o
interfaz a la que exista una conversión válida.
Para obtener una comparación de CType con las otras palabras clave de conversión
de tipos, vea el operador DirectCast y el operador TryCast.

Ejemplo de CBool
En el ejemplo siguiente se usa la función CBool para convertir expresiones en
Boolean valores. Si una expresión se evalúa como un valor distinto de cero, CBool
devuelve True ; de lo contrario, devuelve False .

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)

Ejemplo de CByte
En el ejemplo siguiente se usa la función CByte para convertir una expresión en una
Byte .
Dim aDouble As Double
Dim aByte As Byte
aDouble = 125.5678
' The following line of code sets aByte to 126.
aByte = CByte(aDouble)

Ejemplo de CChar
En el ejemplo siguiente se usa la función CChar para convertir el primer carácter de
una expresión String en un tipo Char .

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)

El argumento de entrada para CChar debe ser de tipo de datos Char o String . No
se puede usar CChar para convertir un número en un carácter, porque CChar no
puede aceptar un tipo de datos numérico. En el ejemplo siguiente se obtiene un
número que representa un punto de código (código de carácter) y lo convierte en el
carácter correspondiente. Usa la función InputBox para obtener la cadena de dígitos,
CInt convertir la cadena al tipo Integer y ChrW convertir el número al tipo Char .

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)

Ejemplo de CDate
En el ejemplo siguiente se usa la función CDate para convertir cadenas en valores
Date . En general, no se recomienda codificar las fechas y horas de forma rígida como
cadenas (como se muestra en este ejemplo). Utilice literales de fecha y literales de
hora, como #Feb 12, 1969 # y #4:45:23 PM #, en su lugar.

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)

Ejemplo de CDbl
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)

Ejemplo de CDec
En el ejemplo siguiente se usa la función CDec para convertir un valor numérico en
Decimal .

Dim aDouble As Double


Dim aDecimal As Decimal
aDouble = 10000000.0587
' The following line of code sets aDecimal to 10000000.0587.
aDecimal = CDec(aDouble)

Ejemplo de CInt
En el ejemplo siguiente se usa la función CInt para convertir un valor en Integer .

Dim aDbl As Double


Dim anInt As Integer
aDbl = 2345.5678
' The following line of code sets anInt to 2346.
anInt = CInt(aDbl)

Ejemplo de CLng
En el ejemplo siguiente se usa la función CLng para convertir valores en Long .

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)

Ejemplo de CObj
En el ejemplo siguiente se usa la función CObj para convertir un valor numérico en
Object . La variable Object solo contiene un puntero de cuatro bytes, que señala al
valor Double asignado a él.

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)
Ejemplo de CSByte
En el ejemplo siguiente se usa la función CSByte para convertir un valor numérico en
SByte .

Dim aDouble As Double


Dim anSByte As SByte
aDouble = 39.501
' The following line of code sets anSByte to 40.
anSByte = CSByte(aDouble)

Ejemplo de CShort
En el ejemplo siguiente se usa la función CShort para convertir un valor numérico en
Short .

Dim aByte As Byte


Dim aShort As Short
aByte = 100
' The following line of code sets aShort to 100.
aShort = CShort(aByte)

Ejemplo de CSng
En el ejemplo siguiente se usa la función CSng para convertir valores en Single .

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)

Ejemplo de CStr
En el ejemplo siguiente se usa la función CStr para convertir un valor numérico en
String .

Dim aDouble As Double


Dim aString As String
aDouble = 437.324
' The following line of code sets aString to "437.324".
aString = CStr(aDouble)

En el ejemplo siguiente se usa la función CStr para convertir valores Date en


valores String .
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 siempre representa un valor de Date en el formato corto estándar para la


configuración regional actual, por ejemplo, "6/15/2003 4:35:47 PM". Sin embargo,
CStr suprime los valores neutros de 1/1/0001 para la fecha y 00:00:00 para la hora.

Para obtener más información sobre los valores devueltos por CStr , vea valores
devueltos para la función CSTR.

Ejemplo de CUInt
En el ejemplo siguiente se usa la función CUInt para convertir un valor numérico en
UInteger .

Dim aDouble As Double


Dim aUInteger As UInteger
aDouble = 39.501
' The following line of code sets aUInteger to 40.
aUInteger = CUInt(aDouble)

Ejemplo de CULng
En el ejemplo siguiente se usa la función CULng para convertir un valor numérico en
ULong .

Dim aDouble As Double


Dim aULong As ULong
aDouble = 39.501
' The following line of code sets aULong to 40.
aULong = CULng(aDouble)

Ejemplo de CUShort
En el ejemplo siguiente se usa la función CUShort para convertir un valor numérico
en UShort .
Dim aDouble As Double
Dim aUShort As UShort
aDouble = 39.501
' The following line of code sets aUShort to 40.
aUShort = CUShort(aDouble)

Vea también
Asc
AscW
Chr
ChrW
Int
Fix
Format
Hex
Oct
Str
Val
Funciones de conversión
Conversiones de tipos en Visual Basic
Valores devueltos para la función CStr (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

En la tabla siguiente se describen los valores devueltos para CStr para diferentes tipos de datos de expression .

SI EXPRESSION T IP O ES DEVO L UC IO N ES DE CSTR

Boolean (tipo de datos) Cadena que contiene "true" o "false".

Date (tipo de datos) Cadena que contiene un valor de Date (fecha y hora) en el
formato de fecha corta del sistema.

Tipos de datos numéricos Cadena que representa el número.

CStr y Date
El tipo de Date siempre contiene información de fecha y hora. A efectos de la conversión de tipos, Visual Basic
considera 1/1/0001 (1 de enero del año 1) para que sea un valor neutro para la fecha y 00:00:00 (medianoche)
como valor neutro para el tiempo. CStr no incluye valores neutros en la cadena resultante. Por ejemplo, si
convierte #January 1, 0001 9:30:00# en una cadena, el resultado es "9:30:00 AM"; se suprime la información de
fecha. Sin embargo, la información de fecha todavía está presente en el valor de Date original y se puede
recuperar con funciones como DatePart.

NOTE
La función CStr realiza su conversión en función de la configuración de la referencia cultural actual de la aplicación. Para
obtener la representación en forma de cadena de un número en una referencia cultural determinada, use el método
ToString(IFormatProvider) del número. Por ejemplo, utilice Double.ToString al convertir un valor de tipo Double en un
String .

Vea también
DatePart
Funciones de conversión de tipos
Boolean (tipo de datos)
Date (tipo de datos)
CType (Función) (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Devuelve el resultado de convertir explícitamente una expresión en un tipo de datos, objeto, estructura, clase
o interfaz especificados.

Sintaxis
CType(expression, typename)

Elementos
expression cualquier expresión válida. Si el valor de expression está fuera del intervalo permitido por
typename , Visual Basic produce una excepción.

typename cualquier expresión válida dentro de una cláusula As en una instrucción Dim , es decir, el nombre
de cualquier tipo de datos, objeto, estructura, clase o interfaz.

Comentarios
TIP
También puede utilizar las siguientes funciones para realizar una conversión de tipos:
Funciones de conversión de tipos como CByte , CDbl y CInt que realizan una conversión a un tipo de datos
específico. Para obtener más información, vea funciones de conversión de tipos.
Operador DirectCast o TryCast. Estos operadores requieren que un tipo herede de o implemente el otro tipo.
Pueden proporcionar un rendimiento algo mejor que CType al convertir a y desde el tipo de datos Object .

CType se compila en línea, lo que significa que el código de conversión forma parte del código que evalúa la
expresión. En algunos casos, el código se ejecuta más rápido porque no se llama a ningún procedimiento
para realizar la conversión.
Si no se define ninguna conversión de expression a typename (por ejemplo, de Integer a Date ), Visual
Basic muestra un mensaje de error en tiempo de compilación.
Si se produce un error en la conversión en tiempo de ejecución, se produce la excepción adecuada. Si se
produce un error en una conversión de restricción, una OverflowException es el resultado más común. Si la
conversión no está definida, se produce una InvalidCastException. Por ejemplo, esto puede ocurrir si
expression es de tipo Object y su tipo en tiempo de ejecución no tiene ninguna conversión a typename .

Si el tipo de datos de expression o typename es una clase o estructura que ha definido, puede definir CType
en esa clase o estructura como un operador de conversión. Esto hace que CType actúe como un operador
sobrecargado. Si lo hace, puede controlar el comportamiento de las conversiones hacia y desde la clase o
estructura, incluidas las excepciones que se pueden producir.

Sobrecarga
También se puede sobrecargar el operador CType en una clase o estructura definida fuera del código. Si el
código se convierte en o desde una clase o estructura de este tipo, asegúrese de que comprende el
comportamiento de su CType operador. Para obtener más información, consulta Operator Procedures.

Convertir objetos dinámicos


Las conversiones de tipos de objetos dinámicos se realizan mediante conversiones dinámicas definidas por el
usuario que utilizan los métodos TryConvert o BindConvert. Si está trabajando con objetos dinámicos, utilice
el método CTypeDynamic para convertir el objeto dinámico.

Ejemplo
En el ejemplo siguiente se usa la función CType para convertir una expresión al tipo de datos Single .

Dim testNumber As Long = 1000


' The following line of code sets testNewType to 1000.0.
Dim testNewType As Single = CType(testNumber, Single)

Para obtener más ejemplos, vea conversiones implícitas y explícitas.

Vea también
OverflowException
InvalidCastException
Funciones de conversión de tipos
Funciones de conversión
Operator Statement
Definir un operador de conversión
Conversión de tipos en .NET Framework
Modificadores de Visual Basic
05/12/2019 • 2 minutes to read • Edit Online

Los temas de esta sección documentan los modificadores en tiempo de ejecución de Visual Basic.

Esta sección
Ansi
Ensamblado
Async
Auto
ByRef
ByVal
Predetermiado
Friend
In
Iterator
Key
Module <keyword>
MustInherit
MustOverride
Narrowing
NotInheritable
NotOverridable
Optional
Out
Sobrecargas
Overridable
Overrides
ParamArray
Partial
Private
Private Protected
Protected
Protected Friend
Public
ReadOnly
Shadows
Shared
Static
Unicode
Widening
WithEvents
WriteOnly

Secciones relacionadas
Referencia del lenguaje Visual Basic
Ansi (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica que Visual Basic debe serializar todas las cadenas en valores de American National Standards Institute
(ANSI), independientemente del nombre del procedimiento externo que se está declarando.
Cuando se llama a un procedimiento definido fuera del proyecto, el compilador Visual Basic no tiene acceso a la
información que necesita para llamar al procedimiento correctamente. Esta información incluye dónde se
encuentra el procedimiento, cómo se identifica, su secuencia de llamada y tipo de valor devuelto, y el juego de
caracteres de cadena que usa. La instrucción Declare crea una referencia a un procedimiento externo y
proporciona esta información necesaria.
La parte charsetmodifier de la instrucción Declare proporciona la información del juego de caracteres para
calcular las referencias de las cadenas durante una llamada al procedimiento externo. También afecta al modo en
que Visual Basic busca el nombre del procedimiento externo en el archivo externo. El modificador Ansi especifica
que Visual Basic debe calcular las referencias de todas las cadenas a valores ANSI y debe buscar el procedimiento
sin modificar su nombre durante la búsqueda.
Si no se especifica ningún modificador de juego de caracteres, Ansi es el valor predeterminado.

Comentarios
El modificador Ansi se puede usar en este contexto:
Declare (instrucción)

Notas para desarrolladores de Smart Device


Esta palabra clave no es compatible.

Vea también
Auto
Unicode
Palabras clave
Assembly (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica que un atributo al principio de un archivo de código fuente se aplica a todo el ensamblado.

Comentarios
Muchos atributos pertenecen a un elemento de programación individual, como una clase o una propiedad. Este
atributo se aplica asociando el bloque de atributos, entre corchetes angulares ( < > ), directamente a la instrucción
de declaración.
Si un atributo no solo pertenece al elemento siguiente, sino a todo el ensamblado, coloca el bloque de atributos al
principio del archivo de código fuente e identifica el atributo con la palabra clave Assembly . Si se aplica al módulo
de ensamblado actual, se usa la palabra clave Module .
También puede aplicar un atributo a un ensamblado en el archivo AssemblyInfo. VB, en cuyo caso no es necesario
usar un bloque de atributos en el archivo de código fuente principal.

Vea también
Module <keyword>
Información general de atributos
Async (Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

El modificador Async indica que el método o la expresión lambda que modifica es asincrónico. Estos métodos
se conocen como métodos asincrónicos.
Un método asincrónico proporciona una manera cómoda de hacer el trabajo de larga duración sin bloquear el
subproceso del llamador. El llamador de un método asincrónico puede reanudar el trabajo sin esperar a que el
método asincrónico finalice.

NOTE
Las palabras clave Async y Await se incluyeron en Visual Studio 2012. Para obtener una introducción a la
programación asincrónica, vea programación asincrónica con Async y Await.

En el siguiente ejemplo se muestra la estructura de un método asincrónico. Por convención, los nombres de
método asincrónico acaban en “Async”.

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, un método modificado por la palabra clave Async contiene al menos una expresión o
instrucción Await . El método se ejecuta sincrónicamente hasta alcanzar el primer Await , punto en el que se
suspende hasta que la tarea en espera se complete. Mientras tanto, se devuelve el control al llamador del
método asincrónico. Si el método no contiene una expresión o instrucción Await , el método no se suspende y
se ejecuta como un método sincrónico. Una advertencia del compilador alerta de cualquier método asincrónico
que no contenga Await , porque esa situación podría indicar un error. Para obtener más información, vea el
error del compilador.
La palabra clave Async no está reservada. Es una palabra clave cuando modifica un método o una expresión
lambda. En todos los demás contextos, se interpreta como identificador.

Tipos de valor devueltos


Un método asincrónico es un procedimiento Sub o un procedimiento de función que tiene un tipo de valor
devuelto de Task o Task<TResult>. El método no puede declarar ningún parámetro ByRef .
Especifique Task(Of TResult) para el tipo de valor devuelto de un método asincrónico si la instrucción Return
del método tiene un operando de tipo TResult. Utilice Task si no se devuelve ningún valor significativo al
completarse el método. Es decir, una llamada al método devuelve Task , pero cuando se completa Task ,
ninguna instrucción Await que está en espera de Task no genera un valor de resultado.
Las subrutinas asincrónicas se utilizan principalmente para definir controladores de eventos donde se requiere
un procedimiento Sub . El llamador de una subrutina asincrónica no puede esperar a que finalice y no puede
detectar las excepciones que el método inicia.
Para más información y ejemplos, vea Tipos de valor devueltos asincrónicos.

Ejemplo
Los ejemplos siguientes muestran un controlador de eventos asincrónicos, una expresión lambda asincrónica y
un método asincrónico. Para obtener un ejemplo completo en el que se usan estos elementos, vea Tutorial:
acceso a la web mediante Async y Await. Puede descargar el código del tutorial en Ejemplos de código para
desarrolladores.

' 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

Vea también
AsyncStateMachineAttribute
Await (operador)
Programación asincrónica con Async y Await
Tutorial: Acceso a Web mediante Async y Await
Auto (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica que Visual Basic debe serializar las cadenas según las reglas de .NET Framework basadas en el nombre
externo del procedimiento externo que se va a declarar.
Cuando se llama a un procedimiento definido fuera del proyecto, el compilador Visual Basic no tiene acceso a la
información que debe tener para llamar al procedimiento correctamente. Esta información incluye dónde se
encuentra el procedimiento, cómo se identifica, su secuencia de llamada y tipo de valor devuelto, y el juego de
caracteres de cadena que usa. La instrucción Declare crea una referencia a un procedimiento externo y
proporciona esta información necesaria.
La parte charsetmodifier de la instrucción Declare proporciona la información del juego de caracteres para
calcular las referencias de las cadenas durante una llamada al procedimiento externo. También afecta al modo en
que Visual Basic busca el nombre del procedimiento externo en el archivo externo. El modificador Auto
especifica que Visual Basic debe serializar las cadenas según las reglas de .NET Framework y que debe determinar
el juego de caracteres base de la plataforma en tiempo de ejecución y, posiblemente, modificar el nombre del
procedimiento externo si se produce un error en la búsqueda inicial. Para obtener más información, vea "juegos
de caracteres" en instrucción Declare.
Si no se especifica ningún modificador de juego de caracteres, Ansi es el valor predeterminado.

Comentarios
El modificador Auto se puede usar en este contexto:
Declare (instrucción)

Notas para desarrolladores de Smart Device


Esta palabra clave no es compatible.

Vea también
Ansi
Unicode
Palabras clave
ByRef (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica que un argumento se pasa de manera que el procedimiento llamado puede cambiar el valor de una
variable subyacente al argumento en el código de llamada.

Comentarios
El modificador ByRef se puede utilizar en los contextos siguientes:
Declare (instrucción)
Function (instrucción)
Sub (instrucción)

Vea también
Palabras clave
Paso de argumentos por valor y por referencia
ByVal (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica que un argumento se pasa por valor, de modo que el procedimiento o la propiedad a los que se ha
llamado no pueden cambiar el valor de una variable subyacente del argumento en el código de llamada. Si no se
especifica ningún modificador, ByVal es el valor predeterminado.

NOTE
Dado que es el valor predeterminado, no es necesario especificar explícitamente la palabra clave ByVal en las firmas de
método. Tiende a producir código ruidoso y, a menudo, conduce a la palabra clave de ByRef no predeterminada que se
pasa por alto.

Comentarios
El modificador ByVal se puede utilizar en los contextos siguientes:
Declare (instrucción)
Function (instrucción)
Operator Statement
Property (instrucción)
Sub (instrucción)

Ejemplo
En el siguiente ejemplo se muestra el uso del mecanismo de paso de parámetros ByVal con un argumento de
tipo de referencia. En el ejemplo, el argumento es c1 , una instancia de la clase Class1 . ByVal evita que el
código de los procedimientos cambie el valor subyacente del argumento de referencia, c1 , pero no protege los
campos y propiedades accesibles de c1 .
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

Vea también
Palabras clave
Paso de argumentos por valor y por referencia
Default (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Identifica una propiedad como la propiedad predeterminada de su clase, estructura o interfaz.

Comentarios
Una clase, estructura o interfaz puede designar como máximo una de sus propiedades como la propiedad
predeterminada, siempre que esa propiedad tome al menos un parámetro. Si el código hace referencia a una
clase o estructura sin especificar un miembro, Visual Basic resuelve esa referencia a la propiedad
predeterminada.
Las propiedades predeterminadas pueden dar lugar a una pequeña reducción en los caracteres de código fuente,
pero pueden hacer que el código sea más difícil de leer. Si el código de llamada no está familiarizado con su clase
o estructura, cuando hace referencia al nombre de la clase o de la estructura no puede estar seguro de si esa
referencia tiene acceso a la clase o estructura, o a una propiedad predeterminada. Esto puede provocar errores
del compilador o errores de lógica sutiles en tiempo de ejecución.
Puede reducir en cierto modo la posibilidad de que se produzcan errores de propiedad predeterminados Si usa
siempre la instrucción Option Strict para establecer la comprobación del tipo de compilador en On .
Si piensa utilizar una clase o estructura predefinida en el código, debe determinar si tiene una propiedad
predeterminada y, en ese caso, cuál es su nombre.
Debido a estas desventajas, considere la posibilidad de no definir las propiedades predeterminadas. Para facilitar
la lectura del código, también debe considerar la posibilidad de hacer referencia siempre a todas las propiedades
explícitamente, incluso a las propiedades predeterminadas.
El modificador Default se puede usar en este contexto:
Property (instrucción)

Vea también
Cómo: declarar y llamar a una propiedad predeterminada en Visual Basic
Palabras clave
Friend (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Especifica que solo se puede tener acceso a uno o varios elementos de programación declarados desde
dentro del ensamblado que contiene su declaración.

Comentarios
En muchos casos, desea que los elementos de programación, como clases y estructuras, se usen en todo el
ensamblado, no solo en el componente que los declara. Sin embargo, es posible que no desee que el
código fuera del ensamblado tenga acceso a ellos (por ejemplo, si la aplicación es propietaria). Si desea
limitar el acceso a un elemento de esta manera, puede declararlo mediante el modificador Friend .
El código de otras clases, estructuras y módulos que se compilan en el mismo ensamblado pueden tener
acceso a todos los elementos de Friend de ese ensamblado.
Friend acceso es a menudo el nivel preferido para los elementos de programación de una aplicación y
Friend es el nivel de acceso predeterminado de una interfaz, un módulo, una clase o una estructura.
Solo puede usar Friend en el nivel de módulo, interfaz o espacio de nombres. Por consiguiente, el
contexto de la declaración de un elemento Friend debe ser un archivo de código fuente, un espacio de
nombres, una interfaz, un módulo, una clase o una estructura; no puede ser un procedimiento.

NOTE
También puede usar el modificador de acceso Friend protegido , que hace que un miembro de clase sea accesible
desde dentro de esa clase, desde las clases derivadas y desde el mismo ensamblado en el que se define la clase. Para
restringir el acceso a un miembro de dentro de su clase y de las clases derivadas en el mismo ensamblado, se utiliza
el modificador de acceso protegido privado .

Para obtener una comparación de Friend y los demás modificadores de acceso, vea niveles de acceso en
Visual Basic.

NOTE
Puede especificar que otro ensamblado es un ensamblado de confianza, lo que le permite tener acceso a todos los
tipos y miembros marcados como Friend . Para más información, vea Ensamblados de confianza.

Ejemplo
La siguiente clase usa el modificador Friend para permitir que otros elementos de programación del
mismo ensamblado tengan acceso a determinados miembros.
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
Puede usar el modificador Friend en estos contextos:
Class (instrucción)
Const (instrucción)
Declare (instrucción)
Delegate (instrucción)
Dim (instrucción)
Enum (instrucción)
Event (instrucción)
Function (instrucción)
Interface (instrucción)
Module (instrucción)
Property (instrucción)
Structure (instrucción)
Sub (instrucción)

Vea también
InternalsVisibleToAttribute
Public
Protected
Private
Private Protected
Protected Friend
Niveles de acceso en Visual Basic
Procedimientos
Estructuras
Objetos y clases
In (Modificador genérico) (Visual Basic)
23/10/2019 • 4 minutes to read • Edit Online

Para los parámetros de tipo genérico, la palabra clave In especifica que el parámetro de tipo es contravariante.

Comentarios
La contravarianza permite usar un tipo menos derivado que el que se especifica en el parámetro genérico. Esto
permite la conversión implícita de las clases que implementan interfaces variantes y la conversión implícita de los
tipos de delegado.
Para obtener más información, vea Covarianza y contravarianza.

Reglas
Puede usar la palabra clave In en las interfaces y delegados genéricos.
Un parámetro de tipo puede declararse como contravariante en una interfaz o un delegado genérico si solo se usa
como un tipo de argumentos de método y no se usa como tipo de valor devuelto de método. los parámetros
ByRef no pueden ser covariantes o contravariante.

La covarianza y la contravarianza se admiten para los tipos de referencia y no se admiten para los tipos de valor.
En Visual Basic, no se pueden declarar eventos en interfaces contravariantes sin especificar el tipo de delegado.
Además, las interfaces contravariantes no pueden tener clases anidadas, enumeraciones o estructuras, pero
pueden tener interfaces anidadas.

Comportamiento
Una interfaz que tiene un parámetro de tipo contravariante permite que sus métodos acepten argumentos de
tipos menos derivados que los que se especifican en el parámetro de tipo de interfaz. Por ejemplo, dado que en
.NET Framework 4, en la interfaz IComparer<T>, el tipo T es contravariante, puede asignar un objeto del tipo
IComparer(Of Person) a un objeto del tipo IComparer(Of Employee) sin usar ningún método de conversión
especial si Employee hereda de Person .
A un delegado contravariante se le puede asignar otro delegado del mismo tipo, pero con un parámetro de tipo
genérico menos derivado.

Ejemplo: interfaz genérica contravariante


En el ejemplo siguiente se muestra cómo declarar, extender e implementar una interfaz genérica contravariante.
También se muestra cómo puede usar la conversión implícita para las clases que implementan esta interfaz.
' 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

Ejemplo: delegado genérico contravariante


En el ejemplo siguiente se muestra cómo declarar e invocar un delegado genérico contravariante, y crear
instancias de este. También se muestra cómo puede convertir implícitamente un tipo de delegado.

' 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

Vea también
Varianza en interfaces genéricas
Out
Iterador (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Especifica que una función o un descriptor de acceso Get es un iterador.

Comentarios
Un iterador realiza una iteración personalizada en una colección. Un iterador usa la instrucción yield para
devolver cada elemento de la colección de uno en uno. Cuando se alcanza una instrucción Yield , se conserva la
ubicación actual en el código. La ejecución se reinicia desde esa ubicación la próxima vez que se llama a la
función del iterador.
Un iterador se puede implementar como una función o como Get descriptor de acceso de una definición de
propiedad. El modificador Iterator aparece en la declaración de la función de iterador o de Get descriptor de
acceso.
Se llama a un iterador desde el código de cliente mediante un método for each... Instrucción siguiente.
El tipo de valor devuelto de una función de iterador o Get descriptor de acceso puede ser IEnumerable,
IEnumerable<T>, IEnumeratoro IEnumerator<T>.
Un iterador no puede tener ningún parámetro ByRef .
Un iterador no puede aparecer en un evento, un constructor de instancia, un constructor estático o un destructor
estático.
Un iterador puede ser una función anónima. Para obtener más información, consulta Iteradores.

Uso
El modificador Iterator se puede utilizar en los contextos siguientes:
Function (instrucción)
Property (instrucción)

Ejemplo
En el ejemplo siguiente se muestra una función de iterador. La función de iterador tiene una instrucción Yield
que está dentro de un ... Siguiente bucle. Cada iteración del cuerpo de la instrucción for each en Main crea una
llamada a la función de iterador Power . Cada llamada a la función de iterador prosigue con la siguiente
ejecución de la instrucción Yield , que se produce durante la siguiente iteración del bucle For…Next .
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

Ejemplo
En el ejemplo siguiente se muestra un descriptor de acceso Get que es un iterador. El modificador Iterator
está en la declaración de propiedad.

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 obtener más ejemplos, vea iteradores.

Vea también
IteratorStateMachineAttribute
Iteradores
Yield (instrucción)
Key (Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

La palabra clave Key permite especificar el comportamiento de las propiedades de los tipos anónimos. Solo las
propiedades que se designan como propiedades clave participan en las pruebas de igualdad entre las instancias de
tipo anónimo o el cálculo de los valores de código hash. No se pueden cambiar los valores de las propiedades de
clave.
Designe una propiedad de un tipo anónimo como una propiedad de clave colocando la palabra clave Key delante
de su declaración en la lista de inicialización. En el ejemplo siguiente, Airline y FlightNo son propiedades clave,
pero Gate no.

Dim flight1 = New With {Key .Airline = "Blue Yonder Airlines",


Key .FlightNo = 3554, .Gate = "C33"}

Cuando se crea un nuevo tipo anónimo, hereda directamente de Object. El compilador invalida tres miembros
heredados: Equals, GetHashCodey ToString. El código de invalidación que se produce para Equals y GetHashCode
se basa en las propiedades de clave. Si no hay ninguna propiedad clave en el tipo, GetHashCode y Equals no se
invalidan.

Igualdad
Dos instancias de tipo anónimo son iguales si son instancias del mismo tipo y si los valores de sus propiedades de
clave son iguales. En los ejemplos siguientes, flight2 es igual a flight1 del ejemplo anterior porque son
instancias del mismo tipo anónimo y tienen valores coincidentes para sus propiedades de clave. Sin embargo,
flight3 no es igual a flight1 porque tiene un valor diferente para una propiedad de clave, FlightNo . La
instancia flight4 no es del mismo tipo que flight1 porque designan propiedades diferentes como propiedades
clave.

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

Si dos instancias de se declaran solo con propiedades que no son de clave, idénticas en nombre, tipo, orden y valor,
las dos instancias de no son iguales. Una instancia sin propiedades de clave es igual a sí misma.
Para obtener más información sobre las condiciones en las que dos instancias de tipos anónimos son instancias
del mismo tipo anónimo, vea tipos anónimos.
Cálculo de código hash
Como Equals, la función hash que se define en GetHashCode para un tipo anónimo se basa en las propiedades
clave del tipo. En los siguientes ejemplos se muestra la interacción entre las propiedades de clave y los valores de
código hash.
Las instancias de un tipo anónimo que tienen los mismos valores para todas las propiedades de clave tienen el
mismo valor de código hash, incluso si las propiedades que no son de clave no tienen valores coincidentes. La
siguiente instrucción devuelve True .

Console.WriteLine(flight1.GetHashCode = flight2.GetHashCode)

Las instancias de un tipo anónimo que tienen valores diferentes para una o varias propiedades de clave tienen
diferentes valores de código hash. La siguiente instrucción devuelve False .

Console.WriteLine(flight1.GetHashCode = flight3.GetHashCode)

Las instancias de tipos anónimos que designan propiedades diferentes como propiedades clave no son instancias
del mismo tipo. Tienen valores de código hash diferentes incluso cuando los nombres y valores de todas las
propiedades son iguales. La siguiente instrucción devuelve False .

Console.WriteLine(flight1.GetHashCode = flight4.GetHashCode)

Valores de solo lectura


No se pueden cambiar los valores de las propiedades de clave. Por ejemplo, en flight1 en los ejemplos
anteriores, los campos Airline y FlightNo son de solo lectura, pero Gate se puede cambiar.

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

Vea también
Definición de tipo anónimo
Deducir tipos y nombres de propiedades en declaraciones de tipos anónimos
Tipos anónimos
> De palabra clave de Module <(Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica que un atributo al principio de un archivo de código fuente se aplica al módulo de ensamblado actual.

Comentarios
Muchos atributos pertenecen a un elemento de programación individual, como una clase o una propiedad. Este
atributo se aplica asociando el bloque de atributos, entre corchetes angulares ( < > ), directamente a la instrucción
de declaración.
Si un atributo no solo pertenece al elemento siguiente, sino al módulo de ensamblado actual, coloca el bloque de
atributos al principio del archivo de código fuente e identifica el atributo con la palabra clave Module . Si se aplica
a todo el ensamblado, se utiliza la palabra clave Assembly .
El modificador Module no es el mismo que el de la instrucción Module.

Vea también
Ensamblado
Module (instrucción)
Información general de atributos
MustInherit (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Especifica que una clase se puede usar solo como una clase base y que no se puede crear un objeto directamente
a partir de ella.

Comentarios
El propósito de una clase base (también conocida como clase abstracta) es definir la funcionalidad común a
todas las clases derivadas de ella. Esto evita que las clases derivadas tengan que volver a definir los elementos
comunes. En algunos casos, esta funcionalidad común no es suficiente para crear un objeto utilizable y cada clase
derivada define la funcionalidad que falta. En tal caso, desea que el código utilizado solo cree objetos a partir de
las clases derivadas. Utilice MustInherit en la clase base para aplicar este.
Otro uso de una clase MustInherit es restringir una variable a un conjunto de clases relacionadas. Puede definir
una clase base y derivar todas estas clases relacionadas de ella. No es necesario que la clase base proporcione
ninguna funcionalidad común a todas las clases derivadas, pero puede servir como filtro para asignar valores a
variables. Si el código utilizado declara una variable como la clase base, Visual Basic le permite asignar solo un
objeto de una de las clases derivadas a esa variable.
El .NET Framework define varias clases MustInherit , entre ellas Array, Enumy ValueType. ValueType es un
ejemplo de una clase base que restringe una variable. Todos los tipos de valor se derivan de ValueType. Si declara
una variable como ValueType, solo podrá asignar tipos de valor a esa variable.

Reglas
Contexto de declaración. Solo se puede usar MustInherit en una instrucción de Class .
Modificadores combinados. No se puede especificar MustInherit junto con NotInheritable en la
misma declaración.

Ejemplo
En el ejemplo siguiente se muestra la herencia forzada y el reemplazo forzado. La clase base shape define una
variable acrossLine . Las clases circle y square derivan de shape . Heredan la definición de acrossLine , pero
deben definir la función area porque el cálculo es diferente para cada tipo de forma.
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

Puede declarar shape1 y shape2 para que sean de tipo shape . Sin embargo, no se puede crear un objeto a
partir de shape porque falta la funcionalidad de la función area y está marcada como MustInherit .
Dado que se declaran como shape , las variables shape1 y shape2 se restringen a los objetos de las clases
derivadas circle y square . Visual Basic no permite asignar ningún otro objeto a estas variables, lo que
proporciona un alto nivel de seguridad de tipos.

Uso
El modificador MustInherit se puede usar en este contexto:
Class (instrucción)

Vea también
Inherits (instrucción)
NotInheritable
Palabras clave
Fundamentos de la herencia
MustOverride (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica que una propiedad o procedimiento no está implementado en esta clase y se debe invalidar en una
clase derivada antes de que se pueda utilizar.

Comentarios
Solo se puede usar MustOverride en una instrucción de declaración de propiedad o procedimiento. La propiedad
o el procedimiento que especifica MustOverride debe ser miembro de una clase y la clase debe marcarse como
MustInherit.

Reglas
Declaración incompleta. Cuando se especifica MustOverride , no se proporcionan líneas de código
adicionales para la propiedad o el procedimiento, ni siquiera la instrucción End Function , End Property o
End Sub .

Modificadores combinados. No se puede especificar MustOverride junto con NotOverridable ,


Overridable o Shared en la misma declaración.

Sombrear e invalidar. Aunque tanto el sombreado como el reemplazo redefinen elementos heredados,
existen diferencias significativas entre ambos conceptos. Para obtener más información, vea sombrear en
Visual Basic.
Términos alternativos. Un elemento que no se puede usar excepto en una invalidación a veces se
denomina elemento virtual puro .
El modificador MustOverride se puede utilizar en los contextos siguientes:
Function (instrucción)
Property (instrucción)
Sub (instrucción)

Vea también
NotOverridable
Overridable
Overrides
MustInherit
Palabras clave
Sombrear en Visual Basic
Narrowing (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Indica que un operador de conversión ( CType ) convierte una clase o estructura en un tipo que podría no contener
algunos de los valores posibles de la clase o estructura original.

Convertir con la palabra clave narrowing


El procedimiento de conversión debe especificar Public Shared además de Narrowing .
Las conversiones de restricción no siempre se realizan correctamente en tiempo de ejecución y pueden producir
un error o provocar la pérdida de datos. Algunos ejemplos son Long Integer , String a Date y un tipo base a
un tipo derivado. Esta última conversión está restringida porque el tipo base no puede contener todos los
miembros del tipo derivado y, por tanto, no es una instancia del tipo derivado.
Si Option Strict es On , el código de consumo debe usar CType para todas las conversiones de restricción.
La palabra clave Narrowing se puede usar en este contexto:
Operator Statement

Vea también
Operator Statement
Widening
Conversiones de ampliación y de restricción
Definir un operador
Función CType
Option Strict (instrucción)
NotInheritable (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica que una clase no se puede usar como clase base.

Comentarios
Términos alternativos . Una clase que no se puede heredar se denomina a veces clase sellada .
El modificador NotInheritable se puede usar en este contexto:
Class (instrucción)

Vea también
Inherits (instrucción)
MustInherit
Palabras clave
NotOverridable (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica que una propiedad o un procedimiento no se pueden invalidar en una clase derivada.

Comentarios
El modificador NotOverridable impide que una propiedad o un método se invalide en una clase derivada. El
modificador Overridable permite que una propiedad o un método de una clase se invalide en una clase
derivada. Para más información, vea Fundamentos de la herencia.
Si no se especifica el modificador Overridable o NotOverridable , el valor predeterminado depende de si la
propiedad o el método reemplaza a una propiedad o método de clase base. Si la propiedad o el método
reemplaza una propiedad o un método de clase base, la configuración predeterminada es Overridable ; de lo
contrario, se NotOverridable .
Un elemento que no se puede invalidar se denomina a veces elemento sellado .
Solo se puede usar NotOverridable en una instrucción de declaración de propiedad o procedimiento. Solo
puede especificar NotOverridable en una propiedad o un procedimiento que invalide otra propiedad o
procedimiento, es decir, solo en combinación con Overrides .

Modificadores combinados
No se puede especificar Overridable ni NotOverridable para un método Private .
No se puede especificar NotOverridable junto con MustOverride , Overridable o Shared en la misma
declaración.

Uso
El modificador NotOverridable se puede utilizar en los contextos siguientes:
Function (instrucción)
Property (instrucción)
Sub (instrucción)

Vea también
Modificadores
Fundamentos de la herencia
MustOverride
Overridable
Overrides
Palabras clave
Sombrear en Visual Basic
Optional (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica que un argumento de procedimiento se puede omitir cuando se llama al procedimiento.

Comentarios
Para cada parámetro opcional, debe especificar una expresión constante como valor predeterminado de ese
parámetro. Si la expresión se evalúa como Nothing, se usa el valor predeterminado del tipo de datos Value como
valor predeterminado del parámetro.
Si la lista de parámetros contiene un parámetro opcional, cada parámetro que siga también debe ser opcional.
El modificador Optional se puede utilizar en los contextos siguientes:
Declare (instrucción)
Function (instrucción)
Property (instrucción)
Sub (instrucción)

NOTE
Cuando se llama a un procedimiento con o sin parámetros opcionales, se pueden pasar argumentos por posición o por
nombre. Para obtener más información, vea pasar argumentos por posición y por nombre.

NOTE
También puede definir un procedimiento con parámetros opcionales mediante sobrecarga. Si tiene un parámetro opcional,
puede definir dos versiones sobrecargadas del procedimiento, una que acepte el parámetro y otra que no lo sea. Para
obtener más información, consulta Procedure Overloading.

Ejemplo
En el ejemplo siguiente se define un procedimiento que tiene un parámetro opcional.
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

Ejemplo
En el ejemplo siguiente se muestra cómo llamar a un procedimiento con argumentos pasados por posición y con
argumentos pasados por nombre. El procedimiento tiene dos parámetros opcionales.

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

Vea también
Lista de parámetros
Parámetros opcionales
Palabras clave
Out (Modificador genérico) (Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

En el caso de los parámetros de tipo genérico, la palabra clave Out especifica que el tipo es covariante.

Comentarios
La covarianza le permite usar un tipo más derivado que el que se especifica en el parámetro genérico. Esto
permite la conversión implícita de las clases que implementan interfaces variantes y la conversión implícita de los
tipos de delegado.
Para obtener más información, vea Covariance and Contravariance (Covarianza y contravarianza).

Reglas
Puede usar la palabra clave Out en las interfaces y delegados genéricos.
En una interfaz genérica, un parámetro de tipo se puede declarar como covariante si cumple las siguientes
condiciones:
El parámetro de tipo se usa solamente como tipo de valor devuelto de los métodos de interfaz y no como
tipo de los argumentos de método.

NOTE
Hay una excepción para esta regla. Si en una interfaz covariante tiene un delegado genérico contravariante como
parámetro de método, puede usar el tipo covariante como parámetro de tipo genérico para este delegado. Para
obtener más información sobre los delegados genéricos covariantes y contravariantes, vea Varianza en delegados y
Usar la varianza para los delegados genéricos Func y Action.

El parámetro de tipo no se usa como restricción genérica para los métodos de interfaz.
En un delegado genérico, un parámetro de tipo puede declararse como covariante si solo se usa como un tipo de
valor devuelto de método y no se usa para los argumentos de método.
La covarianza y la contravarianza son compatibles con los tipos de referencia, pero no lo son con los tipos de
valor.
En Visual Basic, no se pueden declarar eventos en interfaces covariantes sin especificar el tipo de delegado.
Además, las interfaces covariantes no pueden tener clases, enumeraciones o estructuras anidadas, pero pueden
tener interfaces anidadas.

Comportamiento
Una interfaz con un parámetro de tipo covariante permite que sus métodos devuelvan tipos más derivados que
los especificados por el parámetro de tipo. Por ejemplo, dado que en .NET Framework 4, en IEnumerable<T>, el
tipo T es covariante, puede asignar un objeto del tipo IEnumerable(Of String) a otro objeto del tipo
IEnumerable(Of Object) sin usar ningún método de conversión especial.

A un delegado covariante se le puede asignar otro delegado del mismo tipo, pero con un parámetro de tipo
genérico más derivado.
Ejemplo
En el ejemplo siguiente se muestra cómo declarar, extender e implementar una interfaz genérica covariante.
También se muestra cómo usar la conversión implícita para las clases que implementan una interfaz covariante.

' 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

Ejemplo
En el ejemplo siguiente se muestra cómo declarar, invocar y crear instancias de un delegado genérico covariante.
También se muestra cómo puede usar la conversión implícita para los tipos de delegado.

' 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
Vea también
Varianza en interfaces genéricas
In
Overloads (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Especifica que una propiedad o procedimiento vuelve a declarar una o varias propiedades o procedimientos
existentes con el mismo nombre.

Comentarios
La sobrecarga es la práctica de proporcionar más de una definición para un nombre de propiedad o
procedimiento determinado en el mismo ámbito. La Redeclaración de una propiedad o un procedimiento con
una firma diferente se denomina a veces ocultar por firma.

Reglas
Contexto de declaración. Solo se puede usar Overloads en una instrucción de declaración de
propiedad o procedimiento.
Modificadores combinados. No se puede especificar Overloads junto con Shadows en la misma
declaración de procedimiento.
Diferencias requeridas. La firma de esta declaración debe ser diferente de la firma de cada propiedad o
procedimiento que sobrecarga. La firma incluye el nombre de propiedad o procedimiento más lo
siguiente:
el número de parámetros
el orden de los parámetros
los tipos de datos de los parámetros
el número de parámetros de tipo (para un procedimiento genérico)
el tipo de valor devuelto (solo para un procedimiento de operador de conversión)
Todas las sobrecargas deben tener el mismo nombre, pero cada una debe diferir de todas las demás en
uno o varios de los aspectos anteriores. Esto permite al compilador distinguir qué versión debe utilizar
cuando el código llama a la propiedad o el procedimiento.
Diferencias no permitidas. El cambio de uno o varios de los siguientes aspectos no es válido para
sobrecargar una propiedad o un procedimiento, porque no forman parte de la firma:
si devuelve o no un valor (para un procedimiento)
el tipo de datos del valor devuelto (excepto para un operador de conversión)
los nombres de los parámetros o parámetros de tipo
las restricciones en los parámetros de tipo (para un procedimiento genérico)
palabras clave de modificador de parámetro (como ByRef o Optional )
palabras clave de modificador de propiedad o procedimiento (como Public o Shared )
Modificador opcional. No es necesario usar el modificador Overloads al definir varias propiedades o
procedimientos sobrecargados en la misma clase. Sin embargo, si utiliza Overloads en una de las
declaraciones, debe utilizarlo en todas ellas.
Sombreado y sobrecarga. Overloads también puede usarse para prevalecer sobre un miembro
existente, o un conjunto de miembros sobrecargados, en una clase base. Al utilizar Overloads de esta
forma, declara la propiedad o el método con el mismo nombre y la misma lista de parámetros que el
miembro de clase base y no proporciona la palabra clave Shadows .
Si usa Overrides , el compilador agrega de forma implícita Overloads para que las API de la biblioteca trabajen
más fácilmente con C#.
El modificador Overloads se puede utilizar en los contextos siguientes:
Function (instrucción)
Operator Statement
Property (instrucción)
Sub (instrucción)

Vea también
Shadows
Sobrecarga de procedimientos
Generic Types in Visual Basic
Procedimientos de operadores
Definir un operador de conversión
Overridable (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica que una propiedad o un procedimiento se puede invalidar mediante una propiedad o un
procedimiento con el mismo nombre en una clase derivada.

Comentarios
El modificador Overridable permite que una propiedad o un método de una clase se invalide en una clase
derivada. El modificador NotOverridable evita que una propiedad o un método se invalide en una clase
derivada. Para más información, vea Fundamentos de la herencia.
Si no se especifica el modificador Overridable o NotOverridable , el valor predeterminado depende de si la
propiedad o el método reemplaza a una propiedad o método de clase base. Si la propiedad o el método
reemplaza una propiedad o un método de clase base, la configuración predeterminada es Overridable ; de lo
contrario, se NotOverridable .
Puede sombrear o reemplazar para volver a definir un elemento heredado, pero hay diferencias significativas
entre los dos enfoques. Para obtener más información, vea sombrear en Visual Basic.
Un elemento que se puede reemplazar se denomina a veces elemento virtual . Si se puede invalidar, pero no es
necesario, a veces también se denomina elemento concreto .
Solo se puede usar Overridable en una instrucción de declaración de propiedad o procedimiento.

Modificadores combinados
No se puede especificar Overridable ni NotOverridable para un método Private .
No se puede especificar Overridable junto con MustOverride , NotOverridable o Shared en la misma
declaración.
Dado que un elemento de reemplazo es reemplazable de forma implícita, no se puede combinar Overridable
con Overrides .

Uso
El modificador Overridable se puede utilizar en los contextos siguientes:
Function (instrucción)
Property (instrucción)
Sub (instrucción)

Vea también
Modificadores
Fundamentos de la herencia
MustOverride
NotOverridable
Overrides
Palabras clave
Sombrear en Visual Basic
Overrides (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Especifica que una propiedad o procedimiento invalida una propiedad o procedimiento del mismo nombre
heredado de una clase base.

Reglas
Contexto de declaración. Solo se puede usar Overrides en una instrucción de declaración de
propiedad o procedimiento.
Modificadores combinados. No se puede especificar Overrides junto con Shadows o Shared en la
misma declaración. Dado que un elemento de reemplazo es reemplazable de forma implícita, no se
puede combinar Overridable con Overrides .
Firmas coincidentes. La firma de esta declaración debe coincidir exactamente con la firma de la
propiedad o el procedimiento que reemplaza. Esto significa que las listas de parámetros deben tener el
mismo número de parámetros, en el mismo orden y con los mismos tipos de datos.
Además de coincidir con la firma, la declaración de reemplazo también debe coincidir de forma exacta
con los elementos siguientes:
El nivel de acceso.
El tipo de valor devuelto, si lo hay.
Firmas genéricas. En los procedimientos genéricos, la firma incluye el número de parámetros de tipo.
Por lo tanto, la declaración de reemplazo también debe coincidir con la versión de la clase base en este
sentido.
Coincidencia adicional. Además de coincidir con la firma de la versión de la clase base, esta
declaración también debe coincidir con los elementos siguientes:
Modificador de nivel de acceso (por ejemplo, Public)
Mecanismo de paso de cada parámetro (ByVal o ByRef)
Listas de restricciones de los distintos parámetros de tipo de los procedimientos genéricos.
Sombrear e invalidar. Aunque tanto el sombreado como el reemplazo redefinen elementos heredados,
existen diferencias significativas entre ambos conceptos. Para obtener más información, vea sombrear en
Visual Basic.
Si usa Overrides , el compilador agrega de forma implícita Overloads para que las API de la biblioteca trabajen
más fácilmente con C#.
El modificador Overrides se puede utilizar en los contextos siguientes:
Function (instrucción)
Property (instrucción)
Sub (instrucción)

Vea también
MustOverride
NotOverridable
Overridable
Palabras clave
Sombrear en Visual Basic
Generic Types in Visual Basic
Lista de tipos
ParamArray (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica que un parámetro de procedimiento toma una matriz opcional de elementos del tipo especificado.
ParamArray solo se puede usar en el último parámetro de una lista de parámetros.

Comentarios
ParamArray permite pasar un número arbitrario de argumentos al procedimiento. Un parámetro ParamArray
siempre se declara mediante ByVal.
Puede proporcionar uno o varios argumentos a un parámetro ParamArray pasando una matriz del tipo de datos
adecuado, una lista separada por comas de valores o nada en absoluto. Para obtener más información, vea "llamar
a ParamArray" en matrices de parámetros.

IMPORTANT
Siempre que se trata de una matriz que puede ser indefinidamente grande, existe el riesgo de que se produzca una gran
cantidad de capacidad interna de la aplicación. Si acepta una matriz de parámetros del código de llamada, debe probar su
longitud y tomar las medidas adecuadas si es demasiado grande para la aplicación.

El modificador ParamArray se puede utilizar en los contextos siguientes:


Declare (instrucción)
Function (instrucción)
Property (instrucción)
Sub (instrucción)

Vea también
Palabras clave
Matrices de parámetros
Partial (Visual Basic)
27/11/2019 • 6 minutes to read • Edit Online

Indica que una declaración de tipo es una definición parcial del tipo.
Puede dividir la definición de un tipo en varias declaraciones con la palabra clave Partial . Puede usar todas las
declaraciones parciales que quiera en todos los archivos de código fuente que desee, pero todas las declaraciones
deben estar en el mismo ensamblado y en el mismo espacio de nombres.

NOTE
Visual Basic admite métodos parciales, que normalmente se implementan en clases parciales. Para obtener más información,
vea métodos parciales y Sub Statement.

Sintaxis
[ <attrlist> ] [ accessmodifier ] [ Shadows ] [ MustInherit | NotInheritable ] _
Partial { Class | Structure | Interface | Module } name [ (Of typelist) ]
[ Inherits classname ]
[ Implements interfacenames ]
[ variabledeclarations ]
[ proceduredeclarations ]
{ End Class | End Structure }

Elementos
T ÉRM IN O DEF IN IC IÓ N

attrlist Opcional. Lista de atributos que se aplican a este tipo. Debe


incluir la lista de atributos entre corchetes angulares ( < > ).

accessmodifier Opcional. Especifica qué código puede tener acceso a este


tipo. Vea Access levels in Visual Basic.

Shadows Opcional. Vea Shadows.

MustInherit Opcional. Vea MustInherit.

NotInheritable Opcional. Vea NotInheritable.

name Obligatorio. Nombre de este tipo. Debe coincidir con el


nombre definido en el resto de las declaraciones parciales del
mismo tipo.

Of Opcional. Especifica que se trata de un tipo genérico. Vea


tipos genéricos en Visual Basic.

typelist Obligatorio si se usa de. Consulte lista de tipos.


T ÉRM IN O DEF IN IC IÓ N

Inherits Opcional. Vea Inherits (instrucción).

classname Obligatorio si se usa Inherits . El nombre de la clase o la


interfaz de la que se deriva esta clase.

Implements Opcional. Vea Implements (instrucción).

interfacenames Obligatorio si se usa Implements . Los nombres de las


interfaces que implementa este tipo.

variabledeclarations Opcional. Instrucciones que declaran variables adicionales y


eventos para el tipo.

proceduredeclarations Opcional. Instrucciones que declaran y definen


procedimientos adicionales para el tipo.

End Class o End Structure Finaliza esta definición Class o Structure parcial.

Comentarios
Visual Basic usa definiciones de clase parcial para separar el código generado del código creado por el usuario en
archivos de código fuente independientes. Por ejemplo, el Diseñador de Windows Forms define clases
parciales para controles como Form. No debe modificar el código generado en estos controles.
Todas las reglas para crear clases, estructuras, interfaces y módulos, como las reglas de uso y herencia de
modificadores, se aplican al crear un tipo parcial.

Procedimientos recomendados
En circunstancias normales no debe dividir el desarrollo de un solo tipo en dos o más declaraciones. Por lo
tanto, en la mayoría de los casos no necesita la palabra clave Partial .
Para mejorar la legibilidad, cada declaración parcial de un tipo debe incluir la palabra clave Partial . El
compilador permite a lo sumo una declaración parcial para omitir la palabra clave; si hay dos o más que la
omiten, el compilador señala un error.

Comportamiento
Unión de declaraciones. El compilador trata el tipo como la unión de todas sus declaraciones parciales.
Todos los modificadores de todas las definiciones parciales se aplican a todo el tipo; además, todos los
miembros de todas las definiciones parciales están disponibles para todo el tipo.
Promoción de tipos no permitida para tipos parciales en módulos. Si una definición parcial está
dentro de un módulo, se rechaza automáticamente la promoción de tipos de ese tipo. En este caso, un
conjunto de definiciones parciales puede producir resultados inesperados e incluso errores del compilador.
Para obtener más información, consulte promoción de tipos.
El compilador solo combina las definiciones parciales cuando sus rutas de acceso completas son idénticas.
La palabra clave Partial se puede usar en los siguientes contextos:
Class (instrucción)
Structure (instrucción)

Ejemplo
En el ejemplo siguiente se divide la definición de la clase sampleClass en dos declaraciones, cada una de las
cuales define otro procedimiento Sub .

Partial Public Class sampleClass


Public Sub sub1()
End Sub
End Class
Partial Public Class sampleClass
Public Sub sub2()
End Sub
End Class

Las dos definiciones parciales del ejemplo anterior podrían estar en el mismo archivo de origen o en dos archivos
distintos.

Vea también
Class (instrucción)
Structure (instrucción)
Promoción de tipos
Shadows
Generic Types in Visual Basic
Métodos Partial
Private (Visual Basic)
08/01/2020 • 2 minutes to read • Edit Online

Especifica que solo se puede tener acceso a uno o varios elementos de programación declarados desde
dentro del contexto de declaración, incluido desde dentro de cualquier tipo contenido.

Notas
Si un elemento de programación representa la funcionalidad de propiedad o contiene datos
confidenciales, normalmente querrá limitar el acceso a él lo máximo posible. Para lograr la limitación
máxima, solo se permite el módulo, la clase o la estructura que la define para tener acceso a ella. Para
limitar el acceso a un elemento de esta manera, puede declararlo con Private .

NOTE
También puede usar el modificador de acceso protegido privado , que hace que un miembro sea accesible desde
dentro de esa clase y desde las clases derivadas que se encuentran en el ensamblado que lo contiene.

reglas
Contexto de declaración. Solo se puede usar Private en un nivel de módulo. Esto significa que el
contexto de la declaración de un elemento Private debe ser un módulo, una clase o una estructura,
y no puede ser un archivo de código fuente, un espacio de nombres, una interfaz o un procedimiento.

Comportamiento
Nivel de acceso. Todo el código dentro de un contexto de declaración puede tener acceso a sus
elementos Private . Esto incluye el código dentro de un tipo contenido, como una clase anidada o
una expresión de asignación en una enumeración. Ningún código fuera del contexto de la
declaración puede tener acceso a sus elementos Private .
Modificadores de acceso. Las palabras clave que especifican el nivel de acceso se denominan
modificadores de acceso. Para obtener una comparación de los modificadores de acceso, vea
niveles de acceso en Visual Basic.
El modificador Private se puede utilizar en los contextos siguientes:
Class (instrucción)
Const (instrucción)
Declare Statement
Delegate (instrucción)
Dim (instrucción)
Enum (instrucción)
Event (instrucción)
Function (instrucción)
Interface (instrucción)
Property (instrucción)
Structure (instrucción)
Sub (instrucción)

Vea también
Public
Protected
Friend
Private Protected
Protected Friend
Niveles de acceso en Visual Basic
Procedimientos
Estructuras
Objetos y clases
Privado protegido (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

La combinación de palabras claves Private Protected es un modificador de acceso de miembro. Un miembro


de Private Protected es accesible para todos los miembros de la clase contenedora, así como para los tipos
derivados de la clase contenedora, pero solo si se encuentran en el ensamblado que lo contiene.
Solo puede especificar Private Protected en miembros de clases; no se puede aplicar Private Protected a
los miembros de una estructura porque las estructuras no se pueden heredar.
Visual Basic 15,5 y versiones posteriores admiten el modificador de acceso Private Protected . Para usarlo,
puede Agregar el siguiente elemento al archivo de proyecto de Visual Basic (*. vbproj). Siempre que Visual
Basic 15,5 o posterior esté instalado en el sistema, le permite aprovechar todas las características de lenguaje
compatibles con la versión más reciente del compilador de Visual Basic:

<PropertyGroup>
<LangVersion>latest</LangVersion>
</PropertyGroup>

Para obtener más información, vea establecer la versión de lenguaje Visual Basic.

NOTE
En Visual Studio, al seleccionar la ayuda F1 en private protected se proporciona ayuda para privado o protegido. El
IDE elige el token único bajo el cursor en lugar de la palabra compuesta.

Reglas
Contexto de declaración. Solo se puede usar Private Protected en el nivel de clase. Esto significa que
el contexto de la declaración de un elemento Protected debe ser una clase y no puede ser un archivo de
código fuente, un espacio de nombres, una interfaz, un módulo, una estructura o un procedimiento.

Comportamiento
Nivel de acceso. Todo el código de una clase puede tener acceso a sus elementos. El código de
cualquier clase que se deriva de una clase base y se encuentra en el mismo ensamblado puede tener
acceso a todos los elementos Private Protected de la clase base. Sin embargo, el código de cualquier
clase que deriva de una clase base y se encuentra en un ensamblado diferente no puede tener acceso a
la clase base Private Protected elementos.
Modificadores de acceso. Las palabras clave que especifican el nivel de acceso se denominan
modificadores de acceso. Para obtener una comparación de los modificadores de acceso, vea niveles de
acceso en Visual Basic.
El modificador Private Protected se puede utilizar en los contextos siguientes:
Instrucción de clase de una clase anidada
Const (instrucción)
Declare (instrucción)
Instrucción delegada de un delegado anidado en una clase
Dim (instrucción)
Instrucción enum de una enumeración anidada en una clase
Event (instrucción)
Function (instrucción)
Instrucción de interfaz de una interfaz anidada en una clase
Property (instrucción)
Instrucción Structure de una estructura anidada en una clase
Sub (instrucción)

Vea también
Public
Protected
Friend
Private
Protected Friend
Niveles de acceso en Visual Basic
Procedimientos
Estructuras
Objetos y clases
Protected (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Modificador de acceso de miembro que especifica que solo se puede tener acceso a uno o varios
elementos de programación declarados desde dentro de su propia clase o desde una clase derivada.

Comentarios
A veces, un elemento de programación declarado en una clase contiene datos confidenciales o código
restringido, y desea limitar el acceso al elemento. Sin embargo, si la clase es heredable y espera una
jerarquía de clases derivadas, podría ser necesario que estas clases derivadas tengan acceso a los datos o al
código. En tal caso, desea que el elemento sea accesible tanto desde la clase base como desde todas las
clases derivadas. Para limitar el acceso a un elemento de esta manera, puede declararlo con Protected .

NOTE
El modificador de acceso Protected se puede combinar con otros dos modificadores:
El modificador Friend protegido hace que un miembro de clase sea accesible desde dentro de esa clase, desde las
clases derivadas y desde el mismo ensamblado en el que se define la clase.
El modificador Private Protected hace que un miembro de clase sea accesible para los tipos derivados, pero solo
dentro del ensamblado que lo contiene.

Reglas
Contexto de declaración. Solo se puede usar Protected en el nivel de clase. Esto significa que el
contexto de la declaración de un elemento Protected debe ser una clase y no puede ser un archivo de
código fuente, un espacio de nombres, una interfaz, un módulo, una estructura o un procedimiento.

Comportamiento
Nivel de acceso. Todo el código de una clase puede tener acceso a sus elementos. El código de
cualquier clase que deriva de una clase base puede tener acceso a todos los elementos Protected
de la clase base. Esto es cierto para todas las generaciones de derivación. Esto significa que una
clase puede tener acceso a Protected elementos de la clase base de la clase base, etc.
El acceso protegido no es un superconjunto o subconjunto de acceso de confianza.
Modificadores de acceso. Las palabras clave que especifican el nivel de acceso se denominan
modificadores de acceso. Para obtener una comparación de los modificadores de acceso, vea niveles
de acceso en Visual Basic.
El modificador Protected se puede utilizar en los contextos siguientes:
Class (instrucción)
Const (instrucción)
Declare (instrucción)
Delegate (instrucción)
Dim (instrucción)
Enum (instrucción)
Event (instrucción)
Function (instrucción)
Interface (instrucción)
Property (instrucción)
Structure (instrucción)
Sub (instrucción)

Vea también
Public
Friend
Private
Private Protected
Protected Friend
Niveles de acceso en Visual Basic
Procedimientos
Estructuras
Objetos y clases
Friend protegido (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

La combinación de palabras claves Protected Friend es un modificador de acceso de miembro. Confiere


acceso de confianza y acceso protegido en los elementos declarados, por lo que son accesibles desde
cualquier lugar del mismo ensamblado, desde su propia clase y desde las clases derivadas. Solo puede
especificar Protected Friend en miembros de clases; no se puede aplicar Protected Friend a los miembros
de una estructura porque las estructuras no se pueden heredar.

NOTE
En Visual Studio, al seleccionar la ayuda F1 en protected friend se proporciona ayuda para Protected o Friend. El IDE
elige el token único bajo el cursor en lugar de la palabra compuesta.

Reglas
Contexto de declaración. Solo se puede usar Protected Friend en el nivel de clase. Esto significa que el
contexto de la declaración de un elemento Protected debe ser una clase y no puede ser un archivo de código
fuente, un espacio de nombres, una interfaz, un módulo, una estructura o un procedimiento.

Vea también
Public
Protected
Friend
Private
Private Protected
Niveles de acceso en Visual Basic
Procedimientos
Estructuras
Objetos y clases
Public (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica que uno o varios elementos de programación declarados no tienen restricciones de acceso.

Comentarios
Si va a publicar un componente o un conjunto de componentes, como una biblioteca de clases,
normalmente desea que los elementos de programación sean accesibles por cualquier código que
interopere con el ensamblado. Para atribuir este acceso ilimitado en un elemento, puede declararlo con
Public .

El acceso público es el nivel normal para un elemento de programación cuando no es necesario limitar el
acceso a él. Tenga en cuenta que el nivel de acceso de un elemento declarado en una interfaz, módulo,
clase o estructura tiene como valor predeterminado Public si no lo declara de otro modo.

Reglas
Contexto de declaración. Solo se puede usar Public en el nivel de módulo, interfaz o espacio de
nombres. Esto significa que el contexto de la declaración de un elemento Public debe ser un archivo
de código fuente, un espacio de nombres, una interfaz, un módulo, una clase o una estructura, y no
puede ser un procedimiento.

Comportamiento
Nivel de acceso. Todo el código que puede tener acceso a un módulo, clase o estructura puede
tener acceso a sus elementos Public .
Acceso predeterminado. Las variables locales dentro de un procedimiento tienen como valor
predeterminado el acceso público y no se pueden usar modificadores de acceso en ellas.
Modificadores de acceso. Las palabras clave que especifican el nivel de acceso se denominan
modificadores de acceso. Para obtener una comparación de los modificadores de acceso, vea
niveles de acceso en Visual Basic.
El modificador Public se puede utilizar en los contextos siguientes:
Class (instrucción)
Const (instrucción)
Declare (instrucción)
Delegate (instrucción)
Dim (instrucción)
Enum (instrucción)
Event (instrucción)
Function (instrucción)
Interface (instrucción)
Module (instrucción)
Operator Statement
Property (instrucción)
Structure (instrucción)
Sub (instrucción)

Vea también
Protected
Friend
Private
Private Protected
Protected Friend
Niveles de acceso en Visual Basic
Procedimientos
Estructuras
Objetos y clases
ReadOnly (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Especifica que una variable o una propiedad se puede leer pero no escribir.

Comentarios
Reglas
Contexto de declaración. Solo se puede usar ReadOnly en un nivel de módulo. Esto significa que el
contexto de la declaración de un elemento ReadOnly debe ser una clase, una estructura o un módulo, y
no puede ser un archivo de código fuente, un espacio de nombres o un procedimiento.
Modificadores combinados. No se puede especificar ReadOnly junto con Static en la misma
declaración.
Asignación de un valor. El código que consume una propiedad ReadOnly no puede establecer su
valor. Pero el código que tiene acceso al almacenamiento subyacente puede asignar o cambiar el valor
en cualquier momento.
Solo puede asignar un valor a una variable ReadOnly en su declaración o en el constructor de una clase
o estructura en la que se define.

Cuándo usar una variable de solo lectura


Hay situaciones en las que no se puede usar una instrucción const para declarar y asignar un valor constante.
Por ejemplo, es posible que la instrucción Const no acepte el tipo de datos que desea asignar o que no pueda
calcular el valor en tiempo de compilación con una expresión constante. Es posible que ni siquiera conozca el
valor en tiempo de compilación. En estos casos, puede usar una variable ReadOnly para contener un valor
constante.

IMPORTANT
Si el tipo de datos de la variable es un tipo de referencia, como una matriz o una instancia de clase, sus miembros se
pueden cambiar incluso si la propia variable es ReadOnly . En el ejemplo siguiente se ilustra esto.

ReadOnly characterArray() As Char = {"x"c, "y"c, "z"c}


Sub ChangeArrayElement()
characterArray(1) = "M"c
End Sub

Cuando se inicializa, la matriz a la que apunta characterArray() contiene "x", "y" y "z". Dado que la variable
characterArray es ReadOnly , no se puede cambiar su valor una vez inicializado. es decir, no se puede asignar
una nueva matriz a ella. Sin embargo, puede cambiar los valores de uno o varios de los miembros de la
matriz. Después de una llamada al procedimiento ChangeArrayElement , la matriz a la que apunta
characterArray() contiene "x", "M" y "z".

Tenga en cuenta que esto es similar a declarar un parámetro de procedimiento como ByVal, lo que evita que el
procedimiento cambie el argumento de llamada en sí, pero permite cambiar sus miembros.
Ejemplo
En el ejemplo siguiente se define una propiedad ReadOnly para la fecha en la que se contrató a un empleado.
La clase almacena el valor de propiedad internamente como una variable Private y solo el código dentro de
la clase puede cambiar ese valor. Sin embargo, la propiedad es Public y cualquier código que pueda tener
acceso a la clase puede leer la propiedad.

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

El modificador ReadOnly se puede utilizar en los contextos siguientes:


Dim (instrucción)
Property (instrucción)

Vea también
WriteOnly
Palabras clave
Shadows (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Especifica que un elemento de programación declarado vuelve a declarar y oculta un elemento con el mismo
nombre, o un conjunto de elementos sobrecargados, en una clase base.

Comentarios
El propósito principal de la sombra (que también se denomina ocultar por nombre) es conservar la
definición de los miembros de clase. La clase base puede someterse a un cambio que crea un elemento con
el mismo nombre que el que ya se ha definido. Si esto ocurre, el modificador Shadows fuerza las referencias
a través de la clase para que se resuelvan en el miembro definido, en lugar de en el nuevo elemento de clase
base.
Aunque tanto el sombreado como el reemplazo redefinen elementos heredados, existen diferencias
significativas entre ambos conceptos. Para obtener más información, vea sombrear en Visual Basic.

Reglas
Contexto de declaración. Solo se puede usar Shadows en el nivel de clase. Esto significa que el
contexto de la declaración de un elemento Shadows debe ser una clase y no puede ser un archivo de
código fuente, un espacio de nombres, una interfaz, un módulo, una estructura o un procedimiento.
Solo puede declarar un elemento de sombreado en una instrucción de declaración única.
Modificadores combinados. No se puede especificar Shadows junto con Overloads , Overrides o
Static en la misma declaración.

Tipos de elemento. Puede reemplazar cualquier tipo de elemento declarado con cualquier otro tipo.
Si sombrea una propiedad o un procedimiento con otra propiedad o procedimiento, los parámetros y
el tipo de valor devuelto no tienen que coincidir con los de la propiedad o el procedimiento de la clase
base.
Acceso a. Normalmente, el elemento sombreado de la clase base no está disponible en la clase
derivada que lo sombrea. Sin embargo, se aplican las consideraciones siguientes.
Si el elemento de sombreado no es accesible desde el código que hace referencia a él, la
referencia se resuelve en el elemento sombreado. Por ejemplo, si un elemento Private
sombrea un elemento de clase base, el código que no tiene permiso para obtener acceso al
elemento Private tiene acceso al elemento de clase base en su lugar.
Si sombrea un elemento, todavía puede tener acceso al elemento sombreado a través de un
objeto declarado con el tipo de la clase base. También puede tener acceso a ella a través de
MyBase .

El modificador Shadows se puede utilizar en los contextos siguientes:


Class (instrucción)
Const (instrucción)
Declare (instrucción)
Delegate (instrucción)
Dim (instrucción)
Enum (instrucción)
Event (instrucción)
Function (instrucción)
Interface (instrucción)
Property (instrucción)
Structure (instrucción)
Sub (instrucción)

Vea también
Shared
Static
Private
Me, My, MyBase y MyClass
Fundamentos de la herencia
MustOverride
NotOverridable
Sobrecargas
Overridable
Overrides
Sombrear en Visual Basic
Shared (Visual Basic)
27/11/2019 • 6 minutes to read • Edit Online

Especifica que uno o varios elementos de programación declarados están asociados a una clase o estructura
de gran tamaño, y no a una instancia específica de la clase o estructura.

Comentarios
Cuándo usar Shared
Compartir un miembro de una clase o estructura lo pone a disposición de todas las instancias, en lugar de
ser no compartidas, donde cada instancia conserva su propia copia. Esto resulta útil, por ejemplo, si el valor
de una variable se aplica a toda la aplicación. Si declara que la variable es Shared , todas las instancias
acceden a la misma ubicación de almacenamiento y, si una instancia cambia el valor de la variable, todas las
instancias acceden al valor actualizado.
El uso compartido no modifica el nivel de acceso de un miembro. Por ejemplo, un miembro de clase puede
ser compartido y privado (accesible solo desde dentro de la clase), o no compartido y público. Para obtener
más información, consulte niveles de acceso en Visual Basic.

Reglas
Contexto de declaración. Solo se puede usar Shared en un nivel de módulo. Esto significa que el
contexto de la declaración de un elemento Shared debe ser una clase o estructura, y no puede ser un
archivo de código fuente, un espacio de nombres o un procedimiento.
Modificadores combinados. No se puede especificar Shared junto con invalidaciones, Overridable,
NotOverridable, MustOverrideo static en la misma declaración.
Acceso a. Puede tener acceso a un elemento compartido si lo califica con su nombre de clase o
estructura, no con el nombre de variable de una instancia específica de su clase o estructura. No es
necesario crear una instancia de una clase o estructura para tener acceso a sus miembros
compartidos.
En el ejemplo siguiente se llama al procedimiento compartido IsNaN expuesto por la estructura
Double.
If Double.IsNaN(result) Then MsgBox("Result is mathematically undefined.")

Uso compar tido implícito. No se puede usar el modificador Shared en una instrucción const, pero
las constantes se comparten implícitamente. Del mismo modo, no puede declarar un miembro de un
módulo o una interfaz que se Shared , pero se comparten implícitamente.

Comportamiento
Discos. Una variable o evento compartido se almacena en la memoria solo una vez,
independientemente del número de instancias que cree de su clase o estructura. De forma similar, un
procedimiento compartido o una propiedad solo contiene un conjunto de variables locales.
Obtener acceso a través de una variable de instancia. Es posible obtener acceso a un elemento
compartido si se califica con el nombre de una variable que contiene una instancia específica de su
clase o estructura. Aunque esto suele funcionar según lo esperado, el compilador genera un mensaje
de advertencia y hace que el acceso se realice a través del nombre de la clase o la estructura en lugar
de la variable.
Obtener acceso a través de una expresión de instancia. Si obtiene acceso a un elemento
compartido a través de una expresión que devuelve una instancia de su clase o estructura, el
compilador realiza el acceso a través del nombre de la clase o la estructura en lugar de evaluar la
expresión. Esto produce resultados inesperados si desea que la expresión realice otras acciones, así
como para devolver la instancia. En el ejemplo siguiente se ilustra esto.

Sub main()
shareTotal.total = 10
' The preceding line is the preferred way to access total.
Dim instanceVar As New shareTotal
instanceVar.total += 100
' The preceding 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.
returnClass().total += 1000
' The preceding 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 MsgBox in returnClass() does not run.
MsgBox("Value of total is " & CStr(shareTotal.total))
End Sub
Public Function returnClass() As shareTotal
MsgBox("Function returnClass() called")
Return New shareTotal
End Function
Public Class shareTotal
Public Shared total As Integer
End Class

En el ejemplo anterior, el compilador genera un mensaje de advertencia ambas veces el código tiene
acceso a la variable compartida total a través de una instancia de. En cada caso, realiza el acceso
directamente a través de la clase shareTotal y no hace uso de ninguna instancia. En el caso de la
llamada prevista al procedimiento returnClass , esto significa que no genera ni siquiera una llamada
a returnClass , por lo que no se realiza la acción adicional de mostrar "función returnClass ()
llamada".
El modificador Shared se puede utilizar en los contextos siguientes:
Dim (instrucción)
Event (instrucción)
Function (instrucción)
Operator Statement
Property (instrucción)
Sub (instrucción)

Vea también
Shadows
Static
Duración en Visual Basic
Procedimientos
Estructuras
Objetos y clases
Static (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Especifica que una o varias variables locales declaradas deben seguir existiendo y conservar sus valores más
recientes después de la finalización del procedimiento en el que se declaran.

Comentarios
Normalmente, una variable local de un procedimiento deja de existir en cuanto se detiene el procedimiento. Una
variable estática sigue existiendo y conserva su valor más reciente. La próxima vez que el código llame al
procedimiento, no se reinicializará la variable y se conservará el valor más reciente que le haya asignado. Una
variable estática sigue existiendo mientras dure la clase o el módulo en el que se define.

Reglas
Contexto de declaración. Solo puede usar Static en variables locales. Esto significa que el contexto de
la declaración de una variable Static debe ser un procedimiento o un bloque en un procedimiento, y no
puede ser un archivo de código fuente, un espacio de nombres, una clase, una estructura o un módulo.
No se puede usar Static dentro de un procedimiento de estructura.
No se pueden inferir los tipos de datos de Static variables locales. Para obtener más información, vea
inferencia de tipo local.
Modificadores combinados. No se puede especificar Static junto con ReadOnly , Shadows o Shared
en la misma declaración.

Comportamiento
Cuando se declara una variable estática en un procedimiento Shared , solo hay una copia de la variable estática
disponible para toda la aplicación. Se llama a un procedimiento de Shared mediante el nombre de clase, no una
variable que apunta a una instancia de la clase.
Cuando se declara una variable estática en un procedimiento que no está Shared , solo hay una copia de la
variable disponible para cada instancia de la clase. Se llama a un procedimiento no compartido mediante una
variable que apunta a una instancia específica de la clase.

Ejemplo
El siguiente ejemplo muestra el uso de Static .

Function updateSales(ByVal thisSale As Decimal) As Decimal


Static totalSales As Decimal = 0
totalSales += thisSale
Return totalSales
End Function

La variable de Static totalSales se inicializa en 0 solo una vez. Cada vez que escriba updateSales , totalSales
seguirá teniendo el valor más reciente que calculó para él.
El modificador Static se puede usar en este contexto:
Dim (instrucción)

Vea también
Shadows
Shared
Duración en Visual Basic
Declaración de variables
Estructuras
Inferencia de tipo de variable local
Objetos y clases
Unicode (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica que Visual Basic debe serializar todas las cadenas en valores Unicode, independientemente del nombre
del procedimiento externo que se está declarando.
Cuando se llama a un procedimiento definido fuera del proyecto, el compilador Visual Basic no tiene acceso a la
información que debe tener para poder llamar al procedimiento correctamente. Esta información incluye dónde
se encuentra el procedimiento, cómo se identifica, su secuencia de llamada y tipo de valor devuelto, y el juego de
caracteres de cadena que usa. La instrucción Declare crea una referencia a un procedimiento externo y
proporciona esta información necesaria.
La parte charsetmodifier de la instrucción Declare proporciona la información del juego de caracteres para
calcular las referencias de las cadenas durante una llamada al procedimiento externo. También afecta al modo en
que Visual Basic busca el nombre del procedimiento externo en el archivo externo. El modificador Unicode
especifica que Visual Basic debe serializar todas las cadenas en valores Unicode y debe buscar el procedimiento
sin modificar su nombre durante la búsqueda.
Si no se especifica ningún modificador de juego de caracteres, Ansi es el valor predeterminado.

Comentarios
El modificador Unicode se puede usar en este contexto:
Declare (instrucción)

Notas para desarrolladores de Smart Device


Esta palabra clave no es compatible.

Vea también
Ansi
Auto
Palabras clave
Widening (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Indica que un operador de conversión ( CType ) convierte una clase o estructura en un tipo que puede contener
todos los valores posibles de la clase o estructura original.

Convertir con la palabra clave Widening


El procedimiento de conversión debe especificar Public Shared además de Widening .
Las conversiones de ampliación siempre se realizan correctamente en tiempo de ejecución y nunca provocan
pérdida de datos. Los ejemplos se Single para Double , Char a String y un tipo derivado a su tipo base. Esta
última conversión es ampliable porque el tipo derivado contiene todos los miembros del tipo base y, por tanto, es
una instancia del tipo base.
El código utilizado no tiene que utilizar CType para las conversiones de ampliación, aunque se On``Option Strict
.
La palabra clave Widening se puede usar en este contexto:
Operator Statement
Para obtener definiciones de ejemplo de operadores de conversión de ampliación y de restricción, vea Cómo:
definir un operador de conversión.

Vea también
Operator Statement
Narrowing
Conversiones de ampliación y de restricción
Definir un operador
Función CType
Option Strict (instrucción)
Definir un operador de conversión
WithEvents (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica que una o varias variables de miembro declaradas hacen referencia a una instancia de una clase que
puede generar eventos.

Comentarios
Cuando una variable se define utilizando WithEvents , puede especificar mediante declaración que un método
controla los eventos de la variable mediante la palabra clave Handles .
Solo se puede usar WithEvents en el nivel de clase o módulo. Esto significa que el contexto de la declaración de
una variable WithEvents debe ser una clase o módulo y no puede ser un archivo de código fuente, un espacio de
nombres, una estructura o un procedimiento.
No se puede usar WithEvents en un miembro de estructura.
Solo se pueden declarar variables individuales, no matrices, con WithEvents .

Reglas
Tipos de elemento. Debe declarar WithEvents variables como variables de objeto para que puedan aceptar
instancias de clase. Sin embargo, no puede declararlos como Object . Debe declararlos como la clase específica
que puede provocar los eventos.
El modificador WithEvents se puede usar en este contexto: instrucción Dim

Ejemplo
Dim WithEvents app As Application

Vea también
Handles
Palabras clave
Eventos
WriteOnly (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Especifica que una propiedad se puede escribir pero no leer.

Comentarios
Reglas
Contexto de declaración. Solo se puede usar WriteOnly en un nivel de módulo. Esto significa que el contexto
de la declaración de una propiedad WriteOnly debe ser una clase, una estructura o un módulo, y no puede ser un
archivo de código fuente, un espacio de nombres o un procedimiento.
Puede declarar una propiedad como WriteOnly , pero no una variable.

Cuándo usar WriteOnly


A veces, desea que el código de consumo pueda establecer un valor, pero no detectar lo que es. Por ejemplo, los
datos confidenciales, como un número de registro social o una contraseña, deben protegerse contra el acceso de
cualquier componente que no lo haya configurado. En estos casos, puede usar una propiedad WriteOnly para
establecer el valor.

IMPORTANT
Al definir y usar una propiedad WriteOnly , tenga en cuenta las siguientes medidas de protección adicionales:

Invalidar. Si la propiedad es un miembro de una clase, permita que el valor predeterminado sea
NotOverridabley no lo declare Overridable o MustOverride . Esto evita que una clase derivada realice un
acceso no deseado a través de una invalidación.
Nivel de acceso. Si contiene los datos confidenciales de la propiedad en una o varias variables, declárelo
para que ningún otro código pueda acceder a ellos.
Cifra. Almacene todos los datos confidenciales en formato cifrado en lugar de en texto sin formato. Si el
código malintencionado obtiene acceso de algún modo a esa área de memoria, es más difícil hacer uso de
los datos. El cifrado también es útil si es necesario serializar la información confidencial.
Restablecer. Cuando se termine la clase, estructura o módulo que define la propiedad, restablezca los
datos confidenciales a los valores predeterminados o a otros valores sin sentido. Esto proporciona
protección adicional cuando se libera ese área de memoria para el acceso general.
Persistence. No conserve los datos confidenciales, por ejemplo, en el disco, si puede evitarlo. Además, no
escriba datos confidenciales en el portapapeles.
El modificador WriteOnly se puede usar en este contexto:
Property (instrucción)

Vea también
ReadOnly
Private
Palabras clave
Módulos (Visual Basic)
05/12/2019 • 2 minutes to read • Edit Online

Visual Basic proporciona varios módulos que permiten simplificar las tareas comunes del código, como manipular
cadenas, realizar cálculos matemáticos, obtener información del sistema, realizar operaciones de archivos y
directorios, etc. En la tabla siguiente se enumeran los módulos proporcionados por Visual Basic.

Constants Contiene varias constantes. Estas constantes se pueden usar


en cualquier parte del código.

ControlChars Contiene caracteres de control constantes para imprimir y


mostrar texto.

Conversion Contiene miembros que convierten números decimales en


otras bases, números en cadenas, cadenas en números y un
tipo de datos en otro.

DateAndTime Contiene miembros que obtienen la fecha o la hora actual,


realizan cálculos de fecha, devuelven una fecha o una hora,
establecen la fecha o la hora, o la duración de un proceso.

ErrObject Contiene información sobre los errores y métodos en tiempo


de ejecución para generar o borrar un error.

FileSystem Contiene miembros que realizan operaciones de archivo,


directorio o carpeta y del sistema.

Financial Contiene procedimientos que se utilizan para realizar cálculos


financieros.

Globals Contiene información sobre la versión actual del motor de


scripting.

Information Contiene los miembros que devuelven, prueban o


comprueban información como el tamaño de la matriz, los
nombres de tipo, etc.

Interaction Contiene miembros que interactúan con objetos, aplicaciones


y sistemas.

Strings Contiene miembros que realizan operaciones de cadena, como


volver a dar formato a cadenas, buscar una cadena, obtener la
longitud de una cadena, etc.

VBMath Contiene miembros que realizan operaciones matemáticas.

Vea también
Referencia del lenguaje Visual Basic
Palabra clave Nothing (Visual Basic)
27/11/2019 • 7 minutes to read • Edit Online

Representa el valor predeterminado de cualquier tipo de datos. En el caso de los tipos de referencia, el valor
predeterminado es la referencia null . En el caso de los tipos de valor, el valor predeterminado depende de
si el tipo de valor admite valores NULL.

NOTE
En el caso de los tipos de valor que no aceptan valores NULL, Nothing en C#Visual Basic difiere de null en. En
Visual Basic, si establece una variable de un tipo de valor que no acepta valores NULL en Nothing , la variable se
establece en el valor predeterminado para su tipo declarado. En C#, si asigna una variable de un tipo de valor que no
acepta valores null a null , se producirá un error en tiempo de compilación.

Comentarios
Nothing representa el valor predeterminado de un tipo de datos. El valor predeterminado depende de si la
variable es de un tipo de valor o de un tipo de referencia.
Una variable de un tipo de valor contiene directamente su valor. Entre los tipos de valor se incluyen todos los
tipos de datos numéricos, Boolean , Char , Date , todas las estructuras y todas las enumeraciones. Una
variable de un tipo de referencia almacena una referencia a una instancia del objeto en memoria. Los tipos
de referencia incluyen clases, matrices, delegados y cadenas. Para obtener más información, consulta Value
Types and Reference Types.
Si una variable es de un tipo de valor, el comportamiento de Nothing depende de si la variable es de un tipo
de datos que acepta valores NULL. Para representar un tipo de valor que acepta valores NULL, agregue un
modificador ? al nombre de tipo. La asignación de Nothing a una variable que acepta valores NULL
establece el valor en null . Para obtener más información y ejemplos, vea tipos de valor que aceptan
valores NULL.
Si una variable es de un tipo de valor que no acepta valores NULL, si se asigna Nothing , se establece en el
valor predeterminado para su tipo declarado. Si ese tipo contiene miembros de variable, todos ellos se
establecen en sus valores predeterminados. En el ejemplo siguiente se muestra esto para los tipos escalares.
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

Si una variable es de un tipo de referencia, la asignación de Nothing a la variable la establece en una


referencia null del tipo de la variable. Una variable que se establece en una referencia null no está
asociada a ningún objeto. En el siguiente ejemplo se muestra esto:

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

Al comprobar si una variable de referencia (o tipo de valor que acepta valores NULL) está null , no use
= Nothing ni <> Nothing . Utilice siempre Is Nothing o IsNot Nothing .

En el caso de las cadenas de Visual Basic, la cadena vacía es igual a Nothing . Por lo tanto, "" = Nothing es
true.
En el ejemplo siguiente se muestran comparaciones que usan los operadores Is y IsNot :
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

Si declara una variable sin usar una cláusula As y la establece en Nothing , la variable tiene un tipo de
Object . Un ejemplo de esto es Dim something = Nothing . En este caso, se produce un error en tiempo de
compilación cuando Option Strict está activada y Option Infer está desactivada.
Cuando asigna Nothing a una variable de objeto, ya no hace referencia a ninguna instancia de objeto. Si la
variable anteriormente hacía referencia a una instancia, si se establece en Nothing no finaliza la propia
instancia. La instancia se termina y se liberan los recursos de memoria y del sistema asociados a ella, solo
después de que el recolector de elementos no utilizados (GC) detecte que no quedan referencias activas.
Nothing difiere del objeto DBNull, que representa una variante no inicializada o una columna de base de
datos inexistente.

Vea también
Dim (instrucción)
Duración de los objetos: cómo se crean y destruyen
Duración en Visual Basic
Is (operador)
IsNot (operador)
Tipos de valor que aceptan valores NULL
Objetos (Visual Basic)
05/12/2019 • 5 minutes to read • Edit Online

En este tema se proporcionan vínculos a otros temas en los que se describen los objetos en tiempo de ejecución
de Visual Basic y contienen tablas con sus procedimientos de miembro, propiedades y eventos.

Objetos en tiempo de ejecución de Visual Basic

Collection Proporciona una cómoda manera de ver un grupo de


elementos relacionado como un solo objeto.

Err Contiene información sobre los errores en tiempo de


ejecución.

El objeto My.Application consta de las clases siguientes: Proporciona datos asociados únicamente con la aplicación
actual o el archivo DLL. No se puede modificar la información
ApplicationBase proporciona miembros que están disponibles de nivel de sistema mediante My.Application .
en todos los proyectos.
Algunos miembros solo están disponibles para aplicaciones de
WindowsFormsApplicationBase proporciona miembros consola o de Windows Forms.
disponibles en aplicaciones de Windows Forms.

ConsoleApplicationBase proporciona miembros disponibles en


aplicaciones de consola.

My.Application.Info (Info) Proporciona propiedades para obtener información sobre una


la aplicación, como el número de versión, la descripción, los
ensamblados cargados, etc.

My.Application.Log (Log) Proporciona una propiedad y métodos para escribir


información de eventos y excepciones en los agentes de
escucha de registro de la aplicación.

My.Computer (Computer) Proporciona propiedades para manipular componentes del


equipo, como el audio, el reloj, el teclado, el sistema de
archivos, etc.

My.Computer.Audio (Audio) Proporciona métodos para reproducir sonidos.

My.Computer.Clipboard (Clipboard) Proporciona métodos para manipular el Portapapeles.

My.Computer.Clock (Clock) Proporciona propiedades para obtener acceso a la hora local


actual y al Horario universal coordinado (equivalente a la Hora
del meridiano de Greenwich) desde el reloj del sistema.

My.Computer.FileSystem (FileSystem) Proporciona propiedades y métodos para trabajar con


unidades, archivos y directorios.

My.Computer.FileSystem.SpecialDirectories Proporciona propiedades para obtener acceso a directorios a


(SpecialDirectories) los que suele hacerse referencia.
My.Computer.Info (ComputerInfo) Proporciona propiedades para obtener información sobre la
memoria, los ensamblados cargados, el nombre y el sistema
operativo del equipo.

My.Computer.Keyboard (Keyboard) Proporciona propiedades para obtener acceso al estado actual


del teclado, como las teclas que se han presionado, y
proporciona un método para enviar pulsaciones de teclas a la
ventana activa.

My.Computer.Mouse (Mouse) Proporciona propiedades para obtener información sobre el


formato y la configuración del mouse instalado en el equipo
local.

My.Computer.Network (Network) Proporciona una propiedad, un evento y métodos para


interactuar con la red a la que está conectado el equipo.

My.Computer.Ports (Ports) Proporciona una propiedad y un método para obtener acceso


a los puertos serie del equipo.

My.Computer.Registry (RegistryProxy) Proporciona propiedades y métodos para manipular el


Registro.

My.Forms (objeto) Proporciona propiedades para obtener acceso a una instancia


de cada formulario Windows Forms declarado en el proyecto
actual.

My.Log (AspLog) Proporciona una propiedad y métodos para escribir


información de eventos y excepciones en los agentes de
escucha de registro de la aplicación para aplicaciones web.

My.Request (objeto) Obtiene el objeto HttpRequest para la página solicitada.


Objeto My.Request que contiene información sobre la
solicitud HTTP actual.

El objeto My.Request solo está disponible para las


aplicaciones ASP.NET.

My.Resources (objeto) Proporciona propiedades y clases para obtener acceso a los


recursos de una aplicación.

My.Response (objeto) Obtiene el objeto HttpResponse asociado al Page. Este objeto


permite enviar datos de respuesta HTTP a un cliente y
contiene información sobre esa respuesta.

El objeto My.Response solo está disponible para las


aplicaciones ASP.NET.

My.Settings (objeto) Proporciona propiedades y métodos para obtener acceso a la


configuración de una aplicación.

My.User (User) Proporciona acceso a información sobre el usuario actual.

My.WebServices (objeto) Proporciona propiedades para crear y obtener acceso a una


sola instancia de cada servicio web al que hace referencia el
proyecto actual.
TextFieldParser Proporciona los métodos y propiedades para analizar archivos
de texto estructurados.

Vea también
Referencia del lenguaje Visual Basic
My.Application (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona propiedades, métodos y eventos relacionados con la aplicación actual.

Comentarios
Para obtener información sobre los métodos y las propiedades del objeto My.Application , vea los siguientes
recursos:
ApplicationBase para los miembros que están disponibles en todos los proyectos.
WindowsFormsApplicationBase para los miembros que están disponibles en las aplicaciones de Windows
Forms.
ConsoleApplicationBase para los miembros que están disponibles en las aplicaciones de consola.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.ApplicationServices
Clase: WindowsFormsApplicationBase (la clase base ConsoleApplicationBase proporciona miembros disponibles
en las aplicaciones de consola y su clase base ApplicationBase proporciona los miembros que están disponibles en
todos los proyectos).
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
My.Application.Info (objeto)
My.Application.Log (objeto)
My.Application.Info (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona propiedades para obtener información sobre la aplicación, como el número de versión, la descripción,
los ensamblados cargados, etc.

Comentarios
Para obtener información acerca de los métodos y las propiedades del objeto My.Application.Info , vea
AssemblyInfo.

NOTE
Puede utilizar las propiedades de la clase System.Diagnostics.FileVersionInfo para obtener información acerca de un archivo
en disco.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.ApplicationServices
Clase: AssemblyInfo
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
My.Application (objeto)
My.Application.Log (objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona una propiedad y métodos para escribir información de eventos y excepciones en los agentes de
escucha de registro de la aplicación.

Comentarios
Para obtener información acerca de los métodos y las propiedades del objeto My.Application.Log , vea Log.
Para obtener más información, consulte registrar información desde la aplicación.

NOTE
También puede usar clases de .NET Framework para registrar información desde la aplicación. Para obtener más información,
consulta Tracing and Instrumenting Applications.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.Logging
Clase: Log
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
My.Application (objeto)
My.Computer (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona propiedades para manipular componentes del equipo, como el audio, el reloj, el teclado, el sistema
de archivos, etc.

Comentarios
Para obtener información acerca de los métodos y las propiedades del objeto My.Computer , vea Computer. La
clase base ServerComputer proporciona los miembros que están disponibles en todos los proyectos.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.Devices
Clase: Computer (la clase base ServerComputer proporciona los miembros que están disponibles en todos los
proyectos).
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
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 (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona métodos para reproducir sonidos.

Comentarios
Para obtener información acerca de los métodos y las propiedades del objeto My.Computer.Audio , vea Audio.
Para obtener más información, vea reproducir sonidos.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.Devices
Clase: Audio
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
My.Computer (objeto)
My.Computer.Clipboard (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona métodos para manipular el Portapapeles.

Comentarios
Para obtener información acerca de los métodos y las propiedades del objeto My.Computer.Clipboard , vea
ClipboardProxy.
Para obtener más información, vea almacenar y leer datos en el portapapeles.

NOTE
También puede usar métodos de la clase System.Windows.Forms.Clipboard para manipular el portapapeles.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.MyServices
Clase: ClipboardProxy (proporciona acceso a Clipboard)
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
Clipboard
My.Computer (objeto)
My.Computer.Clock (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona propiedades para obtener acceso a la hora local actual y al Horario universal coordinado (equivalente
a la Hora del meridiano de Greenwich) desde el reloj del sistema.

Comentarios
Para obtener información acerca de los métodos y las propiedades del objeto My.Computer.Clock , vea Clock.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.Devices
Clase: Clock
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
My.Computer (objeto)
My.Computer.FileSystem (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona propiedades y métodos para trabajar con unidades, archivos y directorios.

Comentarios
Para obtener información acerca de los métodos y las propiedades del objeto My.Computer.FileSystem , vea
FileSystem.
Para obtener más información, vea acceso a archivos con Visual Basic.

NOTE
También puede utilizar las clases del espacio de nombres System.IO para trabajar con unidades, archivos y directorios.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.MyServices
Clase: FileSystemProxy (proporciona acceso a FileSystem)
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
My.Computer.FileSystem.SpecialDirectories (objeto)
My.Computer (objeto)
My.Computer.FileSystem.SpecialDirectories (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona propiedades para obtener acceso a directorios a los que suele hacerse referencia.

Comentarios
Para obtener información acerca de los métodos y las propiedades del objeto
My.Computer.FileSystem.SpecialDirectories , vea SpecialDirectories.

Para obtener más información, consulte Cómo: recuperar el contenido del directorio mis documentos.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.MyServices
Clase: SpecialDirectoriesProxy (proporciona acceso a SpecialDirectories)
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
My.Computer.FileSystem (objeto)
My.Computer (objeto)
My.Computer.Info (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona propiedades para obtener información sobre la memoria, los ensamblados cargados, el nombre y el
sistema operativo del equipo.

Comentarios
Para obtener información sobre las propiedades del objeto My.Computer.Info , vea ComputerInfo.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.Devices
Clase: ComputerInfo
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
My.Computer (objeto)
My.Computer.Keyboard (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona propiedades para obtener acceso al estado actual del teclado, como las teclas que se han presionado,
y proporciona un método para enviar pulsaciones de teclas a la ventana activa.

Comentarios
Para obtener información acerca de los métodos y las propiedades del objeto My.Computer.Keyword , vea Keyboard.
Para más información, consulte Acceso al teclado.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.Devices
Clase: Keyboard
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
My.Computer (objeto)
My.Computer.Mouse (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona propiedades para obtener información sobre el formato y la configuración del mouse instalado en el
equipo local.

Comentarios
Para obtener información acerca de los métodos y las propiedades del objeto My.Computer.Mouse , vea Mouse.
Para obtener más información, vea acceso al mouse.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.Devices
Clase: Mouse
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
My.Computer (objeto)
My.Computer.Network (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona una propiedad, un evento y métodos para interactuar con la red a la que está conectado el equipo.

Comentarios
Para obtener información acerca de los métodos y las propiedades del objeto My.Computer.Network , vea Network.
Para obtener más información, vea realizar operaciones de red.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.Devices
Clase: Network
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
My.Computer (objeto)
My.Computer.Ports (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona una propiedad y un método para obtener acceso a los puertos serie del equipo.

Comentarios
Para obtener información acerca de los métodos y las propiedades del objeto My.Computer.Ports , vea Ports.
Para obtener más información, consulte acceso a los puertos del equipo.

NOTE
También puede utilizar las propiedades y los métodos de la clase System.IO.Ports.SerialPort para tener acceso a los puertos
serie del equipo.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.Devices
Clase: Ports
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
My.Computer (objeto)
My.Computer.Registry (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona propiedades y métodos para manipular el Registro.

Comentarios
Para obtener información acerca de los métodos y las propiedades del objeto My.Computer.Registry , vea
RegistryProxy.
Para obtener más información, vea leer y escribir en el registro.

NOTE
También puede manipular el registro mediante métodos de la clase Microsoft.Win32.Registry.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.MyServices
Clase: RegistryProxy (proporciona acceso a Registry)
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
My.Computer (objeto)
My.Forms (Objeto)
27/11/2019 • 5 minutes to read • Edit Online

Proporciona propiedades para obtener acceso a una instancia de cada Windows Forms declarado en el proyecto
actual.

Comentarios
El objeto My.Forms proporciona una instancia de cada formulario en el proyecto actual. El nombre de la
propiedad es el mismo que el nombre del formulario al que tiene acceso la propiedad.
Puede tener acceso a los formularios proporcionados por el objeto My.Forms utilizando el nombre del
formulario, sin calificación. Dado que el nombre de la propiedad es el mismo que el nombre de tipo del
formulario, esto le permite tener acceso a un formulario como si tuviera una instancia predeterminada. Por
ejemplo, My.Forms.Form1.Show es equivalente a Form1.Show .
El objeto My.Forms expone solo los formularios asociados al proyecto actual. No proporciona acceso a los
formularios declarados en los archivos DLL a los que se hace referencia. Para tener acceso a un formulario que
proporciona un archivo DLL, debe usar el nombre completo del formulario, escrito como DllName.
Nombreformulario.
Puede usar la propiedad OpenForms para obtener una colección de todos los formularios abiertos de la
aplicación.
El objeto y sus propiedades solo están disponibles para las aplicaciones de Windows.

Propiedades
Cada propiedad del objeto My.Forms proporciona acceso a una instancia de un formulario en el proyecto actual.
El nombre de la propiedad es el mismo que el nombre del formulario al que tiene acceso la propiedad y el tipo
de propiedad es el mismo que el tipo del formulario.

NOTE
Si hay un conflicto de nombres, el nombre de la propiedad para tener acceso a un formulario es
RootNamespacenamespace_formName. Por ejemplo, considere dos formularios denominados Form1. si uno de estos
formularios está en el espacio de nombres raíz WindowsApplication1 y en el espacio de nombres Namespace1 , tendría
acceso a ese formulario a través de My.Forms.WindowsApplication1_Namespace1_Form1 .

El objeto My.Forms proporciona acceso a la instancia del formulario principal de la aplicación que se creó en el
inicio. En el caso de todos los demás formularios, el objeto My.Forms crea una instancia nueva del formulario
cuando se tiene acceso a ella y la almacena. Los intentos posteriores de obtener acceso a esa propiedad
devuelven esa instancia del formulario.
Puede desechar un formulario asignando Nothing a la propiedad de ese formulario. El establecedor de
propiedad llama al método Close del formulario y, a continuación, asigna Nothing al valor almacenado. Si
asigna un valor distinto de Nothing a la propiedad, el establecedor produce una excepción de
ArgumentException.
Puede comprobar si una propiedad del objeto My.Forms almacena una instancia del formulario mediante el
operador Is o IsNot . Puede utilizar esos operadores para comprobar si el valor de la propiedad es Nothing .
NOTE
Normalmente, el operador Is o IsNot tiene que leer el valor de la propiedad para realizar la comparación. Sin
embargo, si la propiedad almacena actualmente Nothing , la propiedad crea una nueva instancia del formulario y, a
continuación, devuelve esa instancia. Sin embargo, el compilador Visual Basic trata las propiedades del objeto My.Forms
de forma diferente y permite que el operador Is o IsNot Compruebe el estado de la propiedad sin modificar su valor.

Ejemplo
En este ejemplo se cambia el título del formulario SidebarMenu predeterminado.

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 ejemplo funcione, el proyecto debe tener un formulario denominado SidebarMenu .
Este código solo funcionará en un proyecto de aplicación de Windows.

Requisitos
Disponibilidad por tipo de proyecto
T IP O DE P RO Y EC TO DISP O N IB L E

Aplicación de Windows Sí

Biblioteca de clases No

Aplicación de consola No

Biblioteca de controles de Windows No

Biblioteca de controles Web No

Servicio de Windows No

Sitio web No

Vea también
OpenForms
Form
Close
Objects
Is (operador)
IsNot (operador)
Acceso ad los formularios de la aplicación
My.Log (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona una propiedad y métodos para escribir información de eventos y excepciones en los agentes de
escucha de registro de la aplicación.

Comentarios
Para obtener información acerca de los métodos y las propiedades del objeto My.Log , vea AspLog.
El objeto My.Log solo está disponible para las aplicaciones de ASP.NET. En el caso de las aplicaciones cliente, use el
objeto My. Application. log.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.Logging
Clase: AspLog
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)
My.Request (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Obtiene el objeto HttpRequest para la página solicitada.

Comentarios
Objeto My.Request que contiene información sobre la solicitud HTTP actual.
El objeto My.Request solo está disponible para las aplicaciones ASP.NET.

Ejemplo
En el ejemplo siguiente se obtiene la colección de encabezados del objeto My.Request y se usa el objeto
My.Response para escribirlo en la página ASP.NET.

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

Vea también
HttpRequest
My.Response (objeto)
My.Response (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Obtiene el objeto de HttpResponse asociado al Page. Este objeto permite enviar datos de respuesta HTTP a un
cliente y contiene información sobre esa respuesta.

Comentarios
El objeto My.Response contiene el objeto HttpResponse actual asociado a la página.
El objeto My.Response solo está disponible para las aplicaciones ASP.NET.

Ejemplo
En el ejemplo siguiente se obtiene la colección de encabezados del objeto My.Request y se usa el objeto
My.Response para escribirlo en la página ASP.NET.

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

Vea también
HttpResponse
My.Request (objeto)
My.Resources (Objeto)
27/11/2019 • 6 minutes to read • Edit Online

Proporciona propiedades y clases para tener acceso a los recursos de la aplicación.

Comentarios
El objeto My.Resources proporciona acceso a los recursos de la aplicación y permite recuperar dinámicamente los
recursos de la aplicación. Para obtener más información, vea administrar recursos de aplicación (.net).
El objeto My.Resources expone solo recursos globales. No proporciona acceso a los archivos de recursos
asociados a los formularios. Debe tener acceso a los recursos de formulario desde el formulario.
Puede tener acceso a los archivos de recursos específicos de la referencia cultural de la aplicación desde el objeto
My.Resources . De forma predeterminada, el objeto My.Resources busca recursos del archivo de recursos que
coincida con la referencia cultural de la propiedad UICulture. Sin embargo, puede invalidar este comportamiento y
especificar una referencia cultural determinada que se usará para los recursos. Para obtener más información, vea
Resources in Desktop Apps (Recursos de aplicaciones de escritorio).

Propiedades
Las propiedades del objeto My.Resources proporcionan acceso de solo lectura a los recursos de la aplicación. Para
agregar o quitar recursos, use el Diseñador de proyectos . Puede tener acceso a los recursos agregados a través
del Diseñador de proyectos mediante My.Resources. resourceName.
También puede Agregar o quitar archivos de recursos seleccionando el proyecto en Explorador de soluciones y
haciendo clic en Agregar nuevo elemento o Agregar elemento existente en el menú proyecto . Puede
tener acceso a los recursos agregados de esta manera mediante My.Resources. nombrearchivorecursos .
resourceName.
Cada recurso tiene un nombre, una categoría y un valor, y esta configuración de recursos determina el modo en
que la propiedad para tener acceso al recurso aparece en el objeto de My.Resources . Para los recursos agregados
en el Diseñador de proyectos :
El nombre determina el nombre de la propiedad.
Los datos del recurso son el valor de la propiedad.
La categoría determina el tipo de la propiedad:

C AT EGO RÍA T IP O DE DATO S DE P RO P IEDA D

Cadenas String

Imágenes Bitmap

Iconos Icon
C AT EGO RÍA T IP O DE DATO S DE P RO P IEDA D

Audio UnmanagedMemoryStream

La clase UnmanagedMemoryStream se deriva de la clase


Stream, por lo que se puede utilizar con métodos que toman
secuencias, como el método Play.

Archivos - cadena para los archivos de texto.


- Bitmap para archivos de imagen.
- Icon para los archivos de icono.
- UnmanagedMemoryStream para archivos de sonido.

Otros problemas Lo determina la información de la columna de tipo del


diseñador.

Clases
El objeto My.Resources expone cada archivo de recursos como una clase con propiedades compartidas. El nombre
de clase es el mismo que el nombre del archivo de recursos. Como se describe en la sección anterior, los recursos
de un archivo de recursos se exponen como propiedades en la clase.

Ejemplo
En este ejemplo se establece el título de un formulario en el recurso de cadena denominado Form1Title en el
archivo de recursos de la aplicación. Para que el ejemplo funcione, la aplicación debe tener una cadena
denominada Form1Title en su archivo de recursos.

Sub SetFormTitle()
Me.Text = My.Resources.Form1Title
End Sub

Ejemplo
En este ejemplo se establece el icono del formulario en el icono denominado Form1Icon que se almacena en el
archivo de recursos de la aplicación. Para que el ejemplo funcione, la aplicación debe tener un icono denominado
Form1Icon en su archivo de recursos.

Sub SetFormIcon()
Me.Icon = My.Resources.Form1Icon
End Sub

Ejemplo
En este ejemplo se establece la imagen de fondo de un formulario en el recurso de imagen denominado
Form1Background , que se encuentra en el archivo de recursos de la aplicación. Para que este ejemplo funcione, la
aplicación debe tener un recurso de imagen denominado Form1Background en su archivo de recursos.

Sub SetFormBackgroundImage()
Me.BackgroundImage = My.Resources.Form1Background
End Sub
Ejemplo
En este ejemplo se reproduce el sonido que se almacena como un recurso de audio denominado Form1Greeting
en el archivo de recursos de la aplicación. Para que el ejemplo funcione, la aplicación debe tener un recurso de
audio denominado Form1Greeting en su archivo de recursos. El método My.Computer.Audio.Play solo está
disponible para aplicaciones de Windows Forms.

Sub PlayFormGreeting()
My.Computer.Audio.Play(My.Resources.Form1Greeting,
AudioPlayMode.Background)
End Sub

Ejemplo
En este ejemplo se recupera la versión de la referencia cultural francesa de un recurso de cadena de la aplicación.
El recurso se denomina Message . Para cambiar la referencia cultural que utiliza el objeto de My.Resources , en el
ejemplo se usa ChangeUICulture.
Para que este ejemplo funcione, la aplicación debe tener una cadena denominada Message en su archivo de
recursos y la aplicación debe tener la versión de referencia cultural en francés de ese archivo de recursos,
Resources.fr-FR. resx. Si la aplicación no tiene la versión de referencia cultural en francés del archivo de recursos,
el objeto My.Resource recupera el recurso del archivo de recursos de referencia cultural predeterminada.

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

Vea también
Administrar los recursos de la aplicación (.NET)
Recursos de aplicaciones de escritorio
My.Settings (Objeto)
27/11/2019 • 3 minutes to read • Edit Online

Proporciona propiedades y métodos para tener acceso a la configuración de la aplicación.

Comentarios
El objeto My.Settings proporciona acceso a la configuración de la aplicación y permite almacenar y recuperar
dinámicamente la configuración de propiedades y otra información de la aplicación. Para obtener más
información, vea Administrar la configuración de la aplicación (.NET).

Propiedades
Las propiedades del objeto My.Settings proporcionan acceso a la configuración de la aplicación. Para agregar o
quitar la configuración, use el Diseñador de configuración .
Cada configuración tiene un nombre , tipo , ámbito y valor , y esta configuración determina cómo aparece la
propiedad para tener acceso a cada configuración en el My.Settings objeto:
Nombre determina el nombre de la propiedad.
Tipo determina el tipo de la propiedad.
El ámbito indica si la propiedad es de solo lectura. Si el valor es Application , la propiedad es de solo
lectura; Si el valor es User , la propiedad es de lectura y escritura.
Value es el valor predeterminado de la propiedad.

Métodos
M ÉTO DO DESC RIP C IÓ N

Reload Vuelve a cargar la configuración de usuario de los últimos


valores guardados.

Save Guarda la configuración del usuario actual.

El objeto My.Settings también proporciona propiedades y métodos avanzados, heredados de la clase


ApplicationSettingsBase.

Tareas
En la tabla siguiente se muestran ejemplos de tareas que implican el My.Settings objeto.

PA RA C O N SULT E

Leer una configuración de la aplicación Cómo: Leer la configuración de la aplicación en Visual Basic

Cambiar la configuración de un usuario Cómo: Cambiar la configuración del usuario en Visual Basic

Conservar la configuración de usuario Cómo: Conservar la configuración del usuario en Visual Basic
PA RA C O N SULT E

Crear una cuadrícula de propiedades para la configuración del Cómo: Crear cuadrículas de propiedades para la configuración
usuario del usuario en Visual Basic

Ejemplo
En este ejemplo se muestra el valor de la configuración Nickname .

Sub ShowNickname()
MsgBox("Nickname is " & My.Settings.Nickname)
End Sub

Para que este ejemplo funcione, la aplicación debe tener una configuración Nickname de tipo String .

Vea también
ApplicationSettingsBase
Cómo: Leer la configuración de la aplicación en Visual Basic
Cómo: Cambiar la configuración del usuario en Visual Basic
Cómo: Conservar la configuración del usuario en Visual Basic
Cómo: Crear cuadrículas de propiedades para la configuración del usuario en Visual Basic
Administrar la configuración de la aplicación (.NET)
My.User (Objeto)
27/11/2019 • 2 minutes to read • Edit Online

Proporciona acceso a información sobre el usuario actual.

Comentarios
Para obtener información acerca de los métodos y las propiedades del objeto My.User , vea
Microsoft.VisualBasic.ApplicationServices.User.
Para obtener más información, consulte acceso a los datos de usuario.

Requisitos
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
IPrincipal
CurrentPrincipal
User
Current
My.WebServices (Objeto)
27/11/2019 • 5 minutes to read • Edit Online

Proporciona propiedades para crear y obtener acceso a una sola instancia de cada servicio Web XML al que hace
referencia el proyecto actual.

Comentarios
El objeto My.WebServices proporciona una instancia de cada servicio Web al que hace referencia el proyecto
actual. Cada una de las instancias se crea a petición. Puede tener acceso a estos servicios Web a través de las
propiedades del objeto My.WebServices . El nombre de la propiedad es igual que el nombre del servicio Web al
que tiene acceso la propiedad. Cualquier clase que hereda de SoapHttpClientProtocol es un servicio web. Para
obtener información sobre cómo agregar servicios web a un proyecto, consulte acceso a servicios Web de
aplicaciones.
El objeto My.WebServices expone solo los servicios web asociados al proyecto actual. No proporciona acceso a
los servicios Web declarados en los archivos DLL a los que se hace referencia. Para tener acceso a un servicio
Web que proporciona un archivo DLL, debe usar el nombre completo del servicio Web, con el formato DllName.
WebServiceName. Para obtener más información, vea acceso a servicios Web de aplicaciones.
El objeto y sus propiedades no están disponibles para las aplicaciones Web.

Propiedades
Cada propiedad del objeto My.WebServices proporciona acceso a una instancia de un servicio Web al que hace
referencia el proyecto actual. El nombre de la propiedad es el mismo que el nombre del servicio Web al que
tiene acceso la propiedad y el tipo de propiedad es el mismo que el tipo del servicio Web.

NOTE
Si hay un conflicto de nombres, el nombre de la propiedad para tener acceso a un servicio web es
RootNamespacenamespace_ServiceName. Por ejemplo, considere dos servicios web denominados Service1 . Si uno de
estos servicios está en el espacio de nombres raíz WindowsApplication1 y en el espacio de nombres Namespace1 ,
tendría acceso a ese servicio mediante My.WebServices.WindowsApplication1_Namespace1_Service1 .

La primera vez que se tiene acceso a una de las propiedades del objeto de My.WebServices , se crea una nueva
instancia del servicio Web y se almacena. Los accesos posteriores de esa propiedad devuelven esa instancia del
servicio Web.
Puede eliminar un servicio Web asignando Nothing a la propiedad de ese servicio Web. El establecedor de
propiedad asigna Nothing al valor almacenado. Si asigna un valor distinto de Nothing a la propiedad, el
establecedor produce una excepción de ArgumentException.
Puede comprobar si una propiedad del objeto My.WebServices almacena una instancia del servicio Web
mediante el operador Is o IsNot . Puede utilizar esos operadores para comprobar si el valor de la propiedad
es Nothing .
NOTE
Normalmente, el operador Is o IsNot tiene que leer el valor de la propiedad para realizar la comparación. Sin
embargo, si la propiedad almacena actualmente Nothing , la propiedad crea una nueva instancia del servicio Web y, a
continuación, devuelve esa instancia. Sin embargo, el compilador Visual Basic trata las propiedades del objeto
My.WebServices de forma especial y permite que el operador Is o IsNot Compruebe el estado de la propiedad sin
modificar su valor.

Ejemplo
En este ejemplo se llama al método FahrenheitToCelsius del servicio Web XML TemperatureConverter y se
devuelve el resultado.

Function ConvertFromFahrenheitToCelsius(
ByVal dFahrenheit As Double) As Double

Return My.WebServices.TemperatureConverter.FahrenheitToCelsius(dFahrenheit)
End Function

Para que este ejemplo funcione, el proyecto debe hacer referencia a un servicio Web denominado Converter y
ese servicio Web debe exponer el método ConvertTemperature . Para obtener más información, vea acceso a
servicios Web de aplicaciones.
Este código no funciona en un proyecto de aplicación Web.

Requisitos
Disponibilidad por tipo de proyecto
T IP O DE P RO Y EC TO DISP O N IB L E

Aplicación de Windows Sí

Biblioteca de clases Sí

Aplicación de consola Sí

Biblioteca de controles de Windows Sí

Biblioteca de controles Web Sí

Servicio de Windows Sí

Sitio web No

Vea también
SoapHttpClientProtocol
ArgumentException
Acceso a los servicios web de la aplicación
TextFieldParser Object
27/11/2019 • 2 minutes to read • Edit Online

Proporciona los métodos y propiedades para analizar archivos de texto estructurados.

Sintaxis
Public Class TextFieldParser

Comentarios
Para obtener información acerca de los métodos y las propiedades del objeto TextFieldParser , vea TextFieldParser.
Para obtener más información, vea leer desde archivos.

Requisitos
Espacio de nombres: Microsoft.VisualBasic.FileIO
Clase: TextFieldParser
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)
Operadores (Visual Basic)
05/12/2019 • 2 minutes to read • Edit Online

En esta sección
Precedencia de operadores en Visual Basic
Operadores enumerados por funcionalidad
Tipos de datos de resultados de operador
DirectCast (operador)
TryCast (operador)
Operador Name
Nuevo operador
Operadores condicionales null
Operadores aritméticos
Operadores de asignación
Operadores de desplazamiento de bits
Operadores de comparación
Operadores de concatenación
Operadores lógicos y bit a bit
Operadores varios

Secciones relacionadas
Referencia del lenguaje Visual Basic
Prioridad de operador en Visual Basic
27/11/2019 • 5 minutes to read • Edit Online

Cuando se producen varias operaciones en una expresión, cada parte se evalúa y se resuelve en un orden
predeterminado denominado precedencia de operadores.

Reglas de precedencia
Cuando las expresiones contienen operadores de más de una categoría, se evalúan según las reglas
siguientes:
Los operadores aritméticos y de concatenación tienen el orden de prioridad que se describe en la
sección siguiente y todos tienen mayor prioridad que los operadores de comparación, lógicos y bit a
bit.
Todos los operadores de comparación tienen la misma prioridad y todos tienen mayor prioridad que
los operadores lógicos y bit a bit, pero tienen menor prioridad que los operadores aritméticos y de
concatenación.
Los operadores lógicos y bit a bit tienen el orden de prioridad que se describe en la sección siguiente y
todos tienen menor prioridad que los operadores aritméticos, de concatenación y de comparación.
Los operadores con la misma prioridad se evalúan de izquierda a derecha en el orden en que aparecen
en la expresión.

Orden de prioridad
Los operadores se evalúan en el orden de prioridad siguiente:
Await (Operador)
Operador
Operadores aritméticos y de concatenación
Exponenciación ( ^ )
Identidad unaria y negación ( + , – )
Multiplicación y división de punto flotante ( * , / )
División de enteros ( \ )
Aritmética modular ( Mod )
Suma y resta ( + , – )
Concatenación de cadenas ( & )
Desplazamiento de bits aritmético ( << , >> )
Operadores de comparación
Todos los operadores de comparación ( = , <> , < , <= , > , >= , Is , IsNot , Like``TypeOf ... Is )
Operadores lógicos y bit a bit
Negación ( Not )
Conjunción ( And , AndAlso )
Disyunción inclusiva ( Or , OrElse )
Disyunción exclusiva ( Xor )
Comentarios
El operador = es solo el operador de comparación de igualdad, no el operador de asignación.
El operador de concatenación de cadenas ( & ) no es un operador aritmético, pero en su precedencia está
agrupado con los operadores aritméticos.
Los operadores Is y IsNot son operadores de comparación de referencia de objeto. No comparan los
valores de dos objetos; solo comprueban si dos variables de objeto hacen referencia a la misma instancia de
objeto.

asociatividad
Cuando los operadores de igual precedencia aparecen juntos en una expresión, por ejemplo multiplicación y
división, el compilador evalúa cada operación a medida que la encuentra de izquierda a derecha. En el
ejemplo siguiente se ilustra esto.

Dim n1 As Integer = 96 / 8 / 4
Dim n2 As Integer = (96 / 8) / 4
Dim n3 As Integer = 96 / (8 / 4)

La primera expresión evalúa la división 96/8 (que da como resultado 12) y, a continuación, la división 12/4,
que da como resultado tres. Dado que el compilador evalúa las operaciones para n1 de izquierda a derecha,
la evaluación es la misma cuando ese orden se indica explícitamente para n2 . Tanto n1 como n2 tienen el
resultado de tres. Por el contrario, n3 tiene un resultado de 48, porque los paréntesis obligan al compilador a
evaluar 8/4 primero.
Debido a este comportamiento, se dice que los operadores son asociativos a la izquierda en Visual Basic.

Reemplazar precedencia y asociatividad


Puede usar paréntesis para forzar que se evalúen algunas partes de una expresión antes que otras. Esto
puede invalidar el orden de prioridad y la asociatividad izquierda. Visual Basic siempre realiza las operaciones
que se incluyen entre paréntesis antes de las externas. Sin embargo, entre paréntesis, mantiene la prioridad y
la asociatividad ordinarias, a menos que use paréntesis dentro de los paréntesis. En el ejemplo siguiente se
ilustra esto.

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.
Vea también
Operador =
Is (operador)
IsNot (operador)
Like (operador)
TypeOf (operador)
Await (operador)
Operadores enumerados por funcionalidad
Operadores y expresiones
Tipos de datos de resultados de operador (Visual
Basic)
27/11/2019 • 16 minutes to read • Edit Online

Visual Basic determina el tipo de datos de resultado de una operación en función de los tipos de datos de los
operandos. En algunos casos, podría tratarse de un tipo de datos con un intervalo mayor que el de uno de los
operandos.

Intervalos de tipo de datos


Los intervalos de los tipos de datos pertinentes, en orden de menor a mayor, son los siguientes:
Booleano : dos valores posibles
SByte, byte : 256 posibles valores integrales
Short, ushort : 65.536 (6.5... E + 4) posibles valores integrales
Entero, UInteger : 4.294.967.296 (4.2... E + 9) posibles valores integrales
Long, ULong : 18446744073709551615 (1.8... E + 19) posibles valores integrales
Decimal : 1,5... e + 29 posibles valores integrales, intervalo máximo de 7,9... e + 28 (valor absoluto)
Único : intervalo máximo 3.4... E + 38 (valor absoluto)
Double : intervalo máximo 1.7... E + 308 (valor absoluto)
Para obtener más información sobre los tipos de datos de Visual Basic, vea tipos de datos.
Si un operando se evalúa como Nothing, los operadores aritméticos Visual Basic lo consideran como cero.

Aritmética decimal
Tenga en cuenta que el tipo de datos decimal no es ningún punto flotante ni entero.
Si uno de los operandos de una + , – , * , / o Mod es Decimal y el otro no Single o Double , Visual Basic
amplía el otro operando a Decimal . Realiza la operación en Decimal y el tipo de datos del resultado es Decimal .

Aritmética de punto flotante


Visual Basic realiza la mayoría de la aritmética de punto flotante en Double, que es el tipo de datos más eficaz
para dichas operaciones. Sin embargo, si un operando es único y el otro no se Double , Visual Basic realiza la
operación en Single . Amplía cada operando según sea necesario para el tipo de datos adecuado antes de la
operación y el resultado tiene ese tipo de datos.
Operadores/y ^
El operador / solo está definido para los tipos de datos decimal, Singley Double . Visual Basic amplía cada
operando según sea necesario para el tipo de datos adecuado antes de la operación y el resultado tiene ese tipo
de datos.
En la tabla siguiente se muestran los tipos de datos de resultados del operador / . Tenga en cuenta que esta
tabla es simétrica; para una combinación determinada de tipos de datos de operando, el tipo de datos del
resultado es el mismo, independientemente del orden de los operandos.

Decimal Single Double Cualquier tipo entero

Decimal Decimal único Doble Decimal

Single único único Doble único

Double Doble Doble Doble Doble

Cualquier tipo entero Decimal único Doble Doble

El operador ^ solo se define para el tipo de datos Double . Visual Basic amplía cada operando según sea
necesario para Double antes de la operación, y el tipo de datos del resultado siempre es Double .

Aritmética de enteros
El tipo de datos de resultado de una operación de entero depende de los tipos de datos de los operandos. En
general, Visual Basic usa las siguientes directivas para determinar el tipo de datos del resultado:
Si ambos operandos de un operador binario tienen el mismo tipo de datos, el resultado tiene ese tipo de
datos. Una excepción es Boolean , que se fuerza a Short .
Si un operando sin signo participa con un operando firmado, el resultado tiene un tipo con signo, al
menos tan grande como un intervalo.
De lo contrario, el resultado normalmente tiene el mayor de los dos tipos de datos de operando.
Tenga en cuenta que el tipo de datos del resultado podría no ser el mismo que el tipo de datos del operando.

NOTE
El tipo de datos del resultado no es siempre lo suficientemente grande como para contener todos los valores posibles
resultantes de la operación. Se puede producir una excepción OverflowException si el valor es demasiado grande para el
tipo de datos del resultado.

Operadores unarios + y –
En la tabla siguiente se muestran los tipos de datos de resultados de los dos operadores unarios, + y – .

Boolean SByte Byte Short UShort Integer UInteger Long ULong

+ Short SByte Byte Short UShort Entero UIntege Long ULong


unario r

– Short SByte Short Short Entero Entero Long Long Decimal


unario

Operadores << y > >


En la tabla siguiente se muestran los tipos de datos de resultados de los dos operadores de desplazamiento de
bits, << y >> . Visual Basic trata cada operador de desplazamiento de bits como un operador unario en su
operando izquierdo (el patrón de bits que se va a desplazar).
Boolean SByte Byte Short UShort Integer UInteger Long ULong

<< , Short SByte Byte Short UShort Entero UIntege Long ULong
>> r

Si el operando izquierdo es Decimal , Single , Double o String , Visual Basic intenta convertirlo en Long antes
de la operación y el tipo de datos del resultado es Long . El operando derecho (el número de posiciones de bits
que se va a desplazar) debe ser Integer o un tipo que se amplíe a Integer .
Operadores binarios +, –, *y mod
En la tabla siguiente se muestran los tipos de datos de resultado de los operadores + y – binarios y los
operadores * y Mod . Tenga en cuenta que esta tabla es simétrica; para una combinación determinada de tipos
de datos de operando, el tipo de datos del resultado es el mismo, independientemente del orden de los
operandos.

Boolean SByte Byte Short UShort Integer UInteger Long ULong

Boolean Short SByte Short Short Entero Entero Long Long Decimal

SByte SByte SByte Short Short Entero Entero Long Long Decimal

Byte Short Short Byte Short UShort Entero UIntege Long ULong
r

Short Short Short Short Short Entero Entero Long Long Decimal

UShort Entero Entero UShort Entero UShort Entero UIntege Long ULong
r

Integer Entero Entero Entero Entero Entero Entero Long Long Decimal

UInteger Long Long UIntege Long UIntege Long UIntege Long ULong
r r r

Long Long Long Long Long Long Long Long Long Decimal

ULong Decimal Decimal ULong Decimal ULong Decimal ULong Decimal ULong

Operador \
En la tabla siguiente se muestran los tipos de datos de resultados del operador \ . Tenga en cuenta que esta
tabla es simétrica; para una combinación determinada de tipos de datos de operando, el tipo de datos del
resultado es el mismo, independientemente del orden de los operandos.

Boolean SByte Byte Short UShort Integer UInteger Long ULong

Boolean Short SByte Short Short Entero Entero Long Long Long
SByte SByte SByte Short Short Entero Entero Long Long Long

Byte Short Short Byte Short UShort Entero UIntege Long ULong
r

Short Short Short Short Short Entero Entero Long Long Long

UShort Entero Entero UShort Entero UShort Entero UIntege Long ULong
r

Integer Entero Entero Entero Entero Entero Entero Long Long Long

UInteger Long Long UIntege Long UIntege Long UIntege Long ULong
r r r

Long Long Long Long Long Long Long Long Long Long

ULong Long Long ULong Long ULong Long ULong Long ULong

Si alguno de los operandos del operador \ es decimal, Singleo Double, Visual Basic intenta convertirlo a Long
antes de la operación y el tipo de datos del resultado es Long .

Comparaciones relacionales y bit a bit


El tipo de datos de resultado de una operación relacional ( = , <> , < , > , <= , >= ) siempre es Boolean tipo de
datos booleano. Lo mismo se aplica a las operaciones lógicas ( And , AndAlso , Not , Or , OrElse , Xor ) en los
operandos de Boolean .
El tipo de datos de resultado de una operación lógica bit a bit depende de los tipos de datos de los operandos.
Tenga en cuenta que AndAlso y OrElse se definen solo para Boolean y Visual Basic convierte cada operando
según sea necesario para Boolean antes de realizar la operación.
=, < >, <, >, <= y > = operadores
Si ambos operandos son Boolean , Visual Basic considera que True es menor que False . Si un tipo numérico se
compara con un String , Visual Basic intenta convertir el String en Double antes de la operación. Un operando
Char o Date se puede comparar solo con otro operando del mismo tipo de datos. El tipo de datos del resultado
siempre es Boolean .
Operador not bit a bit
En la tabla siguiente se muestran los tipos de datos de resultados para el operador bit a bit Not .

Boolean SByte Byte Short UShort Integer UInteger Long ULong

Not Boolean SByte Byte Short UShort Entero UIntege Long ULong
o r

Si el operando es Decimal , Single , Double o String Visual Basic intenta convertirlo en Long antes de la
operación y el tipo de datos del resultado es Long .
Operadores bit a bit and, or y XOR
En la tabla siguiente se muestran los tipos de datos de resultado de los operadores bit a bit And , Or y Xor .
Tenga en cuenta que esta tabla es simétrica; para una combinación determinada de tipos de datos de operando,
el tipo de datos del resultado es el mismo, independientemente del orden de los operandos.

Boolean SByte Byte Short UShort Integer UInteger Long ULong

Boolean Boolean SByte Short Short Entero Entero Long Long Long
o

SByte SByte SByte Short Short Entero Entero Long Long Long

Byte Short Short Byte Short UShort Entero UIntege Long ULong
r

Short Short Short Short Short Entero Entero Long Long Long

UShort Entero Entero UShort Entero UShort Entero UIntege Long ULong
r

Integer Entero Entero Entero Entero Entero Entero Long Long Long

UInteger Long Long UIntege Long UIntege Long UIntege Long ULong
r r r

Long Long Long Long Long Long Long Long Long Long

ULong Long Long ULong Long ULong Long ULong Long ULong

Si un operando es Decimal , Single , Double o String , Visual Basic intenta convertirlo en Long antes de la
operación y el tipo de datos del resultado es el mismo que si ese operando ya se hubiera Long .

Operadores varios
El operador & solo se define para la concatenación de operandos String . Visual Basic convierte cada operando
según sea necesario para String antes de la operación, y el tipo de datos del resultado siempre es String . En el
caso del operador & , se considera que todas las conversiones a String se amplían, incluso si se
On``Option Strict .

Los operadores Is y IsNot requieren que ambos operandos sean de un tipo de referencia. La expresión
TypeOf ... Is requiere que el primer operando sea de un tipo de referencia y el segundo operando sea el nombre
de un tipo de datos. En todos estos casos, el tipo de datos del resultado es Boolean .
El operador Like solo se define para la coincidencia de patrones de String operandos. Visual Basic intenta
convertir cada operando según sea necesario para String antes de la operación. El tipo de datos del resultado
siempre es Boolean .

Vea también
Tipos de datos
Operadores y expresiones
Operadores aritméticos en Visual Basic
Operadores de comparación en Visual Basic
Operadores
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Operadores aritméticos
Operadores de comparación
Option Strict (instrucción)
Operadores enumerados por funcionalidad
(Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Vea una de las categorías que se enumeran a continuación o abra esta parte de la tabla de contenido de la
ayuda para ver una lista alfabética de los operadores de Visual Basic.

Categorías de operadores
O P ERA DO RES DESC RIP C IÓ N

Operadores aritméticos Estos operadores realizan cálculos matemáticos.

Operadores de asignación Estos operadores realizan operaciones de asignación.

Operadores de comparación Estos operadores realizan comparaciones.

Operadores de concatenación Estos operadores combinan cadenas.

Operadores lógicos y operadores bit a bit Estos operadores realizan operaciones lógicas.

Operadores de desplazamiento de bits Estos operadores realizan desplazamientos aritméticos en


los patrones de bits.

Operadores varios Estos operadores realizan operaciones misceláneas.

Vea también
Operadores y expresiones
Prioridad de operador en Visual Basic
Operadores aritméticos (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

A continuación se muestran los operadores aritméticos definidos en Visual Basic.


Operador ^
Operador *
Operador /
Operador </span>
Mod (operador)
Operador + (unario y binario)
Operador- (unario y binario)

Vea también
Prioridad de operador en Visual Basic
Operadores aritméticos en Visual Basic
Operadores de asignación (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

A continuación se muestran los operadores de asignación definidos en Visual Basic.


Operador =
Operador ^=
Operador *=
Operador /=
\= (operador)
Operador +=
Operador -=
<<= (operador)
Operador >>=
Operador &=

Vea también
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Instrucciones
Operador de desplazamiento de bits (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

A continuación se muestran los operadores de desplazamiento de bits definidos en Visual Basic.


<< (operador)
Operador >>

Vea también
Operadores enumerados por funcionalidad
Operadores de comparación (Visual Basic)
27/11/2019 • 10 minutes to read • Edit Online

A continuación se muestran los operadores de comparación definidos en Visual Basic.


< (operador)
<= (operador)
> (operador)
>= (operador)
= (operador)
<> (operador)
Is (operador)
IsNot (operador)
Like (operador)
Estos operadores comparan dos expresiones para determinar si son iguales o no, y si no, cómo se diferencian. Is ,
IsNot y Like se describen en detalle en páginas de ayuda independientes. Los operadores de comparación
relacional se describen en detalle en esta página.

Sintaxis
result = expression1 comparisonoperator expression2
result = object1 [Is | IsNot] object2
result = string Like pattern

Elementos
result
Obligatorio. Boolean valor que representa el resultado de la comparación.
expression1 , expression2
Obligatorio. Cualquier expresión.
comparisonoperator
Obligatorio. Cualquier operador de comparación relacional.
object1 , object2
Obligatorio. Cualquier nombre de objeto de referencia.
string
Obligatorio. Cualquier expresión String .
pattern
Obligatorio. Cualquier expresión String o intervalo de caracteres.
Comentarios
La tabla siguiente contiene una lista de los operadores de comparación relacionales y las condiciones que
determinan si result es True o False .

O P ERA DO R TRUE SI FALSE SI

< (menor que) expression1 < expression2 expression1 >= expression2

<= (menor o igual que) expression1 <= expression2 expression1 > expression2

> (mayor que) expression1 > expression2 expression1 <= expression2

>= (mayor o igual que) expression1 >= expression2 expression1 < expression2

= (igual a) expression1 = expression2 expression1 <> expression2

<> (no es igual a) expression1 <> expression2 expression1 = expression2

NOTE
El operador = también se usa como operador de asignación.

El operador Is , el operador IsNot y el operador Like tienen funcionalidades de comparación específicas que
difieren de los operadores de la tabla anterior.

Comparar números
Al comparar una expresión de tipo Single con una de tipo Double , la expresión de Single se convierte en
Double . Este comportamiento es opuesto al comportamiento que se encuentra en Visual Basic 6.

Del mismo modo, al comparar una expresión de tipo Decimal con una expresión de tipo Single o Double , la
expresión de Decimal se convierte en Single o Double . En el caso de las expresiones Decimal , es posible que se
pierda cualquier valor fraccionario inferior a 1E-28. Esta pérdida de valor fraccionario puede hacer que dos valores
se comparen como iguales cuando no lo son. Por este motivo, debe tener cuidado al utilizar la igualdad ( = ) para
comparar dos variables de punto flotante. Es más seguro probar si el valor absoluto de la diferencia entre los dos
números es menor que una pequeña tolerancia aceptable.
Imprecisión de punto flotante
Al trabajar con números de punto flotante, tenga en cuenta que no siempre tienen una representación precisa en la
memoria. Esto podría dar lugar a resultados inesperados de ciertas operaciones, como la comparación de valores y
el operador mod. Para obtener más información, vea solución de problemas de tipos de datos.

Comparar cadenas
Cuando se comparan cadenas, las expresiones de cadena se evalúan en función de su criterio de ordenación
alfabético, que depende de la configuración Option Compare .
Option Compare Binary basa las comparaciones de cadenas en un criterio de ordenación derivado de las
representaciones binarias internas de los caracteres. La página de códigos determina el criterio de ordenación. En el
ejemplo siguiente se muestra un criterio de ordenación binario típico.
A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø
Option Compare Text basa las comparaciones de cadenas en un criterio de ordenación textual que no distingue
entre mayúsculas y minúsculas, determinado por la configuración regional de la aplicación. Cuando se establece
Option Compare Text y se ordenan los caracteres en el ejemplo anterior, se aplica el siguiente criterio de ordenación
de texto:
(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)

Dependencia de la configuración regional


Al establecer Option Compare Text , el resultado de una comparación de cadenas puede depender de la
configuración regional en la que se ejecuta la aplicación. Dos caracteres podrían compararse como iguales en una
configuración regional, pero no en otra. Si utiliza una comparación de cadenas para tomar decisiones importantes,
por ejemplo, si desea aceptar un intento de inicio de sesión, debe alertar a la confidencialidad de la configuración
regional. Considere la posibilidad de establecer Option Compare Binary o llamar al StrComp, que tiene en cuenta la
configuración regional.

Programación sin tipos con operadores de comparación relacionales


No se permite el uso de operadores de comparación relacionales con expresiones Object en Option Strict On .
Cuando Option Strict se Off y expression1 o expression2 es una expresión de Object , los tipos en tiempo de
ejecución determinan cómo se comparan. En la tabla siguiente se muestra cómo se comparan las expresiones y el
resultado de la comparación, dependiendo del tipo en tiempo de ejecución de los operandos.

SI LO S O P ERA N DO S SO N L A C O M PA RA C IÓ N ES

Ambos String Ordenar la comparación en función de las características de


ordenación de cadenas.

Ambos numéricos Objetos convertidos en Double , comparación numérica.

Un valor numérico y otro String El String se convierte en un Double y se realiza una


comparación numérica. Si el String no se puede convertir en
Double , se produce una InvalidCastException.

Uno o ambos son tipos de referencia distintos de String Se inicia una InvalidCastException.

Las comparaciones numéricas tratan Nothing como 0. Las comparaciones de cadenas tratan Nothing como ""
(una cadena vacía).

Sobrecarga
Operadores de comparación relacionales ( < . <= , > , >= , = , <> ) se pueden sobrecargar, lo que significa que
una clase o estructura puede volver a definir su comportamiento cuando un operando tiene el tipo de esa clase o
estructura. Si el código usa cualquiera de estos operadores en una clase o estructura de este tipo, asegúrese de que
comprende el comportamiento redefinido. Para obtener más información, consulta Operator Procedures.
Observe que el operador = solo se puede sobrecargar como operador de comparación relacional, no como
operador de asignación.

Ejemplo
En el ejemplo siguiente se muestran varios usos de operadores de comparación relacionales, que se usan para
comparar expresiones. Los operadores de comparación relacional devuelven un resultado Boolean que indica si la
expresión indicada se evalúa como True . Cuando se aplican los operadores > y < a las cadenas, la comparación
se realiza utilizando el criterio de ordenación alfabético normal de las cadenas. Este orden puede depender de la
configuración regional. La ordenación distingue entre mayúsculas y minúsculas o no depende del valor Option
Compare .

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

En el ejemplo anterior, la primera comparación devuelve False y las comparaciones restantes devuelven True .

Vea también
InvalidCastException
Operador =
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Solución de problemas de tipos de datos
Operadores de comparación en Visual Basic
Operadores de concatenación (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

A continuación se muestran los operadores de concatenación definidos en Visual Basic.


Operador &
Operador +

Vea también
System.Text
StringBuilder
Prioridad de operador en Visual Basic
Operadores de concatenación en Visual Basic
Operadores lógicos y bit a bit (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

A continuación se muestran los operadores lógicos y bit a bit definidos en Visual Basic.
And (operador)
NOT (operador)
OR (operador)
XOR (operador)
AndAlso (operador)
OrElse (operador)
IsFalse (operador)
IsTrue (operador)

Vea también
Prioridad de operador en Visual Basic
Operadores lógicos y bit a bit en Visual Basic
Operadores varios (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

A continuación se indican operadores varios definidos en Visual Basic.


?. operador condicional null
? () NULL: operador condicional
AddressOf (operador)
Await (operador)
GetType (operador)
Expresión de función
If (operador)
Typeof (operador)

Vea también
Operadores enumerados por funcionalidad
Operador & (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Genera una concatenación de cadenas de dos expresiones.

Sintaxis
result = expression1 & expression2

Elementos
result
Obligatorio. Cualquier String o variable de Object .
expression1
Obligatorio. Cualquier expresión con un tipo de datos que se amplíe a String .
expression2
Obligatorio. Cualquier expresión con un tipo de datos que se amplíe a String .

Comentarios
Si el tipo de datos de expression1 o expression2 no es String pero se amplía a String , se convierte en
String . Si alguno de los tipos de datos no se amplía a String , el compilador genera un error.

El tipo de datos de result es String . Si una o ambas expresiones se evalúan como Nothing o tienen un valor de
DBNull.Value, se tratan como una cadena con un valor de "".

NOTE
El operador de & se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. Si el código usa este operador en una clase o
estructura de este tipo, asegúrese de entender su comportamiento redefinido. Para obtener más información, consulta
Operator Procedures.

NOTE
El carácter de y comercial (&) también se puede usar para identificar variables como tipo Long . Para obtener más
información, vea caracteres de tipo.

Ejemplo
En este ejemplo se usa el operador & para forzar la concatenación de cadenas. El resultado es un valor de
cadena que representa la concatenación de los dos operandos de cadena.
Dim sampleStr As String
sampleStr = "Hello" & " World"
' The preceding statement sets sampleStr to "Hello World".

Vea también
Operador &=
Operadores de concatenación
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Operadores de concatenación en Visual Basic
&= (operador) (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Concatena una expresión String a una variable o propiedad String y asigna el resultado a la variable o
propiedad.

Sintaxis
variableorproperty &= expression

Elementos
variableorproperty
Obligatorio. Cualquier variable o propiedad de String .
expression
Obligatorio. Cualquier expresión String .

Comentarios
El elemento del lado izquierdo del operador &= puede ser una variable escalar simple, una propiedad o un
elemento de una matriz. La variable o la propiedad no pueden ser de solo lectura. El operador &= concatena la
expresión de String de su derecha a la variable o propiedad de la String a su izquierda, y asigna el resultado a
la variable o propiedad de su izquierda.

Sobrecarga
El operador de & se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. La sobrecarga del operador &
afecta al comportamiento del operador &= . Si el código usa &= en una clase o estructura que sobrecarga & ,
asegúrese de que entiende su comportamiento redefinido. Para obtener más información, consulta Operator
Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador &= para concatenar dos variables String y asignar el resultado a la
primera variable.

Dim var1 As String = "Hello "


Dim var2 As String = "World!"
var1 &= var2
' The value of var1 is now "Hello World!".

Vea también
Operador &
Operador +=
Operadores de asignación
Operadores de concatenación
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Instrucciones
* (Operador, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Multiplica dos números.

Sintaxis
number1 * number2

Elementos
T ÉRM IN O DEF IN IC IÓ N

number1 Obligatorio. Cualquier expresión numérica.

number2 Obligatorio. Cualquier expresión numérica.

Resultado
El resultado es el producto de number1 y number2 .

Tipos admitidos
Todos los tipos numéricos, incluidos los tipos de punto flotante y sin signo y Decimal .

Comentarios
El tipo de datos del resultado depende de los tipos de los operandos. En la tabla siguiente se muestra cómo se
determina el tipo de datos del resultado.

T IP O S DE DATO S DE O P ERA N DO T IP O DE DATO S DE RESULTA DO S

Ambas expresiones son tipos de datos enteros (SByte, byte, Un tipo de datos numérico adecuado para los tipos de datos
Short, ushort, Integer, UInteger, Long, ULong) de number1 y number2 . Vea las tablas "aritmética de
enteros" en tipos de datos de resultados de operadores.

Ambas expresiones son decimales Decimal

Ambas expresiones son únicas Single

Cualquier expresión es un tipo de datos de punto flotante ( Double


Single o Double) pero no ambos Single (tenga en
cuenta Decimal no es un tipo de datos de punto flotante)

Si una expresión se evalúa como Nothing, se trata como cero.

Sobrecarga
El operador de * se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. Si el código usa este operador en
una clase o estructura de este tipo, asegúrese de entender su comportamiento redefinido. Para obtener más
información, consulta Operator Procedures.

Ejemplo
En este ejemplo se usa el operador * para multiplicar dos números. El resultado es el producto de los dos
operandos.

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.

Vea también
Operador *=
Operadores aritméticos
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Operadores aritméticos en Visual Basic
*= (Operador, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Multiplica el valor de una variable o propiedad por el valor de una expresión y asigna el resultado a la variable o
propiedad.

Sintaxis
variableorproperty *= expression

Elementos
variableorproperty
Obligatorio. Cualquier variable o propiedad numérica.
expression
Obligatorio. Cualquier expresión numérica.

Comentarios
El elemento del lado izquierdo del operador *= puede ser una variable escalar simple, una propiedad o un
elemento de una matriz. La variable o la propiedad no pueden ser de solo lectura.
El operador *= multiplica primero el valor de la expresión (en el lado derecho del operador) por el valor de la
variable o propiedad (en el lado izquierdo del operador). A continuación, el operador asigna el resultado de la
operación a la variable o propiedad.

Sobrecarga
El operador * se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. La sobrecarga del operador *
afecta al comportamiento del operador *= . Si el código usa *= en una clase o estructura que sobrecarga * ,
asegúrese de que entiende su comportamiento redefinido. Para obtener más información, consulta Operator
Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador *= para multiplicar una variable Integer por un segundo y asignar el
resultado a la primera variable.

Dim var1 As Integer = 10


Dim var2 As Integer = 3
var1 *= var2
' The value of var1 is now 30.

Vea también
Operador *
Operadores de asignación
Operadores aritméticos
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Instrucciones
+ (Operador, Visual Basic)
27/11/2019 • 9 minutes to read • Edit Online

Suma dos números o devuelve el valor positivo de una expresión numérica. También se puede utilizar para
concatenar dos expresiones de cadena.

Sintaxis
expression1 + expression2

+expression1

Elementos
T ÉRM IN O DEF IN IC IÓ N

expression1 Obligatorio. Cualquier expresión numérica o de cadena.

expression2 Obligatorio a menos que el operador de + calcule un valor


negativo. Cualquier expresión numérica o de cadena.

Resultado
Si expression1 y expression2 son ambos numéricos, el resultado es su suma aritmética.
Si expression2 está ausente, el operador de + es el operador unario de identidad para el valor sin modificar de
una expresión. En este sentido, la operación consiste en conservar el signo de expression1 , por lo que el
resultado es negativo si expression1 es negativo.
Si expression1 y expression2 son ambas cadenas, el resultado es la concatenación de sus valores.
Si expression1 y expression2 son de tipos mixtos, la acción tomada depende de sus tipos, su contenido y la
configuración de la instrucción Option Strict. Para obtener más información, vea las tablas de "Comentarios".

Tipos admitidos
Todos los tipos numéricos, incluidos los tipos de punto flotante y sin signo y Decimal ,y String .

Comentarios
En general, + realiza una suma aritmética siempre que sea posible y concatena solo cuando ambas expresiones
son cadenas.
Si ninguna de las expresiones es una Object , Visual Basic realiza las acciones siguientes.
T IP O S DE DATO S DE EXP RESIO N ES A C C IÓ N P O R EL C O M P IL A DO R

Ambas expresiones son tipos de datos numéricos ( SByte , Agregar. El tipo de datos del resultado es un tipo numérico
Byte , Short , UShort , Integer , UInteger , Long , adecuado para los tipos de datos de expression1 y
ULong , Decimal , Single o Double ) expression2 . Vea las tablas "aritmética de enteros" en tipos
de datos de resultados de operadores.

Ambas expresiones son de tipo String Concatenar.

Una expresión es un tipo de datos numérico y la otra es una Si Option Strict se On , genere un error del compilador.
cadena
Si Option Strict es Off , convierta implícitamente el
String en Double y agregue.

Si el String no se puede convertir en Double , inicie una


excepción InvalidCastException.

Una expresión es un tipo de datos numérico y la otra no es Agregue, con Nothing valor cero.
nada

Una expresión es una cadena y la otra es Nothing Concatenate, con Nothing valor como "".

Si una expresión es una expresión de Object , Visual Basic realiza las acciones siguientes.

T IP O S DE DATO S DE EXP RESIO N ES A C C IÓ N P O R EL C O M P IL A DO R

Object expresión contiene un valor numérico y el otro es Si Option Strict se On , genere un error del compilador.
un tipo de datos numérico
Si Option Strict se Off , agregue.

Object expresión contiene un valor numérico y el otro es Si Option Strict se On , genere un error del compilador.
de tipo String
Si Option Strict es Off , convierta implícitamente el
String en Double y agregue.

Si el String no se puede convertir en Double , inicie una


excepción InvalidCastException.

Object expresión contiene una cadena y la otra es un tipo Si Option Strict se On , genere un error del compilador.
de datos numérico
Si Option Strict es Off , convierta implícitamente la
cadena Object en Double y agregue.

Si el Object de cadena no se puede convertir en Double ,


inicie una excepción InvalidCastException.

Object expresión contiene una cadena y la otra es de tipo Si Option Strict se On , genere un error del compilador.
String
Si Option Strict es Off , convierta implícitamente
Object en String y concatene.

Si ambas expresiones son expresiones Object , Visual Basic realiza las siguientes acciones (solo
Option Strict Off ).
T IP O S DE DATO S DE EXP RESIO N ES A C C IÓ N P O R EL C O M P IL A DO R

Ambas expresiones de Object contienen valores numéricos Agregar.

Ambas expresiones Object son de tipo String Concatenar.

Una expresión Object contiene un valor numérico y la otra Convierta implícitamente el Object de cadena en Double
contiene una cadena y agregue.

Si el Object de cadena no se puede convertir en un valor


numérico, inicie una excepción InvalidCastException.

Si Object expresión se evalúa como Nothing o DBNull, el operador de + lo trata como un String con un valor
de "".

NOTE
Al utilizar el operador + , es posible que no pueda determinar si se producirá la concatenación de cadenas o de suma. Use
el operador & para la concatenación para eliminar la ambigüedad y proporcionar código autodocumentado.

Sobrecarga
El operador de + se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. Si el código usa este operador en
una clase o estructura de este tipo, asegúrese de entender su comportamiento redefinido. Para obtener más
información, consulta Operator Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador + para agregar números. Si los operandos son numéricos, Visual
Basic calcula el resultado aritmético. El resultado aritmético representa la suma de los dos operandos.

Dim sumNumber As Integer


sumNumber = 2 + 2
sumNumber = 4257.04 + 98112
' The preceding statements set sumNumber to 4 and 102369.

También puede usar el operador + para concatenar cadenas. Si los operandos son ambas cadenas, Visual Basic
las concatena. El resultado de la concatenación representa una sola cadena formada por el contenido de los dos
operandos uno tras otro.
Si los operandos son de tipos mixtos, el resultado depende de la configuración de la instrucción Option Strict. En
el ejemplo siguiente se muestra el resultado cuando se On``Option Strict .

Option Strict On

Dim var1 As String = "34"


Dim var2 As Integer = 6
Dim concatenatedNumber As Integer = var1 + var2

' The preceding statement generates a COMPILER ERROR.


En el ejemplo siguiente se muestra el resultado cuando se Off``Option Strict .

Option Strict Off

Dim var1 As String = "34"


Dim var2 As Integer = 6
Dim concatenatedNumber As Integer = var1 + var2

' 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 la ambigüedad, debe utilizar el operador & en lugar de + para la concatenación.

Vea también
Operador &
Operadores de concatenación
Operadores aritméticos
Operadores enumerados por funcionalidad
Prioridad de operador en Visual Basic
Operadores aritméticos en Visual Basic
Option Strict (instrucción)
+= (Operador, Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Agrega el valor de una expresión numérica al valor de una variable o propiedad numérica y asigna el resultado a
la variable o propiedad. También se puede utilizar para concatenar una expresión String a una variable o
propiedad String y asignar el resultado a la variable o propiedad.

Sintaxis
variableorproperty += expression

Elementos
variableorproperty
Obligatorio. Cualquier variable o propiedad numérica o String .
expression
Obligatorio. Cualquier expresión numérica o de String .

Comentarios
El elemento del lado izquierdo del operador += puede ser una variable escalar simple, una propiedad o un
elemento de una matriz. La variable o la propiedad no pueden ser de solo lectura.
El operador += agrega el valor de su derecha a la variable o propiedad de su izquierda, y asigna el resultado a la
variable o propiedad de su izquierda. También se puede usar el operador += para concatenar la expresión de
String de su derecha a la variable o propiedad de String de la izquierda, y asignar el resultado a la variable o
propiedad de su izquierda.

NOTE
Al utilizar el operador += , es posible que no pueda determinar si se producirá la concatenación de cadenas o de suma. Use
el operador &= para la concatenación para eliminar la ambigüedad y proporcionar código autodocumentado.

Este operador de asignación realiza implícitamente conversiones de ampliación pero no de restricción si el


entorno de compilación exige una semántica estricta. Para obtener más información sobre estas conversiones, vea
conversiones de restricción y ampliación. Para obtener más información sobre la semántica estricta y permisiva,
vea Option Strict (instrucción).
Si se permiten las semánticas permisivas, el operador += realiza implícitamente una serie de conversiones
numéricas y de cadena idénticas a las realizadas por el operador + . Para obtener más información sobre estas
conversiones, vea operador +.

Sobrecarga
El operador de + se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. La sobrecarga del operador +
afecta al comportamiento del operador += . Si el código usa += en una clase o estructura que sobrecarga + ,
asegúrese de que entiende su comportamiento redefinido. Para obtener más información, consulta Operator
Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador += para combinar el valor de una variable con otra. La primera parte
utiliza += con variables numéricas para agregar un valor a otro. La segunda parte utiliza += con variables de
String para concatenar un valor con otro. En ambos casos, el resultado se asigna a la primera variable.

' This part uses numeric variables.


Dim num1 As Integer = 10
Dim num2 As Integer = 3
num1 += num2

' This part uses string variables.


Dim str1 As String = "10"
Dim str2 As String = "3"
str1 += str2

El valor de num1 es ahora 13 y el valor de str1 es ahora "103".

Vea también
Operador +
Operadores de asignación
Operadores aritméticos
Operadores de concatenación
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Instrucciones
= (Operador, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Asigna un valor a una variable o propiedad.

Sintaxis
variableorproperty = value

Elementos
variableorproperty
Cualquier variable que se pueda escribir o cualquier propiedad.
value
Cualquier literal, constante o expresión.

Comentarios
El elemento del lado izquierdo del signo igual ( = ) puede ser una variable escalar simple, una propiedad o un
elemento de una matriz. La variable o la propiedad no pueden ser de solo lectura. El operador = asigna el
valor de su derecha a la variable o propiedad de su izquierda.

NOTE
El operador = también se usa como operador de comparación. Para obtener más información, vea operadores de
comparación.

Sobrecarga
El operador = solo se puede sobrecargar como operador de comparación relacional, no como operador de
asignación. Para obtener más información, consulta Operator Procedures.

Ejemplo
En el siguiente ejemplo se muestra el operador de asignación. El valor de la derecha se asigna a la variable de
la izquierda.

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
Vea también
Operador &=
Operador *=
Operador +=
-= (Operador) (Visual Basic)
/= (Operador) (Visual Basic)
\= (operador)
Operador ^=
Instrucciones
Operadores de comparación
ReadOnly
Inferencia de tipo de variable local
- (Operador, Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Devuelve la diferencia entre dos expresiones numéricas o el valor negativo de una expresión numérica.

Sintaxis
expression1 – expression2

–expression1

Elementos
expression1
Obligatorio. Cualquier expresión numérica.
expression2
Obligatorio a menos que el operador de – calcule un valor negativo. Cualquier expresión numérica.

Resultado
El resultado es la diferencia entre expression1 y expression2 , o el valor negado de expression1 .
El tipo de datos del resultado es un tipo numérico adecuado para los tipos de datos de expression1 y
expression2 . Vea las tablas "aritmética de enteros" en tipos de datos de resultados de operadores.

Tipos admitidos
todos los tipos numéricos. Esto incluye los tipos de punto flotante y sin signo y Decimal .

Comentarios
En el primer uso que se muestra en la sintaxis mostrada anteriormente, el operador – es el operador de resta
aritmética binaria para la diferencia entre dos expresiones numéricas.
En el segundo uso que se muestra en la sintaxis mostrada anteriormente, el operador – es el operador unario de
negación para el valor negativo de una expresión. En este sentido, la negación consiste en invertir el signo de
expression1 para que el resultado sea positivo si expression1 es negativo.

Si alguna de las expresiones se evalúa como Nothing, el operador – la trata como cero.

NOTE
El operador de – se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. Si el código usa este operador en una clase o
estructura de este tipo, asegúrese de que entiende su comportamiento redefinido. Para obtener más información, consulta
Operator Procedures.
Ejemplo
En el ejemplo siguiente se usa el operador – para calcular y devolver la diferencia entre dos números y, a
continuación, para negar un número.

Dim binaryResult As Double = 459.35 - 334.9


Dim unaryResult As Double = -334.9

Después de la ejecución de estas instrucciones, binaryResult contiene 124,45 y unaryResult contiene – 334,90.

Vea también
-= (Operador) (Visual Basic)
Operadores aritméticos
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Operadores aritméticos en Visual Basic
-= (Operador, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Resta el valor de una expresión del valor de una variable o propiedad y asigna el resultado a la variable o
propiedad.

Sintaxis
variableorproperty -= expression

Elementos
variableorproperty
Obligatorio. Cualquier variable o propiedad numérica.
expression
Obligatorio. Cualquier expresión numérica.

Comentarios
El elemento del lado izquierdo del operador -= puede ser una variable escalar simple, una propiedad o un
elemento de una matriz. La variable o la propiedad no pueden ser de solo lectura.
El operador -= primero resta el valor de la expresión (en el lado derecho del operador) del valor de la variable o
de la propiedad (en el lado izquierdo del operador). A continuación, el operador asigna el resultado de la
operación a la variable o propiedad.

Sobrecarga
Se puede sobrecargarel operador-(Visual Basic) , lo que significa que una clase o estructura puede volver a definir
su comportamiento cuando un operando tiene el tipo de esa clase o estructura. La sobrecarga del operador -
afecta al comportamiento del operador -= . Si el código usa -= en una clase o estructura que sobrecarga - ,
asegúrese de que entiende su comportamiento redefinido. Para obtener más información, consulta Operator
Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador -= para restar una variable Integer de otra y asignar el resultado a
la última variable.

Dim var1 As Integer = 10


Dim var2 As Integer = 3
var1 -= var2
' The value of var1 is now 7.

Vea también
Operador-(Visual Basic)
Operadores de asignación
Operadores aritméticos
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Instrucciones
Operadores de comparación (Visual Basic)
27/11/2019 • 10 minutes to read • Edit Online

A continuación se muestran los operadores de comparación definidos en Visual Basic.


< (operador)
<= (operador)
> (operador)
>= (operador)
= (operador)
<> (operador)
Is (operador)
IsNot (operador)
Like (operador)
Estos operadores comparan dos expresiones para determinar si son iguales o no, y si no, cómo se diferencian. Is ,
IsNot y Like se describen en detalle en páginas de ayuda independientes. Los operadores de comparación
relacional se describen en detalle en esta página.

Sintaxis
result = expression1 comparisonoperator expression2
result = object1 [Is | IsNot] object2
result = string Like pattern

Elementos
result
Obligatorio. Boolean valor que representa el resultado de la comparación.
expression1 , expression2
Obligatorio. Cualquier expresión.
comparisonoperator
Obligatorio. Cualquier operador de comparación relacional.
object1 , object2
Obligatorio. Cualquier nombre de objeto de referencia.
string
Obligatorio. Cualquier expresión String .
pattern
Obligatorio. Cualquier expresión String o intervalo de caracteres.
Comentarios
La tabla siguiente contiene una lista de los operadores de comparación relacionales y las condiciones que
determinan si result es True o False .

O P ERA DO R TRUE SI FALSE SI

< (menor que) expression1 < expression2 expression1 >= expression2

<= (menor o igual que) expression1 <= expression2 expression1 > expression2

> (mayor que) expression1 > expression2 expression1 <= expression2

>= (mayor o igual que) expression1 >= expression2 expression1 < expression2

= (igual a) expression1 = expression2 expression1 <> expression2

<> (no es igual a) expression1 <> expression2 expression1 = expression2

NOTE
El operador = también se usa como operador de asignación.

El operador Is , el operador IsNot y el operador Like tienen funcionalidades de comparación específicas que
difieren de los operadores de la tabla anterior.

Comparar números
Al comparar una expresión de tipo Single con una de tipo Double , la expresión de Single se convierte en
Double . Este comportamiento es opuesto al comportamiento que se encuentra en Visual Basic 6.

Del mismo modo, al comparar una expresión de tipo Decimal con una expresión de tipo Single o Double , la
expresión de Decimal se convierte en Single o Double . En el caso de las expresiones Decimal , es posible que se
pierda cualquier valor fraccionario inferior a 1E-28. Esta pérdida de valor fraccionario puede hacer que dos valores
se comparen como iguales cuando no lo son. Por este motivo, debe tener cuidado al utilizar la igualdad ( = ) para
comparar dos variables de punto flotante. Es más seguro probar si el valor absoluto de la diferencia entre los dos
números es menor que una pequeña tolerancia aceptable.
Imprecisión de punto flotante
Al trabajar con números de punto flotante, tenga en cuenta que no siempre tienen una representación precisa en la
memoria. Esto podría dar lugar a resultados inesperados de ciertas operaciones, como la comparación de valores y
el operador mod. Para obtener más información, vea solución de problemas de tipos de datos.

Comparar cadenas
Cuando se comparan cadenas, las expresiones de cadena se evalúan en función de su criterio de ordenación
alfabético, que depende de la configuración Option Compare .
Option Compare Binary basa las comparaciones de cadenas en un criterio de ordenación derivado de las
representaciones binarias internas de los caracteres. La página de códigos determina el criterio de ordenación. En el
ejemplo siguiente se muestra un criterio de ordenación binario típico.
A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø
Option Compare Text basa las comparaciones de cadenas en un criterio de ordenación textual que no distingue
entre mayúsculas y minúsculas, determinado por la configuración regional de la aplicación. Cuando se establece
Option Compare Text y se ordenan los caracteres en el ejemplo anterior, se aplica el siguiente criterio de ordenación
de texto:
(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)

Dependencia de la configuración regional


Al establecer Option Compare Text , el resultado de una comparación de cadenas puede depender de la
configuración regional en la que se ejecuta la aplicación. Dos caracteres podrían compararse como iguales en una
configuración regional, pero no en otra. Si utiliza una comparación de cadenas para tomar decisiones importantes,
por ejemplo, si desea aceptar un intento de inicio de sesión, debe alertar a la confidencialidad de la configuración
regional. Considere la posibilidad de establecer Option Compare Binary o llamar al StrComp, que tiene en cuenta la
configuración regional.

Programación sin tipos con operadores de comparación relacionales


No se permite el uso de operadores de comparación relacionales con expresiones Object en Option Strict On .
Cuando Option Strict se Off y expression1 o expression2 es una expresión de Object , los tipos en tiempo de
ejecución determinan cómo se comparan. En la tabla siguiente se muestra cómo se comparan las expresiones y el
resultado de la comparación, dependiendo del tipo en tiempo de ejecución de los operandos.

SI LO S O P ERA N DO S SO N L A C O M PA RA C IÓ N ES

Ambos String Ordenar la comparación en función de las características de


ordenación de cadenas.

Ambos numéricos Objetos convertidos en Double , comparación numérica.

Un valor numérico y otro String El String se convierte en un Double y se realiza una


comparación numérica. Si el String no se puede convertir en
Double , se produce una InvalidCastException.

Uno o ambos son tipos de referencia distintos de String Se inicia una InvalidCastException.

Las comparaciones numéricas tratan Nothing como 0. Las comparaciones de cadenas tratan Nothing como ""
(una cadena vacía).

Sobrecarga
Operadores de comparación relacionales ( < . <= , > , >= , = , <> ) se pueden sobrecargar, lo que significa que
una clase o estructura puede volver a definir su comportamiento cuando un operando tiene el tipo de esa clase o
estructura. Si el código usa cualquiera de estos operadores en una clase o estructura de este tipo, asegúrese de que
comprende el comportamiento redefinido. Para obtener más información, consulta Operator Procedures.
Observe que el operador = solo se puede sobrecargar como operador de comparación relacional, no como
operador de asignación.

Ejemplo
En el ejemplo siguiente se muestran varios usos de operadores de comparación relacionales, que se usan para
comparar expresiones. Los operadores de comparación relacional devuelven un resultado Boolean que indica si la
expresión indicada se evalúa como True . Cuando se aplican los operadores > y < a las cadenas, la comparación
se realiza utilizando el criterio de ordenación alfabético normal de las cadenas. Este orden puede depender de la
configuración regional. La ordenación distingue entre mayúsculas y minúsculas o no depende del valor Option
Compare .

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

En el ejemplo anterior, la primera comparación devuelve False y las comparaciones restantes devuelven True .

Vea también
InvalidCastException
Operador =
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Solución de problemas de tipos de datos
Operadores de comparación en Visual Basic
Operadores de comparación (Visual Basic)
27/11/2019 • 10 minutes to read • Edit Online

A continuación se muestran los operadores de comparación definidos en Visual Basic.


< (operador)
<= (operador)
> (operador)
>= (operador)
= (operador)
<> (operador)
Is (operador)
IsNot (operador)
Like (operador)
Estos operadores comparan dos expresiones para determinar si son iguales o no, y si no, cómo se diferencian. Is ,
IsNot y Like se describen en detalle en páginas de ayuda independientes. Los operadores de comparación
relacional se describen en detalle en esta página.

Sintaxis
result = expression1 comparisonoperator expression2
result = object1 [Is | IsNot] object2
result = string Like pattern

Elementos
result
Obligatorio. Boolean valor que representa el resultado de la comparación.
expression1 , expression2
Obligatorio. Cualquier expresión.
comparisonoperator
Obligatorio. Cualquier operador de comparación relacional.
object1 , object2
Obligatorio. Cualquier nombre de objeto de referencia.
string
Obligatorio. Cualquier expresión String .
pattern
Obligatorio. Cualquier expresión String o intervalo de caracteres.
Comentarios
La tabla siguiente contiene una lista de los operadores de comparación relacionales y las condiciones que
determinan si result es True o False .

O P ERA DO R TRUE SI FALSE SI

< (menor que) expression1 < expression2 expression1 >= expression2

<= (menor o igual que) expression1 <= expression2 expression1 > expression2

> (mayor que) expression1 > expression2 expression1 <= expression2

>= (mayor o igual que) expression1 >= expression2 expression1 < expression2

= (igual a) expression1 = expression2 expression1 <> expression2

<> (no es igual a) expression1 <> expression2 expression1 = expression2

NOTE
El operador = también se usa como operador de asignación.

El operador Is , el operador IsNot y el operador Like tienen funcionalidades de comparación específicas que
difieren de los operadores de la tabla anterior.

Comparar números
Al comparar una expresión de tipo Single con una de tipo Double , la expresión de Single se convierte en
Double . Este comportamiento es opuesto al comportamiento que se encuentra en Visual Basic 6.

Del mismo modo, al comparar una expresión de tipo Decimal con una expresión de tipo Single o Double , la
expresión de Decimal se convierte en Single o Double . En el caso de las expresiones Decimal , es posible que se
pierda cualquier valor fraccionario inferior a 1E-28. Esta pérdida de valor fraccionario puede hacer que dos valores
se comparen como iguales cuando no lo son. Por este motivo, debe tener cuidado al utilizar la igualdad ( = ) para
comparar dos variables de punto flotante. Es más seguro probar si el valor absoluto de la diferencia entre los dos
números es menor que una pequeña tolerancia aceptable.
Imprecisión de punto flotante
Al trabajar con números de punto flotante, tenga en cuenta que no siempre tienen una representación precisa en la
memoria. Esto podría dar lugar a resultados inesperados de ciertas operaciones, como la comparación de valores y
el operador mod. Para obtener más información, vea solución de problemas de tipos de datos.

Comparar cadenas
Cuando se comparan cadenas, las expresiones de cadena se evalúan en función de su criterio de ordenación
alfabético, que depende de la configuración Option Compare .
Option Compare Binary basa las comparaciones de cadenas en un criterio de ordenación derivado de las
representaciones binarias internas de los caracteres. La página de códigos determina el criterio de ordenación. En el
ejemplo siguiente se muestra un criterio de ordenación binario típico.
A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø
Option Compare Text basa las comparaciones de cadenas en un criterio de ordenación textual que no distingue
entre mayúsculas y minúsculas, determinado por la configuración regional de la aplicación. Cuando se establece
Option Compare Text y se ordenan los caracteres en el ejemplo anterior, se aplica el siguiente criterio de ordenación
de texto:
(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)

Dependencia de la configuración regional


Al establecer Option Compare Text , el resultado de una comparación de cadenas puede depender de la
configuración regional en la que se ejecuta la aplicación. Dos caracteres podrían compararse como iguales en una
configuración regional, pero no en otra. Si utiliza una comparación de cadenas para tomar decisiones importantes,
por ejemplo, si desea aceptar un intento de inicio de sesión, debe alertar a la confidencialidad de la configuración
regional. Considere la posibilidad de establecer Option Compare Binary o llamar al StrComp, que tiene en cuenta la
configuración regional.

Programación sin tipos con operadores de comparación relacionales


No se permite el uso de operadores de comparación relacionales con expresiones Object en Option Strict On .
Cuando Option Strict se Off y expression1 o expression2 es una expresión de Object , los tipos en tiempo de
ejecución determinan cómo se comparan. En la tabla siguiente se muestra cómo se comparan las expresiones y el
resultado de la comparación, dependiendo del tipo en tiempo de ejecución de los operandos.

SI LO S O P ERA N DO S SO N L A C O M PA RA C IÓ N ES

Ambos String Ordenar la comparación en función de las características de


ordenación de cadenas.

Ambos numéricos Objetos convertidos en Double , comparación numérica.

Un valor numérico y otro String El String se convierte en un Double y se realiza una


comparación numérica. Si el String no se puede convertir en
Double , se produce una InvalidCastException.

Uno o ambos son tipos de referencia distintos de String Se inicia una InvalidCastException.

Las comparaciones numéricas tratan Nothing como 0. Las comparaciones de cadenas tratan Nothing como ""
(una cadena vacía).

Sobrecarga
Operadores de comparación relacionales ( < . <= , > , >= , = , <> ) se pueden sobrecargar, lo que significa que
una clase o estructura puede volver a definir su comportamiento cuando un operando tiene el tipo de esa clase o
estructura. Si el código usa cualquiera de estos operadores en una clase o estructura de este tipo, asegúrese de que
comprende el comportamiento redefinido. Para obtener más información, consulta Operator Procedures.
Observe que el operador = solo se puede sobrecargar como operador de comparación relacional, no como
operador de asignación.

Ejemplo
En el ejemplo siguiente se muestran varios usos de operadores de comparación relacionales, que se usan para
comparar expresiones. Los operadores de comparación relacional devuelven un resultado Boolean que indica si la
expresión indicada se evalúa como True . Cuando se aplican los operadores > y < a las cadenas, la comparación
se realiza utilizando el criterio de ordenación alfabético normal de las cadenas. Este orden puede depender de la
configuración regional. La ordenación distingue entre mayúsculas y minúsculas o no depende del valor Option
Compare .

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

En el ejemplo anterior, la primera comparación devuelve False y las comparaciones restantes devuelven True .

Vea también
InvalidCastException
Operador =
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Solución de problemas de tipos de datos
Operadores de comparación en Visual Basic
Operadores de comparación (Visual Basic)
27/11/2019 • 10 minutes to read • Edit Online

A continuación se muestran los operadores de comparación definidos en Visual Basic.


< (operador)
<= (operador)
> (operador)
>= (operador)
= (operador)
<> (operador)
Is (operador)
IsNot (operador)
Like (operador)
Estos operadores comparan dos expresiones para determinar si son iguales o no, y si no, cómo se diferencian. Is ,
IsNot y Like se describen en detalle en páginas de ayuda independientes. Los operadores de comparación
relacional se describen en detalle en esta página.

Sintaxis
result = expression1 comparisonoperator expression2
result = object1 [Is | IsNot] object2
result = string Like pattern

Elementos
result
Obligatorio. Boolean valor que representa el resultado de la comparación.
expression1 , expression2
Obligatorio. Cualquier expresión.
comparisonoperator
Obligatorio. Cualquier operador de comparación relacional.
object1 , object2
Obligatorio. Cualquier nombre de objeto de referencia.
string
Obligatorio. Cualquier expresión String .
pattern
Obligatorio. Cualquier expresión String o intervalo de caracteres.
Comentarios
La tabla siguiente contiene una lista de los operadores de comparación relacionales y las condiciones que
determinan si result es True o False .

O P ERA DO R TRUE SI FALSE SI

< (menor que) expression1 < expression2 expression1 >= expression2

<= (menor o igual que) expression1 <= expression2 expression1 > expression2

> (mayor que) expression1 > expression2 expression1 <= expression2

>= (mayor o igual que) expression1 >= expression2 expression1 < expression2

= (igual a) expression1 = expression2 expression1 <> expression2

<> (no es igual a) expression1 <> expression2 expression1 = expression2

NOTE
El operador = también se usa como operador de asignación.

El operador Is , el operador IsNot y el operador Like tienen funcionalidades de comparación específicas que
difieren de los operadores de la tabla anterior.

Comparar números
Al comparar una expresión de tipo Single con una de tipo Double , la expresión de Single se convierte en
Double . Este comportamiento es opuesto al comportamiento que se encuentra en Visual Basic 6.

Del mismo modo, al comparar una expresión de tipo Decimal con una expresión de tipo Single o Double , la
expresión de Decimal se convierte en Single o Double . En el caso de las expresiones Decimal , es posible que se
pierda cualquier valor fraccionario inferior a 1E-28. Esta pérdida de valor fraccionario puede hacer que dos valores
se comparen como iguales cuando no lo son. Por este motivo, debe tener cuidado al utilizar la igualdad ( = ) para
comparar dos variables de punto flotante. Es más seguro probar si el valor absoluto de la diferencia entre los dos
números es menor que una pequeña tolerancia aceptable.
Imprecisión de punto flotante
Al trabajar con números de punto flotante, tenga en cuenta que no siempre tienen una representación precisa en la
memoria. Esto podría dar lugar a resultados inesperados de ciertas operaciones, como la comparación de valores y
el operador mod. Para obtener más información, vea solución de problemas de tipos de datos.

Comparar cadenas
Cuando se comparan cadenas, las expresiones de cadena se evalúan en función de su criterio de ordenación
alfabético, que depende de la configuración Option Compare .
Option Compare Binary basa las comparaciones de cadenas en un criterio de ordenación derivado de las
representaciones binarias internas de los caracteres. La página de códigos determina el criterio de ordenación. En el
ejemplo siguiente se muestra un criterio de ordenación binario típico.
A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø
Option Compare Text basa las comparaciones de cadenas en un criterio de ordenación textual que no distingue
entre mayúsculas y minúsculas, determinado por la configuración regional de la aplicación. Cuando se establece
Option Compare Text y se ordenan los caracteres en el ejemplo anterior, se aplica el siguiente criterio de ordenación
de texto:
(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)

Dependencia de la configuración regional


Al establecer Option Compare Text , el resultado de una comparación de cadenas puede depender de la
configuración regional en la que se ejecuta la aplicación. Dos caracteres podrían compararse como iguales en una
configuración regional, pero no en otra. Si utiliza una comparación de cadenas para tomar decisiones importantes,
por ejemplo, si desea aceptar un intento de inicio de sesión, debe alertar a la confidencialidad de la configuración
regional. Considere la posibilidad de establecer Option Compare Binary o llamar al StrComp, que tiene en cuenta la
configuración regional.

Programación sin tipos con operadores de comparación relacionales


No se permite el uso de operadores de comparación relacionales con expresiones Object en Option Strict On .
Cuando Option Strict se Off y expression1 o expression2 es una expresión de Object , los tipos en tiempo de
ejecución determinan cómo se comparan. En la tabla siguiente se muestra cómo se comparan las expresiones y el
resultado de la comparación, dependiendo del tipo en tiempo de ejecución de los operandos.

SI LO S O P ERA N DO S SO N L A C O M PA RA C IÓ N ES

Ambos String Ordenar la comparación en función de las características de


ordenación de cadenas.

Ambos numéricos Objetos convertidos en Double , comparación numérica.

Un valor numérico y otro String El String se convierte en un Double y se realiza una


comparación numérica. Si el String no se puede convertir en
Double , se produce una InvalidCastException.

Uno o ambos son tipos de referencia distintos de String Se inicia una InvalidCastException.

Las comparaciones numéricas tratan Nothing como 0. Las comparaciones de cadenas tratan Nothing como ""
(una cadena vacía).

Sobrecarga
Operadores de comparación relacionales ( < . <= , > , >= , = , <> ) se pueden sobrecargar, lo que significa que
una clase o estructura puede volver a definir su comportamiento cuando un operando tiene el tipo de esa clase o
estructura. Si el código usa cualquiera de estos operadores en una clase o estructura de este tipo, asegúrese de que
comprende el comportamiento redefinido. Para obtener más información, consulta Operator Procedures.
Observe que el operador = solo se puede sobrecargar como operador de comparación relacional, no como
operador de asignación.

Ejemplo
En el ejemplo siguiente se muestran varios usos de operadores de comparación relacionales, que se usan para
comparar expresiones. Los operadores de comparación relacional devuelven un resultado Boolean que indica si la
expresión indicada se evalúa como True . Cuando se aplican los operadores > y < a las cadenas, la comparación
se realiza utilizando el criterio de ordenación alfabético normal de las cadenas. Este orden puede depender de la
configuración regional. La ordenación distingue entre mayúsculas y minúsculas o no depende del valor Option
Compare .

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

En el ejemplo anterior, la primera comparación devuelve False y las comparaciones restantes devuelven True .

Vea también
InvalidCastException
Operador =
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Solución de problemas de tipos de datos
Operadores de comparación en Visual Basic
Operadores de comparación (Visual Basic)
27/11/2019 • 10 minutes to read • Edit Online

A continuación se muestran los operadores de comparación definidos en Visual Basic.


< (operador)
<= (operador)
> (operador)
>= (operador)
= (operador)
<> (operador)
Is (operador)
IsNot (operador)
Like (operador)
Estos operadores comparan dos expresiones para determinar si son iguales o no, y si no, cómo se
diferencian. Is , IsNot y Like se describen en detalle en páginas de ayuda independientes. Los operadores
de comparación relacional se describen en detalle en esta página.

Sintaxis
result = expression1 comparisonoperator expression2
result = object1 [Is | IsNot] object2
result = string Like pattern

Elementos
result
Obligatorio. Boolean valor que representa el resultado de la comparación.
expression1 , expression2
Obligatorio. Cualquier expresión.
comparisonoperator
Obligatorio. Cualquier operador de comparación relacional.
object1 , object2
Obligatorio. Cualquier nombre de objeto de referencia.
string
Obligatorio. Cualquier expresión String .
pattern
Obligatorio. Cualquier expresión String o intervalo de caracteres.
Comentarios
La tabla siguiente contiene una lista de los operadores de comparación relacionales y las condiciones que
determinan si result es True o False .

O P ERA DO R TRUE SI FALSE SI

< (menor que) expression1 < expression2 expression1 >= expression2

<= (menor o igual que) expression1 <= expression2 expression1 > expression2

> (mayor que) expression1 > expression2 expression1 <= expression2

>= (mayor o igual que) expression1 >= expression2 expression1 < expression2

= (igual a) expression1 = expression2 expression1 <> expression2

<> (no es igual a) expression1 <> expression2 expression1 = expression2

NOTE
El operador = también se usa como operador de asignación.

El operador Is , el operador IsNot y el operador Like tienen funcionalidades de comparación específicas


que difieren de los operadores de la tabla anterior.

Comparar números
Al comparar una expresión de tipo Single con una de tipo Double , la expresión de Single se convierte en
Double . Este comportamiento es opuesto al comportamiento que se encuentra en Visual Basic 6.

Del mismo modo, al comparar una expresión de tipo Decimal con una expresión de tipo Single o Double ,
la expresión de Decimal se convierte en Single o Double . En el caso de las expresiones Decimal , es posible
que se pierda cualquier valor fraccionario inferior a 1E-28. Esta pérdida de valor fraccionario puede hacer
que dos valores se comparen como iguales cuando no lo son. Por este motivo, debe tener cuidado al utilizar
la igualdad ( = ) para comparar dos variables de punto flotante. Es más seguro probar si el valor absoluto de
la diferencia entre los dos números es menor que una pequeña tolerancia aceptable.
Imprecisión de punto flotante
Al trabajar con números de punto flotante, tenga en cuenta que no siempre tienen una representación
precisa en la memoria. Esto podría dar lugar a resultados inesperados de ciertas operaciones, como la
comparación de valores y el operador mod. Para obtener más información, vea solución de problemas de
tipos de datos.

Comparar cadenas
Cuando se comparan cadenas, las expresiones de cadena se evalúan en función de su criterio de ordenación
alfabético, que depende de la configuración Option Compare .
Option Compare Binary basa las comparaciones de cadenas en un criterio de ordenación derivado de las
representaciones binarias internas de los caracteres. La página de códigos determina el criterio de
ordenación. En el ejemplo siguiente se muestra un criterio de ordenación binario típico.
A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø

Option Compare Text basa las comparaciones de cadenas en un criterio de ordenación textual que no
distingue entre mayúsculas y minúsculas, determinado por la configuración regional de la aplicación. Cuando
se establece Option Compare Text y se ordenan los caracteres en el ejemplo anterior, se aplica el siguiente
criterio de ordenación de texto:
(A=a) < (À= à) < (B=b) < (E=e) < (Ê= ê) < (Ø = ø) < (Z=z)

Dependencia de la configuración regional


Al establecer Option Compare Text , el resultado de una comparación de cadenas puede depender de la
configuración regional en la que se ejecuta la aplicación. Dos caracteres podrían compararse como iguales en
una configuración regional, pero no en otra. Si utiliza una comparación de cadenas para tomar decisiones
importantes, por ejemplo, si desea aceptar un intento de inicio de sesión, debe alertar a la confidencialidad
de la configuración regional. Considere la posibilidad de establecer Option Compare Binary o llamar al
StrComp, que tiene en cuenta la configuración regional.

Programación sin tipos con operadores de comparación relacionales


No se permite el uso de operadores de comparación relacionales con expresiones Object en
Option Strict On . Cuando Option Strict se Off y expression1 o expression2 es una expresión de Object
, los tipos en tiempo de ejecución determinan cómo se comparan. En la tabla siguiente se muestra cómo se
comparan las expresiones y el resultado de la comparación, dependiendo del tipo en tiempo de ejecución de
los operandos.

SI LO S O P ERA N DO S SO N L A C O M PA RA C IÓ N ES

Ambos String Ordenar la comparación en función de las características de


ordenación de cadenas.

Ambos numéricos Objetos convertidos en Double , comparación numérica.

Un valor numérico y otro String El String se convierte en un Double y se realiza una


comparación numérica. Si el String no se puede
convertir en Double , se produce una
InvalidCastException.

Uno o ambos son tipos de referencia distintos de String Se inicia una InvalidCastException.

Las comparaciones numéricas tratan Nothing como 0. Las comparaciones de cadenas tratan Nothing como
"" (una cadena vacía).

Sobrecarga
Operadores de comparación relacionales ( < . <= , > , >= , = , <> ) se pueden sobrecargar, lo que significa
que una clase o estructura puede volver a definir su comportamiento cuando un operando tiene el tipo de
esa clase o estructura. Si el código usa cualquiera de estos operadores en una clase o estructura de este tipo,
asegúrese de que comprende el comportamiento redefinido. Para obtener más información, consulta
Operator Procedures.
Observe que el operador = solo se puede sobrecargar como operador de comparación relacional, no como
operador de asignación.

Ejemplo
En el ejemplo siguiente se muestran varios usos de operadores de comparación relacionales, que se usan
para comparar expresiones. Los operadores de comparación relacional devuelven un resultado Boolean que
indica si la expresión indicada se evalúa como True . Cuando se aplican los operadores > y < a las
cadenas, la comparación se realiza utilizando el criterio de ordenación alfabético normal de las cadenas. Este
orden puede depender de la configuración regional. La ordenación distingue entre mayúsculas y minúsculas
o no depende del valor Option Compare .

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

En el ejemplo anterior, la primera comparación devuelve False y las comparaciones restantes devuelven
True .

Vea también
InvalidCastException
Operador =
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Solución de problemas de tipos de datos
Operadores de comparación en Visual Basic
Operador de < de <(Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Realiza un desplazamiento aritmético a la izquierda en un patrón de bits.

Sintaxis
result = pattern << amount

Elementos
result
Obligatorio. Valor numérico entero. Resultado de desplazar el modelo de bits. El tipo de datos es el mismo que el
de pattern .
pattern
Obligatorio. Expresión numérica entera. Patrón de bits que se va a desplazar. El tipo de datos debe ser un tipo
entero ( SByte , Byte , Short , UShort , Integer , UInteger , Long o ULong ).
amount
Obligatorio. Expresión numérica. Número de bits que se va a desplazar el modelo de bits. El tipo de datos debe
Integer se o ampliarse a Integer .

Comentarios
Los turnos aritméticos no son circulares, lo que significa que los bits desplazados fuera de un extremo del
resultado no se reintroducen en el otro extremo. En un desplazamiento aritmético a la izquierda, los bits
desplazados más allá del intervalo del tipo de datos del resultado se descartan y las posiciones de bits que quedan
a la derecha se establecen en cero.
Para evitar un desplazamiento por más bits del que puede contener el resultado, Visual Basic enmascara el valor
de amount con una máscara de tamaño correspondiente al tipo de datos de pattern . El binario y estos valores se
usan para la cantidad de desplazamiento. Las máscaras de tamaño son las siguientes:

M Á SC A RA DE TA M A Ñ O
T IP O DE DATO S DE PATTERN M Á SC A RA DE TA M A Ñ O ( DEC IM A L ) ( H EXA DEC IM A L )

SByte , Byte 7 & H00000007

Short , UShort 15 & H0000000F

Integer , UInteger 31 & H0000001F

Long , ULong 63 & H0000003F

Si amount es cero, el valor de result es idéntico al valor de pattern . Si amount es negativo, se toma como un
valor sin signo y se enmascara con la máscara de tamaño adecuada.
Los desplazamientos aritméticos nunca generan excepciones de desbordamiento.
NOTE
El operador de << se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. Si el código usa este operador en una clase o
estructura de este tipo, asegúrese de que entiende su comportamiento redefinido. Para obtener más información, consulta
Operator Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador << para realizar los desplazamientos aritméticos a la izquierda en
valores enteros. El resultado siempre tiene el mismo tipo de datos que la expresión que se está desplazando.

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

Los resultados del ejemplo anterior son los siguientes:


result1 es 192 (0000 0000 1100 0000).
result2 es 3072 (0000 1100 0000 0000).
result3 es-32768 (1000 0000 0000 0000).
result4 es 384 (0000 0001 1000 0000).
result5 es 0 (se desplazan 15 posiciones hacia la izquierda).
La cantidad de desplazamiento para result4 se calcula como 17 y 15, que es igual a 1.

Vea también
Operadores de desplazamiento de bits
Operadores de asignación
Operador <<=
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Operadores aritméticos en Visual Basic
<<= operador (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Realiza un desplazamiento aritmético a la izquierda en el valor de una variable o propiedad y asigna el resultado a
la variable o propiedad.

Sintaxis
variableorproperty <<= amount

Elementos
variableorproperty
Obligatorio. Variable o propiedad de un tipo entero ( SByte , Byte , Short , UShort , Integer , UInteger , Long o
ULong ).

amount
Obligatorio. Expresión numérica de un tipo de datos que se amplía a Integer .

Comentarios
El elemento del lado izquierdo del operador <<= puede ser una variable escalar simple, una propiedad o un
elemento de una matriz. La variable o la propiedad no pueden ser de solo lectura.
El operador <<= primero realiza un desplazamiento aritmético a la izquierda en el valor de la variable o
propiedad. A continuación, el operador asigna de nuevo el resultado de la operación a esa variable o propiedad.
Los turnos aritméticos no son circulares, lo que significa que los bits desplazados fuera de un extremo del
resultado no se reintroducen en el otro extremo. En un desplazamiento aritmético a la izquierda, los bits
desplazados más allá del intervalo del tipo de datos del resultado se descartan y las posiciones de bits que quedan
a la derecha se establecen en cero.

Sobrecarga
Se puede sobrecargarel operador < < , lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. La sobrecarga del operador <<
afecta al comportamiento del operador <<= . Si el código usa <<= en una clase o estructura que sobrecarga << ,
asegúrese de que entiende su comportamiento redefinido. Para obtener más información, consulta Operator
Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador <<= para desplazar el modelo de bits de una variable de Integer a la
izquierda en la cantidad especificada y asignar el resultado a la variable.

Dim var As Integer = 10


Dim shift As Integer = 3
var <<= shift
' The value of var is now 80.
Vea también
Operador <<
Operadores de asignación
Operadores de desplazamiento de bits
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Instrucciones
Operador de > de > (Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

Realiza un desplazamiento aritmético a la derecha en un patrón de bits.

Sintaxis
result = pattern >> amount

Elementos
result
Obligatorio. Valor numérico entero. Resultado de desplazar el modelo de bits. El tipo de datos es el mismo que el
de pattern .
pattern
Obligatorio. Expresión numérica entera. Patrón de bits que se va a desplazar. El tipo de datos debe ser un tipo
entero ( SByte , Byte , Short , UShort , Integer , UInteger , Long o ULong ).
amount
Obligatorio. Expresión numérica. Número de bits que se va a desplazar el modelo de bits. El tipo de datos debe
Integer se o ampliarse a Integer .

Comentarios
Los turnos aritméticos no son circulares, lo que significa que los bits desplazados fuera de un extremo del
resultado no se reintroducen en el otro extremo. En un desplazamiento aritmético a la derecha, se descartan los
bits desplazados más allá de la posición del bit más a la derecha y el bit de la izquierda (signo) se propaga a las
posiciones de bits que quedan a la izquierda. Esto significa que si pattern tiene un valor negativo, las posiciones
vacantes se establecen en uno; de lo contrario, se establecen en cero.
Tenga en cuenta que los tipos de datos Byte , UShort , UInteger y ULong no tienen signo, por lo que no hay
ningún bit de signo que propagar. Si pattern es de cualquier tipo sin signo, las posiciones vacías siempre se
establecen en cero.
Para evitar el desplazamiento por más bits del que puede contener el resultado, Visual Basic enmascara el valor de
amount con una máscara de tamaño correspondiente al tipo de datos de pattern . El binario y estos valores se
usan para la cantidad de desplazamiento. Las máscaras de tamaño son las siguientes:

M Á SC A RA DE TA M A Ñ O
T IP O DE DATO S DE PATTERN M Á SC A RA DE TA M A Ñ O ( DEC IM A L ) ( H EXA DEC IM A L )

SByte , Byte 7 & H00000007

Short , UShort 15 & H0000000F

Integer , UInteger 31 & H0000001F

Long , ULong 63 & H0000003F


Si amount es cero, el valor de result es idéntico al valor de pattern . Si amount es negativo, se toma como un
valor sin signo y se enmascara con la máscara de tamaño adecuada.
Los desplazamientos aritméticos nunca generan excepciones de desbordamiento.

Sobrecarga
El operador de >> se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. Si el código usa este operador en una
clase o estructura de este tipo, asegúrese de entender su comportamiento redefinido. Para obtener más
información, consulta Operator Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador >> para realizar los desplazamientos aritméticos a la derecha en los
valores enteros. El resultado siempre tiene el mismo tipo de datos que la expresión que se está desplazando.

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

Los resultados del ejemplo anterior son los siguientes:


result1 es 2560 (0000 1010 0000 0000).
result2 es 160 (0000 0000 1010 0000).
result3 es 2 (0000 0000 0000 0010).
result4 es 640 (0000 0010 1000 0000).
result5 es 0 (se desplazan 15 posiciones a la derecha).

La cantidad de desplazamiento de result4 se calcula como 18 y 15, que es igual a 2.


En el ejemplo siguiente se muestran los cambios aritméticos en un valor negativo.

Dim negPattern As Short = -8192


' The bit pattern is 1110 0000 0000 0000.
Dim negResult1, negResult2 As Short
negResult1 = negPattern >> 4
negResult2 = negPattern >> 13

Los resultados del ejemplo anterior son los siguientes:


negresult1 es-512 (1111 1110 0000 0000).
negresult2 es-1 (el bit de signo se propaga).

Vea también
Operadores de desplazamiento de bits
Operadores de asignación
Operador >>=
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Operadores aritméticos en Visual Basic
> > = operador (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Realiza un desplazamiento aritmético a la derecha en el valor de una variable o propiedad y asigna el resultado a
la variable o propiedad.

Sintaxis
variableorproperty >>= amount

Elementos
variableorproperty
Obligatorio. Variable o propiedad de un tipo entero ( SByte , Byte , Short , UShort , Integer , UInteger , Long o
ULong ).

amount
Obligatorio. Expresión numérica de un tipo de datos que se amplía a Integer .

Comentarios
El elemento del lado izquierdo del operador >>= puede ser una variable escalar simple, una propiedad o un
elemento de una matriz. La variable o la propiedad no pueden ser de solo lectura.
El operador >>= primero realiza un desplazamiento aritmético a la derecha en el valor de la variable o propiedad.
A continuación, el operador asigna el resultado de la operación a la variable o propiedad.
Los turnos aritméticos no son circulares, lo que significa que los bits desplazados fuera de un extremo del
resultado no se reintroducen en el otro extremo. En un desplazamiento aritmético a la derecha, se descartan los
bits desplazados más allá de la posición de bit situada más a la derecha y el bit del extremo izquierdo se propaga a
las posiciones de bits que quedan a la izquierda. Esto significa que si variableorproperty tiene un valor negativo,
las posiciones vacantes se establecen en una. Si variableorproperty es positivo, o si su tipo de datos es un tipo sin
signo, las posiciones vacías se establecen en cero.

Sobrecarga
Se puede sobrecargarel operador > > , lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. La sobrecarga del operador >>
afecta al comportamiento del operador >>= . Si el código usa >>= en una clase o estructura que sobrecarga >> ,
asegúrese de que entiende su comportamiento redefinido. Para obtener más información, consulta Operator
Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador >>= para desplazar el modelo de bits de una variable de Integer a la
derecha la cantidad especificada y asignar el resultado a la variable.
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).

Vea también
Operador >>
Operadores de asignación
Operadores de desplazamiento de bits
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Instrucciones
/ (Operador, Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Divide dos números y devuelve un resultado de punto flotante.

Sintaxis
expression1 / expression2

Elementos
expression1
Obligatorio. Cualquier expresión numérica.
expression2
Obligatorio. Cualquier expresión numérica.

Tipos admitidos
Todos los tipos numéricos, incluidos los tipos de punto flotante y sin signo y Decimal .

Resultado
El resultado es el cociente completo de expression1 dividido por expression2 , incluido el resto.
El operador \ (Visual Basic) devuelve el cociente entero, que quita el resto.

Comentarios
El tipo de datos del resultado depende de los tipos de los operandos. En la tabla siguiente se muestra cómo se
determina el tipo de datos del resultado.

T IP O S DE DATO S DE O P ERA N DO T IP O DE DATO S DE RESULTA DO S

Ambas expresiones son tipos de datos enteros (SByte, byte, Double


Short, ushort, Integer, UInteger, Long, ULong)

Una expresión es un tipo de datos único y la otra no es Single


Double

Una expresión es un tipo de datos decimal y la otra no es Decimal


Single o Double

Cualquier expresión es un tipo de datos Double Double

Antes de que se realice la división, las expresiones numéricas enteras se amplían a Double . Si asigna el resultado
a un tipo de datos entero, Visual Basic intenta convertir el resultado de Double a ese tipo. Esto puede producir
una excepción si el resultado no cabe en ese tipo. En concreto, vea "se ha intentado la división por cero" en esta
página de ayuda.
Si expression1 o expression2 se evalúa como Nothing, se trata como cero.

División intentada por cero


Si expression2 se evalúa como cero, el operador de / se comporta de forma diferente para los distintos tipos
de datos de operando. En la tabla siguiente se muestran los posibles comportamientos.

T IP O S DE DATO S DE O P ERA N DO C O M P O RTA M IEN TO SI EXPRESSION2 ES C ERO

Punto flotante ( Single o Double ) Devuelve Infinity (PositiveInfinity o NegativeInfinity) o NaN


(no es un número) si expression1 también es cero.

Decimal Produce DivideByZeroException

Entero (con signo o sin signo) Al intentar realizar la conversión de nuevo a un tipo entero se
produce OverflowException porque los tipos enteros no
pueden aceptar PositiveInfinity, NegativeInfinityo NaN

NOTE
El operador de / se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. Si el código usa este operador en una clase o
estructura de este tipo, asegúrese de entender su comportamiento redefinido. Para obtener más información, consulta
Operator Procedures.

Ejemplo
En este ejemplo se usa el operador / para realizar una división de punto flotante. El resultado es el cociente de
los dos operandos.

Dim resultValue As Double


resultValue = 10 / 4
resultValue = 10 / 3

Las expresiones del ejemplo anterior devuelven los valores 2,5 y 3,333333. Tenga en cuenta que el resultado es
siempre de punto flotante ( Double ), aunque ambos operandos son constantes de tipo entero.

Vea también
/= (Operador) (Visual Basic)
Operador (Visual Basic)
Tipos de datos de resultados de operador
Operadores aritméticos
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Operadores aritméticos en Visual Basic
/= (Operador, Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Divide el valor de una variable o propiedad por el valor de una expresión y asigna el resultado de punto flotante a
la variable o propiedad.

Sintaxis
variableorproperty /= expression

Elementos
variableorproperty
Obligatorio. Cualquier variable o propiedad numérica.
expression
Obligatorio. Cualquier expresión numérica.

Comentarios
El elemento del lado izquierdo del operador /= puede ser una variable escalar simple, una propiedad o un
elemento de una matriz. La variable o la propiedad no pueden ser de solo lectura.
El operador /= divide primero el valor de la variable o propiedad (en el lado izquierdo del operador) por el valor
de la expresión (en el lado derecho del operador). A continuación, el operador asigna el resultado de punto
flotante de esa operación a la variable o propiedad.
Esta instrucción asigna un valor Double a la variable o propiedad de la izquierda. Si Option Strict es On ,
variableorproperty debe ser Double . Si Option Strict es Off , Visual Basic realiza una conversión implícita y
asigna el valor resultante a variableorproperty , con un posible error en tiempo de ejecución. Para obtener más
información, vea conversiones de ampliación y restricción y Option Strict (instrucción).

Sobrecarga
El operador/(Visual Basic) se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir
su comportamiento cuando un operando tiene el tipo de esa clase o estructura. La sobrecarga del operador /
afecta al comportamiento del operador /= . Si el código usa /= en una clase o estructura que sobrecarga / ,
asegúrese de que entiende su comportamiento redefinido. Para obtener más información, consulta Operator
Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador /= para dividir una variable Integer por un segundo y asignar el
cociente a la primera variable.

Dim var1 As Integer = 12


Dim var2 As Integer = 3
var1 /= var2
' The value of var1 is now 4.
Vea también
Operador/(Visual Basic)
\= (operador)
Operadores de asignación
Operadores aritméticos
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Instrucciones
\ (Operador, Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Divide dos números y devuelve un resultado entero.

Sintaxis
expression1 \ expression2

Elementos
expression1
Obligatorio. Cualquier expresión numérica.
expression2
Obligatorio. Cualquier expresión numérica.

Tipos admitidos
Todos los tipos numéricos, incluidos los tipos de punto flotante y sin signo y Decimal .

Resultado
El resultado es el cociente entero de expression1 dividida por expression2 , que descarta cualquier resto y solo
conserva la parte entera. Esto se conoce como truncamiento.
El tipo de datos del resultado es un tipo numérico adecuado para los tipos de datos de expression1 y
expression2 . Vea las tablas "aritmética de enteros" en tipos de datos de resultados de operadores.

El operador/(Visual Basic) devuelve el cociente completo, que conserva el resto de la parte fraccionaria.

Comentarios
Antes de realizar la división, Visual Basic intenta convertir cualquier expresión numérica de punto flotante en
Long . Si Option Strict se On , se produce un error del compilador. Si Option Strict se Off , es posible un
OverflowException si el valor está fuera del intervalo del tipo de datos Long. La conversión a Long también está
sujeta a redondeo bancario. Para obtener más información, vea "partes fraccionarias" en funciones de
conversión de tipos.
Si expression1 o expression2 se evalúa como Nothing, se trata como cero.

División intentada por cero


Si expression2 se evalúa como cero, el operador de \ produce una excepción DivideByZeroException. Esto es
así para todos los tipos de datos numéricos de los operandos.
NOTE
El operador de \ se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. Si el código usa este operador en una clase o
estructura de este tipo, asegúrese de entender su comportamiento redefinido. Para obtener más información, consulta
Operator Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador \ para realizar la división de enteros. El resultado es un entero que
representa el cociente entero de los dos operandos, con el resto descartado.

Dim resultValue As Integer


resultValue = 11 \ 4
resultValue = 9 \ 3
resultValue = 100 \ 3
resultValue = 67 \ -3

Las expresiones del ejemplo anterior devuelven los valores 2, 3, 33 y-22, respectivamente.

Vea también
\= (operador)
Operador/(Visual Basic)
Option Strict (instrucción)
Operadores aritméticos
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Operadores aritméticos en Visual Basic
\= (operador)
27/11/2019 • 2 minutes to read • Edit Online

Divide el valor de una variable o propiedad por el valor de una expresión y asigna el resultado entero a la variable
o propiedad.

Sintaxis
variableorproperty \= expression

Elementos
variableorproperty
Obligatorio. Cualquier variable o propiedad numérica.
expression
Obligatorio. Cualquier expresión numérica.

Comentarios
El elemento del lado izquierdo del operador \= puede ser una variable escalar simple, una propiedad o un
elemento de una matriz. La variable o la propiedad no pueden ser de solo lectura.
El operador \= divide el valor de una variable o propiedad a su izquierda por el valor de su derecha, y asigna el
resultado entero a la variable o propiedad de su izquierda.
Para obtener más información sobre la división de enteros, vea \ (operador Visual Basic).

Sobrecarga
El operador de \ se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. La sobrecarga del operador \
afecta al comportamiento del operador \= . Si el código usa \= en una clase o estructura que sobrecarga \ ,
asegúrese de que entiende su comportamiento redefinido. Para obtener más información, consulta Operator
Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador \= para dividir una variable Integer por un segundo y asignar el
resultado entero a la primera variable.

Dim var1 As Integer = 10


Dim var2 As Integer = 3
var1 \= var2
' The value of var1 is now 3.

Vea también
Operador (Visual Basic)
/= (Operador) (Visual Basic)
Operadores de asignación
Operadores aritméticos
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Instrucciones
^ (Operador, Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Eleva un número a la potencia de otro número.

Sintaxis
number ^ exponent

Elementos
number
Obligatorio. Cualquier expresión numérica.
exponent
Obligatorio. Cualquier expresión numérica.

Resultado
El resultado es number elevado a la potencia de exponent , siempre como un valor de Double .

Tipos admitidos
Double . Los operandos de cualquier tipo diferente se convierten en Double .

Comentarios
Visual Basic siempre realiza la exponenciación en el tipo de datos Double.
El valor de exponent puede ser fraccionario, negativo o ambos.
Cuando se realiza más de una exponenciación en una sola expresión, el operador de ^ se evalúa como se
encuentra de izquierda a derecha.

NOTE
El operador de ^ se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. Si el código usa este operador en una clase o
estructura de este tipo, asegúrese de entender su comportamiento redefinido. Para obtener más información, consulta
Operator Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador ^ para elevar un número a la potencia de un exponente. El resultado
es el primer operando elevado a la potencia del segundo.
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)

En el ejemplo anterior se generan los siguientes resultados:


exp1 está establecido en 4 (2 cuadrados).
exp2 está establecido en 19683 (3 cubos y, a continuación, ese valor en cubo).
exp3 se establece en-125 (-5 cubed).
exp4 se establece en 625 (-5 en la cuarta potencia).
exp5 está establecido en 2 (raíz del cubo de 8).
exp6 se establece en 0,5 (1,0 dividido por la raíz del cubo de 8).
Tenga en cuenta la importancia de los paréntesis en las expresiones del ejemplo anterior. Debido a la prioridad de
los operadores, Visual Basic normalmente realiza el operador ^ antes que cualquier otro, incluso el operador
unario – . Si exp4 y exp6 se hubieran calculado sin paréntesis, habría generado los siguientes resultados:
exp4 = -5 ^ 4 se calcularían como – (5 a la cuarta potencia), lo que daría como resultado-625.
se calcularía como (8 para la potencia – 1 o 0,125) dividido entre 3,0, lo que daría lugar a
exp6 = 8 ^ -1.0 / 3.0
0.041666666666666666666666666666667.

Vea también
Operador ^=
Operadores aritméticos
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Operadores aritméticos en Visual Basic
^= (Operador, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Eleva el valor de una variable o propiedad a la potencia de una expresión y asigna el resultado a la variable o
propiedad.

Sintaxis
variableorproperty ^= expression

Elementos
variableorproperty
Obligatorio. Cualquier variable o propiedad numérica.
expression
Obligatorio. Cualquier expresión numérica.

Comentarios
El elemento del lado izquierdo del operador ^= puede ser una variable escalar simple, una propiedad o un
elemento de una matriz. La variable o la propiedad no pueden ser de solo lectura.
El operador ^= primero genera el valor de la variable o la propiedad (en el lado izquierdo del operador) con la
potencia del valor de la expresión (en el lado derecho del operador). A continuación, el operador asigna el
resultado de la operación a la variable o propiedad.
Visual Basic siempre realiza la exponenciación en el tipo de datos Double. Los operandos de cualquier tipo
diferente se convierten en Double y el resultado siempre es Double .
El valor de expression puede ser fraccionario, negativo o ambos.

Sobrecarga
El operador ^ se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. La sobrecarga del operador ^
afecta al comportamiento del operador ^= . Si el código usa ^= en una clase o estructura que sobrecarga ^ ,
asegúrese de que entiende su comportamiento redefinido. Para obtener más información, consulta Operator
Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador ^= para elevar el valor de una variable Integer a la potencia de una
segunda variable y asignar el resultado a la primera variable.

Dim var1 As Integer = 10


Dim var2 As Integer = 3
var1 ^= var2
' The value of var1 is now 1000.
Vea también
Operador ^
Operadores de asignación
Operadores aritméticos
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Instrucciones
?. etc? () operadores condicionales null (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Comprueba el valor del operando izquierdo para null ( Nothing ) antes de realizar una operación de acceso a
miembros ( ?. ) o de índice ( ?() ). Devuelve Nothing si el operando izquierdo se evalúa como Nothing . Tenga en
cuenta que, en las expresiones que normalmente devuelven tipos de valor, el operador condicional null devuelve un
Nullable<T>.
Estos operadores le ayudan a escribir menos código para controlar las comprobaciones de valores NULL,
especialmente cuando desciende en estructuras de datos. Por ejemplo:

' 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 la comparación, el código alternativo para la primera de estas expresiones sin un operador condicional NULL
es:

Dim length As Integer


If customers IsNot Nothing Then
length = customers.Length
End If

A veces es necesario realizar una acción en un objeto que puede ser null, en función del valor de un miembro
booleano en ese objeto (como la propiedad booleana IsAllowedFreeShipping en el ejemplo siguiente):

Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.

If customer IsNot Nothing AndAlso customer.IsAllowedFreeShipping Then


ApplyFreeShippingToOrders(customer)
End If

Puede acortar el código y evitar comprobar manualmente si hay valores NULL mediante el operador condicional
null de la siguiente manera:

Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.

If customer?.IsAllowedFreeShipping Then ApplyFreeShippingToOrders(customer)

Los operadores de condición NULL se cortocircuitan. Si una operación de una cadena de operaciones de índice y
acceso a miembros condicionales devuelve Nothing , se detiene el resto de la ejecución de la cadena. En el ejemplo
siguiente, C(E) no se evalúa si A , B o C se evalúan como Nothing .

A?.B?.C?(E)
Otro uso para el acceso de miembro condicional NULL es invocar delegados de una manera segura para
subprocesos con mucho menos código. En el ejemplo siguiente se definen dos tipos, un NewsBroadcaster y un
NewsReceiver . El delegado de NewsBroadcaster.SendNews envía los elementos de noticias al receptor.

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

Si no hay ningún elemento en la lista de invocación de SendNews , el delegado de SendNews produce una
NullReferenceException. Antes de los operadores condicionales null, el código como el siguiente garantiza que la
lista de invocación de delegado no se Nothing :

SendNews = SendNews.Combine({SendNews, client})


If SendNews IsNot Nothing Then
SendNews("Just in...")
End If

La nueva manera es mucho más sencilla:

SendNews = SendNews.Combine({SendNews, client})


SendNews?.Invoke("Just in...")

La nueva forma de hacerlo es segura para los subprocesos porque el compilador genera código para evaluar
SendNews solo una vez, manteniendo el resultado en una variable temporal. Debe llamar explícitamente al método
Invoke porque no hay ninguna sintaxis de invocación del delegado null condicional SendNews?(String) .

Vea también
Operadores (Visual Basic)
Guía de programación en Visual Basic
Referencia del lenguaje Visual Basic
?. etc? () operadores condicionales null (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Comprueba el valor del operando izquierdo para null ( Nothing ) antes de realizar una operación de acceso a
miembros ( ?. ) o de índice ( ?() ). Devuelve Nothing si el operando izquierdo se evalúa como Nothing . Tenga en
cuenta que, en las expresiones que normalmente devuelven tipos de valor, el operador condicional null devuelve
un Nullable<T>.
Estos operadores le ayudan a escribir menos código para controlar las comprobaciones de valores NULL,
especialmente cuando desciende en estructuras de datos. Por ejemplo:

' 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 la comparación, el código alternativo para la primera de estas expresiones sin un operador condicional NULL
es:

Dim length As Integer


If customers IsNot Nothing Then
length = customers.Length
End If

A veces es necesario realizar una acción en un objeto que puede ser null, en función del valor de un miembro
booleano en ese objeto (como la propiedad booleana IsAllowedFreeShipping en el ejemplo siguiente):

Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.

If customer IsNot Nothing AndAlso customer.IsAllowedFreeShipping Then


ApplyFreeShippingToOrders(customer)
End If

Puede acortar el código y evitar comprobar manualmente si hay valores NULL mediante el operador condicional
null de la siguiente manera:

Dim customer = FindCustomerByID(123) 'customer will be Nothing if not found.

If customer?.IsAllowedFreeShipping Then ApplyFreeShippingToOrders(customer)

Los operadores de condición NULL se cortocircuitan. Si una operación de una cadena de operaciones de índice y
acceso a miembros condicionales devuelve Nothing , se detiene el resto de la ejecución de la cadena. En el ejemplo
siguiente, C(E) no se evalúa si A , B o C se evalúan como Nothing .

A?.B?.C?(E)
Otro uso para el acceso de miembro condicional NULL es invocar delegados de una manera segura para
subprocesos con mucho menos código. En el ejemplo siguiente se definen dos tipos, un NewsBroadcaster y un
NewsReceiver . El delegado de NewsBroadcaster.SendNews envía los elementos de noticias al receptor.

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

Si no hay ningún elemento en la lista de invocación de SendNews , el delegado de SendNews produce una
NullReferenceException. Antes de los operadores condicionales null, el código como el siguiente garantiza que la
lista de invocación de delegado no se Nothing :

SendNews = SendNews.Combine({SendNews, client})


If SendNews IsNot Nothing Then
SendNews("Just in...")
End If

La nueva manera es mucho más sencilla:

SendNews = SendNews.Combine({SendNews, client})


SendNews?.Invoke("Just in...")

La nueva forma de hacerlo es segura para los subprocesos porque el compilador genera código para evaluar
SendNews solo una vez, manteniendo el resultado en una variable temporal. Debe llamar explícitamente al método
Invoke porque no hay ninguna sintaxis de invocación del delegado null condicional SendNews?(String) .

Vea también
Operadores (Visual Basic)
Guía de programación en Visual Basic
Referencia del lenguaje Visual Basic
AddressOf (Operador) (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Crea una instancia de delegado que hace referencia al procedimiento específico.

Sintaxis
AddressOf procedurename

Elementos
procedurename
Obligatorio. Especifica el procedimiento al que debe hacer referencia el delegado recién creado.

Comentarios
El operador AddressOf crea un delegado que apunta a la función Sub o especificada por procedurename . Cuando
el procedimiento especificado es un método de instancia, el delegado hace referencia tanto a la instancia como
al método. A continuación, cuando se invoca al delegado, se llama al método especificado de la instancia
especificada.
El operador AddressOf se puede usar como operando de un constructor delegado o se puede usar en un
contexto en el que el compilador puede determinar el tipo del delegado.

Ejemplo
En este ejemplo se usa el operador AddressOf para designar un delegado que controle el evento de Click de
un botón.

' Add the following line to Sub Form1_Load().


AddHandler Button1.Click, AddressOf Button1_Click

Ejemplo
En el ejemplo siguiente se usa el operador AddressOf para designar la función de inicio de un subproceso.

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
Vea también
Declare (instrucción)
Function (instrucción)
Sub (instrucción)
Delegados
And (Operador, Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

Realiza una conjunción lógica de dos expresiones Boolean o una conjunción bit a bit de dos expresiones
numéricas.

Sintaxis
result = expression1 And expression2

Elementos
result
Obligatorio. Cualquier Boolean o expresión numérica. En la comparación booleana, result es la conjunción
lógica de dos valores Boolean . Para las operaciones bit a bit, result es un valor numérico que representa la
conjunción bit a bit de dos modelos de bits numéricos.
expression1
Obligatorio. Cualquier Boolean o expresión numérica.
expression2
Obligatorio. Cualquier Boolean o expresión numérica.

Comentarios
En la comparación booleana, result se True si y solo si expression1 y expression2 se evalúan como True . En
la tabla siguiente se muestra cómo se determina result .

SI EXPRESSION1 ES Y EXPRESSION2 ES EL VA LO R DE RESULT ES

True True True

True False False

False True False

False False False

NOTE
En una comparación booleana, el operador And siempre evalúa ambas expresiones, lo que podría incluir la realización de
llamadas a procedimientos. El operador AndAlso realiza un cortocircuito, lo que significa que si expression1 es False ,
expression2 no se evalúa.

Cuando se aplica a valores numéricos, el operador And realiza una comparación bit a bit de los bits colocados de
forma idéntica en dos expresiones numéricas y establece el bit correspondiente en result según la tabla
siguiente.
SI EL B IT DE EXPRESSION1 ES Y EL B IT DE EXPRESSION2 ES EL B IT DE RESULT ES

1 1 1

1 0 0

0 1 0

0 0 0

NOTE
Puesto que los operadores lógicos y bit a bit tienen una prioridad más baja que otros operadores aritméticos y relacionales,
las operaciones bit a bit deben ir entre paréntesis para garantizar resultados precisos.

Tipos de datos
Si los operandos constan de una expresión de Boolean y una expresión numérica, Visual Basic convierte la
expresión de Boolean en un valor numérico (– 1 para True y 0 para False ) y realiza una operación bit a bit.
Para una comparación booleana, el tipo de datos del resultado es Boolean . En una comparación bit a bit, el tipo
de datos del resultado es un tipo numérico adecuado para los tipos de datos de expression1 y expression2 . Vea
la tabla "comparaciones relacionales y bit a bit" en tipos de datos de resultados de operadores.

NOTE
El operador de And se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. Si el código usa este operador en una clase o
estructura de este tipo, asegúrese de entender su comportamiento redefinido. Para obtener más información, consulta
Operator Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador And para realizar una conjunción lógica entre dos expresiones. El
resultado es un valor Boolean que indica si las dos expresiones son True .

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

En el ejemplo anterior se generan los resultados de True y False , respectivamente.

Ejemplo
En el ejemplo siguiente se usa el operador And para realizar una conjunción lógica de los bits individuales de dos
expresiones numéricas. El bit en el patrón del resultado se establece si los bits correspondientes de los operandos
están establecidos en 1.
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)

En el ejemplo anterior se generan los resultados de 8, 2 y 0, respectivamente.

Vea también
Operadores lógicos y bit a bit (Visual Basic)
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
AndAlso (operador)
Operadores lógicos y bit a bit en Visual Basic
AndAlso (Operador, Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

Realiza una conjunción lógica de cortocircuito en dos expresiones.

Sintaxis
result = expression1 AndAlso expression2

Elementos
T ÉRM IN O DEF IN IC IÓ N

result Obligatorio. Cualquier expresión Boolean . El resultado es el


Boolean resultado de la comparación de las dos
expresiones.

expression1 Obligatorio. Cualquier expresión Boolean .

expression2 Obligatorio. Cualquier expresión Boolean .

Comentarios
Se dice que una operación lógica es cortocircuitada si el código compilado puede omitir la evaluación de una
expresión en función del resultado de otra expresión. Si el resultado de la primera expresión evaluada determina
el resultado final de la operación, no es necesario evaluar la segunda expresión, porque no puede cambiar el
resultado final. El cortocircuito puede mejorar el rendimiento si la expresión omitida es compleja o si implica
llamadas a procedimientos.
Si ambas expresiones se evalúan como True , se True``result . En la tabla siguiente se muestra cómo se
determina result .

SI EXPRESSION1 ES Y EXPRESSION2 ES EL VA LO R DE RESULT ES

True True True

True False False

False (no evaluado) False

Tipos de datos
El operador AndAlso solo se define para el tipo de datos Boolean. Visual Basic convierte cada operando según
sea necesario para Boolean antes de evaluar la expresión. Si asigna el resultado a un tipo numérico, Visual Basic
lo convierte de Boolean a ese tipo, de modo que False se convierte en 0 y True se vuelve -1 . Para obtener
más información, vea conversiones de tipo booleano.
Sobrecarga
El operador and y el operador IsFalse se pueden sobrecargar, lo que significa que una clase o estructura puede
volver a definir su comportamiento cuando un operando tiene el tipo de esa clase o estructura. La sobrecarga de
los operadores And y IsFalse afecta al comportamiento del operador AndAlso . Si el código utiliza AndAlso en
una clase o estructura que sobrecarga And y IsFalse , asegúrese de entender su comportamiento redefinido.
Para obtener más información, consulta Operator Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador AndAlso para realizar una conjunción lógica entre dos expresiones. El
resultado es un valor Boolean que representa si toda la expresión conunida es true. Si la primera expresión es
False , la segunda no se evalúa.

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

En el ejemplo anterior se generan los resultados de True , False y False , respectivamente. En el cálculo de
secondCheck , la segunda expresión no se evalúa porque la primera ya está False . Sin embargo, la segunda
expresión se evalúa en el cálculo de thirdCheck .

Ejemplo
En el ejemplo siguiente se muestra un procedimiento Function que busca un valor determinado entre los
elementos de una matriz. Si la matriz está vacía, o si se ha superado la longitud de la matriz, la instrucción While
no probará el elemento de la matriz con el valor de búsqueda.

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

Vea también
Operadores lógicos y bit a bit (Visual Basic)
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
And (operador)
IsFalse (operador)
Operadores lógicos y bit a bit en Visual Basic
Await (Operador) (Visual Basic)
15/01/2020 • 7 minutes to read • Edit Online

El operador Await se aplica a un operando de un método asincrónico o a una expresión lambda para
suspender la ejecución del método hasta que la tarea en espera se complete. La tarea representa el trabajo en
curso.
El método en el que se utiliza Await debe tener un modificador Async . Este tipo de método, que se define
mediante el modificador Async y que generalmente contiene una o más expresiones Await , se denomina
método asincrónico.

NOTE
Las palabras clave Async y Await se incluyeron en Visual Studio 2012. Para obtener una introducción a la
programación asincrónica, vea programación asincrónica con Async y Await.

Normalmente, la tarea a la que se aplica el operador Await es el valor devuelto de una llamada a un método
que implementa el modelo asincrónico basado en tareas, es decir, un Task o un Task<TResult>.
En el código siguiente, el método HttpClientGetByteArrayAsync devuelve getContentsTask , un tipo
Task(Of Byte()) . La tarea garantiza que la matriz de bytes real se generará cuando finalice la operación. El
operador Await se aplica a getContentsTask para suspender la ejecución en SumPageSizesAsync hasta que se
complete getContentsTask . Mientras tanto, el control vuelve al llamador de SumPageSizesAsync . Cuando
getContentsTask haya finalizado, la expresión Await se evalúa como una matriz de bytes.

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

IMPORTANT
Para obtener el ejemplo completo, vea Walkthrough: Accessing the Web by Using Async and Await (Tutorial: Acceso a la
web usando Async y Await). Puede descargar el ejemplo desde Ejemplos de código para desarrolladores en el sitio web
de Microsoft. El ejemplo está en el proyecto AsyncWalkthrough_HttpClient.

Si Await se aplica al resultado de una llamada al método que devuelve Task(Of TResult) , el tipo de la
expresión Await será TResult. Si Await se aplica al resultado de una llamada al método que devuelve Task , la
expresión Await no devuelve un valor. En el siguiente ejemplo se ilustra la diferencia.
' 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()

Una expresión o instrucción Await no bloquea el subproceso en el que se ejecuta. En su lugar, hace que el
compilador suscriba el resto del método asincrónico, después de la expresión Await , como una continuación
de la tarea esperada. A continuación, el control vuelve al llamador del método asincrónico. Cuando la tarea se
completa, invoca su continuación y la ejecución del método asincrónico se reanuda donde se quedó.
Una expresión Await solo puede aparecer en el cuerpo de un método envolvente inmediato o una expresión
lambda marcados con el modificador Async . El término Await solo sirve como palabra clave en ese contexto.
En cualquier otra parte, se interpretará como identificador. Dentro del método Async o de la expresión lambda,
una expresión de Await no puede aparecer en una expresión de consulta, en el bloque Catch o Finally de
una instrucción try... Detectar... Finally, en la expresión de variable de control de bucle de un bucle For o
For Each , o en el cuerpo de una instrucción SyncLock .

Excepciones
La mayoría de los métodos asincrónicos devuelven un objeto Task o Task<TResult>. Las propiedades de la tarea
devuelta llevan información acerca de su estado e historial, por ejemplo, si la tarea se ha completado, si el
método asincrónico produjo una excepción o si se ha cancelado y cuál es el resultado final. El operador Await
tiene acceso a esas propiedades.
Si espera un método asincrónico que devuelve una tarea y causa una excepción, el operador Await volverá a
generar la excepción.
Si espera un método asincrónico que devuelve una tarea y se cancela, el operador Await volverá a generar
OperationCanceledException.
Una única tarea en estado de error puede reflejar varias excepciones. Por ejemplo, la tarea podría ser el
resultado de una llamada a Task.WhenAll. Cuando espera dicha tarea, la operación await vuelve a generar
únicamente una de las excepciones. Sin embargo, no se puede predecir cuál de las excepciones se vuelve a
generar.
Para obtener ejemplos de control de errores en métodos asincrónicos, vea try... Detectar... Finally.

Ejemplo
El ejemplo siguiente de Windows Forms muestra el uso de Await en un método asincrónico,
WaitAsynchronouslyAsync . Compare el comportamiento de dicho método con el de WaitSynchronously . Sin un
operador Await , WaitSynchronously se ejecuta sincrónicamente a pesar del uso del modificador Async en su
definición y una llamada a Thread.Sleep en el cuerpo.
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

Vea también
Programación asincrónica con Async y Await
Tutorial: Acceso a Web mediante Async y Await
Async
DirectCast (Operador) (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Introduce una operación de conversión de tipos basada en la herencia o la implementación.

Comentarios
DirectCast no utiliza las rutinas auxiliares de Visual Basic en tiempo de ejecución para la conversión, por lo que
puede proporcionar un rendimiento algo mejor que CType al convertir a y desde el tipo de datos Object .
La palabra clave DirectCast se utiliza de manera similar a la forma en que se usa la función ctype y la palabra
clave del operador TryCast . Proporcione una expresión como primer argumento y un tipo al que convertirlo
como segundo argumento. DirectCast requiere una relación de herencia o implementación entre los tipos de
datos de los dos argumentos. Esto significa que un tipo debe heredar de o implementar el otro.

Errores y errores
DirectCast genera un error del compilador si detecta que no existe ninguna relación de herencia o de
implementación. Pero la falta de un error del compilador no garantiza una conversión correcta. Si la conversión
deseada es de restricción, podría producirse un error en tiempo de ejecución. Si esto sucede, el tiempo de
ejecución produce un error de InvalidCastException.

Palabras clave para conversiones


A continuación se muestra una comparación de las palabras clave de conversión de tipos.

REL A C IÓ N EN T RE ERRO R EN T IEM P O DE


PA L A B RA C L AVE T IP O S DE DATO S A RGUM EN TO S E JEC UC IÓ N

Función CType Cualquier tipo de datos La conversión de ampliación Produce


o de restricción debe InvalidCastException
definirse entre los dos tipos
de datos

DirectCast Cualquier tipo de datos Un tipo debe heredar de o Produce


implementar el otro tipo InvalidCastException

TryCast (operador) Solo tipos de referencia Un tipo debe heredar de o No devuelve nada
implementar el otro tipo

Ejemplo
En el ejemplo siguiente se muestran dos usos de DirectCast , uno que produce un error en tiempo de ejecución
y otro que se ejecuta correctamente.
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)

En el ejemplo anterior, el tipo en tiempo de ejecución de q es Double . CType se realiza correctamente porque
Double se puede convertir en Integer . Sin embargo, se produce un error en el primer DirectCast en tiempo
de ejecución porque el tipo de Double en tiempo de ejecución no tiene ninguna relación de herencia con
Integer , aunque exista una conversión. La segunda DirectCast se realiza correctamente porque convierte de
tipo Form al tipo Control, del que Form hereda.

Vea también
Convert.ChangeType
Conversiones de ampliación y de restricción
Conversiones implícitas y explícitas
Expresión de función (Visual Basic)
08/01/2020 • 5 minutes to read • Edit Online

Declara los parámetros y el código que definen una expresión lambda de función.

Sintaxis
Function ( [ parameterlist ] ) expression
- or -
Function ( [ parameterlist ] )
[ statements ]
End Function

Componentes de
T ÉRM IN O DE ESQ UEM A JSO N

parameterlist Opcional. Una lista de nombres de variables locales que


representan los parámetros de este procedimiento. Los
paréntesis deben estar presentes incluso cuando la lista esté
vacía. Vea lista de parámetros.

expression Obligatoria. Expresión única. El tipo de la expresión es el tipo


de valor devuelto de la función.

statements Obligatoria. Una lista de instrucciones que devuelven un valor


mediante la instrucción Return . (Consulte la instrucción
return). El tipo del valor devuelto es el tipo de valor devuelto
de la función.

Notas
Una expresión lambda es una función sin un nombre que calcula y devuelve un valor. Puede usar una expresión
lambda en cualquier lugar en el que pueda usar un tipo de delegado, excepto como argumento para
RemoveHandler . Para obtener más información sobre los delegados y el uso de expresiones lambda con delegados,
vea instrucción Delegate y conversión de delegado relajado.

Sintaxis de la expresión lambda


La sintaxis de una expresión lambda es similar a la de una función estándar. Las diferencias son las siguientes:
Una expresión lambda no tiene un nombre.
Las expresiones lambda no pueden tener modificadores, como Overloads o Overrides .
Las expresiones lambda no usan una cláusula As para designar el tipo de valor devuelto de la función. En
su lugar, el tipo se deduce del valor que el cuerpo de una expresión lambda de una sola línea evalúa como, o
el valor devuelto de una expresión lambda de varias líneas. Por ejemplo, si el cuerpo de una expresión
lambda de una sola línea es Where cust.City = "London" , su tipo de valor devuelto es Boolean .
El cuerpo de una expresión lambda de una sola línea debe ser una expresión, no una instrucción. El cuerpo
puede constar de una llamada a un procedimiento de función, pero no una llamada a un procedimiento
Sub.
Todos los parámetros deben tener tipos de datos especificados o todos deben ser inferidos.
No se permiten parámetros opcionales y ParamArray.
No se permiten parámetros genéricos.

Ejemplo
En los ejemplos siguientes se muestran dos maneras de crear expresiones lambda simples. El primero usa un Dim
para proporcionar un nombre para la función. Para llamar a la función, envíe un valor para el parámetro.

Dim add1 = Function(num As Integer) num + 1

' The following line prints 6.


Console.WriteLine(add1(5))

Ejemplo
Como alternativa, puede declarar y ejecutar la función al mismo tiempo.

Console.WriteLine((Function(num As Integer) num + 1)(5))

Ejemplo
A continuación se muestra un ejemplo de una expresión lambda que incrementa su argumento y devuelve el valor.
En el ejemplo se muestra la sintaxis de la expresión lambda de una sola línea y de varias líneas para una función.
Para obtener más ejemplos, consulte expresiones lambda.

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

Ejemplo
Las expresiones lambda subyacen a muchos de los operadores de consulta en Language-Integrated Query (LINQ)
y se pueden usar explícitamente en las consultas basadas en métodos. En el ejemplo siguiente se muestra una
consulta LINQ típica, seguida de la conversión de la consulta en formato de método.
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 obtener más información sobre los métodos de consulta, vea consultas. Para obtener más información acerca
de los operadores de consulta estándar, vea información general sobre operadores de consulta estándar.

Vea también
Function (instrucción)
Expresiones lambda
Operadores y expresiones
Instrucciones
Comparaciones de valores
Expresiones booleanas
If (operador)
Conversión de delegado flexible
GetType (Operador, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Devuelve un objeto Type para el tipo especificado. El objeto Type proporciona información sobre el tipo, como sus
propiedades, métodos y eventos.

Sintaxis
GetType(typename)

Parámetros
PA RÁ M ET RO DESC RIP C IÓ N

typename Nombre del tipo del que se desea obtener información.

Comentarios
El operador GetType devuelve el objeto Type para el typename especificado. Puede pasar el nombre de cualquier
tipo definido en typename . Entre estas estructuras se incluyen las siguientes:
Cualquier tipo de datos Visual Basic, como Boolean o Date .
Cualquier .NET Framework clase, estructura, módulo o interfaz, como System.ArgumentException o
System.Double.
Cualquier clase, estructura, módulo o interfaz definida por la aplicación.
Cualquier matriz definida por la aplicación.
Cualquier delegado definido por la aplicación.
Cualquier enumeración definida por Visual Basic, la .NET Framework o la aplicación.
Si desea obtener el objeto de tipo de una variable de objeto, use el método Type.GetType.
El operador GetType puede ser útil en las siguientes circunstancias:
Debe tener acceso a los metadatos de un tipo en tiempo de ejecución. El objeto Type proporciona
metadatos, como los miembros de tipo e información de implementación. Necesita esto, por ejemplo, para
reflejarse en un ensamblado. Para obtener más información, consulta System.Reflection.
Desea comparar dos referencias de objeto para ver si hacen referencia a instancias del mismo tipo. Si lo
hacen, GetType devuelve referencias al mismo objeto Type.

Ejemplo
En los siguientes ejemplos se muestra el operador de GetType en uso.
' 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())

Vea también
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Operadores y expresiones
GetXmlNamespace (Operador) (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Obtiene el objeto XNamespace que corresponde al prefijo de espacio de nombres XML especificado.

Sintaxis
GetXmlNamespace(xmlNamespacePrefix)

Elementos
xmlNamespacePrefix
Opcional. Cadena que identifica el prefijo del espacio de nombres XML. Si se proporciona, esta cadena debe ser un
identificador XML válido. Para obtener más información, vea nombres de elementos y atributos XML declarados. Si
no se especifica ningún prefijo, se devuelve el espacio de nombres predeterminado. Si no se especifica ningún
espacio de nombres predeterminado, se devuelve el espacio de nombres vacío.

Valor devuelto
Objeto XNamespace que corresponde al prefijo del espacio de nombres XML.

Comentarios
El operador GetXmlNamespace obtiene el XNamespace objeto que corresponde al xmlNamespacePrefix de prefijo de
espacio de nombres XML.
Puede usar prefijos de espacio de nombres XML directamente en literales XML y propiedades de eje XML. Sin
embargo, debe usar el operador GetXmlNamespace para convertir un prefijo de espacio de nombres en un objeto
XNamespace antes de poder usarlo en el código. Puede anexar un nombre de elemento no calificado a un objeto
XNamespace para obtener un objeto XName completo, que requieren muchos métodos LINQ to XML.

Ejemplo
En el ejemplo siguiente se importa ns como un prefijo de espacio de nombres XML. A continuación, usa el prefijo
del espacio de nombres para crear un literal XML y acceder al primer nodo secundario que tiene el nombre
completo ns:phone . A continuación, pasa ese nodo secundario a la subrutina ShowName , que construye un nombre
completo mediante el operador GetXmlNamespace . A continuación, la subrutina ShowName pasa el nombre completo
al método Ancestors para obtener el nodo primario ns:contact .
' 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

Cuando se llama a TestGetXmlNamespace.RunSample() , se muestra un cuadro de mensaje que contiene el texto


siguiente:
Name: Patrick Hines

Vea también
Imports (instrucción), espacio de nombres XML
Obtener acceso a XML en Visual Basic
If (Operador) (Visual Basic)
27/03/2020 • 6 minutes to read • Edit Online

Utiliza la evaluación de cortocircuito para devolver condicionalmente uno de dos valores. Se If puede llamar al
operador con tres argumentos o con dos argumentos.

Sintaxis
If( [argument1,] argument2, argument3 )

Si el operador llamó con tres argumentos


Cuando If se llama mediante tres argumentos, el primer argumento debe evaluarse como un valor que se
puede convertir como un Boolean archivo . Ese Boolean valor determinará cuál de los otros dos argumentos se
evalúa y se devuelve. La lista siguiente solo If se aplica cuando se llama al operador mediante tres argumentos.
Partes
T ÉRM IN O DEF IN IC IÓ N

argument1 Necesario. Boolean . Determina cuál de los otros


argumentos se va a evaluar y devolver.

argument2 Necesario. Object . Evaluado y devuelto argument1 si


True se evalúa como .

argument3 Necesario. Object . Evaluado y devuelto argument1 si


False se argument1 evalúa como o si es una variable
nullable Boolean que se evalúa como Nothing.

Un If operador al que se llama IIf con tres argumentos funciona como una función, excepto que utiliza la
evaluación de cortocircuito. Una IIf función siempre evalúa los tres argumentos, mientras que un If operador
que tiene tres argumentos evalúa solo dos de ellos. El If primer argumento se evalúa y el Boolean resultado
True False se convierte como un valor, o . Si el True valor argument2 es , se evalúa y argument3 se devuelve su
valor, pero no se evalúa. Si el valor Boolean de False argument3 la expresión es , se argument2 evalúa y se
devuelve su valor, pero no se evalúa. Los siguientes ejemplos ilustran el uso de If cuando se utilizan tres
argumentos:
' 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"))

En el ejemplo siguiente se muestra el valor de la evaluación de cortocircuitos. El ejemplo muestra dos number
intentos divisor de divisor dividir variable por variable excepto cuando es cero. En ese caso, se debe devolver
un 0 y no se debe intentar realizar la división porque se produciría un error en tiempo de ejecución. Dado If que
la expresión utiliza la evaluación de cortocircuito, evalúa el segundo o el tercer argumento, dependiendo del valor
del primer argumento. Si el primer argumento es true, el divisor no es cero y es seguro evaluar el segundo
argumento y realizar la división. Si el primer argumento es false, solo se evalúa el tercer argumento y se devuelve
un 0. Por lo tanto, cuando el divisor es 0, no se intenta realizar la división y no se produce ningún error. Sin IIf
embargo, dado que no utiliza la evaluación de cortocircuito, el segundo argumento se evalúa incluso cuando el
primer argumento es false. Esto provoca un error de división por cero en tiempo de ejecución.

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

Si operador llamó con dos argumentos


Se puede If omitir el primer argumento que se puede omitir. Esto permite llamar al operador mediante el uso
de solo dos argumentos. La lista siguiente solo If se aplica cuando se llama al operador con dos argumentos.
Partes
T ÉRM IN O DEF IN IC IÓ N

argument2 Necesario. Object . Debe ser un tipo de valor de referencia o


que acepta valores NULL. Evaluado y devuelto cuando se
evalúa Nothing como algo distinto de .

argument3 Necesario. Object . Evaluado y devuelto argument2 si


Nothing se evalúa como .

Cuando Boolean se omite el argumento, el primer argumento debe ser una referencia o un tipo de valor que
acepta valores NULL. Si el primer argumento Nothing se evalúa como , se devuelve el valor del segundo
argumento. En todos los demás casos, se devuelve el valor del primer argumento. En el ejemplo siguiente se
muestra cómo funciona esta evaluación:
' 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))

Vea también
IIf
Tipos de valores que aceptan valores NULL
Nothing
Is (Operador, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Compara dos variables de referencia de objeto.

Sintaxis
result = object1 Is object2

Elementos
result
Obligatorio. Cualquier valor de Boolean .
object1
Obligatorio. Cualquier nombre de Object .
object2
Obligatorio. Cualquier nombre de Object .

Comentarios
El operador Is determina si dos referencias de objeto hacen referencia al mismo objeto. Sin embargo, no
realiza comparaciones de valores. Si object1 y object2 hacen referencia a la misma instancia de objeto
exacta, se True``result . Si no es así, result se False .
también se puede usar Is con la palabra clave TypeOf para crear una expresión TypeOf ... Is , que comprueba
si una variable de objeto es compatible con un tipo de datos.

NOTE
La palabra clave Is también se usa en la Instrucción Case.

Ejemplo
En el ejemplo siguiente se usa el operador Is para comparar pares de referencias a objetos. Los resultados se
asignan a un valor Boolean que representa si los dos objetos son idénticos.
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 se muestra en el ejemplo anterior, puede utilizar el operador Is para probar los objetos enlazados en
tiempo de compilación y en tiempo de ejecución.

Vea también
TypeOf (operador)
IsNot (operador)
Operadores de comparación en Visual Basic
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Operadores y expresiones
IsFalse (Operador) (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Determina si una expresión es False .


No se puede llamar a IsFalse explícitamente en el código, pero el compilador Visual Basic puede usarlo para
generar código a partir de cláusulas AndAlso . Si define una clase o estructura y, a continuación, usa una variable
de ese tipo en una cláusula AndAlso , debe definir IsFalse en esa clase o estructura.
El compilador tiene en cuenta los operadores IsFalse y IsTrue como un par coincidente. Esto significa que si
define uno de ellos, también debe definir el otro.

NOTE
El operador de IsFalse se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando su operando tiene el tipo de esa clase o estructura. Si el código usa este operador en una clase o
estructura de este tipo, asegúrese de entender su comportamiento redefinido. Para obtener más información, consulta
Operator Procedures.

Ejemplo
En el ejemplo de código siguiente se define el contorno de una estructura que incluye definiciones para los
operadores IsFalse y IsTrue .

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

Vea también
IsTrue (operador)
Definir un operador
AndAlso (operador)
IsNot (Operador) (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Compara dos variables de referencia de objeto.

Sintaxis
result = object1 IsNot object2

Elementos
result Obligatorio. Valor Boolean .
object1 Obligatorio. Cualquier Object variable o expresión.
object2 Obligatorio. Cualquier Object variable o expresión.

Comentarios
El operador IsNot determina si dos referencias de objeto hacen referencia a objetos diferentes. Sin embargo,
no realiza comparaciones de valores. Si object1 y object2 hacen referencia a la misma instancia de objeto
exacta, se False``result . Si no es así, result se True .
IsNot es lo contrario del operador de Is . La ventaja de IsNot es que puede evitar una sintaxis poco
complicada con Not y Is , lo que puede resultar difícil de leer.
Puede usar los operadores Is y IsNot para probar los objetos enlazados en tiempo de compilación y en
tiempo de ejecución.

Ejemplo
En el ejemplo de código siguiente se usa el operador Is y el operador IsNot para realizar la misma
comparación.

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.")

Vea también
Is (operador)
TypeOf (operador)
Prioridad de operador en Visual Basic
Comprobar si dos objetos son iguales
IsTrue (Operador) (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Determina si una expresión es True .


No se puede llamar a IsTrue explícitamente en el código, pero el compilador Visual Basic puede usarlo para
generar código a partir de cláusulas OrElse . Si define una clase o estructura y, a continuación, usa una variable de
ese tipo en una cláusula OrElse , debe definir IsTrue en esa clase o estructura.
El compilador tiene en cuenta los operadores IsTrue y IsFalse como un par coincidente. Esto significa que si
define uno de ellos, también debe definir el otro.

Uso del compilador de IsTrue


Cuando haya definido una clase o estructura, puede usar una variable de ese tipo en una instrucción For , If ,
Else If o While , o en una cláusula When . Si lo hace, el compilador requiere un operador que convierta el tipo en
un valor Boolean para que pueda probar una condición. Busca un operador adecuado en el orden siguiente:
1. Operador de conversión de ampliación de la clase o estructura que se va a Boolean .
2. Operador de conversión de ampliación de la clase o estructura que se va a Boolean? .
3. Operador de IsTrue en la clase o estructura.
4. Conversión de restricción a Boolean? que no implica una conversión de Boolean a Boolean? .
5. Operador de conversión de restricción de la clase o estructura que se va a Boolean .
Si no ha definido ninguna conversión a Boolean o a un operador de IsTrue , el compilador indicará un error.

NOTE
El operador de IsTrue se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando su operando tiene el tipo de esa clase o estructura. Si el código usa este operador en una clase o
estructura de este tipo, asegúrese de entender su comportamiento redefinido. Para obtener más información, consulta
Operator Procedures.

Ejemplo
En el ejemplo de código siguiente se define el contorno de una estructura que incluye definiciones para los
operadores IsFalse y IsTrue .
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

Vea también
IsFalse (operador)
Definir un operador
OrElse (operador)
Like (operador, Visual Basic)
27/11/2019 • 10 minutes to read • Edit Online

Compara una cadena con un patrón.

IMPORTANT
El operador Like no se admite actualmente en los proyectos de .NET Core y .NET Standard.

Sintaxis
result = string Like pattern

Elementos
result
Obligatorio. Cualquier variable de Boolean . El resultado es un valor Boolean que indica si el string satisface o
no el pattern .
string
Obligatorio. Cualquier expresión String .
pattern
Obligatorio. Cualquier String expresión que se ajuste a las convenciones de coincidencia de patrones descritas
en "Comentarios".

Comentarios
Si el valor de string satisface el patrón incluido en pattern , se True``result . Si la cadena no satisface el
modelo, result se False . Si tanto string como pattern son cadenas vacías, el resultado es True .

Método de comparación
El comportamiento del operador Like depende de la instrucción Option Compare. El método predeterminado
de comparación de cadenas para cada archivo de código fuente es Option Compare Binary .

Opciones de patrón
La coincidencia de patrones integrada proporciona una herramienta versátil para comparaciones de cadenas. Las
características de coincidencia de patrones permiten hacer coincidir cada carácter de string con un carácter
específico, un carácter comodín, una lista de caracteres o un intervalo de caracteres. En la tabla siguiente se
muestran los caracteres permitidos en pattern y en qué coinciden.

C A RA C T ERES EN PATTERN C O IN C IDEN C IA S EN STRING

? Cualquier carácter individual


C A RA C T ERES EN PATTERN C O IN C IDEN C IA S EN STRING

* Cero o más caracteres

# Cualquier dígito individual (0 – 9)

[charlist] Cualquier carácter individual de charlist

[!charlist] Cualquier carácter individual que no esté en charlist

Listas de caracteres
Se puede usar un grupo de uno o varios caracteres ( charlist ) entre corchetes ( [ ] ) para buscar coincidencias
con cualquier carácter individual de string y puede incluir prácticamente cualquier código de carácter, incluidos
los dígitos.
Un signo de exclamación ( ! ) al principio de charlist significa que se realiza una coincidencia si se encuentra
algún carácter excepto los caracteres de charlist en string . Cuando se usa fuera de corchetes, el signo de
exclamación coincide con sí mismo.

Caracteres especiales
Para hacer coincidir los caracteres especiales entre corchetes ( [ ), signos de interrogación ( ? ), signo de número
( # ) y asterisco ( * ), escríbalos entre corchetes. El corchete de cierre ( ] ) no se puede usar dentro de un grupo
para que coincida, pero se puede usar fuera de un grupo como un carácter individual.
La [] de la secuencia de caracteres se considera una cadena de longitud cero ( "" ). Sin embargo, no puede
formar parte de una lista de caracteres entre corchetes. Si desea comprobar si una posición en string contiene
uno de un grupo de caracteres o ningún carácter, puede usar Like dos veces. Para obtener un ejemplo, vea
Cómo: buscar coincidencias de una cadena con un patrón.

Intervalos de caracteres
Mediante el uso de un guión ( – ) para separar los límites inferior y superior del intervalo, charlist puede
especificar un intervalo de caracteres. Por ejemplo, [A–Z] da como resultado una coincidencia si la posición de
carácter correspondiente en string contiene cualquier carácter dentro del intervalo A – Z y [!H–L] da como
resultado una coincidencia si la posición del carácter correspondiente contiene algún carácter situado fuera del
intervalo H - L .
Cuando se especifica un intervalo de caracteres, deben aparecer en orden ascendente, es decir, de menor a
mayor. Por lo tanto, [A–Z] es un patrón válido, pero [Z–A] no.
Varios intervalos de caracteres
Para especificar varios intervalos para la misma posición de carácter, colóquelos dentro de los mismos corchetes
sin delimitadores. Por ejemplo, [A–CX–Z] da como resultado una coincidencia si la posición de carácter
correspondiente en string contiene cualquier carácter dentro del intervalo A – C o el intervalo X - Z .
Uso del guión
Un guión ( – ) puede aparecer al principio (después de un signo de exclamación, si existe) o al final de charlist
para que coincida. En cualquier otra ubicación, el guión identifica un intervalo de caracteres delimitado por los
caracteres situados a cada lado del guión.
Secuencia de intercalación
El significado de un intervalo especificado depende del orden de los caracteres en tiempo de ejecución, según
determine Option Compare y la configuración regional del sistema en el que se está ejecutando el código. Con
Option Compare Binary , el intervalo [A–E] coincide con A , B , C , D y E . Con Option Compare Text , [A–E]
coincide con A , a , À , à , B , b , C , c , D , d , E y e . El intervalo no coincide con Ê o ê porque los
caracteres acentuados se intercalan después de los caracteres no acentuados en el criterio de ordenación.

Caracteres de dígrafo
En algunos idiomas, hay caracteres alfabéticos que representan dos caracteres independientes. Por ejemplo,
varios lenguajes usan el æ de caracteres para representar los caracteres a y e cuando aparecen juntos. El
operador Like reconoce que el carácter de un solo gráfico y los dos caracteres individuales son equivalentes.
Cuando se especifica un idioma que usa un carácter de dígrafo en la configuración regional del sistema, una
aparición del carácter de un solo gráfico en pattern o string coincide con la secuencia de dos caracteres
equivalentes de la otra cadena. De forma similar, un carácter de dígrafo en pattern entre corchetes (por sí solo,
en una lista o en un intervalo) coincide con la secuencia de dos caracteres equivalentes en string .

Sobrecarga
El operador de Like se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. Si el código usa este operador en
una clase o estructura de este tipo, asegúrese de entender su comportamiento redefinido. Para obtener más
información, consulta Operator Procedures.

Ejemplo
En este ejemplo se usa el operador Like para comparar cadenas con varios patrones. Los resultados van a una
variable Boolean que indica si cada cadena satisface el patrón.
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*"

Vea también
InStr
StrComp
Operadores de comparación
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Option Compare (instrucción)
Operadores y expresiones
Comprobar si una cadena coincide con un modelo
Operador mod (Visual Basic)
27/11/2019 • 6 minutes to read • Edit Online

Divide dos números y devuelve solo el resto.

Sintaxis
result = number1 Mod number2

Elementos
result
Obligatorio. Cualquier variable o propiedad numérica.
number1
Obligatorio. Cualquier expresión numérica.
number2
Obligatorio. Cualquier expresión numérica.

Tipos admitidos
todos los tipos numéricos. Esto incluye los tipos de punto flotante y sin signo y Decimal .

Resultado
El resultado es el resto después de que number1 se divida por number2 . Por ejemplo, la expresión 14 Mod 4 se
evalúa como 2.

NOTE
Hay una diferencia entre el resto y el módulo en las matemáticas, con resultados diferentes para los números negativos.
El operador de Mod en Visual Basic, el operador de op_Modulus de .NET Framework y la instrucción de REM Il
subyacente realizan una operación de resto.

El resultado de una operación de Mod conserva el signo del dividendo, number1 y, por tanto, puede ser positivo
o negativo. El resultado siempre está en el intervalo (- number2 , number2 ), exclusivo. Por ejemplo:
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

Comentarios
Si number1 o number2 es un valor de punto flotante, se devuelve el resto del punto flotante de la división. El
tipo de datos del resultado es el tipo de datos más pequeño que puede contener todos los valores posibles que
son el resultado de la división con los tipos de datos de number1 y number2 .
Si number1 o number2 se evalúa como Nothing, se trata como cero.
Entre los operadores relacionados se incluyen los siguientes:
El operador \ (Visual Basic) devuelve el cociente entero de una división. Por ejemplo, la expresión
14 \ 4 se evalúa como 3.

El operador/(Visual Basic) devuelve el cociente completo, incluido el resto, como un número de punto
flotante. Por ejemplo, la expresión 14 / 4 se evalúa como 3,5.

División intentada por cero


Si number2 se evalúa como cero, el comportamiento del operador Mod depende del tipo de datos de los
operandos:
Una división integral produce una excepción DivideByZeroException si number2 no se puede determinar en
tiempo de compilación y genera un error en tiempo de compilación
BC30542 Division by zero occurred while evaluating this expression si number2 se evalúa como cero en
tiempo de compilación.
Una división de punto flotante devuelve Double.NaN.

Fórmula equivalente
La expresión a Mod b es equivalente a cualquiera de las siguientes fórmulas:
a - (b * (a \ b))

a - (b * Fix(a / b))

Imprecisión de punto flotante


Al trabajar con números de punto flotante, recuerde que no siempre tienen una representación decimal exacta
en la memoria. Esto puede dar lugar a resultados inesperados de ciertas operaciones, como la comparación de
valores y el operador Mod . Para obtener más información, vea solución de problemas de tipos de datos.

Sobrecarga
El operador de Mod se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento. Si el código se aplica Mod a una instancia de una clase o estructura que incluya este tipo de
sobrecarga, asegúrese de que comprende su comportamiento redefinido. Para obtener más información,
consulta Operator Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador Mod para dividir dos números y devolver solo el resto. Si cualquier
número es un número de punto flotante, el resultado es un número de punto flotante que representa el resto.

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

Ejemplo
En el ejemplo siguiente se muestran los posibles imprecisión de operandos de punto flotante. En la primera
instrucción, los operandos son Double y 0,2 es una fracción binaria repetida infinitamente con un valor
almacenado de 0.20000000000000001. En la segunda instrucción, el carácter de tipo literal D fuerza a ambos
operandos a Decimal y 0,2 tiene una representación precisa.

firstResult = 2.0 Mod 0.2


' Double operation returns 0.2, not 0.
secondResult = 2D Mod 0.2D
' Decimal operation returns 0.

Vea también
Int
Fix
Operadores aritméticos
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Solución de problemas de tipos de datos
Operadores aritméticos en Visual Basic
Operador (Visual Basic)
Operador de nombre: Visual Basic
07/01/2020 • 2 minutes to read • Edit Online

El operador NameOf obtiene el nombre de una variable, un tipo o un miembro como la constante de cadena:

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 se muestra en el ejemplo anterior, en el caso de un tipo y un espacio de nombres, el nombre generado por
lo general no está completo.
El operador NameOf se evalúa en tiempo de compilación y no tiene efecto en tiempo de ejecución.
Puede usar el operador NameOf para hacer que el código de comprobación de argumentos sea más fácil de
mantener:

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

El operador NameOf está disponible en Visual Basic 14 y versiones posteriores.

Vea también
Referencia del lenguaje Visual Basic
Operadores (Visual Basic)
New (Operador, Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Presenta una cláusula New para crear una nueva instancia de objeto, especifica una restricción de constructor
en un parámetro de tipo o identifica un procedimiento Sub como un constructor de clase.

Comentarios
En una declaración o una instrucción de asignación, una cláusula New debe especificar una clase definida a
partir de la cual se pueda crear la instancia. Esto significa que la clase debe exponer uno o más constructores a
los que puede tener acceso el código de llamada.
Puede usar una cláusula New en una instrucción de declaración o una instrucción de asignación. Cuando se
ejecuta la instrucción, llama al constructor adecuado de la clase especificada, pasando los argumentos que ha
proporcionado. En el siguiente ejemplo se muestra la creación de instancias de una clase Customer que tiene
dos constructores, uno que no toma parámetros y otro que toma un parámetro de cadena:

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

Dado que las matrices son clases, New puede crear una nueva instancia de la matriz, como se muestra en el
ejemplo siguiente:

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}

El Common Language Runtime (CLR) produce un error de OutOfMemoryException si no hay suficiente


memoria para crear la nueva instancia.

NOTE
La palabra clave New también se usa en las listas de parámetros de tipo para especificar que el tipo proporcionado debe
exponer un constructor sin parámetros accesible. Para obtener más información sobre los parámetros de tipo y las
restricciones, vea Type List.
Para crear un procedimiento de constructor para una clase, establezca el nombre de una Sub procedimiento
en la palabra clave New . Para obtener más información, vea duración del objeto: cómo se crean y destruyen los
objetos.
La palabra clave New se puede usar en los siguientes contextos:
Dim (instrucción)
Of
Sub (instrucción)

Vea también
OutOfMemoryException
Palabras clave
Lista de tipos
Generic Types in Visual Basic
Duración de los objetos: cómo se crean y destruyen
Not (Operador, Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Realiza una negación lógica de una expresión de Boolean o una negación bit a bit en una expresión numérica.

Sintaxis
result = Not expression

Elementos
result
Obligatorio. Cualquier Boolean o expresión numérica.
expression
Obligatorio. Cualquier Boolean o expresión numérica.

Comentarios
En el caso de las expresiones Boolean , en la tabla siguiente se muestra cómo se determina result .

SI EXPRESSION ES EL VA LO R DE RESULT ES

True False

False True

En el caso de las expresiones numéricas, el operador Not invierte los valores de bit de cualquier expresión
numérica y establece el bit correspondiente en result según la tabla siguiente.

SI EL B IT DE EXPRESSION ES EL B IT DE RESULT ES

1 0

0 1

NOTE
Puesto que los operadores lógicos y bit a bit tienen una prioridad más baja que otros operadores aritméticos y relacionales,
las operaciones bit a bit deben ir entre paréntesis para garantizar una ejecución precisa.

Tipos de datos
En el caso de una negación booleana, el tipo de datos del resultado es Boolean . En el caso de una negación bit a
bit, el tipo de datos del resultado es el mismo que el de expression . Sin embargo, si la expresión es Decimal , el
resultado es Long .
Sobrecarga
El operador de Not se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando su operando tiene el tipo de esa clase o estructura. Si el código usa este operador en una
clase o estructura de este tipo, asegúrese de entender su comportamiento redefinido. Para obtener más
información, consulta Operator Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador Not para realizar una negación lógica en una expresión Boolean . El
resultado es un valor Boolean que representa el inverso del valor de la expresión.

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)

En el ejemplo anterior se generan los resultados de False y True , respectivamente.

Ejemplo
En el ejemplo siguiente se usa el operador Not para realizar la negación lógica de los bits individuales de una
expresión numérica. El bit en el patrón del resultado se establece en la inversa del bit correspondiente en el patrón
de operando, incluido el bit de signo.

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)

En el ejemplo anterior se generan los resultados de – 11, – 9 y – 7, respectivamente.

Vea también
Operadores lógicos y bit a bit (Visual Basic)
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Operadores lógicos y bit a bit en Visual Basic
Or (Operador, Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

Realiza una disyunción lógica entre dos expresiones Boolean , o una disyunción bit a bit entre dos expresiones
numéricas.

Sintaxis
result = expression1 Or expression2

Elementos
result
Obligatorio. Cualquier Boolean o expresión numérica. En Boolean comparación, result es la disyunción lógica
inclusiva de dos valores Boolean . Para las operaciones bit a bit, result es un valor numérico que representa la
disyunción bit a bit inclusiva de dos modelos de bits numéricos.
expression1
Obligatorio. Cualquier Boolean o expresión numérica.
expression2
Obligatorio. Cualquier Boolean o expresión numérica.

Comentarios
Para la comparación de Boolean , result se False si y solo si expression1 y expression2 se evalúan como
False . En la tabla siguiente se muestra cómo se determina result .

SI EXPRESSION1 ES Y EXPRESSION2 ES EL VA LO R DE RESULT ES

True True True

True False True

False True True

False False False

NOTE
En una comparación de Boolean , el operador Or siempre evalúa ambas expresiones, lo que podría incluir la realización de
llamadas a procedimientos. El operador OrElse realiza un cortocircuito, lo que significa que si expression1 es True ,
expression2 no se evalúa.

Para las operaciones bit a bit, el operador Or realiza una comparación bit a bit de los bits colocados de forma
idéntica en dos expresiones numéricas y establece el bit correspondiente en result según la tabla siguiente.
SI EL B IT DE EXPRESSION1 ES Y EL B IT DE EXPRESSION2 ES EL B IT DE RESULT ES

1 1 1

1 0 1

0 1 1

0 0 0

NOTE
Puesto que los operadores lógicos y bit a bit tienen una prioridad más baja que otros operadores aritméticos y relacionales,
las operaciones bit a bit deben ir entre paréntesis para garantizar una ejecución precisa.

Tipos de datos
Si los operandos constan de una expresión de Boolean y una expresión numérica, Visual Basic convierte la
expresión de Boolean en un valor numérico (– 1 para True y 0 para False ) y realiza una operación bit a bit.
Para una comparación de Boolean , se Boolean el tipo de datos del resultado. En una comparación bit a bit, el tipo
de datos del resultado es un tipo numérico adecuado para los tipos de datos de expression1 y expression2 . Vea
la tabla "comparaciones relacionales y bit a bit" en tipos de datos de resultados de operadores.

Sobrecarga
El operador de Or se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. Si el código usa este operador en
una clase o estructura de este tipo, asegúrese de entender su comportamiento redefinido. Para obtener más
información, consulta Operator Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador Or para realizar una disyunción lógica inclusiva entre dos expresiones.
El resultado es un valor Boolean que representa si una de las dos expresiones es True .

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

En el ejemplo anterior se generan los resultados de True , True y False , respectivamente.

Ejemplo
En el ejemplo siguiente se usa el operador Or para realizar una disyunción lógica inclusiva en los bits
individuales de dos expresiones numéricas. El bit del modelo de resultado se establece si alguno de los bits
correspondientes de los operandos se establece en 1.
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)

En el ejemplo anterior se generan resultados de 10, 14 y 14, respectivamente.

Vea también
Operadores lógicos y bit a bit (Visual Basic)
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
OrElse (operador)
Operadores lógicos y bit a bit en Visual Basic
OrElse (Operador) (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Realiza una disyunción lógica inclusiva de cortocircuito en dos expresiones.

Sintaxis
result = expression1 OrElse expression2

Elementos
result
Obligatorio. Cualquier expresión Boolean .
expression1
Obligatorio. Cualquier expresión Boolean .
expression2
Obligatorio. Cualquier expresión Boolean .

Comentarios
Se dice que una operación lógica es cortocircuitada si el código compilado puede omitir la evaluación de una
expresión en función del resultado de otra expresión. Si el resultado de la primera expresión evaluada determina
el resultado final de la operación, no es necesario evaluar la segunda expresión, porque no puede cambiar el
resultado final. El cortocircuito puede mejorar el rendimiento si la expresión omitida es compleja o si implica
llamadas a procedimientos.
Si una o ambas expresiones se evalúan como True , result se True . En la tabla siguiente se muestra cómo se
determina result .

SI EXPRESSION1 ES Y EXPRESSION2 ES EL VA LO R DE RESULT ES

True (no evaluado) True

False True True

False False False

Tipos de datos
El operador OrElse solo se define para el tipo de datos Boolean. Visual Basic convierte cada operando según sea
necesario para Boolean antes de evaluar la expresión. Si asigna el resultado a un tipo numérico, Visual Basic lo
convierte de Boolean a ese tipo, de modo que False se convierte en 0 y True se vuelve -1 . Para obtener
más información, vea conversiones de tipo booleano.

Sobrecarga
El operador o y el operador IsTrue se pueden sobrecargar, lo que significa que una clase o estructura puede
volver a definir su comportamiento cuando un operando tiene el tipo de esa clase o estructura. La sobrecarga de
los operadores Or y IsTrue afecta al comportamiento del operador OrElse . Si el código utiliza OrElse en una
clase o estructura que sobrecarga Or y IsTrue , asegúrese de entender su comportamiento redefinido. Para
obtener más información, consulta Operator Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador OrElse para realizar una disyunción lógica entre dos expresiones. El
resultado es un valor Boolean que representa si una de las dos expresiones es true. Si la primera expresión es
True , la segunda no se evalúa.

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

En el ejemplo anterior se generan los resultados de True , True y False respectivamente. En el cálculo de
firstCheck , la segunda expresión no se evalúa porque la primera ya está True . Sin embargo, la segunda
expresión se evalúa en el cálculo de secondCheck .

Ejemplo
En el ejemplo siguiente se muestra una instrucción If ... Then que contiene dos llamadas a procedimiento. Si la
primera llamada devuelve True , no se llama al segundo procedimiento. Esto podría producir resultados
inesperados si el segundo procedimiento realiza tareas importantes que siempre deben realizarse cuando se
ejecuta esta sección del código.

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

Vea también
Operadores lógicos y bit a bit (Visual Basic)
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
OR (operador)
IsTrue (operador)
Operadores lógicos y bit a bit en Visual Basic
Subexpresión (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Declara los parámetros y el código que definen una expresión lambda de subrutina.

Sintaxis
Sub ( [ parameterlist ] ) statement
- or -
Sub ( [ parameterlist ] )
[ statements ]
End Sub

Elementos
T ÉRM IN O DEF IN IC IÓ N

parameterlist Opcional. Una lista de nombres de variables locales que


representan los parámetros del procedimiento. Los paréntesis
deben estar presentes incluso cuando la lista esté vacía. Para
obtener más información, consulta Parameter List.

statement Obligatorio. Una única instrucción.

statements Obligatorio. Una lista de instrucciones.

Comentarios
Una expresión lambda es una subrutina que no tiene un nombre y que ejecuta una o más instrucciones. Puede usar
una expresión lambda en cualquier lugar en el que pueda usar un tipo de delegado, excepto como argumento para
RemoveHandler . Para obtener más información sobre los delegados y el uso de expresiones lambda con delegados,
vea instrucción Delegate y conversión de delegado relajado.

Sintaxis de la expresión lambda


La sintaxis de una expresión lambda es similar a la de una subrutina estándar. Las diferencias son las siguientes:
Una expresión lambda no tiene un nombre.
Una expresión lambda no puede tener un modificador, como Overloads o Overrides .
El cuerpo de una expresión lambda de una sola línea debe ser una instrucción, no una expresión. El cuerpo
puede constar de una llamada a un procedimiento Sub, pero no de una llamada a un procedimiento de
función.
En una expresión lambda, todos los parámetros deben tener tipos de datos especificados o se deben inferir
todos los parámetros.
Los parámetros opcionales y ParamArray no se permiten en expresiones lambda.
Los parámetros genéricos no se permiten en expresiones lambda.
Ejemplo
A continuación se encuentra un ejemplo de una expresión lambda que escribe un valor en la consola. En el ejemplo
se muestra la sintaxis de la expresión lambda de una sola línea y de varias líneas para una subrutina. Para obtener
más ejemplos, consulte expresiones lambda.

Dim writeline1 = Sub(x) Console.WriteLine(x)


Dim writeline2 = Sub(x)
Console.WriteLine(x)
End Sub

' Write "Hello".


writeline1("Hello")

' Write "World"


writeline2("World")

Vea también
Sub (instrucción)
Expresiones lambda
Operadores y expresiones
Instrucciones
Conversión de delegado flexible
TryCast (Operador) (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Introduce una operación de conversión de tipos que no produce una excepción.

Comentarios
Si se produce un error en una conversión intentó, CType y DirectCast producen un error InvalidCastException.
Esto puede afectar negativamente al rendimiento de la aplicación. TryCast no devuelve nada, de modo que, en
lugar de tener que controlar una posible excepción, solo es necesario probar el resultado devuelto con Nothing .
La palabra clave TryCast se utiliza de la misma manera que se usa la función ctype y la palabra clave del
operador DirectCast . Proporcione una expresión como primer argumento y un tipo al que convertirlo como
segundo argumento. TryCast solo funciona en tipos de referencia, como clases e interfaces. Requiere una
relación de herencia o implementación entre los dos tipos. Esto significa que un tipo debe heredar de o
implementar el otro.

Errores y errores
TryCast genera un error del compilador si detecta que no existe ninguna relación de herencia o de
implementación. Pero la falta de un error del compilador no garantiza una conversión correcta. Si la conversión
deseada es de restricción, podría producirse un error en tiempo de ejecución. Si esto ocurre, TryCast no
devuelve nada.

Palabras clave para conversiones


A continuación se muestra una comparación de las palabras clave de conversión de tipos.

REL A C IÓ N EN T RE ERRO R EN T IEM P O DE


PA L A B RA C L AVE T IP O S DE DATO S A RGUM EN TO S E JEC UC IÓ N

Función CType Cualquier tipo de datos La conversión de ampliación Produce


o de restricción debe InvalidCastException
definirse entre los dos tipos
de datos

DirectCast (operador) Cualquier tipo de datos Un tipo debe heredar de o Produce


implementar el otro tipo InvalidCastException

TryCast Solo tipos de referencia Un tipo debe heredar de o No devuelve nada


implementar el otro tipo

Ejemplo
En el ejemplo siguiente se muestra cómo utilizar TryCast .
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

Vea también
Conversiones de ampliación y de restricción
Conversiones implícitas y explícitas
TypeOf (Operador, Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Comprueba si el tipo en tiempo de ejecución del resultado de una expresión es compatible con el tipo
especificado.

Sintaxis
result = TypeOf objectexpression Is typename

result = TypeOf objectexpression IsNot typename

Elementos
result
Devuelto. Valor Boolean .
objectexpression
Obligatorio. Cualquier expresión que se evalúa como un tipo de referencia.
typename
Obligatorio. Cualquier nombre de tipo de datos.

Comentarios
El operador TypeOf determina si el tipo en tiempo de ejecución de objectexpression es compatible con
typename . La compatibilidad depende de la categoría del tipo de typename . En la tabla siguiente se muestra cómo
se determina la compatibilidad.

C AT EGO RÍA DE T IP O DE TYPENAME C RIT ERIO DE C O M PAT IB IL IDA D

Clase objectexpression es de tipo typename o hereda de


typename

Estructura objectexpression es de tipo typename

Interfaz objectexpression implementa typename o hereda de una


clase que implementa typename

Si el tipo en tiempo de ejecución de objectexpression satisface el criterio de compatibilidad, result es True . En


caso contrario, result es False . Si objectexpression es null, entonces TypeOf ... Is devuelve False y ... IsNot
devuelve True .
TypeOf siempre se usa con la palabra clave Is para construir una expresión TypeOf ... Is , o con la palabra clave
IsNot para construir una expresión TypeOf ... IsNot .

Ejemplo
En el ejemplo siguiente se usan expresiones TypeOf ... Is para probar la compatibilidad de tipo de dos variables
de referencia de objeto con diversos tipos de datos.

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)

La variable refInteger tiene un tipo en tiempo de ejecución de Integer . Es compatible con Integer pero no con
Double . La variable refForm tiene un tipo en tiempo de ejecución de Form. Es compatible con Form porque es su
tipo, con Control porque Form hereda de Control, y con IComponent porque Form hereda de Component, que
implementa IComponent. Sin embargo, refForm no es compatible con Label.

Vea también
Is (operador)
IsNot (operador)
Operadores de comparación en Visual Basic
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Operadores y expresiones
Xor (Operador, Visual Basic)
27/11/2019 • 6 minutes to read • Edit Online

Realiza una exclusión lógica en dos expresiones de Boolean o una exclusión bit a bit de dos expresiones
numéricas.

Sintaxis
result = expression1 Xor expression2

Elementos
result
Obligatorio. Cualquier Boolean o variable numérica. En la comparación booleana, result es la exclusión lógica
(disyunción lógica exclusiva) de dos valores Boolean . Para las operaciones bit a bit, result es un valor numérico
que representa la exclusión bit a bit (disyunción bit a bit exclusiva) de dos modelos de bits numéricos.
expression1
Obligatorio. Cualquier Boolean o expresión numérica.
expression2
Obligatorio. Cualquier Boolean o expresión numérica.

Comentarios
En la comparación booleana, result se True si y solo si exactamente uno de expression1 y expression2 se
evalúa como True . Es decir, si y solo si expression1 y expression2 se evalúan como valores de Boolean
opuestos. En la tabla siguiente se muestra cómo se determina result .

SI EXPRESSION1 ES Y EXPRESSION2 ES EL VA LO R DE RESULT ES

True True False

True False True

False True True

False False False

NOTE
En una comparación booleana, el operador Xor siempre evalúa ambas expresiones, lo que podría incluir la realización de
llamadas a procedimientos. No hay ningún homólogo de cortocircuito en Xor , porque el resultado siempre depende de
ambos operandos. Para los operadores lógicos de cortocircuito , vea operador AndAlso y operador OrElse.

Para las operaciones bit a bit, el operador Xor realiza una comparación bit a bit de los bits colocados de forma
idéntica en dos expresiones numéricas y establece el bit correspondiente en result según la tabla siguiente.
SI EL B IT DE EXPRESSION1 ES Y EL B IT DE EXPRESSION2 ES EL B IT DE RESULT ES

1 1 0

1 0 1

0 1 1

0 0 0

NOTE
Puesto que los operadores lógicos y bit a bit tienen una prioridad más baja que otros operadores aritméticos y relacionales,
las operaciones bit a bit deben ir entre paréntesis para garantizar una ejecución precisa.

Por ejemplo, 5 Xor 3 es 6. Para ver por qué es así, convierta 5 y 3 en sus representaciones binarias, 101 y 011. A
continuación, use la tabla anterior para determinar que 101 XOR 011 es 110, que es la representación binaria del
número decimal 6.

Tipos de datos
Si los operandos constan de una expresión de Boolean y una expresión numérica, Visual Basic convierte la
expresión de Boolean en un valor numérico (– 1 para True y 0 para False ) y realiza una operación bit a bit.
Para una comparación de Boolean , se Boolean el tipo de datos del resultado. En una comparación bit a bit, el tipo
de datos del resultado es un tipo numérico adecuado para los tipos de datos de expression1 y expression2 . Vea
la tabla "comparaciones relacionales y bit a bit" en tipos de datos de resultados de operadores.

Sobrecarga
El operador de Xor se puede sobrecargar, lo que significa que una clase o estructura puede volver a definir su
comportamiento cuando un operando tiene el tipo de esa clase o estructura. Si el código usa este operador en una
clase o estructura de este tipo, asegúrese de que entiende su comportamiento redefinido. Para obtener más
información, consulta Operator Procedures.

Ejemplo
En el ejemplo siguiente se usa el operador Xor para realizar una exclusión lógica (disyunción lógica exclusiva) en
dos expresiones. El resultado es un valor Boolean que indica si se True exactamente una de las expresiones.

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

En el ejemplo anterior se generan los resultados de False , True y False , respectivamente.

Ejemplo
En el ejemplo siguiente se usa el operador Xor para realizar una exclusión lógica (disyunción lógica exclusiva) en
los bits individuales de dos expresiones numéricas. El bit en el patrón del resultado se establece si exactamente
uno de los bits correspondientes de los operandos está establecido en 1.

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

En el ejemplo anterior se generan los resultados de 2, 12 y 14, respectivamente.

Vea también
Operadores lógicos y bit a bit (Visual Basic)
Prioridad de operador en Visual Basic
Operadores enumerados por funcionalidad
Operadores lógicos y bit a bit en Visual Basic
Propiedades (Visual Basic)
05/12/2019 • 2 minutes to read • Edit Online

En esta página se enumeran las propiedades que son miembros de Visual Basic módulos. Otras propiedades que
son miembros de objetos Visual Basic específicos se enumeran en objetos.

Propiedades de Visual Basic

DateString Devuelve o establece un valor String que representa la


fecha actual de acuerdo con el sistema.

Now Devuelve un valor Date que contiene la fecha y la hora


actuales de acuerdo con el sistema.

ScriptEngine Devuelve un String que representa el tiempo de ejecución


actualmente en uso.

ScriptEngineBuildVersion Devuelve un valor de tipo Integer que contiene el número


de versión de compilación del motor en tiempo de ejecución
que se usa.

ScriptEngineMajorVersion Devuelve un valor de tipo Integer que contiene el número


de versión principal del motor en tiempo de ejecución que se
usa.

ScriptEngineMinorVersion Devuelve un valor de tipo Integer que contiene el número


de versión secundaria del motor en tiempo de ejecución que
se usa.

TimeOfDay Devuelve o establece un valor de Date que contiene la hora


actual del día según el sistema.

Timer Devuelve un valor Double que representa el número de


segundos transcurridos desde la medianoche.

TimeString Devuelve o establece un valor de tipo String que


representa la hora actual del día según el sistema.

Today Devuelve o establece un valor de Date que contiene la fecha


actual según el sistema.

Vea también
Referencia del lenguaje Visual Basic
Consultas (Visual Basic)
08/01/2020 • 3 minutes to read • Edit Online

Visual Basic le permite crear expresiones LINQ (Language-Integrated Query) en el código.

Esta sección
Aggregate (cláusula)
Describe la cláusula Aggregate , que aplica una o varias funciones de agregado a una colección.
Distinct (cláusula)
Describe la cláusula Distinct , que restringe los valores de la variable de rango actual para eliminar los valores
duplicados en los resultados de la consulta.
From (cláusula)
Describe la cláusula From , que especifica una colección y una variable de rango para una consulta.
Group By (cláusula)
Describe la cláusula Group By , que agrupa los elementos del resultado de una consulta y se puede usar para
aplicar funciones de agregado a cada grupo.
Group Join (cláusula)
Describe la cláusula Group Join , que combina dos colecciones en una sola colección jerárquica.
Join (cláusula)
Describe la cláusula Join , que combina dos colecciones en una sola colección.
Let (cláusula)
Describe la cláusula Let , que calcula un valor y lo asigna a una nueva variable en la consulta.
Order By (cláusula)
Describe la cláusula Order By , que especifica el criterio de ordenación de las columnas de una consulta.
Select (cláusula)
Describe la cláusula Select , que declara un conjunto de variables de rango para una consulta.
Skip (cláusula)
Describe la cláusula Skip , que omite un número especificado de elementos de una colección y, a continuación,
devuelve los elementos restantes.
Skip While (cláusula)
Describe la cláusula Skip While , que omite los elementos de una colección siempre que se true una condición
especificada y, a continuación, devuelve los elementos restantes.
Take (cláusula)
Describe la cláusula Take , que devuelve un número especificado de elementos contiguos desde el principio de
una colección.
Take While (cláusula)
Describe la cláusula Take While , que incluye los elementos de una colección siempre que se true una
condición especificada y se omiten los elementos restantes.
Where (cláusula)
Describe la cláusula Where , que especifica una condición de filtrado para una consulta.
Vea también
LINQ
Introducción a LINQ en Visual Basic
Aggregate (Cláusula, Visual Basic)
27/11/2019 • 12 minutes to read • Edit Online

Aplica una o más funciones de agregado a una colección.

Sintaxis
Aggregate element [As type] In collection _
[, element2 [As type2] In collection2, [...]]
[ clause ]
Into expressionList

Elementos
T ÉRM IN O DEF IN IC IÓ N

element Obligatorio. Variable usada para recorrer en iteración los


elementos de la colección.

type Opcional. Tipo de element . Si no se especifica ningún tipo,


el tipo de element se deduce de collection .

collection Obligatorio. Hace referencia a la colección en la que se va a


operar.

clause Opcional. Una o varias cláusulas de consulta, como una


cláusula Where , para refinar el resultado de la consulta a fin
de aplicar la cláusula o cláusulas de agregado a.

expressionList Obligatorio. Una o más expresiones delimitadas por comas


que identifican una función de agregado que se va a aplicar a
la colección. Puede aplicar un alias a una función de agregado
para especificar un nombre de miembro para el resultado de
la consulta. Si no se proporciona ningún alias, se utiliza el
nombre de la función de agregado. Para obtener ejemplos,
vea la sección acerca de las funciones de agregado más
adelante en este tema.

Comentarios
La cláusula Aggregate se puede utilizar para incluir funciones de agregado en las consultas. Las funciones de
agregado realizan comprobaciones y cálculos sobre un conjunto de valores y devuelven un valor único. Puede
tener acceso al valor calculado mediante el uso de un miembro del tipo de resultado de la consulta. Las funciones
de agregado estándar que puede utilizar son las funciones All , Any , Average , Count , LongCount , Max , Min y
Sum . Estas funciones resultan familiares a los desarrolladores que están familiarizados con los agregados de
SQL. Se describen en la sección siguiente de este tema.
El resultado de una función de agregado se incluye en el resultado de la consulta como un campo del tipo de
resultado de la consulta. Puede proporcionar un alias para que el resultado de la función de agregado
especifique el nombre del miembro del tipo de resultado de la consulta que contendrá el valor agregado. Si no se
proporciona ningún alias, se utiliza el nombre de la función de agregado.
La cláusula Aggregate puede iniciar una consulta o se puede incluir como una cláusula adicional en una consulta.
Si la cláusula Aggregate comienza una consulta, el resultado es un valor único que es el resultado de la función
de agregado especificada en la cláusula Into . Si se especifica más de una función de agregado en la cláusula
Into , la consulta devuelve un tipo único con una propiedad independiente para hacer referencia al resultado de
cada función de agregado en la cláusula Into . Si la cláusula Aggregate se incluye como una cláusula adicional
en una consulta, el tipo devuelto en la colección de consultas tendrá una propiedad independiente para hacer
referencia al resultado de cada función de agregado en la cláusula Into .

Funciones de agregado
A continuación se enumeran las funciones de agregado estándar que se pueden usar con la cláusula Aggregate .
Todos
Devuelve true si todos los elementos de la colección satisfacen una condición especificada; de lo contrario,
devuelve false . Este es un ejemplo:

Dim customerList1 = Aggregate order In orders


Into AllOrdersOver100 = All(order.Total >= 100)

Cualquiera
Devuelve true si algún elemento de la colección satisface una condición especificada; de lo contrario, devuelve
false . Este es un ejemplo:

Dim customerList2 = From cust In customers


Aggregate order In cust.Orders
Into AnyOrderOver500 = Any(order.Total >= 500)

Average
Calcula el promedio de todos los elementos de la colección o calcula una expresión proporcionada para todos los
elementos de la colección. Este es un ejemplo:

Dim customerOrderAverage = Aggregate order In orders


Into Average(order.Total)

Recuento
Cuenta el número de elementos de la colección. Puede proporcionar una expresión Boolean opcional para
contar solo el número de elementos de la colección que satisfacen una condición. Este es un ejemplo:

Dim customerOrderAfter1996 = From cust In customers


Aggregate order In cust.Orders
Into Count(order.OrderDate > #12/31/1996#)

Grupo
Hace referencia a los resultados de la consulta agrupados como resultado de una cláusula Group By o
Group Join . La función Group solo es válida en la cláusula Into de una cláusula Group By o Group Join . Para
obtener más información y ejemplos, vea cláusula Group by y Group join.
LongCount
Cuenta el número de elementos de la colección. Puede proporcionar una expresión Boolean opcional para
contar solo el número de elementos de la colección que satisfacen una condición. Devuelve el resultado como
Long . Para obtener un ejemplo, vea la función de agregado Count .

Max
Calcula el valor máximo de la colección o calcula una expresión proporcionada para todos los elementos de la
colección. Este es un ejemplo:

Dim customerMaxOrder = Aggregate order In orders


Into MaxOrder = Max(order.Total)

Min
Calcula el valor mínimo de la colección o calcula una expresión proporcionada para todos los elementos de la
colección. Este es un ejemplo:

Dim customerMinOrder = From cust In customers


Aggregate order In cust.Orders
Into MinOrder = Min(order.Total)

Sum
Calcula la suma de todos los elementos de la colección o calcula una expresión proporcionada para todos los
elementos de la colección. Este es un ejemplo:

Dim customerTotals = From cust In customers


Aggregate order In cust.Orders
Into Sum(order.Total)

Ejemplo
En el ejemplo siguiente se muestra cómo utilizar la cláusula Aggregate para aplicar funciones de agregado al
resultado de una consulta.

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

Crear funciones de agregado definidas por el usuario


Puede incluir sus propias funciones de agregado personalizadas en una expresión de consulta agregando
métodos de extensión al tipo de IEnumerable<T>. Después, el método personalizado puede realizar un cálculo o
una operación en la colección Enumerable que ha hecho referencia a la función de agregado. Para obtener más
información sobre los métodos de extensión, vea Extension Methods (Métodos de extensión).
Por ejemplo, en el ejemplo siguiente se muestra una función de agregado personalizada que calcula el valor
medio de una colección de números. Hay dos sobrecargas del método de extensión Median . La primera
sobrecarga acepta, como entrada, una colección de tipo IEnumerable(Of Double) . Si se llama a la función de
agregado Median para un campo de consulta de tipo Double , se llamará a este método. A la segunda
sobrecarga del método Median se le puede pasar cualquier tipo genérico. La sobrecarga genérica del método
Median toma un segundo parámetro que hace referencia a la expresión lambda Func(Of T, Double) para
proyectar un valor para un tipo (de una colección) como el valor correspondiente de tipo Double . A
continuación, delega el cálculo del valor medio en la otra sobrecarga del método Median . Para obtener más
información sobre las expresiones lambda, vea Expresiones lambda.

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

En el ejemplo siguiente se muestran consultas de ejemplo que llaman a la función de agregado Median en una
colección de tipo Integer y una colección de tipo Double . La consulta que llama a la función de agregado
Median en la colección de tipo Double llama a la sobrecarga del método Median que acepta, como entrada, una
colección de tipo Double . La consulta que llama a la función de agregado Median en la colección de tipo
Integer llama a la sobrecarga genérica del método Median .
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

Vea también
Introducción a LINQ en Visual Basic
Consultas
Select (cláusula)
From (cláusula)
Where (cláusula)
Group By (cláusula)
Distinct (Cláusula, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Restringe los valores de la variable de rango actual para eliminar los valores duplicados en las cláusulas de
consulta subsiguientes.

Sintaxis
Distinct

Comentarios
Puede usar la cláusula Distinct para devolver una lista de elementos únicos. La cláusula Distinct hace que la
consulta omita los resultados de la consulta duplicada. La cláusula Distinct se aplica a los valores duplicados
para todos los campos devueltos especificados por la cláusula Select . Si no se especifica ninguna cláusula de
Select , la cláusula de Distinct se aplica a la variable de rango de la consulta identificada en la cláusula From . Si
la variable de rango no es un tipo inmutable, la consulta solo omitirá el resultado de una consulta si todos los
miembros del tipo coinciden con el resultado de una consulta existente.

Ejemplo
La siguiente expresión de consulta combina una lista de clientes y una lista de pedidos de cliente. La cláusula
Distinct se incluye para devolver una lista de nombres de clientes únicos y fechas de pedido.

Dim customerOrders = From cust In customers, ord In orders


Where cust.CustomerID = ord.CustomerID
Select cust.CompanyName, ord.OrderDate
Distinct

Vea también
Introducción a LINQ en Visual Basic
Consultas
From (cláusula)
Select (cláusula)
Where (cláusula)
Equals (Cláusula, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Compara las claves de las colecciones que se están combinando.

Comentarios
La palabra clave Equals se usa en los contextos siguientes:
Group Join (cláusula)
Join (cláusula)

Vea también
Palabras clave
From (Cláusula, Visual Basic)
27/11/2019 • 6 minutes to read • Edit Online

Especifica una o varias variables de rango y una colección que se va a consultar.

Sintaxis
From element [ As type ] In collection [ _ ]
[, element2 [ As type2 ] In collection2 [, ... ] ]

Elementos
T ÉRM IN O DEF IN IC IÓ N

element Obligatorio. Una variable de rango que se usa para recorrer


en iteración los elementos de la colección. Una variable de
rango se usa para hacer referencia a cada miembro del
collection a medida que la consulta recorre en iteración
el collection . Debe ser un tipo Enumerable.

type Opcional. Tipo de element . Si no se especifica ningún


type , el tipo de element se deduce de collection .

collection Obligatorio. Hace referencia a la colección que se va a


consultar. Debe ser un tipo Enumerable.

Comentarios
La cláusula From se utiliza para identificar los datos de origen de una consulta y las variables que se usan para
hacer referencia a un elemento de la colección de origen. Estas variables se denominan variables de rango. La
cláusula From es necesaria para una consulta, excepto cuando se usa la cláusula Aggregate para identificar una
consulta que devuelve solo resultados agregados. Para obtener más información, vea cláusula Aggregate.
Puede especificar varias cláusulas From en una consulta para identificar varias colecciones que se van a
combinar. Cuando se especifican varias colecciones, se recorren en iteración de forma independiente o puede
combinarlas si están relacionadas. Puede combinar colecciones implícitamente mediante la cláusula Select , o
explícitamente mediante las cláusulas Join o Group Join . Como alternativa, puede especificar varias
colecciones y variables de rango en una sola cláusula de From , con cada variable de rango relacionada y
colección separadas de las otras por una coma. En el ejemplo de código siguiente se muestran ambas opciones
de sintaxis para la cláusula From .

' 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

La cláusula From define el ámbito de una consulta, que es similar al ámbito de un bucle de For . Por lo tanto,
cada variable de rango de element en el ámbito de una consulta debe tener un nombre único. Dado que puede
especificar varias cláusulas de From para una consulta, las cláusulas de From subsiguientes pueden hacer
referencia a las variables de rango de la cláusula From , o bien pueden hacer referencia a las variables de rango
de una cláusula From anterior. Por ejemplo, en el ejemplo siguiente se muestra una cláusula From anidada en la
que la colección de la segunda cláusula se basa en una propiedad de la variable de rango de la primera cláusula.

Dim allOrders = From cust In GetCustomerList()


From ord In cust.Orders
Select ord

Cada cláusula de From puede ir seguida de cualquier combinación de cláusulas de consulta adicionales para
refinar la consulta. Puede refinar la consulta de las siguientes maneras:
Combine varias colecciones implícitamente mediante el uso de las cláusulas From y Select ,o
explícitamente mediante el uso de las cláusulas Join o Group Join .
Utilice la cláusula Where para filtrar el resultado de la consulta.
Ordene el resultado mediante la cláusula Order By .
Agrupe resultados similares juntos mediante la cláusula Group By .
Utilice la cláusula Aggregate para identificar las funciones de agregado que se van a evaluar para todo el
resultado de la consulta.
Utilice la cláusula Let para introducir una variable de iteración cuyo valor se determina mediante una
expresión en lugar de una colección.
Utilice la cláusula Distinct para omitir los resultados de la consulta duplicada.
Identifique las partes del resultado que se van a devolver mediante las cláusulas Skip , Take ,
Skip While y Take While .

Ejemplo
La siguiente expresión de consulta utiliza una cláusula From para declarar una variable de rango cust para
cada Customer objeto de la colección de customers . La cláusula Where usa la variable de rango para restringir
la salida a los clientes de la región especificada. El bucle For Each muestra el nombre de la compañía para cada
cliente en el resultado de la consulta.

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

Vea también
Consultas
Introducción a LINQ en Visual Basic
For Each...Next (instrucción)
For...Next (instrucción)
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 (Cláusula, Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Agrupa los elementos de los resultados de una consulta. También se puede usar para aplicar funciones de
agregado a cada grupo. La operación de agrupación se basa en una o varias claves.

Sintaxis
Group [ listField1 [, listField2 [...] ] By keyExp1 [, keyExp2 [...] ]
Into aggregateList

Elementos
listField1 , listField2

Opcional. Uno o más campos de la variable o las variables de consulta que identifican explícitamente los
campos que se incluirán en el resultado agrupado. Si no se especifica ningún campo, se incluyen todos los
campos de la variable o las variables de consulta en el resultado agrupado.
keyExp1

Obligatorio. Expresión que identifica la clave que se va a usar para determinar los grupos de elementos.
Puede especificar más de una clave para especificar una clave compuesta.
keyExp2

Opcional. Uno o más claves adicionales que se combinan con keyExp1 para crear una clave compuesta.
aggregateList

Obligatorio. Una o más expresiones que identifican cómo se agregan los grupos. Para identificar un
nombre de miembro para los resultados agrupados, use la palabra clave Group , que puede estar en
cualquiera de los formatos siguientes:

Into Group

O bien,

Into <alias> = Group

También puede incluir funciones de agregado para aplicar al grupo.

Comentarios
Puede usar la cláusula Group By para dividir los resultados de una consulta en grupos. La agrupación se basa en
una clave o una clave compuesta formada por varias claves. Los elementos que están asociados con valores de
clave coincidentes se incluyen en el mismo grupo.
El parámetro aggregateList de la cláusula Into y la palabra clave Group se usan para identificar el nombre del
miembro usado para hacer referencia al grupo. También puede incluir funciones de agregado en la cláusula Into
para calcular los valores de los elementos agrupados. Para obtener una lista de las funciones de agregado
estándar, consulte Aggregate Clause.

Ejemplo
En el ejemplo de código siguiente se agrupa una lista de clientes según su ubicación (país o región) y se
proporciona un recuento de los clientes de cada grupo. Los resultados se ordenan por nombre de país o región.
Los resultados agrupados se ordenan por nombre de ciudad.

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

Vea también
Introducción a LINQ en Visual Basic
Consultas
Select (cláusula)
From (cláusula)
Order By (cláusula)
Aggregate (cláusula)
Group Join (cláusula)
Group Join (Cláusula, Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

Combina dos colecciones en una sola colección jerárquica. La operación de combinación se basa en las claves
coincidentes.

Sintaxis
Group Join element [As type] In collection _
On key1 Equals key2 [ And key3 Equals key4 [... ] ] _
Into expressionList

Elementos
T ÉRM IN O DEF IN IC IÓ N

element Obligatorio. Variable de control de la colección que se va a


combinar.

type Opcional. Tipo de element . Si no se especifica ningún


type , el tipo de element se deduce de collection .

collection Obligatorio. Colección que se va a combinar con la colección


que se encuentra en el lado izquierdo del operador
Group Join . Una cláusula Group Join puede estar
anidada en una cláusula Join o en otra cláusula
Group Join .

key1 Equals key2 Obligatorio. Identifica las claves para las colecciones que se
están combinando. Debe utilizar el operador Equals para
comparar las claves de las colecciones que se están
combinando. Puede combinar condiciones de combinación
mediante el operador And para identificar varias claves. El
parámetro key1 debe ser de la colección en el lado
izquierdo del operador Join . El parámetro key2 debe ser
de la colección del lado derecho del operador Join .

Las claves utilizadas en la condición de combinación pueden


ser expresiones que incluyen más de un elemento de la
colección. Sin embargo, cada expresión clave solo puede
contener elementos de su colección respectiva.

expressionList Obligatorio. Una o más expresiones que identifican el modo


en que se agregan los grupos de elementos de la colección.
Para identificar un nombre de miembro para los resultados
agrupados, use la palabra clave Group ( <alias> = Group ).
También puede incluir funciones de agregado para aplicar al
grupo.

Comentarios
La cláusula Group Join combina dos colecciones basadas en los valores de clave coincidentes de las colecciones
que se van a combinar. La colección resultante puede contener un miembro que hace referencia a una colección
de elementos de la segunda colección que coinciden con el valor de clave de la primera colección. También
puede especificar las funciones de agregado que se van a aplicar a los elementos agrupados de la segunda
colección. Para obtener información sobre las funciones de agregado, vea cláusula Aggregate.
Considere, por ejemplo, una colección de administradores y una colección de empleados. Los elementos de
ambas colecciones tienen una propiedad ManagerID que identifica a los empleados que informan a un
administrador determinado. Los resultados de una operación de combinación contendrían un resultado para
cada administrador y empleado con un valor de ManagerID coincidente. Los resultados de una operación de
Group Join contienen la lista completa de administradores. Cada resultado de administrador tendría un
miembro que hacía referencia a la lista de empleados que coincidían con el administrador específico.
La colección resultante de una operación de Group Join puede contener cualquier combinación de valores de la
colección identificada en la cláusula From y las expresiones identificadas en la cláusula Into de la cláusula
Group Join . Para obtener más información sobre las expresiones válidas para la cláusula Into , consulte
Aggregate (cláusula).
Una operación Group Join devolverá todos los resultados de la colección identificada en el lado izquierdo del
operador Group Join . Esto es así incluso si no hay ninguna coincidencia en la colección que se está combinando.
Esto es como un LEFT OUTER JOIN en SQL.
Puede usar la cláusula Join para combinar colecciones en una sola colección. Esto es equivalente a un
INNER JOIN en SQL.

Ejemplo
En el ejemplo de código siguiente se combinan dos colecciones mediante la cláusula Group Join .

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

Vea también
Introducción a LINQ en Visual Basic
Consultas
Select (cláusula)
From (cláusula)
Join (cláusula)
Where (cláusula)
Group By (cláusula)
Join (Cláusula, Visual Basic)
27/11/2019 • 6 minutes to read • Edit Online

Combina dos colecciones en una sola colección. La operación de combinación se basa en las claves coincidentes y
utiliza el operador Equals .

Sintaxis
Join element In collection _
[ joinClause _ ]
[ groupJoinClause ... _ ]
On key1 Equals key2 [ And key3 Equals key4 [... ]

Elementos
element Obligatorio. Variable de control de la colección que se va a combinar.
collection
Obligatorio. Colección que se va a combinar con la colección identificada en el lado izquierdo del operador Join .
Una cláusula Join se puede anidar en otra cláusula Join o en una cláusula Group Join .
joinClause
Opcional. Una o varias cláusulas de Join adicionales para restringir aún más la consulta.
groupJoinClause
Opcional. Una o varias cláusulas de Group Join adicionales para restringir aún más la consulta.
key1 Equals key2
Obligatorio. Identifica las claves para las colecciones que se están combinando. Debe utilizar el operador Equals
para comparar las claves de las colecciones que se están combinando. Puede combinar condiciones de
combinación mediante el operador And para identificar varias claves. key1 debe ser de la colección en el lado
izquierdo del operador de Join . key2 debe ser de la colección del lado derecho del operador de Join .
Las claves utilizadas en la condición de combinación pueden ser expresiones que incluyen más de un elemento de
la colección. Sin embargo, cada expresión clave solo puede contener elementos de su colección respectiva.

Comentarios
La cláusula Join combina dos colecciones basadas en los valores de clave coincidentes de las colecciones que se
van a combinar. La colección resultante puede contener cualquier combinación de valores de la colección
identificada en el lado izquierdo del operador Join y la colección identificada en la cláusula Join . La consulta
devolverá solo los resultados para los que se cumple la condición especificada por el operador Equals . Esto es
equivalente a un INNER JOIN en SQL.
Puede usar varias cláusulas Join en una consulta para combinar dos o más colecciones en una sola colección.
Puede realizar una combinación implícita para combinar colecciones sin la cláusula Join . Para ello, incluya varias
cláusulas In en la cláusula From y especifique una cláusula Where que identifique las claves que desea usar
para la combinación.
Puede usar la cláusula Group Join para combinar colecciones en una sola colección jerárquica. Esto es como un
LEFT OUTER JOIN en SQL.

Ejemplo
En el ejemplo de código siguiente se realiza una combinación implícita para combinar una lista de clientes con sus
pedidos.

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

Ejemplo
En el ejemplo de código siguiente se combinan dos colecciones mediante la cláusula Join .

Imports System.Diagnostics
Imports System.Security.Permissions

Public Class JoinSample

<SecurityPermission(SecurityAction.Demand)>
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 ejemplo generará una salida similar a la siguiente:


winlogon (968), Windows Logon

explorer (2424), File Explorer

cmd (5136), Command Window

Ejemplo
En el ejemplo de código siguiente se combinan dos colecciones mediante la cláusula Join con dos columnas de
clave.

Imports System.Diagnostics
Imports System.Security.Permissions

Public Class JoinSample2

<SecurityPermission(SecurityAction.Demand)>
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

En el ejemplo se producirá una salida similar a la siguiente:


winlogon (968), Windows Logon, Priority = 13
cmd (700), Command Window, Priority = 8

explorer (2424), File Explorer, Priority = 8

Vea también
Introducción a LINQ en Visual Basic
Consultas
Select (cláusula)
From (cláusula)
Group Join (cláusula)
Where (cláusula)
Cláusula Let (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Calcula un valor y lo asigna a una nueva variable dentro de la consulta.

Sintaxis
Let variable = expression [, ...]

Elementos
T ÉRM IN O DEF IN IC IÓ N

variable Obligatorio. Un alias que se puede usar para hacer referencia


a los resultados de la expresión proporcionada.

expression Obligatorio. Expresión que se evaluará y asignará a la variable


especificada.

Comentarios
La cláusula Let permite calcular valores para cada resultado de la consulta y hacer referencia a ellos mediante un
alias. El alias se puede usar en otras cláusulas, como la cláusula Where . La cláusula Let le permite crear una
instrucción de consulta que es más fácil de leer, ya que puede especificar un alias para una cláusula Expression
incluida en la consulta y sustituir el alias cada vez que se use la cláusula Expression.
Puede incluir cualquier número de asignaciones de variable y expression en la cláusula Let . Separe cada
asignación con una coma (,).

Ejemplo
En el ejemplo de código siguiente se usa la cláusula Let para calcular un 10% de descuento en productos.

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

Vea también
Introducción a LINQ en Visual Basic
Consultas
Select (cláusula)
From (cláusula)
Where (cláusula)
Order By (Cláusula, Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Especifica el criterio de ordenación para el resultado de una consulta.

Sintaxis
Order By orderExp1 [ Ascending | Descending ] [, orderExp2 [...] ]

Elementos
orderExp1
Obligatorio. Uno o más campos del resultado de la consulta actual que identifican cómo ordenar los valores
devueltos. Los nombres de campo deben estar separados por comas (,). Puede identificar cada campo como
ordenado en orden ascendente o descendente mediante el uso de las palabras clave Ascending o Descending . Si
no se especifica ninguna palabra clave Ascending o Descending , el criterio de ordenación predeterminado es
ascendente. Los campos de criterio de ordenación tienen prioridad de izquierda a derecha.

Comentarios
Puede utilizar la cláusula Order By para ordenar los resultados de una consulta. La cláusula Order By solo
puede ordenar un resultado en función de la variable de rango del ámbito actual. Por ejemplo, la cláusula Select
introduce un nuevo ámbito en una expresión de consulta con nuevas variables de iteración para ese ámbito. Las
variables de rango definidas antes de una cláusula de Select en una consulta no están disponibles después de la
cláusula Select . Por lo tanto, si desea ordenar los resultados por un campo que no está disponible en la cláusula
Select , debe colocar la cláusula Order By antes de la cláusula Select . Un ejemplo de Cuándo tendría que
hacer esto es cuando desea ordenar la consulta por campos que no se devuelven como parte del resultado.
El orden ascendente y descendente de un campo viene determinado por la implementación de la interfaz
IComparable para el tipo de datos del campo. Si el tipo de datos no implementa la interfaz IComparable, se omite
el criterio de ordenación.

Ejemplo
La siguiente expresión de consulta utiliza una cláusula From para declarar una variable de rango book para la
colección books . La cláusula Order By ordena el resultado de la consulta por precio en orden ascendente (el
valor predeterminado). Los libros con el mismo precio se ordenan por título en orden ascendente. La cláusula
Select selecciona las propiedades Title y Price como los valores devueltos por la consulta.

Dim titlesAscendingPrice = From book In books


Order By book.Price, book.Title
Select book.Title, book.Price

Ejemplo
La siguiente expresión de consulta utiliza la cláusula Order By para ordenar el resultado de la consulta por precio
en orden descendente. Los libros con el mismo precio se ordenan por título en orden ascendente.
Dim titlesDescendingPrice = From book In books
Order By book.Price Descending, book.Title
Select book.Title, book.Price

Ejemplo
La siguiente expresión de consulta utiliza una cláusula Select para seleccionar el título del libro, el precio, la
fecha de publicación y el autor. A continuación, rellena los campos Title , Price , PublishDate y Author de la
variable de rango para el nuevo ámbito. La cláusula Order By ordena la nueva variable de rango por nombre de
autor, título del libro y, a continuación, precio. Cada columna se ordena en el orden predeterminado (ascendente).

Dim bookOrders =
From book In books
Select book.Title, book.Price, book.PublishDate, book.Author
Order By Author, Title, Price

Vea también
Introducción a LINQ en Visual Basic
Consultas
Select (cláusula)
From (cláusula)
Select (Cláusula, Visual Basic)
27/11/2019 • 6 minutes to read • Edit Online

Define el resultado de una consulta.

Sintaxis
Select [ var1 = ] fieldName1 [, [ var2 = ] fieldName2 [...] ]

Elementos
var1
Opcional. Un alias que se puede utilizar para hacer referencia a los resultados de la expresión de columna.
fieldName1
Obligatorio. Nombre del campo que se va a devolver en el resultado de la consulta.

Comentarios
Puede usar la cláusula Select para definir los resultados que se van a devolver desde una consulta. Esto le
permite definir los miembros de un nuevo tipo anónimo creado por una consulta o establecer como destino los
miembros de un tipo con nombre devuelto por una consulta. La cláusula Select no es necesaria para una
consulta. Si no se especifica ninguna cláusula de Select , la consulta devolverá un tipo basado en todos los
miembros de las variables de rango identificadas para el ámbito actual. Para obtener más información, vea
Tipos anónimos. Cuando una consulta crea un tipo con nombre, devolverá un resultado de tipo
IEnumerable<T> donde T es el tipo creado.
La cláusula Select puede hacer referencia a cualquier variable del ámbito actual. Esto incluye las variables de
rango identificadas en la cláusula From (o en las cláusulas From ). También incluye las nuevas variables creadas
con un alias mediante las cláusulas Aggregate , Let , Group By o Group Join , o bien las variables de una
cláusula Select anterior en la expresión de consulta. La cláusula Select también puede incluir valores
estáticos. Por ejemplo, en el ejemplo de código siguiente se muestra una expresión de consulta en la que la
cláusula Select define el resultado de la consulta como un nuevo tipo anónimo con cuatro miembros:
ProductName , Price , Discount y DiscountedPrice . Los valores de miembro ProductName y Price se toman de
la variable de rango de producto que se define en la cláusula From . El valor del miembro DiscountedPrice se
calcula en la cláusula Let . El miembro Discount es un valor estático.

' 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

La cláusula Select presenta un nuevo conjunto de variables de rango para las cláusulas de consulta
posteriores, y las variables de rango anteriores ya no están en el ámbito. La última cláusula Select de una
expresión de consulta determina el valor devuelto de la consulta. Por ejemplo, la consulta siguiente devuelve el
nombre de la compañía y el ID. de pedido de cada pedido de cliente cuyo total supera el 500. La primera
cláusula Select identifica las variables de rango para la cláusula Where y la segunda cláusula Select . La
segunda cláusula Select identifica los valores devueltos por la consulta como un nuevo tipo anónimo.

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

Si la cláusula Select identifica un solo elemento que se va a devolver, la expresión de consulta devuelve una
colección del tipo de ese único elemento. Si la cláusula Select identifica varios elementos para devolver, la
expresión de consulta devuelve una colección de un nuevo tipo anónimo, basado en los elementos
seleccionados. Por ejemplo, las dos consultas siguientes devuelven colecciones de dos tipos diferentes basados
en la cláusula Select . La primera consulta devuelve una colección de nombres de compañía como cadenas. La
segunda consulta devuelve una colección de objetos Customer rellenados con los nombres e información de
dirección de la compañía.

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}

Ejemplo
La siguiente expresión de consulta utiliza una cláusula From para declarar una variable de rango cust para la
colección customers . La cláusula Select selecciona el nombre del cliente y el valor del identificador y rellena
las columnas CompanyName y CustomerID de la nueva variable de rango. La instrucción For Each recorre en
bucle cada objeto devuelto y muestra las columnas CompanyName y CustomerID de cada registro.

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

Vea también
Introducción a LINQ en Visual Basic
Consultas
From (cláusula)
Where (cláusula)
Order By (cláusula)
Tipos anónimos
Skip (Cláusula, Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Omite un número especificado de elementos de una colección y, a continuación, devuelve los elementos restantes.

Sintaxis
Skip count

Elementos
count
Obligatorio. Un valor o una expresión que se evalúa como el número de elementos de la secuencia que se va a
omitir.

Comentarios
La cláusula Skip hace que una consulta omita los elementos al principio de una lista de resultados y devuelva los
elementos restantes. El número de elementos que se van a omitir se identifica mediante el parámetro count .
Puede usar la cláusula Skip con la cláusula Take para devolver un intervalo de datos de cualquier segmento de
una consulta. Para ello, pase el índice del primer elemento del intervalo a la cláusula Skip y el tamaño del
intervalo a la cláusula Take .
Al utilizar la cláusula Skip en una consulta, puede que también tenga que asegurarse de que los resultados se
devuelven en un orden que permita que la cláusula Skip omita los resultados deseados. Para obtener más
información sobre cómo ordenar los resultados de una consulta, vea cláusula order by.
Puede usar la cláusula SkipWhile para especificar que solo se omitan determinados elementos, en función de una
condición proporcionada.

Ejemplo
En el ejemplo de código siguiente se usa la cláusula Skip junto con la cláusula Take para devolver datos de una
consulta en páginas. La función GetCustomers usa la cláusula Skip para omitir los clientes de la lista hasta el valor
del índice de inicio proporcionado y usa la cláusula Take para devolver una página de clientes a partir de ese
valor de índice.
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

Vea también
Introducción a LINQ en Visual Basic
Consultas
Select (cláusula)
From (cláusula)
Order By (cláusula)
Skip While (cláusula)
Take (cláusula)
Skip While (Cláusula, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Omite los elementos de una colección siempre que el valor de una condición especificada sea true y, a
continuación, devuelve los elementos restantes.

Sintaxis
Skip While expression

Elementos
T ÉRM IN O DEF IN IC IÓ N

expression Obligatorio. Expresión que representa una condición de la


que se van a probar los elementos. La expresión debe
devolver un valor Boolean o un equivalente funcional, como
un Integer que se va a evaluar como Boolean .

Comentarios
La cláusula omite los elementos desde el principio del resultado de una consulta hasta que el
Skip While
expression proporcionado devuelve false . Después de que expression devuelve false , la consulta devuelve
todos los elementos restantes. El expression se omite para los resultados restantes.
La cláusula Skip While difiere de la cláusula Where en que la cláusula Where se puede utilizar para excluir todos
los elementos de una consulta que no cumplan una condición determinada. La cláusula Skip While excluye los
elementos solo hasta la primera vez que la condición no se cumple. La cláusula Skip While es muy útil cuando se
trabaja con un resultado de consulta ordenado.
Puede omitir un número específico de resultados desde el principio del resultado de una consulta mediante la
cláusula Skip .

Ejemplo
En el ejemplo de código siguiente se usa la cláusula Skip While para omitir los resultados hasta que se encuentre
el primer cliente de la Estados Unidos.
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

Vea también
Introducción a LINQ en Visual Basic
Consultas
Select (cláusula)
From (cláusula)
Skip (cláusula)
Take While (cláusula)
Where (cláusula)
Take (Cláusula, Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Devuelve un número especificado de elementos contiguos desde el principio de una colección.

Sintaxis
Take count

Elementos
count
Obligatorio. Un valor o una expresión que se evalúa como el número de elementos de la secuencia que se va a
devolver.

Comentarios
La cláusula Take hace que una consulta incluya un número especificado de elementos contiguos desde el
principio de una lista de resultados. El número de elementos que se van a incluir se especifica mediante el
parámetro count .
Puede usar la cláusula Take con la cláusula Skip para devolver un intervalo de datos de cualquier segmento de
una consulta. Para ello, pase el índice del primer elemento del intervalo a la cláusula Skip y el tamaño del
intervalo a la cláusula Take . En este caso, la cláusula Take debe especificarse después de la cláusula Skip .
Al utilizar la cláusula Take en una consulta, puede que también tenga que asegurarse de que los resultados se
devuelven en un orden que permita a la cláusula Take incluir los resultados deseados. Para obtener más
información sobre cómo ordenar los resultados de una consulta, vea cláusula order by.
Puede usar la cláusula TakeWhile para especificar que solo se devuelvan determinados elementos, en función de
una condición proporcionada.

Ejemplo
En el ejemplo de código siguiente se usa la cláusula Take junto con la cláusula Skip para devolver datos de una
consulta en páginas. La función GetCustomers usa la cláusula Skip para omitir los clientes de la lista hasta el
valor del índice de inicio proporcionado, y usa la cláusula Take para devolver una página de clientes a partir de
ese valor de índice.
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

Vea también
Introducción a LINQ en Visual Basic
Consultas
Select (cláusula)
From (cláusula)
Order By (cláusula)
Take While (cláusula)
Skip (cláusula)
Take While (Cláusula, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Incluye los elementos de una colección siempre que el valor de una condición especificada sea true y, a
continuación, omite los elementos restantes.

Sintaxis
Take While expression

Elementos
T ÉRM IN O DEF IN IC IÓ N

expression Obligatorio. Expresión que representa una condición de la


que se van a probar los elementos. La expresión debe
devolver un valor Boolean o un equivalente funcional, como
un Integer que se va a evaluar como Boolean .

Comentarios
La cláusula incluye elementos desde el principio del resultado de una consulta hasta que el
Take While
expression proporcionado devuelve false . Una vez que el expression devuelva false , la consulta omitirá
todos los elementos restantes. El expression se omite para los resultados restantes.
La cláusula Take While difiere de la cláusula Where en que la cláusula Where se puede utilizar para incluir todos
los elementos de una consulta que cumplan una condición determinada. La cláusula Take While solo incluye
elementos hasta la primera vez que la condición no se cumple. La cláusula Take While es muy útil cuando se
trabaja con un resultado de consulta ordenado.

Ejemplo
En el ejemplo de código siguiente se usa la cláusula Take While para recuperar los resultados hasta que se
encuentre el primer cliente sin ningún pedido.
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

Vea también
Introducción a LINQ en Visual Basic
Consultas
Select (cláusula)
From (cláusula)
Take (cláusula)
Skip While (cláusula)
Where (cláusula)
Where (Cláusula, Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

Especifica la condición de filtrado para una consulta.

Sintaxis
Where condition

Elementos
condition
Obligatorio. Una expresión que determina si los valores del elemento actual de la colección se incluyen en la
colección de salida. La expresión debe evaluarse como un valor Boolean o el equivalente de un valor Boolean .
Si la condición se evalúa como True , el elemento se incluye en el resultado de la consulta; de lo contrario, el
elemento se excluye del resultado de la consulta.

Comentarios
La cláusula Where permite filtrar los datos de la consulta seleccionando solo los elementos que cumplen
determinados criterios. Los elementos cuyos valores hacen que la cláusula Where se evalúe como True se
incluyen en el resultado de la consulta; se excluyen otros elementos. La expresión que se utiliza en una cláusula
Where debe evaluarse como un Boolean o el equivalente de un Boolean , como un entero que se evalúa como
False cuando su valor es cero. Puede combinar varias expresiones en una cláusula Where mediante
operadores lógicos como And , Or , AndAlso , OrElse , Is y IsNot .
De forma predeterminada, las expresiones de consulta no se evalúan hasta que se tiene acceso a ellas; por
ejemplo, cuando están enlazadas a datos o se recorren en iteración en un bucle For . Como resultado, la
cláusula Where no se evalúa hasta que se tiene acceso a la consulta. Si tiene valores externos a la consulta que
se usan en la cláusula Where , asegúrese de que se usa el valor adecuado en la cláusula Where en el momento
en que se ejecuta la consulta. Para obtener más información sobre la ejecución de consultas, vea escribir su
primera consulta LINQ.
Puede llamar a funciones dentro de una cláusula Where para realizar un cálculo o una operación en un valor del
elemento actual de la colección. Llamar a una función en una cláusula Where puede hacer que la consulta se
ejecute inmediatamente cuando se define en lugar de cuando se tiene acceso a ella. Para obtener más
información sobre la ejecución de consultas, vea escribir su primera consulta LINQ.

Ejemplo
La siguiente expresión de consulta utiliza una cláusula From para declarar una variable de rango cust para
cada Customer objeto de la colección de customers . La cláusula Where usa la variable de rango para restringir
la salida a los clientes de la región especificada. El bucle For Each muestra el nombre de la compañía para cada
cliente en el resultado de la consulta.
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

Ejemplo
En el ejemplo siguiente se usa And y Or operadores lógicos en la cláusula Where .

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

Vea también
Introducción a LINQ en Visual Basic
Consultas
From (cláusula)
Select (cláusula)
For Each...Next (instrucción)
Instrucciones (Visual Basic)
05/12/2019 • 2 minutes to read • Edit Online

En los temas de esta sección, se incluyen tablas de la declaración y las instrucciones ejecutables de Visual Basic, y
de listas importantes que se aplican a muchas instrucciones.

Esta sección
Instrucciones de la A a la E
Instrucciones de la F a la P
Instrucciones de la Q a la Z
Cláusulas
Contextos de declaración y niveles de acceso predeterminados
Lista de atributos
Lista de parámetros
Lista de tipos

Secciones relacionadas
Referencia del lenguaje Visual Basic
Instrucciones A-E
27/11/2019 • 2 minutes to read • Edit Online

La tabla siguiente contiene una lista de instrucciones de lenguaje de Visual Basic.

AddHandler Call Clase Const

Continue Declare Delegate Dim

... Realizar Else Fin End <palabra clave>

Enum Erase Error Event

Salir

Vea también
Instrucciones de la F a la P
Instrucciones de la Q a la Z
Referencia del lenguaje Visual Basic
AddHandler (Instrucción)
27/11/2019 • 2 minutes to read • Edit Online

Asocia un evento a un controlador de eventos en tiempo de ejecución.

Sintaxis
AddHandler event, AddressOf eventhandler

Elementos

event Nombre del evento que se va a controlar.

eventhandler Nombre de un procedimiento que controla el evento.

Comentarios
Las instrucciones AddHandler y RemoveHandler permiten iniciar y detener el control de eventos en cualquier
momento durante la ejecución del programa.
La firma del procedimiento eventhandler debe coincidir con la firma del event de eventos.
La palabra clave Handles y la instrucción AddHandler permiten especificar que determinados procedimientos
controlen eventos determinados, pero hay diferencias. La instrucción AddHandler conecta los procedimientos a
los eventos en tiempo de ejecución. Use la palabra clave Handles al definir un procedimiento para especificar
que controla un evento determinado. Para obtener más información, vea identificadores.

NOTE
En el caso de los eventos personalizados, la instrucción AddHandler invoca al descriptor de acceso AddHandler del
evento. Para obtener más información sobre los eventos personalizados, vea Event Statement.

Ejemplo
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()
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

Vea también
RemoveHandler (instrucción)
Handles
Event (instrucción)
Eventos
Call (Instrucción, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Transfiere el control a un procedimiento de biblioteca de vínculos dinámicos (DLL) de Function , Sub o.

Sintaxis
[ Call ] procedureName [ (argumentList) ]

Elementos

procedureName Obligatorio. Nombre del procedimiento al que se va a llamar.

argumentList Opcional. Lista de variables o expresiones que representan


los argumentos que se pasan al procedimiento cuando se
llama. Los argumentos múltiples se separan mediante comas.
Si incluye argumentList , debe encerrarlo entre paréntesis.

Comentarios
Puede usar la palabra clave Call al llamar a un procedimiento. Para la mayoría de las llamadas a
procedimientos, no es necesario usar esta palabra clave.
Normalmente se usa la palabra clave Call cuando la expresión llamada no comienza por un identificador. No se
recomienda el uso de la palabra clave Call para otros usos.
Si el procedimiento devuelve un valor, la instrucción Call lo descarta.

Ejemplo
En el código siguiente se muestran dos ejemplos en los que la palabra clave Call es necesaria para llamar a un
procedimiento. En ambos ejemplos, la expresión llamada no comienza por un identificador.

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

Vea también
Function (instrucción)
Sub (instrucción)
Declare (instrucción)
Expresiones lambda
Instrucción Class (Visual Basic)
27/11/2019 • 8 minutes to read • Edit Online

Declara el nombre de una clase e introduce la definición de las variables, propiedades, eventos y
procedimientos que la clase incluye.

Sintaxis
[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ MustInherit | NotInheritable ] [ Partial ] _
Class name [ ( Of typelist ) ]
[ Inherits classname ]
[ Implements interfacenames ]
[ statements ]
End Class

Elementos
T ÉRM IN O DEF IN IC IÓ N

attributelist Opcional. Vea lista de atributos.

accessmodifier Opcional. Puede ser uno de los siguientes:

- público
- protegido
- Friend
- privado
- Friend protegido
- protegido privado

Vea Access levels in Visual Basic.

Shadows Opcional. Vea Shadows.

MustInherit Opcional. Vea MustInherit.

NotInheritable Opcional. Vea NotInheritable.

Partial Opcional. Indica una definición parcial de la clase. Vea


partial.

name Obligatorio. Nombre de esta clase. Vea Declared Element


Names.

Of Opcional. Especifica que se trata de una clase genérica.

typelist Obligatorio si se usa la palabra clave of . Lista de


parámetros de tipo de esta clase. Consulte lista de tipos.
T ÉRM IN O DEF IN IC IÓ N

Inherits Opcional. Indica que esta clase hereda los miembros de


otra clase. Vea Inherits (instrucción).

classname Es obligatorio si se utiliza la instrucción Inherits .


Nombre de la clase de la que se deriva esta clase.

Implements Opcional. Indica que esta clase implementa los miembros


de una o más interfaces. Vea Implements (instrucción).

interfacenames Es obligatorio si se utiliza la instrucción Implements . Los


nombres de las interfaces que implementa esta clase.

statements Opcional. Instrucciones que definen los miembros de esta


clase.

End Class Obligatorio. Termina la definición de Class .

Comentarios
Una instrucción Class define un nuevo tipo de datos. Una clase es un bloque de creación fundamental de
la programación orientada a objetos (OOP). Para obtener más información, vea objetos y clases.
Class solo se puede utilizar en un espacio de nombres o un nivel de módulo. Esto significa que el
contexto de la declaración de una clase debe ser un archivo de código fuente, un espacio de nombres, una
clase, una estructura, un módulo o una interfaz y no puede ser un procedimiento o un bloque. Para obtener
más información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y niveles
de acceso predeterminados).
Cada instancia de una clase tiene una duración independiente de todas las demás instancias. Esta duración
comienza cuando la crea una nueva cláusula de operador o una función como CreateObject. Finaliza
cuando todas las variables que apuntan a la instancia se han establecido en Nothing o en instancias de
otras clases.
Las clases tienen acceso de forma predeterminada a Friend . Los niveles de acceso se pueden ajustar con
los modificadores de acceso. Para obtener más información, consulte niveles de acceso en Visual Basic.

Reglas
Anidamiento. Puede definir una clase dentro de otra. La clase externa se denomina clase
contenedoray la clase interna se denomina clase anidada.
Herencia. Si la clase usa la instrucción Inherits, solo puede especificar una clase base o una interfaz.
Una clase no puede heredar de más de un elemento.
Una clase no puede heredar de otra clase con un nivel de acceso más restrictivo. Por ejemplo, una
clase Public no puede heredar de una clase Friend .
Una clase no puede heredar de una clase anidada dentro de ella.
Aplicación. Si la clase usa la instrucción Implements, debe implementar todos los miembros
definidos por cada interfaz que especifique en interfacenames . Una excepción a esto es la
reimplementación de un miembro de clase base. Para obtener más información, vea el tema sobre
la reimplementación en implementaciones.
Propiedad predeterminada. Una clase puede especificar como máximo una propiedad como su
propiedad predeterminada. Para obtener más información, vea default.

Comportamiento
Nivel de acceso. Dentro de una clase, puede declarar cada miembro con su propio nivel de acceso.
Los miembros de clase tienen como valor predeterminado el acceso público , excepto las variables y
constantes, que tienen como valor predeterminado el acceso privado . Cuando una clase tiene un
acceso más restringido que uno de sus miembros, el nivel de acceso de la clase tiene prioridad.
ID. Una clase está en el ámbito A lo largo de su espacio de nombres, clase, estructura o módulo que
lo contiene.
El ámbito de cada miembro de clase es toda la clase.
Validez. Visual Basic no admite clases estáticas. Un módulo proporciona el equivalente funcional de
una clase estática. Para obtener más información, vea Module Statement.
Los miembros de clase tienen duración en función de cómo y dónde se declaran. Para obtener más
información, vea duración en Visual Basic.
Evaluación. El código fuera de una clase debe calificar el nombre de un miembro con el nombre de
esa clase.
Si el código incluido en una clase anidada hace una referencia no calificada a un elemento de
programación, Visual Basic busca el elemento en primer lugar en la clase anidada, luego en la clase
contenedora y así sucesivamente hasta el elemento contenedor más externo.

Clases y módulos
Estos elementos tienen muchas similitudes, pero también hay algunas diferencias importantes.
Terminología. Las versiones anteriores de Visual Basic reconocen dos tipos de módulos: módulos
de clase (archivos. CLS) y módulos estándar (archivos. Bas). La versión actual llama a estas clases y
módulos, respectivamente.
Miembros compar tidos. Puede controlar si un miembro de una clase es un miembro compartido
o de instancia.
Orientación de objeto. Las clases están orientadas a objetos, pero los módulos no lo son. Puede
crear una o varias instancias de una clase. Para obtener más información, vea objetos y clases.

Ejemplo
En el ejemplo siguiente se usa una instrucción Class para definir una clase y varios miembros.
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

Vea también
Objetos y clases
Estructuras y clases
Interface (instrucción)
Module (instrucción)
Property (instrucción)
Duración de los objetos: cómo se crean y destruyen
Generic Types in Visual Basic
Utilizar una clase genérica
Instrucción Const (Visual Basic)
27/11/2019 • 9 minutes to read • Edit Online

Declara y define una o más constantes.

Sintaxis
[ <attributelist> ] [ accessmodifier ] [ Shadows ]
Const constantlist

Elementos
attributelist
Opcional. Lista de atributos que se aplican a todas las constantes declaradas en esta instrucción. Vea lista de
atributos entre corchetes angulares (" < " y " > ").
accessmodifier
Opcional. Úselo para especificar qué código puede tener acceso a estas constantes. Puede ser Public,
Protected, Friend, Protected Friend, Privateo Private Protected.
Shadows
Opcional. Use esto para volver a declarar y ocultar un elemento de programación en una clase base. Vea
Shadows.
constantlist
Obligatorio. Lista de constantes que se declaran en esta instrucción.
constant [ , constant ... ]

Cada constant tiene la sintaxis y las partes siguientes:


constantname [ As datatype ] = initializer

PA RT E DESC RIP C IÓ N

constantname Obligatorio. Nombre de la constante. Vea Declared Element


Names.

datatype Es obligatorio si se On``Option Strict . Tipo de datos de


la constante.

initializer Obligatorio. Expresión que se evalúa en tiempo de


compilación y se asigna a la constante.

Comentarios
Si tiene un valor que nunca cambia en la aplicación, puede definir una constante con nombre y utilizarla en
lugar de un valor literal. Un nombre es más fácil de recordar que un valor. Puede definir la constante una sola
vez y usarla en muchos lugares del código. Si en una versión posterior necesita volver a definir el valor, la
Const instrucción es el único lugar que necesita para realizar un cambio.
Solo puede usar Const en el nivel de módulo o de procedimiento. Esto significa que el contexto de la
declaración de una variable debe ser una clase, una estructura, un módulo, un procedimiento o un bloque, y
no puede ser un archivo de código fuente, un espacio de nombres o una interfaz. Para obtener más
información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y niveles de
acceso predeterminados).
Las constantes locales (dentro de un procedimiento) tienen como valor predeterminado el acceso público y
no se pueden usar modificadores de acceso en ellas. Las constantes de miembro de clase y módulo (fuera de
cualquier procedimiento) tienen como valor predeterminado el acceso privado y las constantes de miembro
de estructura tienen como valor predeterminado el acceso público. Los niveles de acceso se pueden ajustar
con los modificadores de acceso.

Reglas
Contexto de declaración. Una constante declarada en el nivel de módulo, fuera de cualquier
procedimiento, es una constante de miembro; es miembro de la clase, estructura o módulo que lo
declara.
Una constante declarada en el nivel de procedimiento es una constante local; es local para el
procedimiento o bloque que lo declara.
Sus. Solo puede aplicar atributos a constantes de miembro, no a constantes locales. Un atributo
contribuye a la información en los metadatos del ensamblado, lo que no es significativo para el
almacenamiento temporal, como las constantes locales.
Modificadores. De forma predeterminada, todas las constantes son Shared , Static y ReadOnly . No
se puede usar ninguna de estas palabras clave al declarar una constante.
En el nivel de procedimiento, no se puede usar Shadows o cualquier modificador de acceso para
declarar constantes locales.
Varias constantes. Puede declarar varias constantes en la misma instrucción de declaración,
especificando la parte constantname de cada una. Varias constantes se separan mediante comas.

Reglas de tipo de datos


Tipos de datos. La instrucción Const puede declarar el tipo de datos de una variable. Puede
especificar cualquier tipo de datos o el nombre de una enumeración.
Tipo predeterminado. Si no se especifica datatype , la constante toma el tipo de datos de
initializer . Si especifica datatype y initializer , el tipo de datos de initializer debe ser
convertible en datatype . Si no hay ningún datatype ni initializer , el tipo de datos tiene como valor
predeterminado Object .
Tipos diferentes. Puede especificar tipos de datos diferentes para las diferentes constantes mediante
el uso de una cláusula de As independiente para cada variable que declare. Sin embargo, no se
pueden declarar varias constantes para que sean del mismo tipo mediante una cláusula de As común.
Inicial. Debe inicializar el valor de cada constante en constantlist . Utilice initializer para
proporcionar una expresión que se asignará a la constante. La expresión puede ser cualquier
combinación de literales, otras constantes que ya están definidas y miembros de enumeración que ya
están definidos. Puede usar operadores aritméticos y lógicos para combinar estos elementos.
No se pueden usar variables ni funciones en initializer . Sin embargo, puede usar palabras clave de
conversión como CByte y CShort . También puede utilizar AscW si lo llama con una constante String
o Char argumento, ya que se puede evaluar en tiempo de compilación.
Comportamiento
ID. Solo se puede tener acceso a las constantes locales desde el procedimiento o el bloque. Las
constantes de miembro son accesibles desde cualquier lugar dentro de su clase, estructura o módulo.
Evaluación. El código fuera de una clase, estructura o módulo debe calificar el nombre de una
constante de miembro con el nombre de esa clase, estructura o módulo. El código fuera de un
procedimiento o bloque no puede hacer referencia a ninguna constante local dentro de ese
procedimiento o bloque.

Ejemplo
En el ejemplo siguiente se usa la instrucción Const para declarar constantes que se usan en lugar de los
valores literales.

' The following statements declare constants.


Const maximum As Long = 459
Public Const helpString As String = "HELP"
Private Const startValue As Integer = 5

Ejemplo
Si define una constante con el tipo de datos Object , el compilador Visual Basic le asigna el tipo de
initializer , en lugar de Object . En el ejemplo siguiente, la constante naturalLogBase tiene Decimal de tipo
en tiempo de ejecución.

Const naturalLogBase As Object = CDec(2.7182818284)


MsgBox("Run-time type of constant naturalLogBase is " &
naturalLogBase.GetType.ToString())

En el ejemplo anterior se usa el método ToString en el objeto Type devuelto por el operador GetType, porque
Type no se puede convertir en String con CStr .

Vea también
Asc
AscW
Enum (instrucción)
#Const (directiva)
Dim (instrucción)
ReDim (instrucción)
Conversiones implícitas y explícitas
Constantes y enumeraciones
Constantes y enumeraciones
Funciones de conversión de tipos
Continue (Instrucción, Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Transfiere el control inmediatamente a la siguiente iteración de un bucle.

Sintaxis
Continue { Do | For | While }

Comentarios
Puede transferir desde dentro de un bucle Do , For o While a la siguiente iteración del bucle. El control pasa
inmediatamente a la prueba de la condición de bucle, que es equivalente a transferir a la instrucción For o
While , o a la instrucción Do o Loop que contiene la cláusula Until o While .

Puede usar Continue en cualquier ubicación del bucle que permita las transferencias. Las reglas que permiten la
transferencia de control son las mismas que con la instrucción Goto.
Por ejemplo, si un bucle está contenido completamente dentro de un bloque Try , un bloque Catch o un bloque
Finally , puede usar Continue para transferir fuera del bucle. Por otra parte, si la estructura Try ... End Try se
encuentra dentro del bucle, no se puede usar Continue para transferir el control fuera del bloque de Finally y
se puede usar para transferir fuera de un bloque Try o Catch solo si se transfiere completamente de la
estructura Try ... End Try .
Si tiene bucles anidados del mismo tipo, por ejemplo un bucle Do dentro de otro bucle Do , una instrucción
Continue Do omite la siguiente iteración del bucle de Do más interno que lo contiene. No se puede usar
Continue para pasar a la siguiente iteración de un bucle contenedor del mismo tipo.

Si tiene bucles anidados de distintos tipos, por ejemplo, un bucle Do dentro de un bucle For , puede ir
directamente a la siguiente iteración de cualquier bucle mediante Continue Do o Continue For .

Ejemplo
En el ejemplo de código siguiente se usa la instrucción Continue While para ir a la columna siguiente de una
matriz si un divisor es cero. El Continue While está dentro de un bucle de For . Se transfiere a la instrucción
While col < lastcol , que es la siguiente iteración del bucle While más interno que contiene el bucle For .
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

Vea también
Do...Loop (instrucción)
For...Next (instrucción)
While...End While (instrucción)
Try...Catch...Finally (instrucción)
Declare Statement
27/11/2019 • 16 minutes to read • Edit Online

Declara una referencia a un procedimiento implementado en un archivo externo.

Sintaxis
[ <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 ]

Elementos
T ÉRM IN O DEF IN IC IÓ N

attributelist Opcional. Vea lista de atributos.

accessmodifier Opcional. Puede ser uno de los siguientes:

- público
- protegido
- Friend
- privado
- Friend protegido
- protegido privado

Vea Access levels in Visual Basic.

Shadows Opcional. Vea Shadows.

charsetmodifier Opcional. Especifica el juego de caracteres y la


información de búsqueda de archivos. Puede ser uno de
los siguientes:

- ANSI (valor predeterminado)


- Unicode
- automática

Sub Opcional, pero debe aparecer Sub o Function . Indica


que el procedimiento externo no devuelve un valor.

Function Opcional, pero debe aparecer Sub o Function . Indica


que el procedimiento externo devuelve un valor.

name Obligatorio. Nombre de esta referencia externa. Para


obtener más información, vea nombres de elementos
declarados.
T ÉRM IN O DEF IN IC IÓ N

Lib Obligatorio. Presenta una cláusula Lib , que identifica el


archivo externo (DLL o recurso de código) que contiene
un procedimiento externo.

libname Obligatorio. Nombre del archivo que contiene el


procedimiento declarado.

Alias Opcional. Indica que no se puede identificar el


procedimiento declarado en su archivo por el nombre
especificado en name . Especifique su identificación en
aliasname .

aliasname Obligatorio si se usa la palabra clave Alias . Cadena


que identifica el procedimiento de una de estas dos
maneras:

Nombre del punto de entrada del procedimiento dentro


de su archivo, entre comillas ( "" )

O bien,

Un signo de número ( # ) seguido de un entero que


especifica el número ordinal del punto de entrada del
procedimiento dentro de su archivo.

parameterlist Obligatorio si el procedimiento toma parámetros. Vea


lista de parámetros.

returntype Obligatorio si se especifica Function y


Option Strict es On . Tipo de datos del valor
devuelto por el procedimiento.

Comentarios
A veces es necesario llamar a un procedimiento definido en un archivo (por ejemplo, un archivo DLL o un
recurso de código) fuera del proyecto. Al hacerlo, el compilador Visual Basic no tiene acceso a la
información que necesita para llamar al procedimiento correctamente, como dónde se encuentra el
procedimiento, cómo se identifica, su secuencia de llamada y tipo de valor devuelto, y el juego de
caracteres de cadena que usa. La instrucción Declare crea una referencia a un procedimiento externo y
proporciona esta información necesaria.
Solo se puede usar Declare en un nivel de módulo. Esto significa que el contexto de la declaración de
una referencia externa debe ser una clase, una estructura o un módulo, y no puede ser un archivo de
código fuente, un espacio de nombres, una interfaz, un procedimiento o un bloque. Para obtener más
información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y niveles de
acceso predeterminados).
Las referencias externas tienen como valor predeterminado el acceso público . Los niveles de acceso se
pueden ajustar con los modificadores de acceso.

Reglas
Sus. Puede aplicar atributos a una referencia externa. Cualquier atributo que aplique solo tiene
efecto en el proyecto, no en el archivo externo.
Modificadores. Los procedimientos externos se compartenimplícitamente. No se puede usar la
palabra clave Shared al declarar una referencia externa, y no se puede modificar su estado
compartido.
Un procedimiento externo no puede participar en la invalidación, la implementación de miembros
de interfaz o la administración de eventos. En consecuencia, no se puede usar la palabra clave
Overrides , Overridable , NotOverridable , MustOverride , Implements o Handles en una
instrucción Declare .
Nombre del procedimiento externo. No es necesario asignar a esta referencia externa el
mismo nombre (en name ) que el nombre de punto de entrada del procedimiento dentro de su
archivo externo ( aliasname ). Puede usar una cláusula Alias para especificar el nombre del punto
de entrada. Esto puede ser útil si el procedimiento externo tiene el mismo nombre que un
modificador Visual Basic reservado o una variable, un procedimiento o cualquier otro elemento de
programación en el mismo ámbito.

NOTE
Los nombres de punto de entrada en la mayoría de los archivos dll distinguen mayúsculas de minúsculas.

Número de procedimiento externo. Como alternativa, puede usar una cláusula Alias para
especificar el número ordinal del punto de entrada en la tabla de exportación del archivo externo.
Para ello, empiece aliasname por un signo de número ( # ). Esto puede ser útil si no se permite
ningún carácter en el nombre del procedimiento externo en Visual Basic, o si el archivo externo
exporta el procedimiento sin un nombre.

Reglas de tipo de datos


Tipos de datos de parámetros. Si Option Strict se On , debe especificar el tipo de datos de
cada parámetro en parameterlist . Puede ser cualquier tipo de datos o el nombre de una
enumeración, estructura, clase o interfaz. Dentro de parameterlist , se utiliza una cláusula As
para especificar el tipo de datos del argumento que se va a pasar a cada parámetro.

NOTE
Si el procedimiento externo no se escribió para el .NET Framework, debe tener cuidado de que los tipos de
datos se correspondan. Por ejemplo, si declara una referencia externa a un procedimiento Visual Basic 6,0
con un parámetro Integer (16 bits en Visual Basic 6,0), debe identificar el argumento correspondiente
como Short en la instrucción Declare , porque es el tipo entero de 16 bits en Visual Basic. Del mismo
modo, Long tiene un ancho de datos diferente en Visual Basic 6,0 y Date se implementa de forma
diferente.

Tipo de datos devuelto. Si el procedimiento externo es un Function y Option Strict es On ,


debe especificar el tipo de datos del valor que se devuelve al código de llamada. Puede ser
cualquier tipo de datos o el nombre de una enumeración, estructura, clase o interfaz.

NOTE
El compilador Visual Basic no comprueba si los tipos de datos son compatibles con los del procedimiento
externo. Si hay un error de coincidencia, el Common Language Runtime genera una excepción de
MarshalDirectiveException en tiempo de ejecución.
Tipos de datos predeterminados. Si Option Strict se Off y no se especifica el tipo de datos
de un parámetro en parameterlist , el compilador de Visual Basic convierte el argumento
correspondiente al tipo de datos del objeto. Del mismo modo, si no se especifica returntype , el
compilador toma el tipo de datos devuelto como Object .

NOTE
Dado que está tratando con un procedimiento externo que puede haberse escrito en una plataforma
diferente, es peligroso realizar suposiciones sobre los tipos de datos o para permitir que se conviertan en
valores predeterminados. Es mucho más seguro especificar el tipo de datos de cada parámetro y del valor
devuelto, si hay alguno. Esto también mejora la legibilidad del código.

Comportamiento
ID. Una referencia externa está en el ámbito a lo largo de su clase, estructura o módulo.
Validez. Una referencia externa tiene la misma duración que la clase, estructura o módulo en el
que se declara.
Llamar a un procedimiento externo. Se llama a un procedimiento externo del mismo modo
que se llama a un procedimiento Function o Sub ; para ello, se usa en una expresión, si devuelve
un valor, o si se especifica en una instrucción de llamada si no devuelve un valor.
Los argumentos se pasan al procedimiento externo exactamente como se especifica en
parameterlist en la instrucción Declare . No tenga en cuenta cómo se declararon originalmente
los parámetros en el archivo externo. De forma similar, si hay un valor devuelto, úselo exactamente
como se especifica en returntype en la instrucción Declare .
Juegos de caracteres. Puede especificar en charsetmodifier la forma en que Visual Basic debe
serializar las cadenas cuando llama al procedimiento externo. El modificador Ansi dirige Visual
Basic para calcular las referencias de todas las cadenas a valores ANSI y el modificador Unicode le
indica que calcule las referencias de todas las cadenas a valores Unicode. El modificador Auto
dirige Visual Basic para calcular las referencias de cadenas según .NET Framework reglas basadas
en la name de referencia externa, o aliasname si se especifica. El valor predeterminado es Ansi .
charsetmodifier también especifica el modo en que Visual Basic debe buscar el procedimiento
externo en su archivo externo. Ansi y Unicode Visual Basic directos para buscarlo sin modificar
su nombre durante la búsqueda. Auto dirige Visual Basic para determinar el juego de caracteres
base de la plataforma en tiempo de ejecución y posiblemente modificar el nombre del
procedimiento externo, como se indica a continuación:
En una plataforma ANSI, como Windows 95, Windows 98 o Windows Millennium Edition,
primero debe buscar el procedimiento externo sin modificar el nombre. Si se produce un
error, anexe "a" al final del nombre del procedimiento externo y búsquelo de nuevo.
En una plataforma Unicode, como Windows NT, Windows 2000 o Windows XP, primero
debe buscar el procedimiento externo sin modificar el nombre. Si se produce un error,
anexe "W" al final del nombre del procedimiento externo y búsquelo de nuevo.
Método. Visual Basic utiliza el mecanismo de invocación de plataforma .NET Framework (PInvoke)
para resolver y tener acceso a procedimientos externos. La instrucción Declare y la clase
DllImportAttribute utilizan este mecanismo automáticamente y no se necesita ningún
conocimiento de PInvoke. Para obtener más información, consulte Tutorial: llamar a las API de
Windows.
IMPORTANT
Si el procedimiento externo se ejecuta fuera del Common Language Runtime (CLR), se trata de código no
administrado. Cuando llame a este procedimiento, por ejemplo, una función de la API de Windows o un método
COM, podría exponer la aplicación a riesgos de seguridad. Para obtener más información, vea instrucciones de
codificación segura para código no administrado.

Ejemplo
En el ejemplo siguiente se declara una referencia externa a un procedimiento Function que devuelve el
nombre de usuario actual. A continuación, llama al procedimiento externo GetUserNameA como parte del
procedimiento getUser .

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

Ejemplo
El DllImportAttribute proporciona una forma alternativa de usar funciones en código no administrado. En
el ejemplo siguiente se declara una función importada sin usar una instrucción Declare .

' Add an Imports statement at the top of the class, structure, or


' module that uses the DllImport attribute.
Imports System.Runtime.InteropServices

<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

Vea también
LastDllError
Imports (instrucción), espacio de nombres y tipo .NET
AddressOf (operador)
Function (instrucción)
Sub (instrucción)
Lista de parámetros
Call (instrucción)
Tutorial: Llamar a las API de Windows
Delegate (Instrucción)
27/11/2019 • 7 minutes to read • Edit Online

Se usa para declarar un delegado. Un delegado es un tipo de referencia que hace referencia a un método
Shared de un tipo o a un método de instancia de un objeto. Cualquier procedimiento con parámetros
coincidentes y tipos de valor devueltos se puede utilizar para crear una instancia de esta clase de delegado.
Posteriormente, el procedimiento se puede invocar mediante la instancia del delegado.

Sintaxis
[ <attrlist> ] [ accessmodifier ] _
[ Shadows ] Delegate [ Sub | Function ] name [( Of typeparamlist )] [([ parameterlist ])] [ As type ]

Elementos
T ÉRM IN O DEF IN IC IÓ N

attrlist Opcional. Lista de atributos que se aplican a este delegado.


Los diversos atributos se separan con comas. Debe incluir
la lista de atributos entre corchetes angulares (" < " y " >
").

accessmodifier Opcional. Especifica qué código puede tener acceso al


delegado. Puede ser uno de los siguientes:

- público. Cualquier código que pueda tener acceso al


elemento que declara el delegado puede tener acceso al
mismo.
- protegido. Solo el código dentro de la clase del delegado
o de una clase derivada puede tener acceso al mismo.
- Friend. Solo el código del mismo ensamblado puede tener
acceso al delegado.
- privado. Solo el código dentro del elemento que declara el
delegado puede tener acceso al mismo.

- código solo Friend protegido dentro de la clase del


delegado, una clase derivada o el mismo ensamblado
puede tener acceso al delegado.
- código privado protegido solo dentro de la clase del
delegado o en una clase derivada del mismo ensamblado
puede tener acceso al delegado.
T ÉRM IN O DEF IN IC IÓ N

Shadows Opcional. Indica que este delegado vuelve a declarar y


oculta un elemento de programación con el mismo
nombre, o un conjunto de elementos sobrecargados, en
una clase base. Puede reemplazar cualquier tipo de
elemento declarado con cualquier otro tipo.

Un elemento reemplazado no está disponible desde la clase


derivada que lo reemplaza, excepto desde donde el
elemento reemplazado es inaccesible. Por ejemplo, si un
elemento Private sombrea un elemento de clase base, el
código que no tiene permiso para obtener acceso al
elemento Private tiene acceso al elemento de clase base
en su lugar.

Sub Opcional, pero debe aparecer Sub o Function . Declara


este procedimiento como un delegado Sub procedimiento
que no devuelve un valor.

Function Opcional, pero debe aparecer Sub o Function . Declara


este procedimiento como un delegado Function
procedimiento que devuelve un valor.

name Obligatorio. Nombre del tipo de delegado; sigue las


convenciones de nomenclatura de variables estándar.

typeparamlist Opcional. Lista de parámetros de tipo para este delegado.


Varios parámetros de tipo se separan mediante comas.
Opcionalmente, cada parámetro de tipo se puede declarar
como variante mediante el uso de In y Out
modificadores genéricos. Debe incluir la lista de tipos entre
paréntesis y presentarla con la palabra clave Of .

parameterlist Opcional. Lista de parámetros que se pasan al


procedimiento cuando se llama. Debe incluir la lista de
parámetros entre paréntesis.

type Obligatorio si se especifica un procedimiento Function .


Tipo de datos del valor devuelto.

Comentarios
La instrucción Delegate define el parámetro y los tipos devueltos de una clase de delegado. Cualquier
procedimiento con parámetros coincidentes y tipos de valor devueltos se puede utilizar para crear una
instancia de esta clase de delegado. Posteriormente, el procedimiento se puede invocar mediante la instancia
de delegado, llamando al método Invoke del delegado.
Los delegados se pueden declarar en el nivel de espacio de nombres, módulo, clase o estructura, pero no
dentro de un procedimiento.
Cada clase delegada define un constructor que se pasa la especificación de un método de objeto. Un
argumento para un constructor delegado debe ser una referencia a un método o una expresión lambda.
Para especificar una referencia a un método, utilice la siguiente sintaxis:
AddressOf [ expression .] methodname
El tipo de tiempo de compilación de expression debe ser el nombre de una clase o una interfaz que contiene
un método del nombre especificado cuya firma coincida con la firma de la clase delegada. methodname puede
ser un método compartido o un método de instancia. methodname no es opcional, incluso si se crea un
delegado para el método predeterminado de la clase.
Para especificar una expresión lambda, utilice la siguiente sintaxis:
Function ([ parm As type , parm2 As type2 , ...]) expression

La firma de la función debe coincidir con la del tipo de delegado. Para obtener más información sobre las
expresiones lambda, vea Expresiones lambda.
Para obtener más información sobre los delegados, consulte Delegados.

Ejemplo
En el ejemplo siguiente se usa la instrucción Delegate para declarar un delegado para que opere con dos
números y devolver un número. El método DelegateTest toma una instancia de un delegado de este tipo y lo
usa para operar en pares de números.

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

Vea también
AddressOf (operador)
Of
Delegados
Utilizar una clase genérica
Generic Types in Visual Basic
Covarianza y contravarianza
In
Out
DIM (instrucción Visual Basic)
03/02/2020 • 24 minutes to read • Edit Online

Declara y asigna espacio de almacenamiento para una o más variables.

Sintaxis
[ <attributelist> ] [ accessmodifier ] [[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ]
Dim [ WithEvents ] variablelist

Partes
attributelist

Opcional. Vea lista de atributos.


accessmodifier

Opcional. Puede ser uno de los siguientes:


Pública
Protected
Friend
Privada
Protected Friend
Private Protected
Vea Access levels in Visual Basic.
Shared

Opcional. Vea Shared.


Shadows

Opcional. Vea Shadows.


Static

Opcional. Vea static.


ReadOnly

Opcional. Vea ReadOnly.


WithEvents

Opcional. Especifica que se trata de variables de objeto que hacen referencia a las instancias de
una clase que puede generar eventos. Vea WithEvents.
variablelist
Necesario. Lista de variables que se declaran en esta instrucción.
variable [ , variable ... ]

Cada variable tiene la sintaxis y las partes siguientes:


variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With {
[ .propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]

PA RT E DESC RIP C IÓ N

variablename Necesario. nombre de la variable. Vea Declared


Element Names.

boundslist Opcional. Lista de los límites de cada dimensión de


una variable de matriz.

New Opcional. Crea una nueva instancia de la clase


cuando se ejecuta la instrucción Dim .

datatype Opcional. Tipo de datos de la variable.

With Opcional. Presenta la lista de inicializadores de


objeto.

propertyname Opcional. Nombre de una propiedad de la clase en


la que se va a crear una instancia.

propinitializer Obligatorio después de propertyname =.


Expresión que se evalúa y asigna al nombre de la
propiedad.

initializer Opcional si no se especifica New . Expresión que se


evalúa y se asigna a la variable cuando se crea.

Observaciones
El compilador Visual Basic usa la instrucción Dim para determinar el tipo de datos de la variable y otra
información, como el código que puede tener acceso a la variable. En el ejemplo siguiente se declara
una variable que contiene un valor Integer .

Dim numberOfStudents As Integer

Puede especificar cualquier tipo de datos o el nombre de una enumeración, estructura, clase o interfaz.

Dim finished As Boolean


Dim monitorBox As System.Windows.Forms.Form

Para un tipo de referencia, use la palabra clave New para crear una nueva instancia de la clase o la
estructura especificada por el tipo de datos. Si utiliza New , no utiliza una expresión de inicializador. En
su lugar, se proporcionan argumentos, si son necesarios, al constructor de la clase a partir de la cual se
crea la variable.
Dim bottomLabel As New System.Windows.Forms.Label

Puede declarar una variable en un procedimiento, un bloque, una clase, una estructura o un módulo.
No se puede declarar una variable en un archivo de código fuente, un espacio de nombres o una
interfaz. Para obtener más información, vea Declaration Contexts and Default Access Levels (Contextos
de declaración y niveles de acceso predeterminados).
Una variable que se declara en el nivel de módulo, fuera de cualquier procedimiento, es una variable o
campo miembro . Las variables de miembro están en el ámbito a lo largo de su clase, estructura o
módulo. Una variable que se declara en el nivel de procedimiento es una variable local. Las variables
locales están en el ámbito solo dentro de su procedimiento o bloque.
Los modificadores de acceso siguientes se usan para declarar variables fuera de un procedimiento:
Public , Protected , Friend , Protected Friend y Private . Para obtener más información, consulte
niveles de acceso en Visual Basic.
La palabra clave Dim es opcional y normalmente se omite si se especifica cualquiera de los siguientes
modificadores: Public , Protected , Friend , Protected Friend , Private , Shared , Shadows , Static ,
ReadOnly o WithEvents .

Public maximumAllowed As Double


Protected Friend currentUserName As String
Private salary As Decimal
Static runningTotal As Integer

Si Option Explicit es on (valor predeterminado), el compilador requiere una declaración para cada
variable que se use. Para obtener más información, vea Option Explicit (instrucción).

Especificar un valor inicial


Puede asignar un valor a una variable cuando se crea. Para un tipo de valor, se usa un inicializador para
proporcionar una expresión que se va a asignar a la variable. La expresión se debe evaluar como una
constante que se puede calcular en tiempo de compilación.

Dim quantity As Integer = 10


Dim message As String = "Just started"

Si se especifica un inicializador y no se especifica un tipo de datos en una cláusula As , se usa la


inferencia de tipos para deducir el tipo de datos del inicializador. En el ejemplo siguiente, tanto num1
como num2 están fuertemente tipados como enteros. En la segunda declaración, la inferencia de tipos
infiere el tipo a partir del valor 3.

' Use explicit typing.


Dim num1 As Integer = 3

' Use local type inference.


Dim num2 = 3

La inferencia de tipos se aplica en el nivel de procedimiento. No se aplica fuera de un procedimiento en


una clase, estructura, módulo o interfaz. Para obtener más información sobre la inferencia de tipos, vea
Option Infer Statement e inferencia de tipo local.
Para obtener información sobre lo que ocurre cuando no se especifica un tipo de datos o un
inicializador, vea valores y tipos de datos predeterminados más adelante en este tema.
Puede usar un inicializador de objeto para declarar instancias de tipos con nombre y anónimos. En el
código siguiente se crea una instancia de una clase Student y se utiliza un inicializador de objeto para
inicializar las propiedades.

Dim student1 As New Student With {.First = "Michael",


.Last = "Tucker"}

Para obtener más información sobre los inicializadores de objeto, vea Cómo: declarar un objeto usando
un inicializadorde objeto, inicializadores de objeto: tipos con nombre y anónimos, y tipos anónimos.

Declarar varias variables


Puede declarar varias variables en una instrucción de declaración, especificando el nombre de la
variable para cada una de ellas y siguiendo cada nombre de matriz entre paréntesis. Las variables se
separan con comas.

Dim lastTime, nextTime, allTimes() As Date

Si se declara más de una variable con una As cláusula, no se puede proporcionar un inicializador para
ese grupo de variables.
Puede especificar tipos de datos diferentes para variables diferentes mediante una cláusula de As
independiente para cada variable que declare. Cada variable toma el tipo de datos especificado en la
primera cláusula As encontrada después de su parte variablename .

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

Matrices
Puede declarar una variable para que contenga una matriz, que puede contener varios valores. Para
especificar que una variable contiene una matriz, siga el variablename inmediatamente con paréntesis.
Para obtener más información sobre las matrices, consulte Matrices.
Puede especificar el límite inferior y superior de cada dimensión de una matriz. Para ello, incluya una
boundslist dentro de los paréntesis. Para cada dimensión, el boundslist especifica el límite superior
y, opcionalmente, el límite inferior. El límite inferior es siempre cero, tanto si se especifica como si no.
Cada índice puede variar de cero a través de su valor de límite superior.
Las dos instrucciones siguientes son equivalentes. Cada instrucción declara una matriz de 21
elementos Integer . Al tener acceso a la matriz, el índice puede variar de 0 a 20.

Dim totals(20) As Integer


Dim totals(0 To 20) As Integer

La instrucción siguiente declara una matriz bidimensional de tipo Double . La matriz tiene 4 filas (3 + 1)
de 6 columnas (5 + 1) cada una. Tenga en cuenta que un límite superior representa el valor más alto
posible para el índice, no la longitud de la dimensión. La longitud de la dimensión es el límite superior
más uno.
Dim matrix2(3, 5) As Double

Una matriz puede tener de 1 a 32 dimensiones.


Puede dejar todos los límites en blanco en una declaración de matriz. Si lo hace, la matriz tiene el
número de dimensiones que especifique, pero no se inicializa. Tiene un valor de Nothing hasta que
inicializa al menos algunos de sus elementos. La instrucción Dim debe especificar límites para todas
las dimensiones o para ninguna dimensión.

' Declare an array with blank array bounds.


Dim messages() As String
' Initialize the array.
ReDim messages(4)

Si la matriz tiene más de una dimensión, debe incluir comas entre paréntesis para indicar el número de
dimensiones.

Dim oneDimension(), twoDimensions(,), threeDimensions(,,) As Byte

Puede declarar una matriz de longitud cero declarando una de las dimensiones de la matriz para que
sea-1. Una variable que contiene una matriz de longitud cero no tiene el valor Nothing . Ciertas
funciones Common Language Runtime requieren matrices de longitud cero. Si intenta obtener acceso
a una matriz de este tipo, se produce una excepción en tiempo de ejecución. Para más información,
consulte Matrices.
Puede inicializar los valores de una matriz mediante un literal de matriz. Para ello, incluya los valores
de inicialización entre llaves ( {} ).

Dim longArray() As Long = {0, 1, 2, 3}

En el caso de las matrices multidimensionales, la inicialización de cada dimensión independiente se


incluye entre llaves en la dimensión externa. Los elementos se especifican en orden de fila principal.

Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}

Para obtener más información sobre los literales de matriz, vea matrices.

Valores y tipos de datos predeterminados


En la tabla siguiente se describen los resultados de diversas combinaciones resultantes de especificar el
tipo de datos y el inicializador en una instrucción Dim .

¿T IP O DE DATO S ¿IN IC IA L IZ A DO R
ESP EC IF IC A DO ? ESP EC IF IC A DO ? E JEM P LO RESULTA DO
¿T IP O DE DATO S ¿IN IC IA L IZ A DO R
ESP EC IF IC A DO ? ESP EC IF IC A DO ? E JEM P LO RESULTA DO

No No Dim qty Si Option Strict está


establecido en OFF (valor
predeterminado), la
variable se establece en
Nothing .

Si Option Strict está


activado, se produce un
error en tiempo de
compilación.

No Sí Dim qty = 5 Si Option Infer es on


(valor predeterminado), la
variable toma el tipo de
datos del inicializador. Vea
inferencia de tipo de
local.

Si Option Infer está


desactivado y
Option Strict está
desactivado, la variable
toma el tipo de datos de
Object .

Si Option Infer está


desactivado y
Option Strict está
activado, se produce un
error en tiempo de
compilación.

Sí No Dim qty As Integer La variable se inicializa


con el valor
predeterminado del tipo
de datos. Vea la tabla que
aparece más adelante en
esta sección.

Sí Sí Dim qty As Integer = Si el tipo de datos del


5 inicializador no es
convertible al tipo de
datos especificado, se
produce un error en
tiempo de compilación.

Si especifica un tipo de datos pero no especifica un inicializador, Visual Basic inicializa la variable en el
valor predeterminado para su tipo de datos. En la tabla siguiente se muestran los valores de
inicialización predeterminados.

T IP O DE DATO S VA LO R P REDET ERM IN A DO

Todos los tipos numéricos (incluidos Byte y SByte ) 0

Char Binario 0
T IP O DE DATO S VA LO R P REDET ERM IN A DO

Todos los tipos de referencia (incluidos Object , Nothing


String y todas las matrices)

Boolean False

Date 12:00 A.M. del 1 de enero del año 1 (01/01/0001


12:00:00 AM)

Cada elemento de una estructura se inicializa como si fuera una variable independiente. Si declara la
longitud de una matriz pero no inicializa sus elementos, cada elemento se inicializa como si fuera una
variable independiente.

Duración de la variable local estática


Una variable local Static tiene una duración más larga que la del procedimiento en el que se declara.
Los límites de la duración de la variable dependen de dónde se declara el procedimiento y de si se
Shared .

DEC L A RA C IÓ N DE
P RO C EDIM IEN TO VA RIA B L E IN IC IA L IZ A DA L A VA RIA B L E DE JA DE EXIST IR

En un módulo La primera vez que se llama al Cuando el programa detiene la


procedimiento ejecución

En una clase o estructura, el La primera vez que se llama al Cuando el programa detiene la
procedimiento es Shared procedimiento en una instancia ejecución
específica o en la propia clase o
estructura

En una clase o estructura, el La primera vez que se llama al Cuando se libera la instancia para la
procedimiento no es Shared procedimiento en una instancia recolección de elementos no
específica utilizados (GC)

Atributos y modificadores
Solo puede aplicar atributos a las variables de miembro, no a las variables locales. Un atributo aporta
información a los metadatos del ensamblado, lo que no es significativo para el almacenamiento
temporal, como las variables locales.
En el nivel de módulo, no se puede usar el modificador Static para declarar variables de miembro. En
el nivel de procedimiento, no se puede usar Shared , Shadows , ReadOnly , WithEvents o cualquier
modificador de acceso para declarar variables locales.
Puede especificar qué código puede tener acceso a una variable proporcionando un accessmodifier .
Las variables de miembro de clase y módulo (fuera de cualquier procedimiento) tienen como valor
predeterminado el acceso privado y las variables miembro de estructura tienen como valor
predeterminado el acceso público. Los niveles de acceso se pueden ajustar con los modificadores de
acceso. No se pueden usar modificadores de acceso en variables locales (dentro de un procedimiento).
Solo puede especificar WithEvents en variables de miembro, no en variables locales dentro de un
procedimiento. Si especifica WithEvents , el tipo de datos de la variable debe ser un tipo de clase
específico, no Object . No se puede declarar una matriz con WithEvents . Para obtener más
información sobre los eventos, vea eventos.
NOTE
El código fuera de una clase, estructura o módulo debe calificar el nombre de una variable miembro con el
nombre de esa clase, estructura o módulo. El código fuera de un procedimiento o bloque no puede hacer
referencia a ninguna variable local dentro de ese procedimiento o bloque.

Liberar recursos administrados


El recolector de elementos no utilizados de .NET Framework elimina los recursos administrados sin
necesidad de codificación adicional por su parte. Sin embargo, puede forzar la eliminación de un
recurso administrado en lugar de esperar al recolector de elementos no utilizados.
Si una clase contiene un recurso especialmente valioso y escaso (como una conexión de base de datos
o un identificador de archivo), es posible que no desee esperar hasta la siguiente recolección de
elementos no utilizados para limpiar una instancia de clase que ya no está en uso. Una clase puede
implementar la interfaz IDisposable para proporcionar una manera de liberar recursos antes de una
recolección de elementos no utilizados. Una clase que implementa esa interfaz expone un método
Dispose al que se puede llamar para obligar a que se liberen recursos valiosos de forma inmediata.

La instrucción Using automatiza el proceso de adquisición de un recurso, la ejecución de un conjunto


de instrucciones y la eliminación del recurso. Sin embargo, el recurso debe implementar la interfaz
IDisposable. Para obtener más información, vea Using (Instrucción).

Ejemplo
En el siguiente ejemplo se declaran variables mediante la instrucción Dim con varias opciones.

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

Ejemplo
En el ejemplo siguiente se enumeran los números primos entre 1 y 30. El ámbito de las variables
locales se describe en los comentarios de código.
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

Ejemplo
En el ejemplo siguiente, la variable speedValue se declara en el nivel de clase. La palabra clave
Private se utiliza para declarar la variable. Cualquier procedimiento de la clase Car puede tener
acceso a la variable.

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

Consulte también
Const (instrucción)
ReDim (instrucción)
Option Explicit (instrucción)
Option Infer (instrucción)
Option Strict (instrucción)
Página Compilación, Diseñador de proyectos (Visual Basic)
Declaración de variables
Matrices
Inicializadores de objeto: Tipos con nombre y anónimos
Tipos anónimos
Inicializadores de objeto: Tipos con nombre y anónimos
Declarar un objeto usando un inicializador de objeto
Inferencia de tipo de variable local
Instrucción Do...Loop (Visual Basic)
27/11/2019 • 7 minutes to read • Edit Online

Repite un bloque de instrucciones mientras se True una condición Boolean o hasta que la condición se True .

Sintaxis
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

Elementos
T ÉRM IN O DEF IN IC IÓ N

Do Obligatorio. Inicia la definición del bucle Do .

While Es necesario a menos que se use Until . Repita el bucle


hasta que se False``condition .

Until Es necesario a menos que se use While . Repita el bucle


hasta que se True``condition .

condition Opcional. Boolean expresión. Si condition es Nothing ,


Visual Basic lo trata como False .

statements Opcional. Una o varias instrucciones que se repiten


mientras, o hasta, se True``condition .

Continue Do Opcional. Transfiere el control a la siguiente iteración del


bucle Do .

Exit Do Opcional. Transfiere el control fuera del bucle Do .

Loop Obligatorio. Finaliza la definición del bucle Do .

Comentarios
Use una estructura de Do...Loop cuando desee repetir un conjunto de instrucciones un número indefinido de
veces, hasta que se satisfaga una condición. Si desea repetir las instrucciones un número establecido de veces,
la instrucción for... La siguiente instrucción suele ser una mejor opción.
Puede usar While o Until para especificar condition , pero no ambos.
Solo puede probar condition una vez, al principio o al final del bucle. Si prueba condition al principio del
bucle (en la instrucción Do ), es posible que el bucle no se ejecute incluso una vez. Si realiza una prueba al final
del bucle (en la instrucción Loop ), el bucle siempre se ejecuta al menos una vez.
La condición suele ser el resultado de una comparación de dos valores, pero puede ser cualquier expresión que
se evalúe como un valor de tipo de datos booleano ( True o False ). Esto incluye los valores de otros tipos de
datos, como los tipos numéricos, que se han convertido en Boolean .
Puede anidar Do bucles colocando un bucle dentro de otro. También puede anidar distintos tipos de
estructuras de control entre sí. Para obtener más información, vea estructuras de control anidadas.

NOTE
La estructura de Do...Loop proporciona más flexibilidad que el tiempo... End while , ya que permite decidir si finalizar el
bucle cuando condition deja de True o cuando se convierte por primera vez en True . También le permite probar
condition al principio o al final del bucle.

Salir
La instrucción Exit do puede proporcionar una manera alternativa de salir de un Do…Loop . Exit Do transfiere el
control inmediatamente a la instrucción que sigue a la instrucción Loop .
a menudo se usa después de evaluar alguna condición, por ejemplo en una estructura de
Exit Do
If...Then...Else . Es posible que desee salir de un bucle si detecta una condición que hace que sea innecesario
o imposible continuar la iteración, como un valor erróneo o una solicitud de finalización. Un uso de Exit Do es
probar una condición que podría provocar un bucle interminable, que es un bucle que podría ejecutar un
número de veces grande o incluso infinito. Puede usar Exit Do para escapar el bucle.
Puede incluir cualquier número de instrucciones Exit Do en cualquier parte de un Do…Loop .
Cuando se utiliza en bucles Do anidados, Exit Do transfiere el control fuera del bucle más interno y en el
siguiente nivel superior de anidamiento.

Ejemplo
En el ejemplo siguiente, las instrucciones del bucle continúan ejecutándose hasta que la variable de index sea
mayor que 10. La cláusula Until está al final del bucle.

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

Ejemplo
En el ejemplo siguiente se utiliza una cláusula While en lugar de una cláusula Until y condition se prueba al
principio del bucle en lugar de al final.

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

Ejemplo
En el ejemplo siguiente, condition detiene el bucle cuando la variable de index es mayor que 100. Sin
embargo, la instrucción If del bucle hace que la instrucción Exit Do detenga el bucle cuando la variable de
índice sea mayor que 10.

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

Ejemplo
En el ejemplo siguiente se leen todas las líneas de un archivo de texto. El método OpenText abre el archivo y
devuelve un StreamReader que lee los caracteres. En la condición Do...Loop , el método Peek de la
StreamReader determina si hay caracteres adicionales.

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

Vea también
Estructuras de bucle
For...Next (instrucción)
Boolean (tipo de datos)
Estructuras de control anidadas
Exit (instrucción)
While...End While (instrucción)
Else (Instrucción, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Introduce un grupo de instrucciones que se van a ejecutar o compilar si no se ha ejecutado o compilado ningún
otro grupo condicional de instrucciones.

Comentarios
La palabra clave Else se puede usar en los siguientes contextos:
If...Then...Else (instrucción)
Select...Case (instrucción)
#If... Then... #Else (Directiva)

Vea también
Palabras clave
End (Instrucción)
27/11/2019 • 3 minutes to read • Edit Online

Finaliza la ejecución inmediatamente.

Sintaxis
End

Comentarios
Puede colocar la instrucción End en cualquier parte de un procedimiento para obligar a que toda la aplicación
deje de ejecutarse. End cierra los archivos abiertos con una instrucción Open y borra todas las variables de la
aplicación. La aplicación se cierra en cuanto no hay ningún otro programa que contenga referencias a sus objetos
y no se está ejecutando ningún código.

NOTE
La instrucción End detiene la ejecución del código repentinamente y no invoca el Dispose ni Finalize método, ni
ningún otro código de Visual Basic. Se invalidan las referencias de objeto mantenidas por otros programas. Si se encuentra
una instrucción End dentro de un bloque Try o Catch , el control no pasa al bloque de Finally correspondiente.

La instrucción Stop suspende la ejecución, pero a diferencia de End , no cierra ningún archivo ni borra ninguna
variable, a menos que se encuentre en un archivo ejecutable (. exe) compilado.
Dado que End finaliza la aplicación sin tener que ocuparse de los recursos que puedan estar abiertos, debe
intentar cerrarlo correctamente antes de usarlo. Por ejemplo, si la aplicación tiene algún formulario abierto, debe
cerrarlo antes de que el control alcance la instrucción End .
Debería usar End moderadamente y solo cuando necesite detenerse inmediatamente. Las formas normales de
finalizar un procedimiento (instrucción return y de salida) no solo cierran el procedimiento correctamente, sino
que también proporcionan al código de llamada la oportunidad de cerrarse sin problemas. Por ejemplo, una
aplicación de consola puede Return del procedimiento Main .

IMPORTANT
La instrucción End llama al método Exit de la clase Environment en el espacio de nombres System. Exit requiere que tenga
UnmanagedCode permiso. Si no lo hace, se produce un error de SecurityException.

Cuando va seguido de una palabra clave adicional, End <palabra clave > instrucción define el final de la
definición del procedimiento o bloque adecuado. Por ejemplo, End Function finaliza la definición de un
procedimiento Function .

Ejemplo
En el ejemplo siguiente se usa la instrucción End para finalizar la ejecución del código si el usuario lo solicita.
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

Notas para desarrolladores de Smart Device


Esta instrucción no se admite.

Vea también
SecurityPermissionFlag
Stop (instrucción)
End <palabra clave > instrucción
End <palabra clave > instrucción (Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

Cuando va seguido de una palabra clave adicional, finaliza la definición del bloque de instrucciones introducido
por esa palabra clave.

Sintaxis
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

Elementos
PA RT E DESC RIP C IÓ N

End Obligatorio. Finaliza la definición del elemento de


programación.

AddHandler Se requiere para terminar un descriptor de acceso


AddHandler Iniciado por una instrucción AddHandler
coincidente en una instrucción de eventopersonalizada.

Class Necesario para terminar una definición de clase que comienza


por una instrucción de clasecoincidente.

Enum Necesario para terminar una definición de enumeración


iniciada por una instrucción enumcoincidente.

Event Necesario para terminar una definición de evento Custom


iniciada por una instrucción de eventocoincidente.
PA RT E DESC RIP C IÓ N

Function Necesario para terminar una definición de procedimiento


Function iniciada por una instrucción de
funcióncoincidente. Si la ejecución encuentra una instrucción
End Function , el control vuelve al código de llamada.

Get Necesario para terminar una definición de procedimiento


Property iniciada por una instrucción Getcoincidente. Si la
ejecución encuentra una instrucción End Get , el control
vuelve a la instrucción que solicita el valor de la propiedad.

If Necesario para terminar una definición de bloque If ...


Then ... Else iniciada por una instrucción de If
coincidente. Vea If... Después... Else (instrucción).

Interface Necesario para terminar una definición de interfaz iniciada por


una instrucción de interfazcoincidente.

Module Necesario para terminar una definición de módulo iniciada


por una instrucción de módulocoincidente.

Namespace Necesario para terminar una definición de espacio de


nombres iniciada por una instrucción de espacio de
nombrescoincidente.

Operator Necesario para terminar una definición de operador iniciada


por una instrucción de operadorcoincidente.

Property Necesario para terminar una definición de propiedad iniciada


por una instrucción de propiedadcoincidente.

RaiseEvent Se requiere para terminar un descriptor de acceso


RaiseEvent Iniciado por una instrucción RaiseEvent
coincidente en una instrucción de eventopersonalizada.

RemoveHandler Se requiere para terminar un descriptor de acceso


RemoveHandler Iniciado por una instrucción
RemoveHandler coincidente en una instrucción de
eventopersonalizada.

Select Necesario para terminar una definición de bloque Select ...


Case iniciada por una instrucción Select coincidente. Vea
Select... Instrucción Case.

Set Necesario para terminar una definición de procedimiento


Property iniciada por una instrucción setcoincidente. Si la
ejecución encuentra una instrucción End Set , el control
vuelve a la instrucción que establece el valor de la propiedad.

Structure Necesario para terminar una definición de estructura que


comienza por una instrucción de estructuracoincidente.
PA RT E DESC RIP C IÓ N

Sub Necesario para terminar una definición de procedimiento


Sub iniciada por una instrucción Subcoincidente. Si la
ejecución encuentra una instrucción End Sub , el control
vuelve al código de llamada.

SyncLock Necesario para terminar una definición de bloque SyncLock


iniciada por una instrucción SyncLock coincidente. Vea la
instrucción SyncLock.

Try Necesario para terminar una definición de bloque Try ...


Catch ... Finally iniciada por una instrucción de Try
coincidente. Vea try... Detectar... Finally.

While Necesario para terminar una definición de bucle While


iniciada por una instrucción While coincidente. Vea while...
End while (instrucción).

With Necesario para terminar una definición de bloque With


iniciada por una instrucción With coincidente. Vea con... End
with.

Directivas
Cuando va precedido de un signo de número ( # ), la palabra clave End finaliza un bloque de preprocesamiento
introducido por la directiva correspondiente.

#End ExternalSource
#End If
#End Region

PA RT E DESC RIP C IÓ N

#End Obligatorio. Finaliza la definición del bloque de


preprocesamiento.

ExternalSource Obligatorio para finalizar un bloque de origen externo


Iniciado por una Directiva de #ExternalSourcecoincidente.

If Necesario para terminar un bloque de compilación


condicional Iniciado por una directiva de #If coincidente.
Vea #If... Then... #Else directivas.

Region Obligatorio para terminar un bloque de región de origen


Iniciado por una Directiva de #Regioncoincidente.

Comentarios
La instrucción end, sin una palabra clave adicional, finaliza la ejecución inmediatamente.
Notas para desarrolladores de Smart Device
No se admite la instrucción End , sin una palabra clave adicional.

Vea también
End (instrucción)
Instrucción Enum (Visual Basic)
27/11/2019 • 14 minutes to read • Edit Online

Declara una enumeración y define los valores de sus miembros.

Sintaxis
[ <attributelist> ] [ accessmodifier ] [ Shadows ]
Enum enumerationname [ As datatype ]
memberlist
End Enum

Elementos
attributelist

Opcional. Lista de atributos que se aplican a esta enumeración. Debe incluir la lista de atributos entre
corchetes angulares (" < " y " > ").
El atributo FlagsAttribute indica que el valor de una instancia de la enumeración puede incluir varios
miembros de enumeración y que cada miembro representa un campo de bits en el valor de
enumeración.
accessmodifier

Opcional. Especifica qué código puede tener acceso a esta enumeración. Puede ser uno de los
siguientes:
Public
Protected
Friend
Private
Protected Friend
Private Protected
Shadows

Opcional. Especifica que esta enumeración vuelve a declarar y oculta un elemento de programación
con el mismo nombre, o un conjunto de elementos sobrecargados, en una clase base. Solo puede
especificar Shadows en la propia enumeración, no en ninguno de sus miembros.
enumerationname

Obligatorio. Nombre de la enumeración. Para obtener información sobre los nombres válidos, vea
nombres de elementos declarados.
datatype

Opcional. Tipo de datos de la enumeración y de todos sus miembros.


memberlist

Obligatorio. Lista de constantes de miembro que se declaran en esta instrucción. Aparecen varios
miembros en líneas de código fuente individuales.
Cada member tiene la sintaxis y las partes siguientes:
[<attribute list>] member name [ = initializer ]

PA RT E DESC RIP C IÓ N

membername Obligatorio. Nombre de este miembro.

initializer Opcional. Expresión que se evalúa en tiempo de


compilación y se asigna a este miembro.

End Enum

Finaliza el bloque Enum .

Comentarios
Si tiene un conjunto de valores invariables que están relacionados lógicamente entre sí, puede definirlos
juntos en una enumeración. Esto proporciona nombres descriptivos para la enumeración y sus miembros,
que son más fáciles de recordar que sus valores. Después, puede usar los miembros de enumeración en
muchos lugares del código.
Las ventajas de utilizar enumeraciones son las siguientes:
Reduce los errores causados por la transposición o la escritura indebida de números.
Facilita el cambio de valores en el futuro.
Facilita la lectura del código, lo que significa que es menos probable que se introduzcan errores.
Garantiza la compatibilidad con versiones posteriores. Si usa enumeraciones, es menos probable que
se produzca un error en el código si en el futuro alguien cambia los valores correspondientes a los
nombres de miembro.
Una enumeración tiene un nombre, un tipo de datos subyacente y un conjunto de miembros. Cada miembro
representa una constante.
Una enumeración declarada en el nivel de clase, estructura, módulo o interfaz, fuera de cualquier
procedimiento, es una enumeración de miembros. Es miembro de la clase, estructura, módulo o interfaz que
lo declara.
Se puede tener acceso a las enumeraciones de miembros desde cualquier lugar dentro de su clase,
estructura, módulo o interfaz. El código fuera de una clase, estructura o módulo debe calificar el nombre de la
enumeración de un miembro con el nombre de esa clase, estructura o módulo. Puede evitar la necesidad de
usar nombres completos agregando una instrucción Imports al archivo de código fuente.
Una enumeración declarada en el nivel de espacio de nombres, fuera de cualquier clase, estructura, módulo o
interfaz, es un miembro del espacio de nombres en el que aparece.
El contexto de la declaración de una enumeración debe ser un archivo de código fuente, un espacio de
nombres, una clase, una estructura, un módulo o una interfaz y no puede ser un procedimiento. Para obtener
más información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y niveles de
acceso predeterminados).
Puede aplicar atributos a una enumeración en su totalidad, pero no a sus miembros individualmente. Un
atributo contribuye a la información en los metadatos del ensamblado.

Tipo de datos
La instrucción Enum puede declarar el tipo de datos de una enumeración. Cada miembro toma el tipo de
datos de la enumeración. Puede especificar Byte , Integer , Long , SByte , Short , UInteger , ULong o
UShort .

Si no especifica datatype para la enumeración, cada miembro toma el tipo de datos de su initializer . Si
especifica datatype y initializer , el tipo de datos de initializer debe ser convertible en datatype . Si no
hay ningún datatype ni initializer , el tipo de datos tiene como valor predeterminado Integer .

Inicializar miembros
La instrucción Enum puede inicializar el contenido de los miembros seleccionados en memberlist . Utilice
initializer para proporcionar una expresión que se va a asignar al miembro.

Si no especifica initializer para un miembro, Visual Basic lo inicializa en cero (si es el primer member de
memberlist ) o en un valor mayor en uno que el de la member inmediatamente anterior.

La expresión proporcionada en cada initializer puede ser cualquier combinación de literales, otras
constantes que ya están definidas y miembros de enumeración que ya están definidos, incluido un miembro
anterior de esta enumeración. Puede usar operadores aritméticos y lógicos para combinar estos elementos.
No se pueden usar variables ni funciones en initializer . Sin embargo, puede usar palabras clave de
conversión como CByte y CShort . También puede utilizar AscW si lo llama con una constante String o
Char argumento, ya que se puede evaluar en tiempo de compilación.

Las enumeraciones no pueden tener valores de punto flotante. Si a un miembro se le asigna un valor de
punto flotante y Option Strict está establecido en ON, se produce un error del compilador. Si
Option Strict está desactivado, el valor se convierte automáticamente al tipo de Enum .

Si el valor de un miembro supera el intervalo permitido para el tipo de datos subyacente, o si se inicializa un
miembro con el valor máximo permitido por el tipo de datos subyacente, el compilador informa de un error.

Modificadores
Las enumeraciones de clase, estructura, módulo y miembro de interfaz tienen como valor predeterminado el
acceso público. Los niveles de acceso se pueden ajustar con los modificadores de acceso. Las enumeraciones
de miembros de espacio de nombres tienen acceso de confianza de forma predeterminada. Puede ajustar sus
niveles de acceso a público, pero no a privado o protegido. Para obtener más información, consulte niveles de
acceso en Visual Basic.
Todos los miembros de enumeración tienen acceso público y no se pueden usar modificadores de acceso en
ellos. Sin embargo, si la propia enumeración tiene un nivel de acceso más restringido, tiene prioridad el nivel
de acceso de enumeración especificado.
De forma predeterminada, todas las enumeraciones son tipos y sus campos son constantes. Por lo tanto, las
palabras clave Shared , Static y ReadOnly no se pueden usar al declarar una enumeración o sus miembros.

Asignar varios valores


Las enumeraciones suelen representar valores mutuamente excluyentes. Al incluir el atributo FlagsAttribute
en la declaración de Enum , en su lugar puede asignar varios valores a una instancia de la enumeración. El
atributo FlagsAttribute especifica que la enumeración se tratará como un campo de bits, es decir, un conjunto
de marcas. Se denominan enumeraciones bit a bit .
Cuando se declara una enumeración mediante el atributo FlagsAttribute, se recomienda usar las potencias de
2, es decir, 1, 2, 4, 8, 16, etc., para los valores. También se recomienda que "none" sea el nombre de un
miembro cuyo valor sea 0. Para obtener instrucciones adicionales, vea FlagsAttribute y Enum.

Ejemplo
En el ejemplo siguiente se muestra cómo usar la instrucción Enum . Tenga en cuenta que el miembro se
conoce como EggSizeEnum.Medium y no como Medium .

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

Ejemplo
El método del ejemplo siguiente está fuera de la clase Egg . Por lo tanto, EggSizeEnum se califica como
Egg.EggSizeEnum .

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

Ejemplo
En el ejemplo siguiente se usa la instrucción Enum para definir un conjunto relacionado de valores constantes
con nombre. En este caso, los valores son colores que se pueden elegir para diseñar formularios de entrada
de datos para una base de datos.
Public Enum InterfaceColors
MistyRose = &HE1E4FF&
SlateGray = &H908070&
DodgerBlue = &HFF901E&
DeepSkyBlue = &HFFBF00&
SpringGreen = &H7FFF00&
ForestGreen = &H228B22&
Goldenrod = &H20A5DA&
Firebrick = &H2222B2&
End Enum

Ejemplo
En el ejemplo siguiente se muestran valores que incluyen números positivos y negativos.

Enum SecurityLevel
IllegalEntry = -1
MinimumSecurity = 0
MaximumSecurity = 1
End Enum

Ejemplo
En el ejemplo siguiente, se utiliza una cláusula As para especificar el datatype de una enumeración.

Public Enum MyEnum As Byte


Zero
One
Two
End Enum

Ejemplo
En el ejemplo siguiente se muestra cómo usar una enumeración bit a bit. Se pueden asignar varios valores a
una instancia de una enumeración bit a bit. La declaración de Enum incluye el atributo FlagsAttribute, que
indica que la enumeración se puede tratar como un conjunto de marcas.
' 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

Ejemplo
En el ejemplo siguiente se recorre en iteración una enumeración. Usa el método GetNames para recuperar
una matriz de nombres de miembro de la enumeración y GetValues para recuperar una matriz de valores de
miembro.

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
Vea también
Enum
AscW
Const (instrucción)
Dim (instrucción)
Conversiones implícitas y explícitas
Funciones de conversión de tipos
Constantes y enumeraciones
Erase (Instrucción, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Se usa para liberar las variables de matriz y desasignar la memoria usada para sus elementos.

Sintaxis
Erase arraylist

Elementos
arraylist
Obligatorio. Lista de variables de matriz que se van a borrar. Las variables se separan con comas.

Comentarios
La instrucción Erase solo puede aparecer en el nivel de procedimiento. Esto significa que puede liberar matrices
dentro de un procedimiento, pero no en el nivel de clase o módulo.
La instrucción Erase es equivalente a asignar Nothing a cada variable de matriz.

Ejemplo
En el ejemplo siguiente se usa la instrucción Erase para borrar dos matrices y liberar su memoria (elementos de
almacenamiento 1000 y 100, respectivamente). A continuación, la instrucción ReDim asigna una nueva instancia
de la matriz a la matriz tridimensional.

Dim threeDimArray(9, 9, 9), twoDimArray(9, 9) As Integer


Erase threeDimArray, twoDimArray
ReDim threeDimArray(4, 4, 9)

Vea también
Nothing
ReDim (instrucción)
Error (Instrucción)
27/11/2019 • 2 minutes to read • Edit Online

Simula la aparición de un error.

Sintaxis
Error errornumber

Elementos
errornumber
Obligatorio. Puede ser cualquier número de error válido.

Comentarios
La instrucción Error se admite por compatibilidad con versiones anteriores. En el nuevo código, especialmente al
crear objetos, utilice el método Raise del objeto Err para generar errores en tiempo de ejecución.
Si se define errornumber , la instrucción Error llama al controlador de errores después de que se asignen los
siguientes valores predeterminados a las propiedades del objeto Err :

P RO P IEDA D VA LO R

Number Valor especificado como argumento para Error instrucción.


Puede ser cualquier número de error válido.

Source Nombre del proyecto de Visual Basic actual.

Description Expresión de cadena que corresponde al valor devuelto de la


función Error para el Number especificado, si esta cadena
existe. Si la cadena no existe, Description contiene una
cadena de longitud cero ("").

HelpFile La unidad, ruta de acceso y nombre de archivo completos del


archivo de ayuda Visual Basic adecuado.

HelpContext El identificador de contexto del archivo de ayuda Visual Basic


adecuado para el error correspondiente a la propiedad
Number .

LastDLLError Nulo.

Si no existe ningún controlador de errores, o si no se habilita ninguno, se crea un mensaje de error que se muestra
en las propiedades del objeto Err .
NOTE
Algunas aplicaciones host de Visual Basic no pueden crear objetos. Consulte la documentación de la aplicación host para
determinar si puede crear clases y objetos.

Ejemplo
En este ejemplo se utiliza la instrucción Error para generar el número de error 11.

On Error Resume Next ' Defer error handling.


Error 11 ' Simulate the "Division by zero" error.

Requisitos
Espacio de nombres: Microsoft. VisualBasic
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
Clear
Err
Raise
On Error (instrucción)
Resume (instrucción)
Mensajes de error
Event (Instrucción)
27/11/2019 • 12 minutes to read • Edit Online

Declara un evento definido por el usuario.

Sintaxis
[ <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

Elementos
PA RT E DESC RIP C IÓ N

attrlist Opcional. Lista de atributos que se aplican a este evento.


Los diversos atributos se separan con comas. Debe
incluir la lista de atributos entre corchetes angulares (" <
" y " > ").

accessmodifier Opcional. Especifica qué código puede tener acceso al


evento. Puede ser uno de los siguientes:

- público: cualquier código que pueda tener acceso al


elemento que lo declara puede tener acceso a él.
- protegido: solo el código dentro de su clase o una clase
derivada puede tener acceso a él.
- Friend: solo el código del mismo ensamblado puede
acceder a él.
- privado: solo el código del elemento que lo declara
puede tener acceso al mismo.
- código de solo amigos protegidoen la clase del evento,
una clase derivada o el mismo ensamblado pueden tener
acceso a él.
- código privado solo protegidoen la clase del evento o
una clase derivada en el mismo ensamblado puede tener
acceso al mismo.
PA RT E DESC RIP C IÓ N

Shared Opcional. Especifica que este evento no está asociado a


una instancia específica de una clase o estructura.

Shadows Opcional. Indica que este evento vuelve a declarar y


oculta un elemento de programación con el mismo
nombre, o un conjunto de elementos sobrecargados, en
una clase base. Puede reemplazar cualquier tipo de
elemento declarado con cualquier otro tipo.

Un elemento reemplazado no está disponible desde la


clase derivada que lo reemplaza, excepto desde donde el
elemento reemplazado es inaccesible. Por ejemplo, si un
elemento Private reemplaza un elemento de clase
base, el código que no tiene permiso para acceder al
elemento Private accede en su lugar al elemento de
clase base.

eventname Obligatorio. Nombre del evento; sigue las convenciones


estándar de nomenclatura de variables.

parameterlist Opcional. Lista de variables locales que representan los


parámetros de este evento. Debe incluir la lista de
parámetros entre paréntesis.

Implements Opcional. Indica que este evento implementa un evento


de una interfaz.

implementslist Es necesario si se proporciona Implements . Lista de


procedimientos Sub que se implementan. Los diversos
procedimientos se separan con comas:

implementedprocedure [, implementedprocedure ...]

Cada implementedprocedure tiene la sintaxis y las


partes siguientes:

interface . definedname

- interface : necesario. Nombre de una interfaz que


implementan la estructura o clase contenedora de este
procedimiento.
- Definedname : necesario. Nombre por el que se define
el procedimiento en interface . No tiene que ser el
mismo que name , el nombre que usa este
procedimiento para implementar el procedimiento
definido.

Custom Obligatorio. Los eventos declarados como Custom


deben definir descriptores de acceso AddHandler ,
RemoveHandler y RaiseEvent personalizados.

delegatename Opcional. Nombre de un delegado que especifica la firma


del controlador de eventos.
PA RT E DESC RIP C IÓ N

AddHandler Obligatorio. Declara un descriptor de acceso


AddHandler , que especifica las instrucciones que se
deben ejecutar cuando se agrega un controlador de
eventos, ya sea explícitamente mediante la instrucción
AddHandler o implícitamente mediante la cláusula
Handles .

End AddHandler Obligatorio. Finaliza el bloque AddHandler .

value Obligatorio. Nombre del parámetro.

RemoveHandler Obligatorio. Declara un descriptor de acceso


RemoveHandler , que especifica las instrucciones que se
ejecutan cuando se quita un controlador de eventos
mediante la instrucción RemoveHandler .

End RemoveHandler Obligatorio. Finaliza el bloque RemoveHandler .

RaiseEvent Obligatorio. Declara un descriptor de acceso


RaiseEvent , que especifica las instrucciones que se
ejecutan cuando se produce el evento mediante la
instrucción RaiseEvent . Normalmente, invoca una lista
de delegados mantenida por los descriptores de acceso
AddHandler y RemoveHandler .

End RaiseEvent Obligatorio. Finaliza el bloque RaiseEvent .

delegatesignature Obligatorio. Lista de parámetros que coincide con los


parámetros requeridos por el delegado delegatename .
Debe incluir la lista de parámetros entre paréntesis.

statements Opcional. Instrucciones que contienen los cuerpos de los


métodos AddHandler , RemoveHandler y RaiseEvent .

End Event Obligatorio. Finaliza el bloque Event .

Comentarios
Una vez declarado el evento, use la instrucción RaiseEvent para generar el evento. Un evento típico
podría declararse y provocarse tal como se muestra en los fragmentos siguientes:

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
NOTE
Puede declarar argumentos de evento del mismo modo que los argumentos de procedimientos, con las siguientes
excepciones: los eventos no pueden tener argumentos con nombre, argumentos ParamArray o argumentos
Optional . Los eventos no tienen valores devueltos.

Para controlar un evento, debe asociarlo a una subrutina del controlador de eventos mediante la
instrucción Handles o AddHandler . Las firmas de la subrutina y del evento deben coincidir. Para controlar
un evento compartido, debe usar la instrucción AddHandler .
Solo se puede usar Event en un nivel de módulo. Esto significa que el contexto de la declaración de un
evento debe ser una clase, una estructura, un módulo o una interfaz, y no puede ser un archivo de código
fuente, un espacio de nombres, un procedimiento o un bloque. Para obtener más información, vea
Declaration Contexts and Default Access Levels (Contextos de declaración y niveles de acceso
predeterminados).
En la mayoría de los casos, puede usar la primera sintaxis de la sección Sintaxis de este tema para
declarar los eventos. Sin embargo, algunos escenarios requieren un mayor control sobre el
comportamiento detallado del evento. La última sintaxis de la sección Sintaxis de este tema, que usa la
palabra clave Custom , proporciona ese control permitiéndole definir eventos personalizados. En un
evento personalizado, debe especificar exactamente lo que sucede cuando el código agrega o quita un
controlador de eventos a o desde el evento, o cuando el código provoca el evento. Para obtener ejemplos,
vea Cómo: declarar eventos personalizados para conservar memoria y Cómo: declarar eventos
personalizados para evitar bloqueos.

Ejemplo
En el ejemplo siguiente se usan eventos para contar los segundos de 10 a 0. El código muestra algunos
de los métodos, propiedades e instrucciones relacionados con eventos. Esto incluye la instrucción
RaiseEvent .

La clase que provoca un evento es el origen del evento, y los métodos que procesan el evento son los
controladores de eventos. Un origen de eventos puede tener varios controladores para los eventos que
genera. Cuando la clase genera el evento, ese evento se genera en cada clase que eligió controlar eventos
para esa instancia del objeto.
El ejemplo también usa un formulario ( Form1 ) con un botón ( Button1 ) y un cuadro de texto ( TextBox1 ).
Al hacer clic en el botón, el primer cuadro de texto muestra una cuenta atrás de 10 a 0 segundos. Cuando
transcurre el tiempo (10 segundos), el primer cuadro de texto muestra "Done".
El código de Form1 especifica los estados inicial y terminal del formulario. También contiene el código
que se ejecuta cuando se producen eventos.
Para usar este ejemplo, abra un nuevo proyecto de Windows Forms. Agregue un botón denominado
Button1 y un cuadro de texto denominado TextBox1 al formulario principal, denominado Form1 . A
continuación, haga clic con el botón secundario en el formulario y haga clic en Ver código para abrir el
editor de código.
Agregue una variable WithEvents a la sección de declaraciones de la clase Form1 :

Private WithEvents mText As TimerState

Agregue el código siguiente al código de Form1 . Sustituya los procedimientos duplicados que existan,
como Form_Load o Button_Click .
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

Presione F5 para ejecutar el ejemplo anterior y haga clic en el botón iniciar . El primer cuadro de texto
empieza la cuenta atrás de los segundos. Cuando transcurre el tiempo (10 segundos), el primer cuadro de
texto muestra "Done".

NOTE
El método My.Application.DoEvents no procesa los eventos de la misma manera que el formulario. Para
habilitar el formulario de modo que controle directamente los eventos, puede usar multithreading. Para obtener
más información, vea subprocesamiento administrado.

Vea también
RaiseEvent (instrucción)
Implements (instrucción)
Eventos
AddHandler (instrucción)
RemoveHandler (instrucción)
Handles
Delegate (instrucción)
Declarar eventos personalizados para conservar memoria
Declarar eventos personalizados para evitar bloqueos
Shared
Shadows
Exit (Instrucción, Visual Basic)
27/11/2019 • 6 minutes to read • Edit Online

Sale de un procedimiento o un bloque y transfiere el control inmediatamente a la instrucción que sigue a la


llamada al procedimiento o la definición del bloque.

Sintaxis
Exit { Do | For | Function | Property | Select | Sub | Try | While }

Instrucciones
Exit Do
Sale inmediatamente del bucle Do en el que aparece. La ejecución continúa con la instrucción que sigue a la
instrucción Loop . Exit Do solo se puede usar dentro de un bucle de Do . Cuando se usa dentro de bucles Do
anidados, Exit Do sale del bucle más interno y transfiere el control al siguiente nivel superior de anidamiento.
Exit For
Sale inmediatamente del bucle For en el que aparece. La ejecución continúa con la instrucción que sigue a la
instrucción Next . Exit For solo se puede usar dentro de un bucle For ... Next o For Each ... Next . Cuando se
usa dentro de bucles For anidados, Exit For sale del bucle más interno y transfiere el control al siguiente
nivel superior de anidamiento.
Exit Function
Sale inmediatamente del procedimiento de Function en el que aparece. La ejecución continúa con la
instrucción que sigue a la instrucción que llamó al procedimiento Function . Exit Function solo se puede usar
dentro de un procedimiento Function .
Para especificar un valor devuelto, puede asignar el valor al nombre de la función en una línea antes de la
instrucción Exit Function . Para asignar el valor devuelto y salir de la función en una instrucción, en su lugar
puede usar la instrucción return.
Exit Property
Sale inmediatamente del procedimiento de Property en el que aparece. La ejecución continúa con la
instrucción que llamó al procedimiento Property , es decir, con la instrucción que solicita o establece el valor de
la propiedad. Exit Property solo se puede usar dentro del procedimiento de Get o Set de una propiedad.
Para especificar un valor devuelto en un procedimiento Get , puede asignar el valor al nombre de la función en
una línea antes de la instrucción Exit Property . Para asignar el valor devuelto y salir del procedimiento Get
en una instrucción, en su lugar puede usar la instrucción Return .
En un procedimiento de Set , la instrucción Exit Property es equivalente a la instrucción Return .
Exit Select
Sale inmediatamente del bloque Select Case en el que aparece. La ejecución continúa con la instrucción que
sigue a la instrucción End Select . Exit Select solo se puede usar dentro de una instrucción de Select Case .
Exit Sub
Sale inmediatamente del procedimiento de Sub en el que aparece. La ejecución continúa con la instrucción
que sigue a la instrucción que llamó al procedimiento Sub . Exit Sub solo se puede usar dentro de un
procedimiento Sub .
En un procedimiento de Sub , la instrucción Exit Sub es equivalente a la instrucción Return .
Exit Try
Sale inmediatamente del bloque Try o Catch en el que aparece. La ejecución continúa con el bloque Finally
si hay alguno, o con la instrucción que sigue a la instrucción End Try de lo contrario. Exit Try solo se puede
usar dentro de un bloque de Try o Catch y no dentro de un bloque de Finally .
Exit While
Sale inmediatamente del bucle While en el que aparece. La ejecución continúa con la instrucción que sigue a la
instrucción End While . Exit While solo se puede usar dentro de un bucle de While . Cuando se usa dentro de
bucles While anidados, Exit While transfiere el control al bucle que está un nivel anidado por encima del
bucle donde se produce Exit While .

Comentarios
No confunda Exit instrucciones con instrucciones de End . Exit no define el final de una instrucción.

Ejemplo
En el ejemplo siguiente, la condición de bucle detiene el bucle cuando la variable de index es mayor que 100.
Sin embargo, la instrucción If del bucle hace que la instrucción Exit Do detenga el bucle cuando la variable
de índice sea mayor que 10.

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

Ejemplo
En el ejemplo siguiente se asigna el valor devuelto al nombre de función myFunction y, a continuación, se usa
Exit Function para devolver de la función:

Function MyFunction(ByVal j As Integer) As Double


MyFunction = 3.87 * j
Exit Function
End Function

Ejemplo
En el ejemplo siguiente se usa la instrucción return para asignar el valor devuelto y salir de la función:
Function MyFunction(ByVal j As Integer) As Double
Return 3.87 * j
End Function

Vea también
Continue (instrucción)
Do...Loop (instrucción)
End (instrucción)
For Each...Next (instrucción)
For...Next (instrucción)
Function (instrucción)
Return (instrucción)
Stop (instrucción)
Sub (instrucción)
Try...Catch...Finally (instrucción)
Instrucciones F-P
27/11/2019 • 2 minutes to read • Edit Online

La tabla siguiente contiene una lista de instrucciones de lenguaje de Visual Basic.

Para cada... Nueva Para... Nueva Function Get

GoTo If... Después... Demás Implements Imports (espacio de


nombres y tipo .NET)

Imports (espacio de Inherits Interface Mid


nombres XML)

Módulo Espacio de nombres En error Operator

Palabra clave <Option > Option Compare Option Explicit Option Infer

Option Strict Property

Vea también
Instrucciones de la A a la E
Instrucciones de la Q a la Z
Referencia del lenguaje Visual Basic
Instrucción For Each...Next (Visual Basic)
27/11/2019 • 23 minutes to read • Edit Online

Repite un grupo de instrucciones para cada elemento de una colección.

Sintaxis
For Each element [ As datatype ] In group
[ statements ]
[ Continue For ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ element ]

Elementos
T ÉRM IN O DEF IN IC IÓ N

element Obligatorio en la instrucción For Each . Opcional en la


instrucción Next . Variable. Se utiliza para recorrer en
iteración los elementos de la colección.

datatype Opcional si Option Infer está activado (valor


predeterminado) o element ya se ha declarado;
obligatorio si Option Infer está desactivado y
element no se ha declarado. Tipo de datos de
element .

group Obligatorio. Una variable con un tipo que es un tipo de


colección o un objeto. Hace referencia a la colección en la
que se van a repetir los statements .

statements Opcional. Una o varias instrucciones entre For Each y


Next que se ejecutan en cada elemento de group .

Continue For Opcional. Transfiere el control al principio del bucle


For Each .

Exit For Opcional. Transfiere el control fuera del bucle For Each .

Next Obligatorio. Finaliza la definición del bucle For Each .

Ejemplo sencillo
Use un bucle For Each ... Next cuando desee repetir un conjunto de instrucciones para cada elemento de
una colección o matriz.
TIP
Una para... La siguiente instrucción funciona bien cuando se puede asociar cada iteración de un bucle a una variable
de control y determinar los valores iniciales y finales de la variable. Sin embargo, cuando se trabaja con una
colección, el concepto de valores iniciales y finales no es significativo y no se sabe necesariamente cuántos
elementos tiene la colección. En este tipo de caso, un bucle For Each ... Next suele ser una opción mejor.

En el ejemplo siguiente, el For Each ... Next la instrucción recorre en iteración todos los elementos de una
colección de lista.

' 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 obtener más ejemplos, vea colecciones y matrices.

Bucles anidados
Puede anidar For Each bucles colocando un bucle dentro de otro.
En el ejemplo siguiente se muestra For Each anidadas... Next Obra.

' 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

Al anidar bucles, cada bucle debe tener una variable de element única.
También puede anidar distintos tipos de estructuras de control entre sí. Para obtener más información, vea
estructuras de control anidadas.

Salir de y continuar para


La instrucción Exit for hace que la ejecución salga del For ... Next bucle y transfiere el control a la
instrucción que sigue a la instrucción Next .
La instrucción Continue For transfiere el control inmediatamente a la siguiente iteración del bucle. Para
obtener más información, vea instrucción continue.
En el ejemplo siguiente se muestra cómo usar las instrucciones Continue For y Exit For .
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 7, 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

Puede incluir cualquier número de instrucciones Exit For en un bucle de For Each . Cuando se usa
dentro de bucles For Each anidados, Exit For hace que la ejecución salga del bucle más interno y
transfiere el control al siguiente nivel superior de anidamiento.
Exit For se suele usar después de una evaluación de alguna condición, por ejemplo, en una estructura
If ... Then ... Else . Es posible que desee usar Exit For para las siguientes condiciones:

Continuar la iteración no es necesario o imposible. Esto puede deberse a un valor erróneo o a una
solicitud de finalización.
Se ha detectado una excepción en una Try ... Catch ... Finally . Puede usar Exit For al final del
bloque de Finally .
Hay un bucle interminable, que es un bucle que podría ejecutar un número de veces grande o
incluso infinito. Si detecta este tipo de condición, puede usar Exit For para escapar el bucle. Para
obtener más información, vea.. . Instrucción Loop.

Iteradores
Un iterador se usa para realizar una iteración personalizada en una colección. Un iterador puede ser una
función o un descriptor de acceso Get . Usa una instrucción Yield para devolver cada elemento de la
colección de uno en uno.
Se llama a un iterador mediante una instrucción For Each...Next . Cada iteración del bucle For Each
llama al iterador. Cuando se alcanza una instrucción Yield en el iterador, se devuelve la expresión de la
instrucción Yield y se conserva la ubicación actual en el código. La ejecución se reinicia desde esa
ubicación la próxima vez que se llama al iterador.
En el ejemplo siguiente se utiliza una función de iterador. La función de iterador tiene una instrucción
Yield que se encuentra dentro de un ... Siguiente bucle. En el método ListEvenNumbers , cada iteración del
cuerpo de la instrucción For Each crea una llamada a la función de iterador, que continúa con la siguiente
instrucción Yield .
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 obtener más información, vea iteradores, instrucción yielde iterator.

Implementación técnica
Cuando una For Each ... Next la instrucción se ejecuta, Visual Basic evalúa la colección solo una vez, antes
de que se inicie el bucle. Si el bloque de instrucciones cambia element o group , estos cambios no afectan
a la iteración del bucle.
Cuando todos los elementos de la colección se han asignado sucesivamente a element , el bucle For Each
detiene y el control pasa a la instrucción que sigue a la instrucción Next .
Si Option Infer es on (su configuración predeterminada), el compilador Visual Basic puede deducir el tipo
de datos de element . Si está desactivado y element no se ha declarado fuera del bucle, debe declararlo en
la instrucción For Each . Para declarar el tipo de datos de element explícitamente, utilice una cláusula As .
A menos que el tipo de datos del elemento esté definido fuera de la construcción For Each ... Next , su
ámbito es el cuerpo del bucle. Tenga en cuenta que no puede declarar element fuera y dentro del bucle.
Opcionalmente, puede especificar element en la instrucción Next . Esto mejora la legibilidad del
programa, sobre todo si tiene bucles For Each anidados. Debe especificar la misma variable que la que
aparece en la instrucción For Each correspondiente.
Puede que desee evitar cambiar el valor de element dentro de un bucle. Esto puede dificultar la lectura y
depuración del código. Cambiar el valor de group no afecta a la colección ni a sus elementos, que se
determinaron cuando el bucle se introdujo por primera vez.
Al anidar bucles, si se encuentra una instrucción Next de un nivel de anidamiento externo antes del Next
de un nivel interno, el compilador indica un error. Sin embargo, el compilador puede detectar este error
superpuesto solo si se especifica element en cada instrucción Next .
Si el código depende de atravesar una colección en un orden determinado, un bucle For Each ... Next no
es la mejor opción, a menos que conozca las características del objeto de enumerador que expone la
colección. Visual Basic, pero con el método MoveNext del objeto de enumerador, no determina el orden de
recorrido. Por lo tanto, es posible que no pueda predecir qué elemento de la colección es el primero que se
devolverá en element , o que es el siguiente que se devolverá después de un elemento determinado.
Podría obtener resultados más confiables mediante una estructura de bucle diferente, como For ... Next o
Do ... Loop .

El tiempo de ejecución debe ser capaz de convertir los elementos de group en element . La instrucción [
Option Strict ] controla si se permiten las conversiones de ampliación y de restricción ( Option Strict
está desactivada, su valor predeterminado) o si solo se permiten conversiones de ampliación (
Option Strict está activada). Para obtener más información, vea conversiones de restricción.

El tipo de datos de group debe ser un tipo de referencia que haga referencia a una colección o una matriz
que sea Enumerable. Normalmente, esto significa que group hace referencia a un objeto que implementa
la interfaz de IEnumerable del espacio de nombres System.Collections o la interfaz IEnumerable<T> del
espacio de nombres System.Collections.Generic . System.Collections.IEnumerable define el método de
GetEnumerator, que devuelve un objeto de enumerador para la colección. El objeto de enumerador
implementa la interfaz System.Collections.IEnumerator del espacio de nombres System.Collections y
expone la propiedad Current y los métodos Reset y MoveNext. Visual Basic los usa para recorrer la
colección.
Conversiones de restricción
Cuando Option Strict se establece en On , las conversiones de restricción suelen producir errores del
compilador. Sin embargo, en una instrucción For Each , las conversiones de los elementos de group a
element se evalúan y se realizan en tiempo de ejecución, y se suprimen los errores del compilador
causados por las conversiones de restricción.
En el ejemplo siguiente, la asignación de m como el valor inicial de n no se compila cuando
Option Strict está activado porque la conversión de un Long en una Integer es una conversión de
restricción. En la instrucción For Each , sin embargo, no se genera ningún error del compilador, aunque la
asignación a number requiere la misma conversión de Long a Integer . En la instrucción For Each que
contiene un número grande, se produce un error en tiempo de ejecución cuando se aplica ToInteger al
número grande.

Option Strict On

Module Module1
Sub Main()
' 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

Console.ReadKey()
End Sub
End Module

Llamadas IEnumerator
Cuando se inicia la ejecución de un bucle For Each ... Next , Visual Basic comprueba que group hace
referencia a un objeto de colección válido. Si no es así, se produce una excepción. De lo contrario, llama al
método MoveNext y a la propiedad Current del objeto enumerador para devolver el primer elemento. Si
MoveNext indica que no hay ningún elemento siguiente, es decir, si la colección está vacía, el bucle
For Each detiene y el control pasa a la instrucción que sigue a la instrucción Next . De lo contrario, Visual
Basic establece element en el primer elemento y ejecuta el bloque de instrucciones.
Cada vez que Visual Basic encuentra la instrucción Next , vuelve a la instrucción For Each . Una vez más,
llama a MoveNext y Current para devolver el elemento siguiente y, de nuevo, ejecuta el bloque o detiene
el bucle en función del resultado. Este proceso continúa hasta que MoveNext indica que no hay ningún
elemento siguiente o se encuentra una instrucción de Exit For .
Modificar la colección. El objeto de enumerador devuelto por GetEnumerator normalmente no permite
cambiar la colección agregando, eliminando, reemplazando o reordenando los elementos. Si cambia la
colección después de haber iniciado un bucle For Each ... Next , el objeto de enumerador deja de ser válido
y el siguiente intento de obtener acceso a un elemento produce una excepción InvalidOperationException.
Sin embargo, este bloqueo de modificación no viene determinado por Visual Basic, sino por la
implementación de la interfaz IEnumerable. Es posible implementar IEnumerable de forma que permita la
modificación durante la iteración. Si está pensando en realizar esta modificación dinámica, asegúrese de
que comprende las características de la implementación de IEnumerable en la colección que está
utilizando.
Modificar elementos de la colección. La propiedad Current del objeto enumerador es de solo lecturay
devuelve una copia local de cada elemento de la colección. Esto significa que no se pueden modificar los
propios elementos en un bucle For Each ... Next . Cualquier modificación que realice solo afectará a la
copia local de Current y no se reflejará de nuevo en la colección subyacente. Sin embargo, si un elemento
es un tipo de referencia, puede modificar los miembros de la instancia a la que señala. En el ejemplo
siguiente se modifica el miembro de BackColor de cada elemento thisControl . Sin embargo, no puede
modificar thisControl mismo.

Sub LightBlueBackground(thisForm As System.Windows.Forms.Form)


For Each thisControl In thisForm.Controls
thisControl.BackColor = System.Drawing.Color.LightBlue
Next thisControl
End Sub

En el ejemplo anterior se puede modificar el miembro de BackColor de cada elemento thisControl ,


aunque no se puede modificar thisControl mismo.
Atravesar matrices. Dado que la clase Array implementa la interfaz IEnumerable, todas las matrices
exponen el método GetEnumerator. Esto significa que puede recorrer en iteración una matriz con un bucle
For Each ... Next . Sin embargo, solo puede leer los elementos de la matriz. No se pueden cambiar.

Ejemplo
En el ejemplo siguiente se enumeran todas las carpetas de C:\ directorio mediante la clase DirectoryInfo.

Dim dInfo As New System.IO.DirectoryInfo("c:\")


For Each dir As System.IO.DirectoryInfo In dInfo.GetDirectories()
Debug.WriteLine(dir.Name)
Next

Ejemplo
En el ejemplo siguiente se muestra un procedimiento para ordenar una colección. El ejemplo ordena las
instancias de una clase Car que se almacenan en un List<T>. La clase Car implementa la interfaz
IComparable<T>, que requiere implementar el método CompareTo.
Cada llamada al método CompareTo realiza una comparación única que se usa para la ordenación. El
código escrito por el usuario en el método CompareTo devuelve un valor para cada comparación del
objeto actual con otro objeto. El valor devuelto es menor que cero si el objeto actual es menor que el otro
objeto, mayor que cero si el objeto actual es mayor que el otro objeto y cero si son iguales. Esto permite
definir en el código los criterios de mayor que, menor que e igual.
En el método ListCars , la instrucción cars.Sort() ordena la lista. Esta llamada al método Sort de
List<T> hace que se llame automáticamente al método CompareTo para los objetos Car de List .

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

Vea también
Colecciones
For...Next (instrucción)
Estructuras de bucle
While...End While (instrucción)
Do...Loop (instrucción)
Conversiones de ampliación y de restricción
Inicializadores de objeto: Tipos con nombre y anónimos
Inicializadores de colección
Matrices
Instrucción For...Next (Visual Basic)
27/11/2019 • 15 minutes to read • Edit Online

Repite un grupo de instrucciones un número especificado de veces.

Sintaxis
For counter [ As datatype ] = start To end [ Step step ]
[ statements ]
[ Continue For ]
[ statements ]
[ Exit For ]
[ statements ]
Next [ counter ]

Elementos
PA RT E DESC RIP C IÓ N

counter Obligatorio en la instrucción For . Variable numérica.


Variable de control del bucle. Para obtener más
información, vea el argumento Counter más adelante en
este tema.

datatype Opcional. Tipo de datos de counter . Para obtener más


información, vea el argumento Counter más adelante en
este tema.

start Obligatorio. Expresión numérica. Valor inicial de


counter .

end Obligatorio. Expresión numérica. Valor final de counter .

step Opcional. Expresión numérica. Cantidad por la que se


incrementa el counter cada vez a través del bucle.

statements Opcional. Una o varias instrucciones entre For y Next


que ejecutan el número especificado de veces.

Continue For Opcional. Transfiere el control a la siguiente iteración del


bucle.

Exit For Opcional. Transfiere el control fuera del bucle For .

Next Obligatorio. Finaliza la definición del bucle For .


NOTE
La palabra clave To se usa en esta instrucción para especificar el intervalo del contador. También puede usar esta
palabra clave en la Instrucción Case y en declaraciones de matriz. Para obtener más información sobre las
declaraciones de matriz, vea instrucción Dim.

Ejemplos sencillos
Use una estructura For ... Next cuando desee repetir un conjunto de instrucciones un número de veces.
En el ejemplo siguiente, la variable index comienza con un valor de 1 y se incrementa con cada iteración
del bucle, finalizando después del valor de index llega a 5.

For index As Integer = 1 To 5


Debug.Write(index.ToString & " ")
Next
Debug.WriteLine("")
' Output: 1 2 3 4 5

En el ejemplo siguiente, la variable number comienza en 2 y se reduce en 0,25 en cada iteración del bucle,
finalizando después de que el valor de number llegue a 0. El argumento Step de -.25 reduce el valor en
0,25 en cada iteración del bucle.

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

TIP
While... End while instrucción o do... La instrucción de bucle funciona bien cuando no se sabe de antemano cuántas
veces ejecutar las instrucciones en el bucle. Sin embargo, cuando espera ejecutar el bucle un número determinado
de veces, un bucle For ... Next es una mejor opción. El número de iteraciones se determina cuando se escribe el
bucle por primera vez.

Anidar bucles
Puede anidar For bucles colocando un bucle dentro de otro. En el ejemplo siguiente se muestran las
estructuras For anidadas... Next que tienen valores de paso diferentes. El bucle exterior crea una cadena
para cada iteración del bucle. El bucle interno reduce una variable de contador de bucle para cada
iteración del bucle.
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

Al anidar bucles, cada bucle debe tener una variable de counter única.
También puede anidar distintos tipos de estructuras de control. Para obtener más información, vea
estructuras de control anidadas.

Salir de y continuar para


La instrucción Exit For sale inmediatamente del For ... Next bucle y transfiere el control a la instrucción
que sigue a la instrucción Next .
La instrucción Continue For transfiere el control inmediatamente a la siguiente iteración del bucle. Para
obtener más información, vea instrucción continue.
En el ejemplo siguiente se muestra el uso de las instrucciones Continue For y Exit For .

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

Puede incluir cualquier número de instrucciones Exit For en un For ... Next bucle Cuando se usa dentro
de For anidadas... Next bucles, Exit For sale del bucle más interno y transfiere el control al siguiente
nivel superior de anidamiento.
Exit For se usa a menudo después de evaluar alguna condición (por ejemplo, en una estructura If ...
Then ... Else ). Es posible que desee usar Exit For para las siguientes condiciones:

Continuar la iteración no es necesario o imposible. Un valor erróneo o una solicitud de finalización


podría crear esta condición.
Una instrucción Try ... Catch ... Finally detecta una excepción. Puede usar Exit For al final del
bloque de Finally .
Tiene un bucle sin fin, que es un bucle que podría ejecutar un número de veces grande o incluso
infinito. Si detecta este tipo de condición, puede usar Exit For para escapar el bucle. Para obtener
más información, vea.. . Instrucción Loop.

Implementación técnica
Cuando se inicia un bucle For ... Next , Visual Basic evalúa start , end y step . Visual Basic evalúa estos
valores solo en este momento y, a continuación, asigna start a counter . Antes de que se ejecute el
bloque de instrucciones, Visual Basic compara counter con end . Si counter ya es mayor que el valor de
end (o menor si step es negativo), el bucle de For finaliza y el control pasa a la instrucción que sigue a
la instrucción Next . De lo contrario, se ejecuta el bloque de instrucciones.
Cada vez que Visual Basic encuentra la instrucción Next , incrementa counter de step y vuelve a la
instrucción For . Una vez más, compara counter con end y, de nuevo, ejecuta el bloque o sale del bucle,
en función del resultado. Este proceso continúa hasta que counter pasa end o se encuentra una
instrucción Exit For .
El bucle no se detiene hasta que counter ha pasado end . Si counter es igual a end , el bucle continúa.
La comparación que determina si se va a ejecutar el bloque es counter <= end si step es positivo y
counter >= end si step es negativo.

Si cambia el valor de counter mientras se encuentra dentro de un bucle, el código podría ser más difícil
de leer y depurar. Cambiar el valor de start , end o step no afecta a los valores de iteración que se
determinaron cuando se escribió el bucle por primera vez.
Si anida bucles, el compilador indicará un error si encuentra la instrucción Next de un nivel de
anidamiento externo antes de la instrucción Next de un nivel interno. Sin embargo, el compilador puede
detectar este error superpuesto solo si se especifica counter en cada instrucción Next .
Argumento Step
El valor de step puede ser positivo o negativo. Este parámetro determina el procesamiento de bucles
según la tabla siguiente:

VA LO R DEL PA SO EL B UC L E SE E JEC UTA SI

Positivo o cero counter <= end

Negativo counter >= end

El valor predeterminado de step es 1.


Argumento Counter
En la tabla siguiente se indica si counter define una nueva variable local cuyo ámbito es el bucle de
For…Next completo. Esta determinación depende de si datatype está presente y de si ya se ha definido
counter .
RESULTA DO ( SI COUNTER DEF IN E UN A
N UEVA VA RIA B L E LO C A L C UY O
Á M B ITO ES EL B UC L E DE FOR...NEXT
¿ESTÁ DATATYPE P RESEN T E? ¿ COUNTER YA ESTÁ DEF IN IDO ? C O M P L ETO )

No Sí No, porque el counter ya está


definido. Si el ámbito de counter
no es local para el procedimiento, se
produce una advertencia de tiempo
de compilación.

No No Sí. El tipo de datos se deduce de las


expresiones start , end y step .
Para obtener información sobre la
inferencia de tipos, vea Option Infer
Statement e inferencia de tipo local.

Sí Sí Sí, pero solo si la variable de


counter existente se define fuera
del procedimiento. Esa variable sigue
siendo independiente. Si el ámbito
de la variable de counter existente
es local para el procedimiento, se
produce un error en tiempo de
compilación.

Sí No Sí.

El tipo de datos de counter determina el tipo de la iteración, que debe ser uno de los siguientes tipos:
Byte , SByte , UShort , Short , UInteger , Integer , ULong , Long , Decimal , Single o Double .
Una enumeración que se declara mediante una instrucción enum.
Un Object .
de tipo que tiene los operadores siguientes, donde
T B es un tipo que se puede utilizar en una
expresión 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, puede especificar la variable counter en la instrucción Next . Esta sintaxis mejora la
legibilidad del programa, sobre todo si tiene bucles For anidados. Debe especificar la variable que
aparece en la instrucción de For correspondiente.
Las expresiones start , end y step pueden evaluarse como cualquier tipo de datos que se amplíe al tipo
de counter . Si usa un tipo definido por el usuario para counter , es posible que tenga que definir el
CType operador de conversión para convertir los tipos de start , end o step al tipo de counter .

Ejemplo
En el ejemplo siguiente se quitan todos los elementos de una lista genérica. En lugar de para cada...
Instrucción siguiente, en el ejemplo se muestra una instrucción For ... Next que itera en orden
descendente. En el ejemplo se utiliza esta técnica porque el método removeAt hace que los elementos
situados después del elemento quitado tengan un valor de índice inferior.

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

Ejemplo
En el ejemplo siguiente se recorre en iteración una enumeración declarada mediante una instrucción
enum.

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

Ejemplo
En el ejemplo siguiente, los parámetros de instrucción usan una clase que tiene sobrecargas de operador
para los operadores + , - , >= y <= .
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

Vea también
List<T>
Estructuras de bucle
While...End While (instrucción)
Do...Loop (instrucción)
Estructuras de control anidadas
Exit (instrucción)
Colecciones
Function (Instrucción, Visual Basic)
27/11/2019 • 15 minutes to read • Edit Online

Declara el nombre, los parámetros y el código que definen un procedimiento Function .

Sintaxis
[ <attributelist> ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [ Async |
Iterator ]
Function name [ (Of typeparamlist) ] [ (parameterlist) ] [ As returntype ] [ Implements
implementslist | Handles eventlist ]
[ statements ]
[ Exit Function ]
[ statements ]
End Function

Elementos
attributelist

Opcional. Vea lista de atributos.


accessmodifier

Opcional. Puede ser uno de los siguientes:


Public
Protected
Friend
Private
Protected Friend
Private Protected
Vea Access levels in Visual Basic.
proceduremodifiers

Opcional. Puede ser uno de los siguientes:


Sobrecargas
Overrides
Overridable
NotOverridable
MustOverride
MustOverride Overrides

NotOverridable Overrides
Shared

Opcional. Vea Shared.


Shadows

Opcional. Vea Shadows.


Async

Opcional. Vea Async.


Iterator

Opcional. Vea iterator.


name

Obligatorio. Nombre del procedimiento. Vea Declared Element Names.


typeparamlist

Opcional. Lista de parámetros de tipo para un procedimiento genérico. Consulte lista de tipos.
parameterlist

Opcional. Lista de nombres de variables locales que representan los parámetros de este
procedimiento. Vea lista de parámetros.
returntype

Es obligatorio si se On``Option Strict . Tipo de datos del valor devuelto por este
procedimiento.
Implements

Opcional. Indica que este procedimiento implementa uno o varios procedimientos de


Function , cada uno de los cuales se define en una interfaz implementada por la clase o
estructura contenedora de este procedimiento. Vea Implements (instrucción).
implementslist

Es necesario si se proporciona Implements . Lista de procedimientos Function que se


implementan.
implementedprocedure [ , implementedprocedure ... ]

Cada implementedprocedure tiene la sintaxis y las partes siguientes:


interface.definedname

PA RT E DESC RIP C IÓ N

interface Obligatorio. Nombre de una interfaz implementada


por la clase o estructura contenedora de este
procedimiento.

definedname Obligatorio. Nombre por el que se define el


procedimiento en interface .

Handles
Opcional. Indica que este procedimiento puede controlar uno o más eventos concretos. Vea
identificadores.
eventlist

Es necesario si se proporciona Handles . Lista de eventos que controla este procedimiento.


eventspecifier [ , eventspecifier ... ]

Cada eventspecifier tiene la sintaxis y las partes siguientes:


eventvariable.event

PA RT E DESC RIP C IÓ N

eventvariable Obligatorio. Variable de objeto declarada con el


tipo de datos de la clase o estructura que genera el
evento.

event Obligatorio. Nombre del evento que controla este


procedimiento.

statements

Opcional. Bloque de instrucciones que se ejecutarán en este procedimiento.


End Function

Finaliza la definición de este procedimiento.

Comentarios
Todo el código ejecutable debe estar dentro de un procedimiento. Cada procedimiento, a su vez, se
declara dentro de una clase, una estructura o un módulo al que se hace referencia como la clase,
estructura o módulo contenedor.
Para devolver un valor al código de llamada, use un procedimiento Function ; de lo contrario, use un
procedimiento Sub .

Definir una función


Solo puede definir un procedimiento Function en el nivel de módulo. Por lo tanto, el contexto de la
declaración de una función debe ser una clase, una estructura, un módulo o una interfaz y no puede
ser un archivo de código fuente, un espacio de nombres, un procedimiento o un bloque. Para obtener
más información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y
niveles de acceso predeterminados).
Function procedimientos tienen como valor predeterminado el acceso público. Los niveles de acceso
se pueden ajustar con los modificadores de acceso.
Un procedimiento Function puede declarar el tipo de datos del valor que devuelve el procedimiento.
Puede especificar cualquier tipo de datos o el nombre de una enumeración, una estructura, una clase
o una interfaz. Si no especifica el parámetro returntype , el procedimiento devuelve Object .
Si este procedimiento usa la palabra clave Implements , la clase o estructura contenedora también
debe tener una instrucción Implements que siga inmediatamente a su instrucción Class o Structure
. La instrucción Implements debe incluir cada interfaz que se especifica en implementslist . Sin
embargo, el nombre por el que una interfaz define el Function (en definedname ) no tiene que
coincidir con el nombre de este procedimiento (en name ).

NOTE
Puede usar expresiones lambda para definir expresiones de función alineadas. Para obtener más información,
vea expresión de función y expresiones lambda.

Devolver desde una función


Cuando el procedimiento Function devuelve al código de llamada, la ejecución continúa con la
instrucción que sigue a la instrucción que llamó al procedimiento.
Para devolver un valor de una función, puede asignar el valor al nombre de la función o incluirlo en
una instrucción Return .
La instrucción Return asigna simultáneamente el valor devuelto y sale de la función, como se
muestra en el ejemplo siguiente.

Function MyFunction(ByVal j As Integer) As Double


Return 3.87 * j
End Function

En el ejemplo siguiente se asigna el valor devuelto al nombre de función myFunction y, a


continuación, se usa la instrucción Exit Function para devolver.

Function MyFunction(ByVal j As Integer) As Double


MyFunction = 3.87 * j
Exit Function
End Function

Las instrucciones Exit Function y Return producen una salida inmediata de un procedimiento de
Function . Cualquier número de instrucciones Exit Function y Return puede aparecer en cualquier
parte del procedimiento y se pueden mezclar instrucciones Exit Function y Return .
Si usa Exit Function sin asignar un valor a name , el procedimiento devuelve el valor predeterminado
para el tipo de datos especificado en returntype . Si no se especifica returntype , el procedimiento
devuelve Nothing , que es el valor predeterminado para Object .

Llamar a una función


Se llama a un procedimiento de Function mediante el nombre del procedimiento, seguido de la lista
de argumentos entre paréntesis, en una expresión. Solo se pueden omitir los paréntesis si no se
proporcionan argumentos. Sin embargo, el código es más legible si siempre incluye los paréntesis.
Se llama a un procedimiento Function del mismo modo que se llama a cualquier función de
biblioteca como Sqrt , Cos o ChrW .
También puede llamar a una función mediante la palabra clave Call . En ese caso, se omite el valor
devuelto. No se recomienda el uso de la palabra clave Call en la mayoría de los casos. Para obtener
más información, consulte instrucción call.
A veces Visual Basic reorganiza las expresiones aritméticas para aumentar la eficacia interna. Por ese
motivo, no debe utilizar un procedimiento Function en una expresión aritmética cuando la función
cambia el valor de las variables en la misma expresión.
Funciones asincrónicas
La característica Async le permite invocar funciones asincrónicas sin usar devoluciones de llamada
explícitas ni dividir manualmente el código en varias funciones o expresiones lambda.
Si marca una función con el modificador Async , puede usar el operador Await en la función. Cuando
el control alcanza una expresión Await en la función Async , el control vuelve al llamador y el
progreso de la función se suspende hasta que se completa la tarea esperada. Una vez completada la
tarea, la ejecución puede reanudarse en la función.

NOTE
Un procedimiento Async devuelve al autor de la llamada cuando encuentra el primer objeto esperado que
aún no se ha completado o hasta el final de la Async procedimiento, lo que ocurra primero.

Una función Async puede tener un tipo de valor devuelto de Task<TResult> o Task. A continuación se
proporciona un ejemplo de una función de Async que tiene un tipo de valor devuelto de
Task<TResult>.
Una función Async no puede declarar ningún parámetro ByRef .
Una instrucción Sub también se puede marcar con el modificador Async . Se utiliza principalmente
para los controladores de eventos, donde no se puede devolver un valor. No se puede esperar a un
procedimiento de Sub de Async , y el llamador de un procedimiento de Sub de Async no puede
detectar las excepciones producidas por el procedimiento Sub .
Para obtener más información sobre las funciones de Async , vea programación asincrónica con
Async y Await, flujo de control en programas asincrónicosy tipos de valor devueltos asincrónicos.

Funciones de iterador
Una función de iterador realiza una iteración personalizada en una colección, como una lista o una
matriz. Una función de iterador utiliza la instrucción yield para devolver cada elemento de uno en uno.
Cuando se alcanza una instrucción yield , se recuerda la ubicación actual en el código. La ejecución se
reinicia desde esa ubicación la próxima vez que se llama a la función del iterador.
Se llama a un iterador desde el código de cliente mediante un método for each... Instrucción siguiente
.
El tipo de valor devuelto de una función de iterador puede ser IEnumerable, IEnumerable<T>,
IEnumeratoro IEnumerator<T>.
Para obtener más información, consulta Iteradores.

Ejemplo
En el ejemplo siguiente se usa la instrucción Function para declarar el nombre, los parámetros y el
código que forman el cuerpo de un procedimiento Function . El modificador ParamArray permite que
la función acepte un número variable de argumentos.
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

Ejemplo
En el ejemplo siguiente se invoca la función declarada en el ejemplo anterior.

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

Ejemplo
En el ejemplo siguiente, DelayAsync es un Function de Async que tiene un tipo de valor devuelto de
Task<TResult>. DelayAsync tiene una instrucción Return que devuelve un entero. Por lo tanto, la
declaración de función de DelayAsync debe tener un tipo de valor devuelto de Task(Of Integer) .
Dado que el tipo de valor devuelto es Task(Of Integer) , la evaluación de la expresión de Await en
DoSomethingAsync produce un entero. Esto se muestra en esta instrucción:
Dim result As Integer = Await delayTask .

El procedimiento startButton_Clickes un ejemplo de un procedimiento Async Sub . Dado que


DoSomethingAsync es una función Async , se debe esperar la tarea para la llamada a DoSomethingAsync ,
como se muestra en la siguiente instrucción: Await DoSomethingAsync() . El procedimiento de Sub de
startButton_Click debe definirse con el modificador Async porque tiene una expresión de Await .
' 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

Vea también
Sub (instrucción)
Procedimientos de función
Lista de parámetros
Dim (instrucción)
Call (instrucción)
Of
Matrices de parámetros
Utilizar una clase genérica
Solución de problemas de procedimientos
Expresiones lambda
Expresión de función
Get (Instrucción)
27/11/2019 • 6 minutes to read • Edit Online

Declara un procedimiento de propiedad Get que se usa para recuperar el valor de una propiedad.

Sintaxis
[ <attributelist> ] [ accessmodifier ] Get()
[ statements ]
End Get

Elementos
T ÉRM IN O DEF IN IC IÓ N

attributelist Opcional. Vea lista de atributos.

accessmodifier Opcional en, como máximo, una de las instrucciones Get y


Set de esta propiedad. Puede ser uno de los siguientes:

- protegido
- Friend
- privado
- Protected Friend

Vea Access levels in Visual Basic.

statements Opcional. Una o varias instrucciones que se ejecutan cuando


se llama al procedimiento de propiedad Get .

End Get Obligatorio. Finaliza la definición del procedimiento de


propiedad Get .

Comentarios
Cada propiedad debe tener un procedimiento de propiedad Get a menos que la propiedad esté marcada
WriteOnly . El procedimiento Get se utiliza para devolver el valor actual de la propiedad.

Visual Basic llama automáticamente al procedimiento Get de una propiedad cuando una expresión solicita el
valor de la propiedad.
El cuerpo de la declaración de propiedad solo puede contener los procedimientos Get y Set de la propiedad
entre la instrucción Property y la instrucción End Property . No puede almacenar nada que no sea esos
procedimientos. En concreto, no puede almacenar el valor actual de la propiedad. Debe almacenar este valor
fuera de la propiedad, porque si lo almacena dentro de cualquiera de los procedimientos de propiedad, el otro
procedimiento de propiedad no podrá tener acceso a él. El enfoque habitual es almacenar el valor en una
variable privada declarada en el mismo nivel que la propiedad. Debe definir un procedimiento de Get dentro de
la propiedad a la que se aplica.
El procedimiento Get toma como valor predeterminado el nivel de acceso de la propiedad que lo contiene a
menos que use accessmodifier en la instrucción Get .

Reglas
Niveles de acceso mixtos. Si va a definir una propiedad de lectura y escritura, puede especificar
opcionalmente un nivel de acceso diferente para el Get o el procedimiento de Set , pero no ambos. Si lo
hace, el nivel de acceso del procedimiento debe ser más restrictivo que el nivel de acceso de la propiedad.
Por ejemplo, si la propiedad se declara Friend , puede declarar el Get procedimiento Private , pero no
Public .

Si va a definir una propiedad ReadOnly , el procedimiento Get representa la propiedad completa. No se


puede declarar un nivel de acceso diferente para Get , porque esto establecería dos niveles de acceso
para la propiedad.
Tipo de valor devuelto. La instrucción Property puede declarar el tipo de datos del valor que devuelve.
El procedimiento Get devuelve automáticamente ese tipo de datos. Puede especificar cualquier tipo de
datos o el nombre de una enumeración, estructura, clase o interfaz.
Si la instrucción Property no especifica returntype , el procedimiento devuelve Object .

Comportamiento
Devolver de un procedimiento. Cuando el procedimiento Get devuelve al código de llamada, la
ejecución continúa dentro de la instrucción que solicitó el valor de propiedad.
Get procedimientos de propiedad pueden devolver un valor mediante la instrucción return o asignando
el valor devuelto al nombre de la propiedad. Para obtener más información, vea el tema sobre el valor
devuelto en la instrucción function.
Las instrucciones Exit Property y Return producen una salida inmediata de un procedimiento de
propiedad. Cualquier número de instrucciones Exit Property y Return puede aparecer en cualquier
parte del procedimiento y se pueden mezclar instrucciones Exit Property y Return .
Valor devuelto. Para devolver un valor de un procedimiento Get , puede asignar el valor al nombre de
la propiedad o incluirlo en una instrucción return. La instrucción Return asigna simultáneamente el valor
devuelto del procedimiento Get y sale del procedimiento.
Si usa Exit Property sin asignar un valor al nombre de la propiedad, el procedimiento Get devuelve el
valor predeterminado del tipo de datos de la propiedad. Para obtener más información, vea el tema sobre
el valor devuelto en la instrucción function.
En el ejemplo siguiente se muestran dos maneras en las que la propiedad de solo lectura quoteForTheDay
puede devolver el valor contenido en la variable privada quoteValue .

Private quoteValue As String = "No quote assigned yet."

ReadOnly Property QuoteForTheDay() As String


Get
QuoteForTheDay = quoteValue
Exit Property
End Get
End Property
ReadOnly Property QuoteForTheDay() As String
Get
Return quoteValue
End Get
End Property

Ejemplo
En el ejemplo siguiente se usa la instrucción Get para devolver el valor de una propiedad.

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

Vea también
Set (instrucción)
Property (instrucción)
Exit (instrucción)
Objetos y clases
Tutorial: Definir clases
GoTo (Instrucción)
27/11/2019 • 3 minutes to read • Edit Online

Bifurca incondicionalmente a una línea especificada en un procedimiento.

Sintaxis
GoTo line

Parte
line
Obligatorio. Cualquier etiqueta de línea.

Comentarios
La instrucción GoTo solo puede bifurcar a las líneas del procedimiento en el que aparece. La línea debe tener una
etiqueta de línea a la que GoTo pueda hacer referencia. Para obtener más información, vea Cómo: etiquetar
instrucciones.

NOTE
GoTo instrucciones pueden hacer que el código sea difícil de leer y mantener. Siempre que sea posible, use una estructura
de control en su lugar. Para obtener más información, consulte Control Flow.

No se puede usar una instrucción GoTo para bifurcar desde fuera de una For ... Next , For Each ... Next ,
SyncLock ... End SyncLock , Try ... Catch ... Finally , With ... End With o Using ... End Using construcción a una
etiqueta dentro de.

Bifurcación y construcciones try


Dentro de una construcción Try ... Catch ... Finally , se aplican las siguientes reglas a la bifurcación con la
instrucción GoTo .

B LO Q UE O REGIÓ N B IF URC A C IÓ N DESDE F UERA B IF URC A R DESDE DEN T RO

Try bloque) Solo desde un bloque de Catch de la Solo hacia fuera de la construcción
misma construcción 1 completa

Catch bloque) Nunca permitido Solo hacia fuera de la construcción


completa o hasta el Try bloque de la
misma construcción 1

Finally bloque) Nunca permitido Nunca permitido

1 si una construcción Try ... Catch ... Finally está anidada dentro de otra, un bloque de Catch se puede bifurcar
en el bloque de Try en su propio nivel de anidamiento, pero no en otro bloque de Try . Una construcción Try
anidada... Catch ... Finally debe estar contenida completamente en un bloque Try o Catch de la construcción
en la que está anidada.
En la ilustración siguiente se muestra una construcción Try anidada dentro de otra. Varias ramas entre los
bloques de las dos construcciones se indican como válidas o no válidas.

Ejemplo
En el ejemplo siguiente se usa la instrucción GoTo para bifurcar a las etiquetas de línea de un procedimiento.

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

Vea también
Do...Loop (instrucción)
For...Next (instrucción)
For Each...Next (instrucción)
If...Then...Else (instrucción)
Select...Case (instrucción)
Try...Catch...Finally (instrucción)
While...End While (instrucción)
With...End With (instrucción)
Instrucción If...Then...Else (Visual Basic)
27/11/2019 • 8 minutes to read • Edit Online

Ejecuta condicionalmente un grupo de instrucciones en función del valor de una expresión.

Sintaxis
' Multiline syntax:
If condition [ Then ]
[ statements ]
[ ElseIf elseifcondition [ Then ]
[ elseifstatements ] ]
[ Else
[ elsestatements ] ]
End If

' Single-line syntax:


If condition Then [ statements ] [ Else [ elsestatements ] ]

Vínculos rápidos a código de ejemplo


En este artículo se incluyen varios ejemplos que ilustran los usos de la instrucción If ... Then ... Else :
Ejemplo de sintaxis de varias líneas
Ejemplo de sintaxis anidada
Ejemplo de sintaxis de una sola línea

Elementos
condition
Obligatorio. Expresiones. Debe evaluarse como True o False , o a un tipo de datos que se pueda convertir
implícitamente a Boolean .
Si la expresión es una variable de Boolean que acepta valores NULL y que se evalúa como Nothing, la
condición se trata como si la expresión fuese False , y los bloques de ElseIf se evalúan si existen, o el bloque
de Else se ejecuta si existe.
Then
Requerido en la sintaxis de una sola línea; opcional en la sintaxis de varias líneas.
statements
Opcional. Una o varias instrucciones que siguen If ... Then que se ejecutan si condition se evalúa como True .
elseifcondition
Obligatorio si ElseIf está presente. Expresiones. Debe evaluarse como True o False , o a un tipo de datos
que se pueda convertir implícitamente a Boolean .
elseifstatements
Opcional. Una o varias instrucciones que siguen ElseIf ... Then que se ejecutan si elseifcondition se evalúa
como True .
elsestatements
Opcional. Una o varias instrucciones que se ejecutan si ninguna expresión condition o elseifcondition
anterior se evalúa como True .
End If
Finaliza la versión de varias líneas del bloque If ... Then ... Else .

Comentarios
Sintaxis de varias líneas
Cuando se encuentra una instrucción If ... Then ... Else , se prueba condition . Si condition se True , se
ejecutan las instrucciones siguientes Then . Si se False``condition , cada instrucción de ElseIf (si hay alguna)
se evalúa en orden. Cuando se encuentra un elseifcondition de True , se ejecutan las instrucciones
inmediatamente después de la ElseIf asociada. Si ningún elseifcondition se evalúa como True , o si no hay
ninguna instrucción ElseIf , se ejecutan las instrucciones siguientes Else . Después de ejecutar las
instrucciones que siguen Then , ElseIf o Else , la ejecución continúa con la instrucción que sigue a End If .
Las cláusulas ElseIf y Else son opcionales. Puede tener tantas cláusulas ElseIf como desee en una
instrucción If ... Then ... Else , pero no puede aparecer una cláusula ElseIf después de una cláusula Else . las
instrucciones If ... Then ... Else se pueden anidar unas dentro de otras.
En la sintaxis de varias líneas, la instrucción If debe ser la única instrucción en la primera línea. Las
instrucciones ElseIf , Else y End If solo pueden ir precedidas de una etiqueta de línea. El bloque If ... Then ...
Else debe terminar con una instrucción End If .

TIP
La selección... La instrucción Case podría ser más útil cuando se evalúa una expresión única que tiene varios valores
posibles.

Sintaxis de una sola línea


Puede usar la sintaxis de una sola línea para una única condición con el código que se ejecutará si es true. Sin
embargo, la sintaxis de varias líneas proporciona más estructura y flexibilidad y es más fácil de leer, mantener y
depurar.
Lo que sigue a la palabra clave Then se examina para determinar si una instrucción es un If de una sola línea.
Si aparece cualquier cosa que no sea un comentario después de Then en la misma línea, la instrucción se trata
como una instrucción de If de una sola línea. Si falta Then , debe ser el inicio de una If de varias líneas...
Then ... Else .

En la sintaxis de una sola línea, se pueden ejecutar varias instrucciones como resultado de una If ... Then
decisión. Todas las instrucciones deben estar en la misma línea y deben estar separadas por dos puntos.

Ejemplo de sintaxis de varias líneas


En el ejemplo siguiente se muestra el uso de la sintaxis de varias líneas de la instrucción If ... Then ... Else .
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.

Ejemplo de sintaxis anidada


En el ejemplo siguiente se incluyen instrucciones anidadas If ... Then ... Else .

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.
Ejemplo de sintaxis de una sola línea
En el ejemplo siguiente se muestra el uso de la sintaxis de una sola línea.

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

Vea también
Choose
Switch
#If...Then...#Else (directivas)
Select...Case (instrucción)
Estructuras de control anidadas
Estructuras de decisión
Operadores lógicos y bit a bit en Visual Basic
If (operador)
Implements (Instrucción)
27/11/2019 • 4 minutes to read • Edit Online

Especifica una o más interfaces, o miembros de interfaz, que se deben implementar en la definición de clase o
estructura en la que aparece.

Sintaxis
Implements interfacename [, ...]
' -or-
Implements interfacename.interfacemember [, ...]

Elementos
interfacename
Obligatorio. Interfaz cuyas propiedades, procedimientos y eventos van a ser implementados por los
miembros correspondientes de la clase o estructura.
interfacemember
Obligatorio. Miembro de una interfaz que se está implementando.

Comentarios
Una interfaz es una colección de prototipos que representan los miembros (propiedades, procedimientos y
eventos) que la interfaz encapsula. Las interfaces contienen solo las declaraciones de los miembros; las clases
y estructuras implementan estos miembros. Para obtener más información, consulta Interfaces.
La instrucción Implements debe seguir inmediatamente a la instrucción Class o Structure .
Al implementar una interfaz, debe implementar todos los miembros declarados en la interfaz. Omitir
cualquier miembro se considera un error de sintaxis. Para implementar un miembro individual, se especifica
la palabra clave Implements (que es independiente de la instrucción Implements ) cuando se declara el
miembro en la clase o estructura. Para obtener más información, consulta Interfaces.
Las clases pueden utilizar implementaciones privadas de propiedades y procedimientos, pero solo se puede
tener acceso a estos miembros si se convierte una instancia de la clase de implementación en una variable
declarada como del tipo de la interfaz.

Ejemplo
En el ejemplo siguiente se muestra cómo utilizar la instrucción Implements para implementar miembros de
una interfaz. Define una interfaz denominada ICustomerInfo con un evento, una propiedad y un
procedimiento. La clase customerInfo implementa todos los miembros definidos en la interfaz.
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

Tenga en cuenta que la clase customerInfo usa la instrucción Implements en una línea de código fuente
independiente para indicar que la clase implementa todos los miembros de la interfaz ICustomerInfo .
Después, cada miembro de la clase usa la palabra clave Implements como parte de su declaración de
miembro para indicar que implementa ese miembro de interfaz.

Ejemplo
Los dos procedimientos siguientes muestran cómo podría usar la interfaz implementada en el ejemplo
anterior. Para probar la implementación, agregue estos procedimientos al proyecto y llame al procedimiento
testImplements .

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
Vea también
Implements
Interface (instrucción)
Interfaces
Instrucción Imports (Tipo y espacio de nombres de
.NET)
27/11/2019 • 8 minutes to read • Edit Online

Permite hacer referencia a los nombres de tipo sin la calificación de espacio de nombres.

Sintaxis
Imports [ aliasname = ] namespace
' -or-
Imports [ aliasname = ] namespace.element

Elementos
T ÉRM IN O DEF IN IC IÓ N

aliasname Opcional. Un alias de importación o nombre con el que el


código puede hacer referencia a namespace en lugar de la
cadena de calificación completa. Vea Declared Element
Names.

namespace Obligatorio. Nombre completo del espacio de nombres que


se va a importar. Puede ser una cadena de espacios de
nombres anidados en cualquier nivel.

element Opcional. Nombre de un elemento de programación


declarado en el espacio de nombres. Puede ser cualquier
elemento contenedor.

Comentarios
La instrucción Imports permite hacer referencia directamente a los tipos contenidos en un espacio de
nombres determinado.
Puede proporcionar un único nombre de espacio de nombres o una cadena de espacios de nombres
anidados. Cada espacio de nombres anidado se separa del siguiente espacio de nombres de nivel superior en
un punto ( . ), como se muestra en el ejemplo siguiente:

Imports System.Collections.Generic

Cada archivo de código fuente puede contener cualquier número de instrucciones Imports . Estos deben
seguir cualquier declaración de opción, como la instrucción Option Strict , y deben preceder a las
declaraciones de elementos de programación, como Module o Class instrucciones.
Solo puede usar Imports en el nivel de archivo. Esto significa que el contexto de la declaración para la
importación debe ser un archivo de código fuente y no puede ser un espacio de nombres, una clase, una
estructura, un módulo, una interfaz, un procedimiento o un bloque.
Tenga en cuenta que la instrucción Imports no hace que los elementos de otros proyectos y ensamblados
estén disponibles para el proyecto. La importación no se ocupa del establecimiento de una referencia. Solo
elimina la necesidad de calificar nombres que ya están disponibles para el proyecto. Para obtener más
información, vea "importar elementos contenedores" en referencias a elementos declarados.

NOTE
Puede definir instrucciones de Imports implícitas mediante la Página referencias, el diseñador de proyectos (Visual
Basic). Para obtener más información, consulte Cómo: agregar o quitar espacios de nombres importados (Visual Basic).

Alias de importación
Un alias de importación define el alias de un espacio de nombres o de un tipo. Los alias de importación son
útiles cuando es necesario usar elementos con el mismo nombre que se declaran en uno o varios espacios de
nombres. Para obtener más información y un ejemplo, vea "calificar un nombre de elemento" en referencias a
elementos declarados.
No debe declarar un miembro en el nivel de módulo con el mismo nombre que aliasname . Si lo hace, el
compilador de Visual Basic utiliza aliasname solo para el miembro declarado y ya no lo reconoce como un
alias de importación.
Aunque la sintaxis que se usa para declarar un alias de importación es similar a la que se usa para importar
un prefijo de espacio de nombres XML, los resultados son diferentes. Un alias de importación se puede usar
como una expresión en el código, mientras que un prefijo de espacio de nombres XML solo se puede usar en
literales XML o propiedades de eje XML como prefijo para un nombre de elemento o atributo calificado.
Nombres de elementos
Si proporciona element , debe representar un elemento contenedor, es decir, un elemento de programación
que puede contener otros elementos. Los elementos de contenedor incluyen clases, estructuras, módulos,
interfaces y enumeraciones.
El ámbito de los elementos que se ponen a disposición de una instrucción Imports depende de si se
especifica element . Si solo especifica namespace , todos los miembros con el nombre único de ese espacio de
nombres y los miembros de los elementos contenedores dentro de ese espacio de nombres están disponibles
sin calificación. Si especifica namespace y element , solo estarán disponibles los miembros de ese elemento
sin calificación.

Ejemplo
En el ejemplo siguiente se devuelven todas las carpetas del directorio C:\ mediante la clase DirectoryInfo:
El código no tiene ninguna instrucción Imports en la parte superior del archivo. Por lo tanto, las referencias
de DirectoryInfo, StringBuildery CrLf están completas con los espacios de nombres.
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

Ejemplo
En el ejemplo siguiente se incluyen instrucciones de Imports para los espacios de nombres a los que se hace
referencia. Por lo tanto, no es necesario que los tipos estén completos con los espacios de nombres.

' Place Imports statements at the top of your program.


Imports System.Text
Imports System.IO
Imports Microsoft.VisualBasic.ControlChars

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

Ejemplo
En el ejemplo siguiente se incluyen Imports instrucciones que crean alias para los espacios de nombres a los
que se hace referencia. Los tipos se califican con los alias.

Imports systxt = System.Text


Imports sysio = System.IO
Imports ch = Microsoft.VisualBasic.ControlChars
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

Ejemplo
En el ejemplo siguiente se incluyen Imports instrucciones que crean alias para los tipos a los que se hace
referencia. Los alias se usan para especificar los tipos.

Imports strbld = System.Text.StringBuilder


Imports dirinf = System.IO.DirectoryInfo

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

Vea también
Namespace (instrucción)
Espacios de nombres en Visual Basic
Referencias y la instrucción Imports
Imports (instrucción), espacio de nombres XML
Referencias a elementos declarados
Imports (Instrucción, Espacio de nombres XML)
27/11/2019 • 7 minutes to read • Edit Online

Importa prefijos de espacios de nombres XML para su uso en literales XML y propiedades de eje XML.

Sintaxis
Imports <xmlns:xmlNamespacePrefix = "xmlNamespaceName">

Elementos
xmlNamespacePrefix
Opcional. Cadena por la que los elementos y atributos XML pueden hacer referencia a xmlNamespaceName . Si no se
proporciona ningún xmlNamespacePrefix , el espacio de nombres XML importado es el espacio de nombres XML
predeterminado. Debe ser un identificador XML válido. Para obtener más información, vea nombres de
elementos y atributos XML declarados.
xmlNamespaceName
Obligatorio. Cadena que identifica el espacio de nombres XML que se va a importar.

Comentarios
Puede utilizar la instrucción Imports para definir espacios de nombres XML globales que puede utilizar con
literales XML y propiedades de eje XML, o como parámetros pasados al operador GetXmlNamespace . (Para obtener
información sobre el uso de la instrucción Imports para importar un alias que se puede usar donde se usan los
nombres de tipo en el código, vea instrucción Imports (espacio de nombres y tipo de .net)). La sintaxis para
declarar un espacio de nombres XML mediante la instrucción Imports es idéntica a la sintaxis utilizada en XML.
Por lo tanto, puede copiar una declaración de espacio de nombres de un archivo XML y utilizarla en una
instrucción Imports .
Los prefijos de espacios de nombres XML son útiles cuando se desea crear repetidamente elementos XML que
son del mismo espacio de nombres. El prefijo de espacio de nombres XML declarado con la instrucción Imports
es global en el sentido de que está disponible para todo el código del archivo. Se puede utilizar al crear literales
de elemento XML y al tener acceso a las propiedades del eje XML. Para obtener más información, vea XML
ELEMENT literal and XML AXIS Properties.
Si define un espacio de nombres XML global sin un prefijo de espacio de nombres (por ejemplo,
Imports <xmlns="http://SomeNameSpace>" ), ese espacio de nombres se considera el espacio de nombres XML
predeterminado. El espacio de nombres XML predeterminado se utiliza para los literales de elemento XML o las
propiedades de eje de atributo XML que no especifican explícitamente un espacio de nombres. También se utiliza
el espacio de nombres predeterminado si el espacio de nombres especificado es el espacio de nombres vacío (es
decir, xmlns="" ). El espacio de nombres XML predeterminado no se aplica a los atributos XML en los literales
XML ni a las propiedades del eje de atributo XML que no tienen un espacio de nombres.
Los espacios de nombres XML que se definen en un literal XML, que se denominan espacios de nombres XML
locales, tienen prioridad sobre los espacios de nombres XML definidos por la instrucción Imports como global.
Los espacios de nombres XML definidos por la instrucción Imports tienen prioridad sobre los espacios de
nombres XML importados para un proyecto de Visual Basic. Si un literal XML define un espacio de nombres XML,
ese espacio de nombres local no se aplica a las expresiones incrustadas.
Los espacios de nombres XML globales siguen las mismas reglas de ámbito y definición que .NET Framework
espacios de nombres. Como resultado, puede incluir una instrucción Imports para definir un espacio de
nombres XML global en cualquier lugar en el que pueda importar un espacio de nombres de .NET Framework.
Esto incluye los archivos de código y los espacios de nombres importados en el nivel de proyecto. Para obtener
información sobre los espacios de nombres importados en el nivel de proyecto, vea Página referencias,
diseñador de proyectos (Visual Basic).
Cada archivo de código fuente puede contener cualquier número de instrucciones Imports . Estas deben seguir
las declaraciones de opciones, como la instrucción Option Strict , y deben preceder a las declaraciones de
elementos de programación, como Module o Class instrucciones.

Ejemplo
En el ejemplo siguiente se importa un espacio de nombres XML predeterminado y un espacio de nombres XML
identificado con el prefijo ns . A continuación, crea literales XML que usan ambos espacios de nombres.

' 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 muestra el siguiente texto:

<ns:outer xmlns="http://DefaultNamespace"
xmlns:ns="http://NewNamespace">
<ns:innerElement></ns:innerElement>
<siblingElement></siblingElement>
<innerElement />
</ns:outer>

Ejemplo
En el ejemplo siguiente se importa el prefijo del espacio de nombres XML ns . A continuación, crea un literal
XML que utiliza el prefijo de espacio de nombres y muestra el formulario final del elemento.
' 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 muestra el siguiente texto:

<ns:outer xmlns:ns="http://SomeNamespace">
<ns:middle xmlns:ns="http://NewNamespace">
<ns:inner1 />
<inner2 xmlns="http://SomeNamespace" />
</ns:middle>
</ns:outer>

Observe que el compilador ha convertido el prefijo de espacio de nombres XML de un prefijo global a una
definición de prefijo local.

Ejemplo
En el ejemplo siguiente se importa el prefijo del espacio de nombres XML ns . A continuación, se usa el prefijo
del espacio de nombres para crear un literal XML y obtener acceso al primer nodo secundario con el nombre
completo ns:name .

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 muestra el siguiente texto:


Patrick Hines

Vea también
Literal de elemento XML
Propiedades del eje XML
Nombres de atributos y elementos XML declarados
GetXmlNamespace (operador)
Inherits Statement
27/11/2019 • 4 minutes to read • Edit Online

Hace que la clase o interfaz actual herede los atributos, variables, propiedades, procedimientos y eventos de
otra clase o conjunto de interfaces.

Sintaxis
Inherits basetypenames

Elementos
T ÉRM IN O DEF IN IC IÓ N

basetypenames Obligatorio. Nombre de la clase de la que se deriva esta


clase.

O bien,

Los nombres de las interfaces de las que se deriva esta


interfaz. Use comas para separar varios nombres.

Comentarios
Si se utiliza, la instrucción Inherits debe ser la primera línea no vacía sin comentarios en una definición de
clase o interfaz. Debe seguir inmediatamente a la instrucción Class o Interface .
Solo puede usar Inherits en una clase o interfaz. Esto significa que el contexto de la declaración de una
herencia no puede ser un archivo de código fuente, un espacio de nombres, una estructura, un módulo, un
procedimiento o un bloque.

Reglas
Herencia de clases. Si una clase utiliza la instrucción Inherits , solo puede especificar una clase base.
Una clase no puede heredar de una clase anidada dentro de ella.
Herencia de interfaz. Si una interfaz utiliza la instrucción Inherits , puede especificar una o varias
interfaces base. Puede heredar de dos interfaces incluso si cada una de ellas define un miembro con el
mismo nombre. Si lo hace, el código de implementación debe usar la calificación de nombre para
especificar qué miembro está implementando.
Una interfaz no puede heredar de otra interfaz con un nivel de acceso más restrictivo. Por ejemplo, una
interfaz de Public no puede heredar de una interfaz de Friend .
Una interfaz no puede heredar de una interfaz anidada dentro de ella.
Un ejemplo de herencia de clases en el .NET Framework es la clase ArgumentException, que hereda de la clase
SystemException. Esto proporciona a ArgumentException todas las propiedades y los procedimientos
predefinidos que requieren las excepciones del sistema, como la propiedad Message y el método ToString.
Un ejemplo de herencia de interfaz en el .NET Framework es la interfaz ICollection, que hereda de la interfaz
IEnumerable. Esto hace que ICollection herede la definición del enumerador necesaria para atravesar una
colección.

Ejemplo
En el ejemplo siguiente se usa la instrucción Inherits para mostrar cómo una clase denominada thisClass
puede heredar todos los miembros de una clase base denominada anotherClass .

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

Ejemplo
En el ejemplo siguiente se muestra la herencia de varias interfaces.

Public Interface thisInterface


Inherits IComparable, IDisposable, IFormattable
' Add new property, procedure, and event definitions.
End Interface

La interfaz denominada thisInterface ahora incluye todas las definiciones de las interfaces IComparable,
IDisposabley IFormattable que los miembros heredados proporcionan respectivamente para la comparación
específica del tipo de dos objetos, liberando los recursos asignados y expresando el valor de un objeto como
una String . Una clase que implementa thisInterface debe implementar todos los miembros de cada
interfaz base.

Vea también
MustInherit
NotInheritable
Objetos y clases
Fundamentos de la herencia
Interfaces
Instrucción Interface (Visual Basic)
27/11/2019 • 11 minutes to read • Edit Online

Declara el nombre de una interfaz e introduce las definiciones de los miembros que la interfaz contiene.

Sintaxis
[ <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

Elementos
T ÉRM IN O DEF IN IC IÓ N

attributelist Opcional. Vea lista de atributos.

accessmodifier Opcional. Puede ser uno de los siguientes:

- público
- protegido
- Friend
- privado
- Friend protegido
- protegido privado

Vea Access levels in Visual Basic.

Shadows Opcional. Vea Shadows.

name Obligatorio. Nombre de esta interfaz. Vea Declared Element


Names.

Of Opcional. Especifica que se trata de una interfaz genérica.

typelist Obligatorio si se usa la palabra clave of . Lista de


parámetros de tipo para esta interfaz. Opcionalmente, cada
parámetro de tipo se puede declarar como variante
mediante el uso de In y Out modificadores genéricos.
Consulte lista de tipos.

Inherits Opcional. Indica que esta interfaz hereda los atributos y los
miembros de otra interfaz o interfaces. Vea Inherits
(instrucción).
T ÉRM IN O DEF IN IC IÓ N

interfacenames Es obligatorio si se utiliza la instrucción Inherits . Los


nombres de las interfaces de las que se deriva esta interfaz.

modifiers Opcional. Modificadores adecuados para el miembro de


interfaz que se está definiendo.

Property Opcional. Define una propiedad que es miembro de la


interfaz.

Function Opcional. Define un procedimiento Function que es


miembro de la interfaz.

Sub Opcional. Define un procedimiento Sub que es miembro


de la interfaz.

Event Opcional. Define un evento que es miembro de la interfaz.

Interface Opcional. Define una interfaz que está anidada dentro de


esta interfaz. La definición de interfaz anidada debe
terminar con una instrucción End Interface .

Class Opcional. Define una clase que es miembro de la interfaz.


La definición de clase miembro debe terminar con una
instrucción End Class .

Structure Opcional. Define una estructura que es un miembro de la


interfaz. La definición de la estructura de miembro debe
terminar con una instrucción End Structure .

membername Se requiere para cada propiedad, procedimiento, evento,


interfaz, clase o estructura definidos como miembro de la
interfaz. Nombre del miembro.

End Interface Termina la definición de Interface .

Comentarios
Una interfaz define un conjunto de miembros, como propiedades y procedimientos, que las clases y
estructuras pueden implementar. La interfaz solo define las firmas de los miembros y no sus trabajos
internos.
Una clase o estructura implementa la interfaz proporcionando código para cada miembro definido por la
interfaz. Por último, cuando la aplicación crea una instancia a partir de esa clase o estructura, existe un objeto
y se ejecuta en la memoria. Para obtener más información, vea objetos y clases e interfaces.
Interface solo se puede utilizar en un espacio de nombres o un nivel de módulo. Esto significa que el
contexto de la declaración de una interfaz debe ser un archivo de código fuente, un espacio de nombres, una
clase, una estructura, un módulo o una interfaz y no puede ser un procedimiento o un bloque. Para obtener
más información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y niveles de
acceso predeterminados).
El acceso predeterminado de las interfaces es Friend . Los niveles de acceso se pueden ajustar con los
modificadores de acceso. Para obtener más información, consulte niveles de acceso en Visual Basic.
Reglas
Anidar interfaces. Puede definir una interfaz dentro de otra. La interfaz externa se denomina interfaz
contenedoray la interfaz interna se denomina interfaz anidada.
Declaración de miembro. Cuando se declara una propiedad o un procedimiento como miembro de
una interfaz, solo se define la firma de esa propiedad o procedimiento. Esto incluye el tipo de elemento
(propiedad o procedimiento), sus parámetros y tipos de parámetro, y su tipo de valor devuelto. Debido
a esto, la definición de miembro usa solo una línea de código y las instrucciones de terminación como
End Function o End Property no son válidas en una interfaz.

Por el contrario, cuando se define una enumeración o una estructura, o una clase o interfaz anidada, es
necesario incluir sus miembros de datos.
Modificadores de miembro. No se puede usar ningún modificador de acceso al definir miembros
de módulo, ni se puede especificar un modificador de procedimiento compartido o Any excepto
sobrecargas. Puede declarar cualquier miembro con sombras, y puede usar el valor predeterminado al
definir una propiedad, así como ReadOnly o WriteOnly.
Herencia. Si la interfaz utiliza la instrucción Inherits, puede especificar una o varias interfaces base.
Puede heredar de dos interfaces incluso si cada una de ellas define un miembro con el mismo nombre.
Si lo hace, el código de implementación debe usar la calificación de nombre para especificar qué
miembro está implementando.
Una interfaz no puede heredar de otra interfaz con un nivel de acceso más restrictivo. Por ejemplo, una
interfaz de Public no puede heredar de una interfaz de Friend .
Una interfaz no puede heredar de una interfaz anidada dentro de ella.
Aplicación. Cuando una clase usa la instrucción Implements para implementar esta interfaz, debe
implementar todos los miembros definidos en la interfaz. Además, cada firma del código que
implementa debe coincidir exactamente con la firma correspondiente definida en esta interfaz. Sin
embargo, el nombre del miembro en el código de implementación no tiene que coincidir con el
nombre de miembro definido en la interfaz.
Cuando una clase implementa un procedimiento, no puede designar el procedimiento como Shared .
Propiedad predeterminada. Una interfaz puede especificar como máximo una propiedad como su
propiedad predeterminada, a la que se puede hacer referencia sin usar el nombre de la propiedad. Para
especificar este tipo de propiedad, se declara con el modificador predeterminado .
Tenga en cuenta que esto significa que una interfaz solo puede definir una propiedad predeterminada
si hereda ninguno.

Comportamiento
Nivel de acceso. Todos los miembros de interfaz tienen acceso público de forma implícita. No se
puede usar ningún modificador de acceso al definir un miembro. Sin embargo, una clase que
implementa la interfaz puede declarar un nivel de acceso para cada miembro implementado.
Si asigna una instancia de clase a una variable, el nivel de acceso de sus miembros puede depender de
si el tipo de datos de la variable es la interfaz subyacente o la clase de implementación. En el ejemplo
siguiente se ilustra esto.
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()

Si tiene acceso a los miembros de clase a través de varAsInterface , todos tienen acceso público. Sin
embargo, si obtiene acceso a los miembros a través de varAsClass , el Sub procedimiento
doSomething tiene acceso privado.

ID. Una interfaz está en el ámbito a lo largo de su espacio de nombres, clase, estructura o módulo.
El ámbito de cada miembro de interfaz es toda la interfaz.
Validez. Una interfaz no tiene una duración, ni sus miembros. Cuando una clase implementa una
interfaz y un objeto se crea como una instancia de esa clase, el objeto tiene una duración dentro de la
aplicación en la que se está ejecutando. Para obtener más información, vea "Lifetime" en la instrucción
Class.

Ejemplo
En el ejemplo siguiente se usa la instrucción Interface para definir una interfaz denominada thisInterface ,
que debe implementarse con una instrucción Property y una instrucción Function .

Public Interface thisInterface


Property ThisProp(ByVal thisStr As String) As Char
Function ThisFunc(ByVal thisInt As Integer) As Integer
End Interface

Tenga en cuenta que las instrucciones Property y Function no presentan los bloques que terminan con
End Property y End Function dentro de la interfaz. La interfaz define solo las firmas de sus miembros. Los
bloques Property y Function completos aparecen en una clase que implementa thisInterface .

Vea también
Interfaces
Class (instrucción)
Module (instrucción)
Structure (instrucción)
Property (instrucción)
Function (instrucción)
Sub (instrucción)
Generic Types in Visual Basic
Varianza en interfaces genéricas
In
Out
Mid (Instrucción)
27/11/2019 • 2 minutes to read • Edit Online

Reemplaza un número especificado de caracteres de una variable de String por caracteres de otra cadena.

Sintaxis
Mid( _
ByRef Target As String, _
ByVal Start As Integer, _
Optional ByVal Length As Integer _
) = StringExpression

Elementos
Target
Obligatorio. Nombre de la variable de String que se va a modificar.
Start
Obligatorio. Integer expresión. Posición de carácter en Target donde comienza la sustitución del texto. Start
usa un índice basado en uno.
Length
Opcional. Integer expresión. Número de caracteres que se van a reemplazar. Si se omite, se usa todo String .
StringExpression
Obligatorio. String expresión que reemplaza a parte de Target .

Excepciones
T IP O DE EXC EP C IÓ N C O N DIC IÓ N

ArgumentException Start <=0o Length < 0.

Comentarios
El número de caracteres reemplazados siempre es menor o igual que el número de caracteres de Target .
Visual Basic tiene una función Mid y una instrucción Mid . Estos elementos operan en un número especificado de
caracteres de una cadena, pero la función Mid devuelve los caracteres mientras la instrucción Mid reemplaza los
caracteres. Para obtener más información, consulta Mid.

NOTE
La MidB instrucción de versiones anteriores de Visual Basic reemplaza una subcadena en bytes, en lugar de caracteres. Se
usa principalmente para convertir cadenas en aplicaciones de juegos de caracteres de doble byte (DBCS). Todas las cadenas
de Visual Basic están en Unicode y ya no se admiten MidB .
Ejemplo
En este ejemplo se utiliza la instrucción Mid para reemplazar un número especificado de caracteres de una
variable de cadena por caracteres de otra cadena.

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
Espacio de nombres: Microsoft. VisualBasic
Módulo: Strings

Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
Mid
Cadenas
Introducción a las cadenas en Visual Basic
Module (Instrucción)
27/11/2019 • 6 minutes to read • Edit Online

Declara el nombre de un módulo e introduce la definición de las variables, propiedades, eventos y


procedimientos que el módulo incluye.

Sintaxis
[ <attributelist> ] [ accessmodifier ] Module name
[ statements ]
End Module

Elementos
attributelist
Opcional. Vea lista de atributos.
accessmodifier
Opcional. Puede ser uno de los siguientes:
Public
Friend
Vea Access levels in Visual Basic.
name
Obligatorio. Nombre de este módulo. Vea Declared Element Names.
statements
Opcional. Instrucciones que definen las variables, propiedades, eventos, procedimientos y tipos anidados de
este módulo.
End Module
Termina la definición de Module .

Comentarios
Una instrucción Module define un tipo de referencia disponible a lo largo de su espacio de nombres. Un
módulo (a veces denominado módulo estándar) es similar a una clase, pero con algunas distinciones
importantes. Cada módulo tiene exactamente una instancia y no es necesario crearla o asignarla a una
variable. Los módulos no admiten la herencia ni implementan interfaces. Observe que un módulo no es un
tipo en el sentido de que una clase o estructura es: no puede declarar un elemento de programación para que
tenga el tipo de datos de un módulo.
Solo se puede usar Module en el nivel de espacio de nombres. Esto significa que el contexto de la declaración
de un módulo debe ser un archivo de código fuente o un espacio de nombres, y no puede ser una clase, una
estructura, un módulo, una interfaz, un procedimiento o un bloque. No se puede anidar un módulo dentro de
otro módulo o dentro de cualquier tipo. Para obtener más información, vea Declaration Contexts and Default
Access Levels (Contextos de declaración y niveles de acceso predeterminados).
Un módulo tiene la misma duración que el programa. Dado que todos sus miembros se Shared , también
tienen una duración igual a la del programa.
El acceso predeterminado de los módulos es Friend . Los niveles de acceso se pueden ajustar con los
modificadores de acceso. Para obtener más información, consulte niveles de acceso en Visual Basic.
Todos los miembros de un módulo se Shared n implícitamente.

Clases y módulos
Estos elementos tienen muchas similitudes, pero también hay algunas diferencias importantes.
Terminología. Las versiones anteriores de Visual Basic reconocen dos tipos de módulos: módulos de
clase (archivos. CLS) y módulos estándar (archivos. Bas). La versión actual llama a estas clases y
módulos, respectivamente.
Miembros compar tidos. Puede controlar si un miembro de una clase es un miembro compartido o
de instancia.
Orientación de objeto. Las clases están orientadas a objetos, pero los módulos no lo son. De modo
que solo se pueden crear instancias de las clases como objetos. Para obtener más información, vea
objetos y clases.

Reglas
Modificadores. Todos los miembros de módulo están compartidosimplícitamente. No se puede usar
la palabra clave Shared al declarar un miembro, y no se puede modificar el estado compartido de
ningún miembro.
Herencia. Un módulo no puede heredar de ningún tipo que no sea Object, del que se heredan todos
los módulos. En concreto, un módulo no puede heredar de otro.
No se puede usar la instrucción Inherits en una definición de módulo, ni siquiera para especificar
Object.
Propiedad predeterminada. No se puede definir ninguna propiedad predeterminada en un módulo.
Para obtener más información, vea default.

Comportamiento
Nivel de acceso. Dentro de un módulo, puede declarar cada miembro con su propio nivel de acceso.
Los miembros del módulo tienen acceso público de forma predeterminada, excepto las variables y
constantes, que tienen como valor predeterminado el acceso privado . Cuando un módulo tiene más
acceso restringido que uno de sus miembros, tiene prioridad el nivel de acceso del módulo
especificado.
ID. Un módulo está en el ámbito A lo largo de su espacio de nombres.
El ámbito de cada miembro del módulo es todo el módulo. Observe que todos los miembros se
someten a la promoción de tipos, lo que hace que su ámbito se promueva al espacio de nombres que
contiene el módulo. Para obtener más información, consulte promoción de tipos.
Evaluación. Puede tener varios módulos en un proyecto y puede declarar miembros con el mismo
nombre en dos o más módulos. Sin embargo, debe calificar cualquier referencia a este miembro con el
nombre de módulo adecuado si la referencia es de fuera de ese módulo. Para obtener más
información, consulta References to Declared Elements.

Ejemplo
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

Vea también
Class (instrucción)
Namespace (instrucción)
Structure (instrucción)
Interface (instrucción)
Property (instrucción)
Promoción de tipos
Namespace (Instrucción)
27/11/2019 • 10 minutes to read • Edit Online

Declara el nombre de un espacio de nombres y hace que el código fuente que sigue a la declaración se compile
dentro de ese espacio de nombres.

Sintaxis
Namespace [Global.] { name | name.name }
[ componenttypes ]
End Namespace

Elementos
Global
Opcional. Permite definir un espacio de nombres fuera del espacio de nombres raíz del proyecto. Vea espacios
de nombres en Visual Basic.
name
Obligatorio. Nombre único que identifica el espacio de nombres. Debe ser un identificador de Visual Basic
válido. Para obtener más información, vea nombres de elementos declarados.
componenttypes
Opcional. Elementos que componen el espacio de nombres. Estos incluyen, entre otros, enumeraciones,
estructuras, interfaces, clases, módulos, delegados y otros espacios de nombres.
End Namespace
Finaliza un bloque de Namespace .

Comentarios
Los espacios de nombres se usan como sistema de la organización. Proporcionan una manera de clasificar y
presentar los elementos de programación que se exponen a otros programas y aplicaciones. Tenga en cuenta
que un espacio de nombres no es un tipo en el sentido de que una clase o estructura es: no puede declarar un
elemento de programación para que tenga el tipo de datos de un espacio de nombres.
Todos los elementos de programación declarados después de una instrucción Namespace pertenecen a ese
espacio de nombres. Visual Basic continúa compilando elementos en el último espacio de nombres declarado
hasta que encuentra una instrucción End Namespace u otra instrucción Namespace .
Si ya hay un espacio de nombres definido, incluso fuera del proyecto, puede agregarle elementos de
programación. Para ello, use una instrucción Namespace para dirigir Visual Basic para compilar elementos en
ese espacio de nombres.
Puede usar una instrucción Namespace solo en el nivel de archivo o de espacio de nombres. Esto significa que el
contexto de la declaración de un espacio de nombres debe ser un archivo de código fuente u otro espacio de
nombres, y no puede ser una clase, una estructura, un módulo, una interfaz o un procedimiento. Para obtener
más información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y niveles de
acceso predeterminados).
Puede declarar un espacio de nombres dentro de otro. No hay ningún límite estricto para los niveles de
anidamiento que puede declarar, pero recuerde que cuando otro código tiene acceso a los elementos
declarados en el espacio de nombres más interno, debe usar una cadena de calificación que contenga todos los
nombres de espacio de nombres de la jerarquía de anidamiento.

Nivel de acceso
Los espacios de nombres se tratan como si tienen un nivel de acceso Public . Se puede tener acceso a un
espacio de nombres desde el código en cualquier parte del mismo proyecto, desde otros proyectos que hagan
referencia al proyecto y desde cualquier ensamblado compilado a partir del proyecto.
Los elementos de programación declarados en el nivel de espacio de nombres, lo que significa que en un
espacio de nombres pero no dentro de ningún otro elemento, pueden tener Public o Friend acceso. Si no se
especifica, el nivel de acceso de este elemento utiliza Friend de forma predeterminada. Los elementos que se
pueden declarar en el nivel de espacio de nombres incluyen clases, estructuras, módulos, interfaces,
enumeraciones y delegados. Para obtener más información, vea Declaration Contexts and Default Access Levels
(Contextos de declaración y niveles de acceso predeterminados).

Espacio de nombres raíz


Todos los nombres de espacios de nombres del proyecto se basan en un espacio de nombres raíz. Visual Studio
asigna el nombre del proyecto como el espacio de nombres raíz predeterminado para todo el código del
proyecto. Por ejemplo, si el proyecto se llama Payroll , los respectivos elementos de programación
pertenecerán al espacio de nombres Payroll . Si declara Namespace funding , se Payroll.funding el nombre
completo de ese espacio de nombres.
Si desea especificar un espacio de nombres existente en una instrucción Namespace , como en el ejemplo de
clase de lista genérica, puede establecer el espacio de nombres raíz en un valor null. Para ello, haga clic en
propiedades del proyecto en el menú proyecto y, a continuación, desactive la entrada espacio de
nombres raíz para que el cuadro esté vacío. Si no lo hizo en el ejemplo de clase de lista genérica, el
compilador Visual Basic tomaría System.Collections.Generic como un nuevo espacio de nombres dentro de
Project Payroll , con el nombre completo de Payroll.System.Collections.Generic .
Como alternativa, puede usar la palabra clave Global para hacer referencia a los elementos de los espacios de
nombres definidos fuera del proyecto. Esto le permite conservar el nombre del proyecto como espacio de
nombres raíz. Esto reduce la posibilidad de combinar accidentalmente los elementos de programación con los
de los espacios de nombres existentes. Para obtener más información, vea la sección "palabra clave global en
nombres completos" en espacios de nombres en Visual Basic.
La palabra clave Global también se puede utilizar en una instrucción de espacio de nombres. con lo que podrá
definir un espacio de nombres fuera del espacio de nombres raíz del proyecto. Para obtener más información,
vea la sección "palabra clave global en instrucciones de espacio de nombres" en espacios de nombres en Visual
Basic.
Solución. El espacio de nombres raíz puede producir concatenaciones inesperadas de nombres de espacios de
nombres. Si hace referencia a los espacios de nombres definidos fuera del proyecto, el compilador de Visual
Basic puede interpretarlos como espacios de nombres anidados en el espacio de nombres raíz. En tal caso, el
compilador no reconoce ningún tipo que ya se haya definido en los espacios de nombres externos. Para evitar
esto, establezca el espacio de nombres raíz en un valor nulo como se describe en "espacio de nombres raíz" o
use la palabra clave Global para obtener acceso a los elementos de espacios de nombres externos.

Atributos y modificadores
No se pueden aplicar atributos a un espacio de nombres. Un atributo contribuye a la información en los
metadatos del ensamblado, lo que no es significativo para los clasificadores de origen, como los espacios de
nombres.
No se puede aplicar ningún modificador de acceso o procedimiento, ni ningún otro modificador, a un espacio
de nombres. Dado que no es un tipo, estos modificadores no son significativos.

Ejemplo
En el siguiente ejemplo se declaran dos espacios de nombres, uno anidado en el otro.

Namespace n1
Namespace n2
Class a
' Insert class definition.
End Class
End Namespace
End Namespace

Ejemplo
En el siguiente ejemplo se declaran varios espacios de nombres anidados en una sola línea y es equivalente al
ejemplo anterior.

Namespace n1.n2
Class a
' Insert class definition.
End Class
End Namespace

Ejemplo
En el ejemplo siguiente se obtiene acceso a la clase definida en los ejemplos anteriores.

Dim instance As New n1.n2.a

Ejemplo
En el ejemplo siguiente se define el esqueleto de una nueva clase de lista genérica y se agrega al espacio de
nombres System.Collections.Generic.

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

Vea también
Imports (instrucción), espacio de nombres y tipo .NET
Nombres de elementos declarados
Espacios de nombres en Visual Basic
Instrucción On Error (Visual Basic)
27/11/2019 • 15 minutes to read • Edit Online

Habilita una rutina de control de errores y especifica la ubicación de la rutina dentro de un procedimiento.
también se puede usar para deshabilitar una rutina de control de errores. La instrucción On Error se usa en el
control de errores no estructurado y se puede usar en lugar de un control de excepciones estructurado. El control
estructurado de excepciones está integrado en .net, suele ser más eficaz y, por lo tanto, se recomienda al
controlar los errores en tiempo de ejecución en la aplicación.
Sin el control de errores o el control de excepciones, cualquier error en tiempo de ejecución que se produzca es
grave: se muestra un mensaje de error y se detiene la ejecución.

NOTE
La palabra clave Error también se usa en la instrucción de error, que se admite por compatibilidad con versiones
anteriores.

Sintaxis
On Error { GoTo [ line | 0 | -1 ] | Resume Next }

Elementos
T ÉRM IN O DEF IN IC IÓ N

línea GoTo Habilita la rutina de control de errores que se inicia en la línea


especificada en el argumento de línea requerido. El
argumento line es cualquier etiqueta de línea o número de
línea. Si se produce un error en tiempo de ejecución, el
control se bifurca en la línea especificada, lo que activa el
controlador de errores. La línea especificada debe estar en el
mismo procedimiento que la instrucción On Error o se
producirá un error en tiempo de compilación.

GoTo 0 Deshabilita el controlador de errores habilitado en el


procedimiento actual y lo restablece en Nothing .

GoTo -1 Deshabilita la excepción habilitada en el procedimiento actual


y la restablece en Nothing .

Resume Next Especifica que cuando se produce un error en tiempo de


ejecución, el control va a la instrucción inmediatamente
posterior a la instrucción en la que se produjo el error y la
ejecución continúa a partir de ese punto. Utilice este
formulario en lugar de On Error GoTo al obtener acceso a
los objetos.

Comentarios
NOTE
Se recomienda usar el control de excepciones estructurado en el código siempre que sea posible, en lugar de usar el
control de excepciones no estructurado y la instrucción On Error . Para obtener más información, vea Try...Catch...Finally
Statement (Try...Catch...Finally [Instrucción, Visual Basic]).

Un controlador de errores "habilitado" es el que está activado por una instrucción On Error . Un controlador de
errores "activo" es un controlador habilitado que se encuentra en el proceso de control de un error.
Si se produce un error mientras un controlador de errores está activo (entre la aparición del error y una
instrucción Resume , Exit Sub , Exit Function o Exit Property ), el controlador de errores del procedimiento
actual no puede controlar el error. El control vuelve al procedimiento que realiza la llamada.
Si el procedimiento de llamada tiene un controlador de errores habilitado, se activa para controlar el error. Si el
controlador de errores del procedimiento que realiza la llamada también está activo, el control pasa a través de
los procedimientos de llamada anteriores hasta que se encuentra un controlador de errores habilitado, pero
inactivo. Si no se encuentra ningún controlador de errores, el error es grave en el punto en el que se produjo
realmente.
Cada vez que el controlador de errores vuelve a pasar el control a un procedimiento que realiza la llamada, ese
procedimiento se convierte en el procedimiento actual. Una vez que un controlador de errores controla un error
en cualquier procedimiento, la ejecución se reanuda en el procedimiento actual en el punto designado por la
instrucción Resume .

NOTE
Una rutina de control de errores no es un procedimiento Sub o un procedimiento Function . Es una sección de código
marcada por una etiqueta de línea o un número de línea.

Propiedad Number
Las rutinas de control de errores se basan en el valor de la propiedad Number del objeto Err para determinar la
causa del error. La rutina debe probar o guardar los valores de propiedad relevantes en el objeto Err antes de
que pueda producirse cualquier otro error o antes de que se llame a un procedimiento que puede provocar un
error. Los valores de propiedad del objeto Err reflejan solo el error más reciente. El mensaje de error asociado a
Err.Number está contenido en Err.Description .

Throw (Instrucción)
Un error que se produce con el método Err.Raise establece la propiedad Exception en una instancia recién
creada de la clase Exception. Con el fin de admitir la generación de excepciones de tipos de excepción derivados,
se admite una instrucción Throw en el lenguaje. Esto toma un parámetro único que es la instancia de excepción
que se va a producir. En el ejemplo siguiente se muestra cómo se pueden usar estas características con la
compatibilidad con el control de excepciones existente:

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

Tenga en cuenta que la instrucción On Error GoTo captura todos los errores, independientemente de la clase de
excepción.

Al reanudar el error siguiente


On Error Resume Next hace que la ejecución continúe con la instrucción inmediatamente posterior a la
instrucción que causó el error en tiempo de ejecución, o con la instrucción inmediatamente posterior a la
llamada más reciente del procedimiento que contiene la instrucción On Error Resume Next . Esta instrucción
permite que la ejecución continúe a pesar de un error en tiempo de ejecución. Puede colocar la rutina de control
de errores en la que se produciría el error en lugar de transferir el control a otra ubicación dentro del
procedimiento. Una instrucción On Error Resume Next se vuelve inactiva cuando se llama a otro procedimiento,
por lo que debe ejecutar una instrucción On Error Resume Next en cada rutina llamada si desea controlar los
errores en línea dentro de esa rutina.

NOTE
La construcción On Error Resume Next puede ser preferible a On Error GoTo al controlar los errores generados
durante el acceso a otros objetos. La comprobación de Err después de cada interacción con un objeto elimina la
ambigüedad sobre el objeto al que tuvo acceso el código. Puede asegurarse de que el objeto colocó el código de error en
Err.Number , así como el objeto que generó originalmente el error (el objeto especificado en Err.Source ).

On error GoTo 0
On Error GoTo 0 deshabilita el control de errores en el procedimiento actual. No especifica la línea 0 como el
inicio del código de control de errores, aunque el procedimiento contenga una línea numerada como 0. Sin una
instrucción On Error GoTo 0 , se deshabilita automáticamente un controlador de errores cuando se sale de un
procedimiento.

On error GoTo-1
On Error GoTo -1 deshabilita la excepción en el procedimiento actual. No especifica line-1 como el inicio del
código de control de errores, aunque el procedimiento contenga una línea numerada-1. Sin una instrucción
On Error GoTo -1 , se deshabilita automáticamente una excepción cuando se sale de un procedimiento.

Para evitar que se ejecute código de control de errores cuando no se ha producido ningún error, coloque una
instrucción Exit Sub , Exit Function o Exit Property inmediatamente antes de la rutina de control de errores,
como en el fragmento siguiente:

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

Aquí, el código de control de errores sigue la instrucción Exit Sub y precede a la instrucción End Sub para
separarlo del flujo de procedimiento. Puede colocar el código de control de errores en cualquier parte de un
procedimiento.

Errores no interceptados
Los errores no interceptados de los objetos se devuelven a la aplicación de control cuando el objeto se ejecuta
como un archivo ejecutable. En el entorno de desarrollo, los errores no interceptados se devuelven a la aplicación
de control solo si se establecen las opciones adecuadas. Consulte la documentación de la aplicación host para
obtener una descripción de las opciones que se deben establecer durante la depuración, cómo establecerlas y si
el host puede crear clases.
Si crea un objeto que tiene acceso a otros objetos, debe tratar de tratar cualquier error no controlado que pase.
Si no es posible, asigne los códigos de error de Err.Number a uno de sus propios errores y, a continuación,
vuelva a pasarlos al autor de la llamada del objeto. Debe especificar el error agregando el código de error a la
constante VbObjectError . Por ejemplo, si el código de error es 1052, asígnelo como se indica a continuación:

Err.Number = vbObjectError + 1052

Cau t i on

Los errores del sistema durante las llamadas a las bibliotecas de vínculos dinámicos (dll) de Windows no
generan excepciones y no se pueden interceptar con Visual Basic la interceptación de errores. Al llamar a
funciones de DLL, debe comprobar si cada valor devuelto es correcto o incorrecto (de acuerdo con las
especificaciones de la API) y, en caso de que se produzca un error, compruebe el valor de la propiedad
LastDLLError del objeto Err .

Ejemplo
En primer lugar, en este ejemplo se usa la instrucción On Error GoTo para especificar la ubicación de una rutina
de control de errores dentro de un procedimiento. En el ejemplo, un intento de dividir por cero genera el número
de error 6. El error se controla en la rutina de control de errores y, a continuación, el control se devuelve a la
instrucción que provocó el error. La instrucción On Error GoTo 0 desactiva la interceptación de errores. A
continuación, se utiliza la instrucción On Error Resume Next para aplazar la interceptación de errores de modo
que el contexto del error generado por la siguiente instrucción pueda ser conocido para ciertos. Tenga en cuenta
que Err.Clear se utiliza para borrar las propiedades del objeto de Err una vez que se ha controlado el error.

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
Espacio de nombres: Microsoft. VisualBasic
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
Err
Number
Description
LastDllError
End (instrucción)
Exit (instrucción)
Resume (instrucción)
Mensajes de error
Try...Catch...Finally (instrucción)
Operator (Instrucción)
27/11/2019 • 11 minutes to read • Edit Online

Declara el símbolo del operador, los operandos y el código que definen un procedimiento de operador en
una clase o estructura.

Sintaxis
[ <attrlist> ] Public [ Overloads ] Shared [ Shadows ] [ Widening | Narrowing ]
Operator operatorsymbol ( operand1 [, operand2 ]) [ As [ <attrlist> ] type ]
[ statements ]
[ statements ]
Return returnvalue
[ statements ]
End Operator

Elementos
attrlist
Opcional. Vea lista de atributos.
Public
Obligatorio. Indica que este procedimiento de operador tiene acceso público .
Overloads
Opcional. Vea sobrecargas.
Shared
Obligatorio. Indica que este procedimiento de operador es un procedimiento compartido .
Shadows
Opcional. Vea Shadows.
Widening
Obligatorio para un operador de conversión a menos que especifique Narrowing . Indica que este
procedimiento de operador define una conversión de ampliación . Vea "conversiones de ampliación y de
restricción" en esta página de ayuda.
Narrowing
Obligatorio para un operador de conversión a menos que especifique Widening . Indica que este
procedimiento de operador define una conversión de restricción . Vea "conversiones de ampliación y de
restricción" en esta página de ayuda.
operatorsymbol
Obligatorio. Símbolo o identificador del operador que define este procedimiento de operador.
operand1
Obligatorio. El nombre y el tipo del operando único de un operador unario (incluido un operador de
conversión) o el operando izquierdo de un operador binario.
operand2
Requerido para los operadores binarios. Nombre y tipo del operando derecho de un operador binario.
operand1 y operand2 tienen la sintaxis y las partes siguientes:
[ ByVal ] operandname [ As operandtype ]

PA RT E DESC RIP C IÓ N

ByVal Opcional, pero el mecanismo de paso debe ser ByVal.

operandname Obligatorio. Nombre de la variable que representa este


operando. Vea Declared Element Names.

operandtype Opcional a menos que se On``Option Strict . Tipo de


datos de este operando.

type
Opcional a menos que se On``Option Strict . Tipo de datos del valor que el procedimiento del operador
devuelve.
statements
Opcional. Bloque de instrucciones que ejecuta el procedimiento de operador.
returnvalue
Obligatorio. Valor que el procedimiento del operador devuelve al código de llamada.
End Operator
Obligatorio. Finaliza la definición de este procedimiento de operador.

Comentarios
Solo se puede usar Operator en una clase o estructura. Esto significa que el contexto de la declaración de un
operador no puede ser un archivo de código fuente, un espacio de nombres, un módulo, una interfaz, un
procedimiento o un bloque. Para obtener más información, vea Declaration Contexts and Default Access
Levels (Contextos de declaración y niveles de acceso predeterminados).
Todos los operadores deben ser Public Shared . No se puede especificar ByRef , Optional o ParamArray para
ninguno de los operandos.
No se puede utilizar el símbolo de operador o el identificador para contener un valor devuelto. Debe utilizar
la instrucción Return y debe especificar un valor. Cualquier número de instrucciones Return puede aparecer
en cualquier parte del procedimiento.
La definición de un operador de este modo se denomina sobrecarga de operadores, tanto si se usa la palabra
clave Overloads como si no. En la tabla siguiente se enumeran los operadores que se pueden definir.

T IP O O P ERA DO RES

Unario + , - , IsFalse , IsTrue , Not

Binary + , - , * , / , \ , & , ^ , >> , << , = , <> , > , >= ,


< , <= , And , Like , Mod , Or , Xor

Conversión (unaria) CType

Tenga en cuenta que el operador = de la lista binaria es el operador de comparación, no el operador de


asignación.
Al definir CType , debe especificar Widening o Narrowing .

Pares coincidentes
Debe definir ciertos operadores como pares coincidentes. Si define un operador de este tipo, debe definir
también el otro. Los pares coincidentes son los siguientes:
= y <>

> y <

>= y <=

IsTrue y IsFalse

Restricciones de tipos de datos


Cada operador que defina debe incluir la clase o estructura en la que se define. Esto significa que la clase o
estructura debe aparecer como el tipo de datos de lo siguiente:
Operando de un operador unario.
Al menos uno de los operandos de un operador binario.
El operando o el tipo de valor devuelto de un operador de conversión.
Ciertos operadores tienen restricciones de tipo de datos adicionales, como se indica a continuación:
Si define los operadores IsTrue y IsFalse , ambos deben devolver el tipo de Boolean .
Si define los operadores << y >> , ambos deben especificar el tipo de Integer para la operandtype
de operand2 .

El tipo de valor devuelto no tiene que corresponder al tipo de uno de los operandos. Por ejemplo, un
operador de comparación como = o <> puede devolver Boolean aunque no se Boolean ninguno de los
operandos.

Operadores lógicos y bit a bit


Los operadores And , Or , Not y Xor pueden realizar operaciones lógicas o bit a bit en Visual Basic. Sin
embargo, si define uno de estos operadores en una clase o estructura, solo puede definir su operación bit a
bit.
No se puede definir el operador de AndAlso directamente con una instrucción Operator . Sin embargo,
puede usar AndAlso si ha cumplido las condiciones siguientes:
Ha definido And en los mismos tipos de operando que desea usar para AndAlso .
La definición de And devuelve el mismo tipo que la clase o estructura en la que se ha definido.
Ha definido el operador de IsFalse en la clase o estructura en la que ha definido And .
Del mismo modo, puede utilizar OrElse si ha definido Or en los mismos operandos, con el tipo de valor
devuelto de la clase o estructura, y ha definido IsTrue en la clase o estructura.

Widening and Narrowing Conversions


Una conversión de ampliación siempre se realiza correctamente en tiempo de ejecución, mientras que una
conversión de restricción puede producir un error en tiempo de ejecución. Para obtener más información,
consulta Widening and Narrowing Conversions.
Si declara un procedimiento de conversión para que se Widening , el código de procedimiento no debe
generar ningún error. Esto significa lo siguiente:
Siempre debe devolver un valor válido de tipo type .
Debe administrar todas las excepciones posibles y otras condiciones de error.
Debe controlar cualquier devolución de error de cualquier procedimiento al que llame.
Si existe la posibilidad de que un procedimiento de conversión no se lleve a cabo correctamente o de que se
produzca una excepción no controlada, debe declararlo como Narrowing .

Ejemplo
En el ejemplo de código siguiente se usa la instrucción Operator para definir el contorno de una estructura
que incluye procedimientos de operador para los operadores And , Or , IsFalse y IsTrue . And y Or
tienen dos operandos de tipo abc y abc de tipo de valor devuelto. IsFalse y IsTrue toman un único
operando de tipo abc y devuelven Boolean . Estas definiciones permiten que el código de llamada use And ,
AndAlso , Or y OrElse con operandos de tipo abc .

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

Vea también
IsFalse (operador)
IsTrue (operador)
Widening
Narrowing
Conversiones de ampliación y de restricción
Procedimientos de operadores
Definir un operador
Definir un operador de conversión
Llamar a un procedimiento de operador
Utilizar una clase que define operadores
Option <palabra clave > instrucción
27/11/2019 • 2 minutes to read • Edit Online

Presenta una instrucción que especifica una opción del compilador que se aplica a todo el archivo de código
fuente.

Comentarios
Las opciones del compilador pueden controlar si todas las variables deben declararse explícitamente, si las
conversiones de tipo de restricción deben ser explícitas o si las cadenas se deben comparar como texto o como
cantidades binarias.
La palabra clave Option se puede usar en los siguientes contextos:
Option Compare (instrucción)
Option Explicit (instrucción)
Option Infer (instrucción)
Option Strict (instrucción)

Vea también
Palabras clave
Option Compare (Instrucción)
27/11/2019 • 6 minutes to read • Edit Online

Declara el método de comparación predeterminado que se utiliza al comparar datos de cadena.

Sintaxis
Option Compare { Binary | Text }

Elementos
T ÉRM IN O DEF IN IC IÓ N

Binary Opcional. Genera comparaciones de cadenas basadas en


un criterio de ordenación que se deriva de las
representaciones binarias internas de los caracteres.

Este tipo de comparación es especialmente útil si las


cadenas pueden contener caracteres que no serán
interpretados como texto. En este caso, no conviene
desviar las comparaciones con equivalencias alfabéticas,
como la no distinción entre mayúsculas y minúsculas.

Text Opcional. Genera comparaciones de cadenas basadas en


un criterio de ordenación de texto sin distinción entre
mayúsculas y minúsculas, determinado por la
configuración regional del sistema.

Este tipo de comparación es útil si las cadenas contienen


todos los caracteres de texto y si desea compararlas
teniendo en cuenta equivalencias alfabéticas, como la no
distinción entre mayúsculas y minúsculas y las letras
estrechamente relacionadas. Por ejemplo, tal vez le
interese considerar que A y a son iguales, y que Ä y
ä van antes que B y b .

Comentarios
Si se utiliza la instrucción Option Compare , debe aparecer en un archivo antes que cualquier otra instrucción
de código fuente.
La instrucción Option Compare especifica el método de comparación de cadenas ( Binary o Text ). El método
de comparación de texto predeterminado es Binary .
Una comparación Binary compara el valor numérico de Unicode de cada carácter en cada cadena. Una
comparación Text compara cada carácter Unicode basándose en su significado léxico en la referencia
cultural actual.
En Microsoft Windows, el criterio de ordenación viene determinado por la página de código. Para obtener
más información, vea Páginas de códigos.
En el ejemplo siguiente, los caracteres de la página de códigos inglés/europeo (ANSI 1252) se ordenan
mediante el uso de Option Compare Binary , lo que genera un criterio de ordenación binario típico.
A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø

Cuando se ordenan los mismos caracteres en la misma página de código mediante el uso de
Option Compare Text , se genera el siguiente criterio de ordenación de texto.

(A=a) < (À = à) < (B=b) < (E=e) < (Ê = ê) < (Z=z) < (Ø = ø)

Cuando la instrucción Option Compare no está presente


Si el código fuente no contiene una instrucción Option Compare , se usa el valor Option Compare en la
Página compilar, el diseñador de proyectos (Visual Basic) . Si usa el compilador de línea de comandos, se usa
el valor especificado por la opción del compilador -optioncompare ( .

NOTE
Es posible que el equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de
usuario de Visual Studio en las siguientes instrucciones. La edición de Visual Studio que se tenga y la configuración
que se utilice determinan estos elementos. Para obtener más información, vea Personalizar el IDE.

Cómo establecer Option Compare en el IDE


1. En el Explorador de soluciones , seleccione un proyecto. En el menú Proyecto , haga clic en
Propiedades .
2. Haga clic en la pestaña Compilar .
3. Establezca el valor en el cuadro Option Compare .
Al crear un proyecto, el valor Option Compare de la pestaña compilar se establece en el valor Option
Compare del cuadro de diálogo Opciones . Para cambiar esta configuración, en el menú herramientas ,
haga clic en Opciones . En el cuadro de diálogo Opciones , expanda Proyectos y soluciones y, después,
haga clic en Valores predeterminados de VB . La configuración predeterminada inicial en los valores
predeterminados de VB es binaria .
Cómo establecer Option Compare en la línea de comandos
Incluya la opción del compilador -optioncompare ( en el comando VBC .

Ejemplo
El ejemplo siguiente utiliza la instrucción Option Compare para establecer la comparación binaria como
método predeterminado de comparación de cadenas. Para utilizar este código, quite el comentario de la
instrucción Option Compare Binary y colóquelo en la parte superior del archivo de origen.

' Option Compare Binary

Console.WriteLine("A" < "a")


' Output: True

Ejemplo
El ejemplo siguiente se utiliza la instrucción Option Compare para establecer el criterio de ordenación de
texto sin distinción entre mayúsculas y minúsculas como método predeterminado de comparación de
cadenas. Para utilizar este código, quite el comentario de la instrucción Option Compare Text y colóquelo en
la parte superior del archivo de origen.
' Option Compare Text

Console.WriteLine("A" = "a")
' Output: True

Vea también
InStr
InStrRev
Replace
Split
StrComp
-optioncompare
Operadores de comparación
Operadores de comparación en Visual Basic
Like (operador)
Funciones de cadena
Option Explicit (instrucción)
Option Strict (instrucción)
Option Explicit (Instrucción, Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Fuerza la declaración explícita de todas las variables de un archivo o permite declaraciones implícitas de
variables.

Sintaxis
Option Explicit { On | Off }

Elementos
On
Opcional. Habilita la comprobación de Option Explicit . Si no se especifica On o Off , el valor predeterminado
es On .
Off
Opcional. Deshabilita la comprobación de Option Explicit .

Comentarios
Cuando Option Explicit On o Option Explicit aparezca en un archivo, debe declarar explícitamente todas las
variables mediante el uso de las instrucciones Dim o ReDim . Si intenta usar un nombre de variable no
declarado, se produce un error en tiempo de compilación. La instrucción Option Explicit Off permite la
declaración implícita de variables.
Si se utiliza la instrucción Option Explicit , debe aparecer en un archivo antes que cualquier otra instrucción de
código fuente.

NOTE
La configuración de Option Explicit en Off no suele ser una buena práctica. Podría escribir mal un nombre de
variable en una o varias ubicaciones, lo que provocaría resultados inesperados cuando se ejecuta el programa.

Cuando una instrucción Option Explicit no está presente


Si el código fuente no contiene una instrucción Option Explicit , se usa el valor Option Explicit en la Página
compilar, el diseñador de proyectos (Visual Basic) . Si se usa el compilador de línea de comandos, se usa la
opción del compilador -OptionExplicit .
Para establecer Option Explicit en el IDE
1. En el Explorador de soluciones , seleccione un proyecto. En el menú Proyecto , haga clic en
Propiedades .
2. Haga clic en la pestaña Compilar .
3. Establezca el valor en el cuadro Option Explicit .
Al crear un nuevo proyecto, el valor Option Explicit en la pestaña compilar se establece en el valor Option
Explicit en el cuadro de diálogo valores predeterminados de VB . Para tener acceso al cuadro de diálogo
valores predeterminados de VB , en el menú herramientas , haga clic en Opciones . En el cuadro de
diálogo Opciones , expanda Proyectos y soluciones y, después, haga clic en Valores predeterminados de
VB . La configuración predeterminada inicial en los valores predeterminados de VB es On .
Para establecer Option Explicit en la línea de comandos
Incluya la opción del compilador -OptionExplicit en el comando VBC .

Ejemplo
En el ejemplo siguiente se usa la instrucción Option Explicit para forzar la declaración explícita de todas las
variables. Al intentar usar una variable no declarada, se produce un error en tiempo de compilación.

' Force explicit variable declaration.


Option Explicit On

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

Vea también
Dim (instrucción)
ReDim (instrucción)
Option Compare (instrucción)
Option Strict (instrucción)
-optioncompare
-optionexplicit
-optionstrict
Valores predeterminados de Visual Basic, Proyectos, Opciones (Cuadro de diálogo)
Option Infer (instrucción)
27/11/2019 • 8 minutes to read • Edit Online

Permite el uso de la inferencia de tipo de variable local en la declaración de variables.

Sintaxis
Option Infer { On | Off }

Elementos
T ÉRM IN O DEF IN IC IÓ N

On Opcional. Habilita la inferencia de tipo de variable local.

Off Opcional. Deshabilita la inferencia de tipo de variable local.

Comentarios
Para establecer Option Infer en un archivo, escriba Option Infer On o Option Infer Off en la parte superior
del archivo, antes de cualquier otro código fuente. Si el valor establecido para Option Infer en un archivo
entra en conflicto con el valor establecido en el IDE o en la línea de comandos, el valor del archivo tiene
prioridad.
Al establecer Option Infer en On , puede declarar variables locales sin especificar explícitamente un tipo de
datos. El compilador deduce el tipo de datos de una variable a partir del tipo de su expresión de inicialización.
En la siguiente ilustración, Option Infer está activado. La variable de la declaración Dim someVar = 2 se
declara como un entero mediante la inferencia de tipo.
En la captura de pantalla siguiente se muestra IntelliSense cuando Option Infer está activada:

En la siguiente ilustración, Option Infer está desactivado. La variable de la declaración Dim someVar = 2 se
declara como un Object mediante la inferencia de tipo. En este ejemplo, el valor Option Strict está
establecido en OFF en la Página compilar, diseñador de proyectos (Visual Basic).
La captura de pantalla siguiente muestra IntelliSense cuando Option Infer es OFF:
NOTE
Cuando una variable se declara como un Object , el tipo de tiempo de ejecución puede cambiar mientras se ejecuta el
programa. Visual Basic realiza operaciones denominadas conversión boxing y unboxing para realizar la conversión entre
un Object y un tipo de valor, lo que hace que la ejecución sea más lenta. Para obtener información sobre las
conversiones boxing y unboxing, vea la especificación del lenguaje Visual Basic.

La inferencia de tipo se aplica en el nivel de procedimiento, y no se aplica fuera de un procedimiento en una


clase, estructura, módulo o interfaz.
Para obtener más información, consulte inferencia de tipo de local.

Cuando la instrucción Option Infer no está presente


Si el código fuente no contiene una instrucción Option Infer , se usa el valor de Option Infer en la Página
compilar, el diseñador de proyectos (Visual Basic) . Si se usa el compilador de línea de comandos, se usa la
opción del compilador -optioninfer ( .
Cómo establecer Option Infer en el IDE
1. En el Explorador de soluciones , seleccione un proyecto. En el menú Proyecto , haga clic en
Propiedades .
2. Haga clic en la pestaña Compilar .
3. Establezca el valor en el cuadro Option Infer .
Al crear un nuevo proyecto, el valor Option Infer de la pestaña compilar se establece en el valor Option
Infer del cuadro de diálogo valores predeterminados de VB . Para tener acceso al cuadro de diálogo
valores predeterminados de VB , en el menú herramientas , haga clic en Opciones . En el cuadro de
diálogo Opciones , expanda Proyectos y soluciones y, después, haga clic en Valores predeterminados de
VB . La configuración predeterminada inicial en los valores predeterminados de VB es On .
Cómo establecer Option Infer en la línea de comandos
Incluya la opción del compilador -optioninfer ( en el comando VBC .

Tipos de datos y valores predeterminados


En la tabla siguiente se describen los resultados de diversas combinaciones resultantes de especificar el tipo de
datos y el inicializador en una instrucción Dim .

¿T IP O DE DATO S ¿IN IC IA L IZ A DO R
ESP EC IF IC A DO ? ESP EC IF IC A DO ? E JEM P LO RESULTA DO
¿T IP O DE DATO S ¿IN IC IA L IZ A DO R
ESP EC IF IC A DO ? ESP EC IF IC A DO ? E JEM P LO RESULTA DO

No No Dim qty Si Option Strict está


desactivado (valor
predeterminado), la variable
se establece en Nothing .

Si Option Strict está


activado, se produce un
error en tiempo de
compilación.

No Sí Dim qty = 5 Si Option Infer está


activado (valor
predeterminado), la variable
toma el tipo de datos del
inicializador. Vea inferencia
de tipo de local.

Si Option Infer está


desactivado y
Option Strict está
desactivado, la variable
toma el tipo de datos de
Object .

Si Option Infer está


desactivado y
Option Strict está
activado, se produce un
error en tiempo de
compilación.

Sí No Dim qty As Integer La variable se inicializa con


el valor predeterminado del
tipo de datos. Para obtener
más información, vea Dim
(instrucción).

Sí Sí Dim qty As Integer = 5 Si el tipo de datos del


inicializador no es
convertible al tipo de datos
especificado, se produce un
error en tiempo de
compilación.

Ejemplo
Los ejemplos siguientes muestran cómo la instrucción Option Infer habilita la inferencia de tipo local.
' 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

Ejemplo
El siguiente ejemplo demuestra que el tipo en tiempo de ejecución puede ser diferente cuando una variable se
identifica como un Object .

' 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

Vea también
Dim (instrucción)
Inferencia de tipo de variable local
Option Compare (instrucción)
Option Explicit (instrucción)
Option Strict (instrucción)
Valores predeterminados de Visual Basic, Proyectos, Opciones (Cuadro de diálogo)
-optioninfer
Conversión boxing y conversión unboxing
Option Strict Statement
27/11/2019 • 17 minutes to read • Edit Online

Restringe las conversiones de tipos de datos implícitos solo a las conversiones de ampliación, no
permite el enlace en tiempo de ejecución y no permite los tipos implícitos que generan un tipo de
Object .

Sintaxis
Option Strict { On | Off }

Elementos
T ÉRM IN O DEF IN IC IÓ N

On Opcional. Habilita la comprobación de Option Strict .

Off Opcional. Deshabilita la comprobación de


Option Strict .

Comentarios
Cuando Option Strict On o Option Strict aparece en un archivo, las condiciones siguientes producen
un error en tiempo de compilación:
Conversiones de restricción implícitas
Enlace en tiempo de ejecución
Tipos implícitos que dan como resultado un tipo Object

NOTE
En las configuraciones de advertencia que se pueden establecer en la Página compilar, diseñador de proyectos
(Visual Basic), hay tres opciones de configuración que se corresponden con las tres condiciones que causan un
error en tiempo de compilación. Para obtener información sobre cómo usar estos valores, vea para establecer
configuraciones de advertencia en el IDE más adelante en este tema.

La instrucción Option Strict Off desactiva la comprobación de errores y advertencias para las tres
condiciones, incluso si la configuración de IDE asociada especifica que se activen estos errores o
advertencias. La instrucción Option Strict On activa la comprobación de errores y advertencias para
las tres condiciones, incluso si la configuración de IDE asociada especifica que se desactiven estos
errores o advertencias.
Si se utiliza, la instrucción Option Strict debe aparecer antes que cualquier otra instrucción de código
en un archivo.
Cuando se establece Option Strict en On , Visual Basic comprueba que los tipos de datos se
especifican para todos los elementos de programación. Los tipos de datos se pueden especificar
explícitamente o especificarse mediante la inferencia de tipo local. Se recomienda especificar los tipos
de datos para todos los elementos de programación, por las razones siguientes:
Habilita la compatibilidad con IntelliSense para las variables y los parámetros. Esto le permite ver
sus propiedades y otros miembros a medida que escribe código.
Permite que el compilador realice la comprobación de tipos. La comprobación de tipos le ayuda
a encontrar instrucciones que pueden producir errores en tiempo de ejecución debido a errores
de conversión de tipos. También identifica las llamadas a métodos en objetos que no admiten
esos métodos.
Acelera la ejecución del código. Una razón para esto es que, si no se especifica un tipo de datos
para un elemento de programación, el compilador Visual Basic le asigna el tipo de Object . Es
posible que el código compilado tenga que realizar una conversión entre Object y otros tipos
de datos, lo que reduce el rendimiento.

Errores de conversión de restricción implícita


Los errores de conversión de restricción implícita se producen cuando existe una conversión de tipos de
datos implícita que es una conversión de restricción.
Visual Basic puede convertir muchos tipos de datos en otros tipos de datos. La pérdida de datos puede
producirse cuando el valor de un tipo de datos se convierte en un tipo de datos que tiene menos
precisión o menor capacidad. Se produce un error en tiempo de ejecución si se produce un error en una
conversión de restricción. Option Strict garantiza la notificación en tiempo de compilación de estas
conversiones de restricción para que pueda evitarlas. Para obtener más información, vea conversiones
implícitas y explícitas , y conversiones de ampliación y de restricción.
Entre las conversiones que pueden producir errores se incluyen las conversiones implícitas que se
producen en expresiones. Para obtener más información, consulta los temas siguientes:
Operador +
Operador +=
Operador (Visual Basic)
/= (Operador) (Visual Basic)
Char (tipo de datos)
Al concatenar cadenas mediante el operador &, se considera que todas las conversiones de las cadenas
son de ampliación. Por lo tanto, estas conversiones no generan un error de conversión de restricción
implícita, aun cuando Option Strict esté activada.
Cuando se llama a un método que tiene un argumento que tiene un tipo de datos diferente del
parámetro correspondiente, una conversión de restricción produce un error en tiempo de compilación
si Option Strict está activado. Puede evitar el error en tiempo de compilación mediante una
conversión de ampliación o una conversión explícita.
Los errores de conversión de restricción implícita se suprimen en tiempo de compilación para las
conversiones de los elementos de una colección de For Each…Next a la variable de control de bucle.
Esto sucede incluso si Option Strict está activada. Para obtener más información, vea la sección acerca
de las conversiones de restricción en for each... Instrucción siguiente.

Errores de enlace en tiempo de ejecución


Un objeto se enlaza en tiempo de ejecución cuando se asigna a una propiedad o un método de una
variable que se declara como variable de tipo Object . Para obtener más información, vea enlace
anticipado y en tiempo de ejecución.

Errores de tipo de objeto implícito


Los errores de tipo de objeto implícito se producen cuando no se puede inferir un tipo adecuado para
una variable declarada, por lo que se infiere un tipo de Object . Esto se produce principalmente cuando
se usa una instrucción Dim para declarar una variable sin usar una cláusula As y Option Infer está
desactivado. Para obtener más información, vea la instrucción Option Infer y la especificación del
lenguaje Visual Basic.
En el caso de los parámetros de método, la cláusula As es opcional si Option Strict está en OFF. Sin
embargo, si cualquiera de los parámetros utiliza una cláusula As , todos deben usarlo. Si
Option Strict está activada, se requiere la cláusula As para cada definición de parámetro.

Si declara una variable sin usar una cláusula As y la establece en Nothing , la variable tiene un tipo de
Object . En este caso, no se produce ningún error en tiempo de compilación cuando Option Strict
está activada y Option Infer está activada. Un ejemplo de esto es Dim something = Nothing .
Tipos de datos y valores predeterminados
En la tabla siguiente se describen los resultados de diversas combinaciones de especificar el tipo de
datos y el inicializador en una instrucción Dim.

¿T IP O DE DATO S ¿IN IC IA L IZ A DO R
ESP EC IF IC A DO ? ESP EC IF IC A DO ? E JEM P LO RESULTA DO

No No Dim qty Si Option Strict está


desactivado (valor
predeterminado), la
variable se establece en
Nothing .

Si Option Strict está


activado, se produce un
error en tiempo de
compilación.

No Sí Dim qty = 5 Si Option Infer está


activado (valor
predeterminado), la
variable toma el tipo de
datos del inicializador. Vea
inferencia de tipo de local.

Si Option Infer está


desactivado y
Option Strict está
desactivado, la variable
toma el tipo de datos de
Object .

Si Option Infer está


desactivado y
Option Strict está
activado, se produce un
error en tiempo de
compilación.
¿T IP O DE DATO S ¿IN IC IA L IZ A DO R
ESP EC IF IC A DO ? ESP EC IF IC A DO ? E JEM P LO RESULTA DO

Sí No Dim qty As Integer La variable se inicializa


con el valor
predeterminado del tipo
de datos. Para obtener
más información, vea Dim
(instrucción).

Sí Sí Dim qty As Integer = Si el tipo de datos del


5 inicializador no es
convertible al tipo de
datos especificado, se
produce un error en
tiempo de compilación.

Cuando una instrucción Option Strict no está presente


Si el código fuente no contiene una instrucción Option Strict , se usa el valor Option Strict en la
Página compilar, el diseñador de proyectos (Visual Basic) . La Página compilar tiene valores que
proporcionan un control adicional sobre las condiciones que generan un error.
Si usa el compilador de línea de comandos, puede usar la opción del compilador -OptionStrict para
especificar un valor para Option Strict .
Para establecer Option Strict en el IDE

NOTE
Es posible que el equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz
de usuario de Visual Studio en las siguientes instrucciones. La edición de Visual Studio que se tenga y la
configuración que se utilice determinan estos elementos. Para obtener más información, vea Personalizar el IDE.

1. En el Explorador de soluciones , seleccione un proyecto. En el menú Proyecto , haga clic en


Propiedades .
2. En la pestaña compilar , establezca el valor en el cuadro Option Strict .
Para establecer configuraciones de advertencia en el IDE
Cuando use la Página compilar, el diseñador de proyectos (Visual Basic) en lugar de una instrucción
Option Strict , tendrá un control adicional sobre las condiciones que generan errores. La sección
configuraciones de adver tencia de la Página compilar tiene valores de configuración que
corresponden a las tres condiciones que causan un error en tiempo de compilación cuando
Option Strict está activada. Estas opciones son las siguientes:

Conversión implícita
Enlace en tiempo de ejecución; la llamada podría generar un error en tiempo de
ejecución
Tipo implícito; se supone el objeto
Al establecer Option Strict en On , estos tres valores de configuración de advertencias se establecen
en Error . Al establecer Option Strict en Off , las tres opciones se establecen en None .
Puede cambiar individualmente cada valor de configuración de advertencia por None , Warning o
Error . Si se establecen las tres opciones de configuración de advertencia en Error , On aparece en el
cuadro Option strict . Si se establecen las tres en None , Off aparece en este cuadro. Para cualquier
otra combinación de estas opciones, aparece (personalizado) .
Para establecer la configuración predeterminada de Option Strict para los nuevos proyectos
Al crear un proyecto, el valor Option Strict de la pestaña compilar se establece en el valor Option
Strict del cuadro de diálogo Opciones .
Para establecer Option Strict en este cuadro de diálogo, en el menú herramientas , haga clic en
Opciones . En el cuadro de diálogo Opciones , expanda Proyectos y soluciones y, después, haga clic
en Valores predeterminados de VB . La configuración predeterminada inicial en los valores
predeterminados de VB es Off .
Para establecer Option Strict en la línea de comandos
Incluya la opción del compilador -OptionStrict en el comando VBC .

Ejemplo
En los siguientes ejemplos se muestran errores en tiempo de compilación causados por conversiones
de tipo implícitas que son conversiones de restricción. Esta categoría de errores corresponde a la
condición de conversión implícita en la Página compilar .

' 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

Ejemplo
En el ejemplo siguiente se muestra un error en tiempo de compilación causado por el enlace en tiempo
de ejecución. Esta categoría de errores corresponde al enlace en tiempo de ejecución; la llamada
podría producir un error en la condición de tiempo de ejecución en la Página de compilación .
' 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

Ejemplo
En los siguientes ejemplos se muestran errores causados por variables declaradas con un tipo implícito
de Object . Esta categoría de errores corresponde al tipo implícito; se supone que el objeto es una
condición en la Página de compilación .

' 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

' If Option Strict is on, this parameter without an


' As clause causes a compile-time error.
Private Sub DetectIntergalacticRange(ByVal photonAttenuation)

End Sub

Vea también
Conversiones de ampliación y de restricción
Conversiones implícitas y explícitas
Página Compilación, Diseñador de proyectos (Visual Basic)
Option Explicit (instrucción)
Funciones de conversión de tipos
Obtener acceso a los miembros de un objeto
Expresiones incrustadas en XML
Conversión de delegado flexible
Enlace en tiempo de ejecución en las soluciones de Office
-optionstrict
Valores predeterminados de Visual Basic, Proyectos, Opciones (Cuadro de diálogo)
Property Statement
27/11/2019 • 11 minutes to read • Edit Online

Declara el nombre de una propiedad y los procedimientos de propiedad que se usan para almacenar y
recuperar el valor de la propiedad.

Sintaxis
[ <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 ]

Elementos
attributelist

Opcional. Lista de atributos que se aplican a esta propiedad o Get o Set procedimiento. Vea
lista de atributos.
Default

Opcional. Especifica que esta propiedad es la propiedad predeterminada de la clase o estructura


en la que se define. Las propiedades predeterminadas deben aceptar parámetros y se pueden
establecer y recuperar sin especificar el nombre de la propiedad. Si declara la propiedad como
Default , no puede usar Private en la propiedad o en cualquiera de sus procedimientos de
propiedad.
accessmodifier

Opcional en la instrucción Property y en, como máximo, una de las instrucciones Get y Set .
Puede ser uno de los siguientes:
Public
Protected
Friend
Private
Protected Friend
Private Protected
Vea Access levels in Visual Basic.
propertymodifiers

Opcional. Puede ser uno de los siguientes:


Sobrecargas
Overrides
Overridable
NotOverridable
MustOverride
MustOverride Overrides

NotOverridable Overrides

Shared

Opcional. Vea Shared.


Shadows

Opcional. Vea Shadows.


ReadOnly

Opcional. Vea ReadOnly.


WriteOnly

Opcional. Vea WriteOnly.


Iterator

Opcional. Vea iterator.


name

Obligatorio. Nombre de la propiedad. Vea Declared Element Names.


parameterlist

Opcional. Lista de nombres de variables locales que representan los parámetros de esta
propiedad y posibles parámetros adicionales del procedimiento Set . Vea lista de parámetros.
returntype

Es obligatorio si se On``Option Strict . Tipo de datos del valor devuelto por esta propiedad.
Implements

Opcional. Indica que esta propiedad implementa una o más propiedades, cada una de las cuales
se define en una interfaz implementada por la clase o estructura que contiene esta propiedad.
Vea Implements (instrucción).
implementslist

Es necesario si se proporciona Implements . Lista de propiedades que se implementan.


implementedproperty [ , implementedproperty ... ]

Cada implementedproperty tiene la sintaxis y las partes siguientes:


interface.definedname

PA RT E DESC RIP C IÓ N

interface Obligatorio. Nombre de una interfaz implementada


por la clase o estructura que contiene esta
propiedad.

definedname Obligatorio. Nombre por el que se define la


propiedad en interface .

Get

Opcional. Obligatorio si la propiedad está marcada como ReadOnly . Inicia una Get
procedimiento de propiedad que se usa para devolver el valor de la propiedad. La instrucción
Get no se utiliza con las propiedades implementadas automáticamente.

statements

Opcional. Bloque de instrucciones que se va a ejecutar en el procedimiento Get o Set .


End Get

Finaliza el procedimiento de la propiedad Get .


Set

Opcional. Obligatorio si la propiedad está marcada como WriteOnly . Inicia una Set
procedimiento de propiedad que se usa para almacenar el valor de la propiedad. La instrucción
Set no se utiliza con las propiedades implementadas automáticamente.

End Set

Finaliza el procedimiento de la propiedad Set .


End Property

Finaliza la definición de esta propiedad.

Comentarios
La instrucción Property presenta la declaración de una propiedad. Una propiedad puede tener un
procedimiento Get (solo lectura), un procedimiento Set (solo escritura) o ambos (lectura y escritura).
Puede omitir el procedimiento Get y Set al utilizar una propiedad implementada automáticamente.
Para obtener más información, vea Auto-Implemented Properties (Propiedades implementadas
automáticamente).
Solo se puede usar Property en el nivel de clase. Esto significa que el contexto de la declaración de
una propiedad debe ser una clase, una estructura, un módulo o una interfaz, y no puede ser un archivo
de código fuente, un espacio de nombres, un procedimiento o un bloque. Para obtener más
información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y niveles de
acceso predeterminados).
De forma predeterminada, las propiedades usan el acceso público. Puede ajustar el nivel de acceso de
una propiedad con un modificador de acceso en la instrucción Property y, opcionalmente, puede
ajustar uno de sus procedimientos de propiedad a un nivel de acceso más restrictivo.
Visual Basic pasa un parámetro al procedimiento Set durante las asignaciones de propiedades. Si no
proporciona un parámetro para Set , el entorno de desarrollo integrado (IDE) utiliza un parámetro
implícito denominado value . Este parámetro contiene el valor que se va a asignar a la propiedad.
Normalmente, este valor se almacena en una variable local privada y se devuelve cada vez que se
llama al procedimiento Get .

Reglas
Niveles de acceso mixtos. Si va a definir una propiedad de lectura y escritura, puede
especificar opcionalmente un nivel de acceso diferente para el Get o el procedimiento de Set ,
pero no ambos. Si lo hace, el nivel de acceso del procedimiento debe ser más restrictivo que el
nivel de acceso de la propiedad. Por ejemplo, si la propiedad se declara Friend , puede declarar
el Set procedimiento Private , pero no Public .
Si va a definir una propiedad ReadOnly o WriteOnly , el procedimiento de propiedad única (
Get o Set , respectivamente) representa toda la propiedad. No se puede declarar un nivel de
acceso diferente para este procedimiento, ya que esto establecería dos niveles de acceso para la
propiedad.
Tipo de valor devuelto. La instrucción Property puede declarar el tipo de datos del valor que
devuelve. Puede especificar cualquier tipo de datos o el nombre de una enumeración,
estructura, clase o interfaz.
Si no se especifica returntype , la propiedad devuelve Object .
Aplicación. Si esta propiedad utiliza la palabra clave Implements , la clase o estructura
contenedora debe tener una instrucción Implements inmediatamente después de su instrucción
Class o Structure . La instrucción Implements debe incluir cada interfaz especificada en
implementslist . Sin embargo, el nombre por el que una interfaz define el Property (en
definedname ) no tiene que ser el mismo que el nombre de esta propiedad (en name ).

Comportamiento
Devolver desde un procedimiento de propiedad. Cuando el procedimiento Get o Set
vuelve al código de llamada, la ejecución continúa con la instrucción que sigue a la instrucción
que lo invocó.
Las instrucciones Exit Property y Return producen una salida inmediata de un procedimiento
de propiedad. Cualquier número de instrucciones Exit Property y Return puede aparecer en
cualquier parte del procedimiento y se pueden mezclar instrucciones Exit Property y Return .
Valor devuelto. Para devolver un valor de un procedimiento Get , puede asignar el valor al
nombre de la propiedad o incluirlo en una instrucción Return . En el ejemplo siguiente se
asigna el valor devuelto al nombre de propiedad quoteForTheDay y, a continuación, se usa la
instrucción Exit Property para devolver.

Private quoteValue As String = "No quote assigned yet."

ReadOnly Property QuoteForTheDay() As String


Get
QuoteForTheDay = quoteValue
Exit Property
End Get
End Property
Si usa Exit Property sin asignar un valor a name , el procedimiento Get devuelve el valor
predeterminado del tipo de datos de la propiedad.
La instrucción Return al mismo tiempo asigna el valor devuelto del procedimiento Get y sale
del procedimiento. En el ejemplo siguiente se muestra esto.

Private quoteValue As String = "No quote assigned yet."

ReadOnly Property QuoteForTheDay() As String


Get
Return quoteValue
End Get
End Property

Ejemplo
En el ejemplo siguiente se declara una propiedad en una clase.

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

Vea también
Propiedades autoimplementadas
Objetos y clases
Get (instrucción)
Set (instrucción)
Lista de parámetros
Default
Instrucciones Q-Z
27/11/2019 • 2 minutes to read • Edit Online

La tabla siguiente contiene una lista de instrucciones de lenguaje de Visual Basic.

RaiseEvent ReDim REM RemoveHandler

Resume Return Seleccione... Y Set

Stop Estructuras Sub SyncLock

Then Throw Try... Detectar... Terminar Using

While... Finalizar while Con... Terminar con Yield

Vea también
Instrucciones de la A a la E
Instrucciones de la F a la P
Referencia del lenguaje Visual Basic
RaiseEvent (Instrucción)
27/11/2019 • 7 minutes to read • Edit Online

Desencadena un evento declarado en el nivel de módulo dentro de una clase, formulario o documento.

Sintaxis
RaiseEvent eventname[( argumentlist )]

Elementos
eventname
Obligatorio. Nombre del evento que se va a desencadenar.
argumentlist
Opcional. Lista delimitada por comas de variables, matrices o expresiones. El argumento argumentlist debe ir
entre paréntesis. Si no hay ningún argumento, se deben omitir los paréntesis.

Comentarios
El eventname necesario es el nombre de un evento declarado en el módulo. Sigue Visual Basic convenciones de
nomenclatura de variables.
Si el evento no se ha declarado en el módulo en el que se genera, se produce un error. En el fragmento de código
siguiente se muestra una declaración de evento y un procedimiento en el que se genera el evento.

' 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

No se puede usar RaiseEvent para generar eventos que no se declaran explícitamente en el módulo. Por
ejemplo, todos los formularios heredan un evento Click de System.Windows.Forms.Form, no se pueden generar
con RaiseEvent en un formulario derivado. Si declara un evento de Click en el módulo de formulario, sombrea
el propio evento de Click del formulario. Todavía puede invocar el evento Click del formulario llamando al
método OnClick.
De forma predeterminada, un evento definido en Visual Basic genera sus controladores de eventos en el orden
en que se establecen las conexiones. Dado que los eventos pueden tener ByRef parámetros, un proceso que se
conecta tarde puede recibir parámetros modificados por un controlador de eventos anterior. Una vez que se
ejecutan los controladores de eventos, se devuelve el control a la subrutina que provocó el evento.
NOTE
Los eventos no compartidos no se deben generar en el constructor de la clase en la que se declaran. Aunque estos
eventos no causan errores en tiempo de ejecución, pueden no ser detectados por los controladores de eventos asociados.
Utilice el modificador Shared para crear un evento compartido si necesita generar un evento desde un constructor.

NOTE
Puede cambiar el comportamiento predeterminado de los eventos mediante la definición de un evento personalizado. En el
caso de los eventos personalizados, la instrucción RaiseEvent invoca al descriptor de acceso RaiseEvent del evento.
Para obtener más información sobre los eventos personalizados, vea Event Statement.

Ejemplo
En el ejemplo siguiente se usan eventos para contar los segundos de 10 a 0. El código muestra algunos de los
métodos, las propiedades y las instrucciones relacionados con eventos, incluida la instrucción RaiseEvent .
La clase que provoca un evento es el origen del evento, y los métodos que procesan el evento son los
controladores de eventos. Un origen de eventos puede tener varios controladores para los eventos que genera.
Cuando la clase genera el evento, ese evento se genera en cada clase que eligió controlar eventos para esa
instancia del objeto.
El ejemplo también usa un formulario ( Form1 ) con un botón ( Button1 ) y un cuadro de texto ( TextBox1 ). Al
hacer clic en el botón, el primer cuadro de texto muestra una cuenta atrás de 10 a 0 segundos. Cuando transcurre
el tiempo (10 segundos), el primer cuadro de texto muestra "Done".
El código de Form1 especifica los estados inicial y terminal del formulario. También contiene el código que se
ejecuta cuando se producen eventos.
Para usar este ejemplo, abra un nuevo proyecto de aplicación para Windows, agregue un botón denominado
Button1 y un cuadro de texto denominado TextBox1 al formulario principal, denominado Form1 . A
continuación, haga clic con el botón secundario en el formulario y haga clic en Ver código para abrir el editor de
código.
Agregue una variable WithEvents a la sección de declaraciones de la clase Form1 .

Private WithEvents mText As TimerState

Ejemplo
Agregue el código siguiente al código de Form1 . Reemplace los procedimientos duplicados que puedan existir,
como Form_Load o Button_Click .
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

Presione F5 para ejecutar el ejemplo anterior y haga clic en el botón iniciar . El primer cuadro de texto empieza la
cuenta atrás de los segundos. Cuando transcurre el tiempo (10 segundos), el primer cuadro de texto muestra
"Done".

NOTE
El método My.Application.DoEvents no procesa los eventos exactamente del mismo modo que el formulario. Para
permitir que el formulario controle los eventos directamente, puede usar multithreading. Para obtener más información,
vea subprocesamiento administrado.

Vea también
Eventos
Event (instrucción)
AddHandler (instrucción)
RemoveHandler (instrucción)
Handles
Instrucción ReDim (Visual Basic)
27/11/2019 • 8 minutes to read • Edit Online

Reasigna espacio de almacenamiento a una variable de matriz.

Sintaxis
ReDim [ Preserve ] name(boundlist) [ , name(boundlist) [, ... ] ]

Elementos
T ÉRM IN O DEF IN IC IÓ N

Preserve Opcional. Modificador usado para mantener los datos en la


matriz existente cuando cambia el tamaño solamente de la
última dimensión.

name Obligatorio. Nombre de la variable de matriz. Vea Declared


Element Names.

boundlist Obligatorio. Lista de límites de cada dimensión de la matriz


redefinida.

Comentarios
Puede utilizar la instrucción ReDim para cambiar el tamaño de una o más dimensiones de una matriz que ya se
ha declarado. Si tiene una matriz grande y ya no necesita algunos de sus elementos, ReDim puede liberar
memoria al reducir el tamaño de la matriz. Por otro lado, si la matriz necesita más elementos, ReDim puede
agregarlos.
La instrucción ReDim está destinada solo a las matrices. No es válida en escalares (variables que contienen un
único valor), colecciones ni estructuras. Tenga en cuenta que, si declara una variable de tipo Array , la
instrucción ReDim no tiene suficiente información de tipo para crear la nueva matriz.
Solo puede usar ReDim en el nivel de procedimiento. Por lo tanto, el contexto de declaración de la variable debe
ser un procedimiento; no puede ser un archivo de código fuente, un espacio de nombres, una interfaz, una clase,
una estructura, un módulo o un bloque. Para obtener más información, vea Declaration Contexts and Default
Access Levels (Contextos de declaración y niveles de acceso predeterminados).

Reglas
Varias variables. Puede cambiar el tamaño de varias variables de matriz en la misma instrucción de
declaración y especificar las partes name y boundlist de cada variable. Las variables se separan con
comas.
Límites de matriz. Cada entrada de boundlist puede especificar los límites inferior y superior de esa
dimensión. El límite inferior es siempre 0 (cero). El límite superior es el valor de índice posible más alto
para esa dimensión, no la longitud de la dimensión (que es el límite superior más uno). El índice de cada
dimensión puede variar entre 0 y el valor del límite superior.
El número de dimensiones de boundlist debe coincidir con el número de dimensiones (rango) de la
matriz original.
Tipos de datos. La instrucción ReDim no puede cambiar el tipo de datos de una variable de matriz o sus
elementos.
Inicial. La instrucción ReDim no puede proporcionar nuevos valores de inicialización para los elementos
de la matriz.
Criterios. La instrucción ReDim no puede cambiar el rango (número de dimensiones) de la matriz.
Cambio de tamaño con Preser ve. Si utiliza Preserve , solo podrá cambiar el tamaño de la última
dimensión de la matriz. Para cualquier otra dimensión, debe especificar el límite de la matriz existente.
Por ejemplo, si su matriz tiene solo una dimensión, puede cambiar el tamaño de esa dimensión y
conservar todo el contenido de la matriz, ya que es la última y única dimensión. Sin embargo, si su matriz
tiene dos o más dimensiones, puede cambiar solamente el tamaño de la última dimensión si utiliza
Preserve .

Propiedades. Puede usar ReDim en una propiedad que contiene una matriz de valores.

Comportamiento
Reemplazo de matriz. ReDim libera la matriz existente y crea una nueva matriz con el mismo rango. La
nueva matriz reemplaza la matriz liberada en la variable de matriz.
Inicialización sin Preser ve. Si no se especifica Preserve , ReDim inicializa los elementos de la nueva
matriz utilizando el valor predeterminado para su tipo de datos.
Inicialización con Preser ve. Si especifica Preserve , Visual Basic copia los elementos de la matriz
existente en la nueva matriz.

Ejemplo
El ejemplo siguiente aumenta el tamaño de la última dimensión de una matriz dinámica sin perder los datos
existentes en la matriz y, a continuación, reduce el tamaño con pérdida de datos parcial. Por último, reduce el
tamaño a su valor original y reinicializa todos los elementos de la matriz.

Dim intArray(10, 10, 10) As Integer


ReDim Preserve intArray(10, 10, 20)
ReDim Preserve intArray(10, 10, 15)
ReDim intArray(10, 10, 10)

La instrucción Dim crea una nueva matriz con tres dimensiones. Cada dimensión se declara con un límite de 10,
por lo que el índice de matriz para cada dimensión puede oscilar entre 0 y 10. En el siguiente análisis, las tres
dimensiones se conocen como capa, fila y columna.
El primer ReDim crea una nueva matriz que reemplaza la matriz existente en la variable intArray . ReDim copia
todos los elementos de la matriz existente en la nueva matriz. También agrega 10 columnas más al final de cada
fila en cada capa e inicializa los elementos de estas nuevas columnas a 0 (el valor predeterminado de Integer ,
que es el tipo de elemento de la matriz).
El segundo ReDim crea otra nueva matriz y copia todos los elementos que quepan. Sin embargo, se pierden
cinco columnas del final de cada fila en cada capa. No es un problema si ya ha terminado de utilizar estas
columnas. Reducir el tamaño de una matriz grande puede liberar memoria que ya no necesite.
El tercer ReDim crea otra nueva matriz y quita otras cinco columnas del final de cada fila en cada capa. Esta vez
no copia los elementos existentes. Esta instrucción revierte la matriz a su tamaño original. Dado que la
instrucción no incluye el modificador Preserve , establece todos los elementos de matriz con sus valores
predeterminados originales.
Para obtener más ejemplos, consulte matrices.

Vea también
IndexOutOfRangeException
Const (instrucción)
Dim (instrucción)
Erase (instrucción)
Nothing
Matrices
REM (Instrucción, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Se usa para incluir comentarios explicativos en el código fuente de un programa.

Sintaxis
REM comment
' comment

Elementos
comment
Opcional. Texto de cualquier comentario que desee incluir. Se requiere un espacio entre la palabra clave REM y
comment .

Comentarios
Puede colocar una instrucción REM sola en una línea o puede colocarla en una línea después de otra instrucción.
La instrucción REM debe ser la última instrucción de la línea. Si sigue otra instrucción, el REM debe estar separado
de la instrucción por un espacio.
Puede usar una comilla simple ( ' ) en lugar de REM . Esto es así si el comentario sigue a otra instrucción en la
misma línea o solo se coloca en una línea.

NOTE
No se puede continuar una instrucción REM mediante una secuencia de continuación de línea ( _ ). Una vez que se inicia un
comentario, el compilador no examina los caracteres para un significado especial. Para un Comentario de varias líneas, use
otra instrucción REM o un símbolo de comentario ( ' ) en cada línea.

Ejemplo
En el ejemplo siguiente se muestra la instrucción REM , que se usa para incluir comentarios explicativos en un
programa. También se muestra la alternativa de usar el carácter de comilla simple ( ' ) en lugar de REM .

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.

Vea también
Comentarios en código
Interrumpir y combinar instrucciones en código
RemoveHandler (Instrucción)
27/11/2019 • 2 minutes to read • Edit Online

Quita la asociación entre un evento y un controlador de eventos.

Sintaxis
RemoveHandler event, AddressOf eventhandler

Elementos
T ÉRM IN O DEF IN IC IÓ N

event Nombre del evento que se está controlando.

eventhandler Nombre del procedimiento que está controlando el evento.

Comentarios
Las instrucciones AddHandler y RemoveHandler permiten iniciar y detener el control de eventos para un evento
concreto en cualquier momento durante la ejecución del programa.

NOTE
En el caso de los eventos personalizados, la instrucción RemoveHandler invoca al descriptor de acceso RemoveHandler
del evento. Para obtener más información sobre los eventos personalizados, vea Event Statement.

Ejemplo
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()
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

Vea también
AddHandler (instrucción)
Handles
Event (instrucción)
Eventos
Resume (Instrucción)
27/11/2019 • 4 minutes to read • Edit Online

Reanuda la ejecución después de que haya finalizado una rutina de control de errores.
Se recomienda usar el control de excepciones estructurado en el código siempre que sea posible, en lugar de
usar el control de excepciones no estructurado y las instrucciones On Error y Resume . Para obtener más
información, vea Try...Catch...Finally Statement (Try...Catch...Finally [Instrucción, Visual Basic]).

Sintaxis
Resume [ Next | line ]

Elementos
Resume
Obligatorio. Si el error se produjo en el mismo procedimiento que el controlador de errores, la ejecución se
reanuda con la instrucción que causó el error. Si el error se produjo en un procedimiento llamado, la ejecución se
reanuda en la instrucción que se ha llamado por última vez en el procedimiento que contiene la rutina de control
de errores.
Next
Opcional. Si el error se produjo en el mismo procedimiento que el controlador de errores, la ejecución se
reanudará con la instrucción inmediatamente posterior a la instrucción que causó el error. Si el error se produjo
en un procedimiento llamado, la ejecución se reanuda con la instrucción inmediatamente posterior a la
instrucción que se ha llamado por última vez en el procedimiento que contiene la rutina de control de errores (o
On Error Resume Next instrucción).

line
Opcional. La ejecución se reanuda en la línea especificada en el argumento line requerido. El line argumento
es una etiqueta de línea o un número de línea y debe estar en el mismo procedimiento que el controlador de
errores.

Comentarios
NOTE
Se recomienda usar el control de excepciones estructurado en el código siempre que sea posible, en lugar de usar el control
de excepciones no estructurado y las instrucciones On Error y Resume . Para obtener más información, vea
Try...Catch...Finally Statement (Try...Catch...Finally [Instrucción, Visual Basic]).

Si utiliza una instrucción Resume en cualquier lugar que no sea en una rutina de control de errores, se producirá
un error.
No se puede usar la instrucción Resume en ningún procedimiento que contenga una instrucción
Try...Catch...Finally .

Ejemplo
En este ejemplo se utiliza la instrucción Resume para finalizar el control de errores en un procedimiento y, a
continuación, reanudar la ejecución con la instrucción que causó el error. Se genera el número de error 55 para
mostrar el uso de la instrucción Resume .

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
Espacio de nombres: Microsoft. VisualBasic
Ensamblado: Biblioteca en tiempo de ejecución de Visual Basic (en Microsoft. VisualBasic. dll)

Vea también
Try...Catch...Finally (instrucción)
Error (instrucción)
On Error (instrucción)
Return (Instrucción, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Devuelve el control al código que llamó a un procedimiento Function , Sub , Get , Set o Operator .

Sintaxis
Return
' -or-
Return expression

Parte
expression
Obligatorio en un procedimiento Function , Get o Operator . Expresión que representa el valor que se va a
devolver al código de llamada.

Comentarios
En un procedimiento Sub o Set , la instrucción Return es equivalente a una instrucción Exit Sub o
Exit Property y no se debe proporcionar expression .

En un procedimiento Function , Get o Operator , la instrucción Return debe incluir expression y


expression debe evaluarse como un tipo de datos que se pueda convertir al tipo de valor devuelto del
procedimiento. En un procedimiento Function o Get , también tiene la alternativa de asignar una expresión
al nombre del procedimiento para que sirva como valor devuelto y, a continuación, ejecutar una instrucción
Exit Function o Exit Property . En un procedimiento Operator , debe utilizar Return expression .

Puede incluir tantas instrucciones Return como corresponda en el mismo procedimiento.

NOTE
El código de un bloque de Finally se ejecuta después de que se encuentre una instrucción de Return en un
bloque de Try o Catch , pero antes de que se ejecute la instrucción Return . No se puede incluir una instrucción
Return en un bloque de Finally .

Ejemplo
En el ejemplo siguiente se utiliza la instrucción Return varias veces para volver al código de llamada cuando
el procedimiento no tiene que hacer nada más.
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

Vea también
Function (instrucción)
Sub (instrucción)
Get (instrucción)
Set (instrucción)
Operator Statement
Property (instrucción)
Exit (instrucción)
Try...Catch...Finally (instrucción)
Instrucción Select...Case (Visual Basic)
27/11/2019 • 8 minutes to read • Edit Online

Ejecuta uno de varios grupos de instrucciones, dependiendo del valor de una expresión.

Sintaxis
Select [ Case ] testexpression
[ Case expressionlist
[ statements ] ]
[ Case Else
[ elsestatements ] ]
End Select

Elementos
T ÉRM IN O DEF IN IC IÓ N

testexpression Obligatorio. Expresiones. Debe evaluarse como uno de los


tipos de datos básicos ( Boolean , Byte , Char , Date ,
Double , Decimal , Integer , Long , Object , SByte ,
Short , Single , String , UInteger , ULong y UShort
).
T ÉRM IN O DEF IN IC IÓ N

expressionlist Obligatorio en una instrucción Case . Lista de cláusulas de


expresión que representan los valores de coincidencia para
testexpression . Las cláusulas de varias expresiones se
separan mediante comas. Cada cláusula puede adoptar uno
de los siguientes formatos:

- expression1 To expresión2
-[ Is ] expresión comparisonoperator
- expresión )

Use la palabra clave To para especificar los límites de un


intervalo de valores coincidentes para testexpression . El
valor de expression1 debe ser menor o igual que el valor
de expression2 .

Use la palabra clave Is con un operador de comparación (


= , <> , < , <= , > o >= ) para especificar una
restricción en los valores de coincidencia de
testexpression . Si no se proporciona la palabra clave
Is , se inserta automáticamente antes de
comparisonoperator.

La forma que especifica solo expression se trata como un


caso especial del Is formulario donde comparisonoperator
es el signo igual ( = ). Este formulario se evalúa como
testexpression = expression .

Las expresiones de expressionlist pueden ser de


cualquier tipo de datos, siempre que se puedan convertir
implícitamente al tipo de testexpression y el
comparisonoperator adecuado sea válido para los dos
tipos con los que se usa.

statements Opcional. Una o más instrucciones que siguen Case que


se ejecutan si testexpression coincide con cualquier
cláusula de expressionlist .

elsestatements Opcional. Una o más instrucciones que siguen Case Else


que se ejecutan si testexpression no coincide con
ninguna cláusula en el expressionlist de cualquiera de
las instrucciones de Case .

End Select Finaliza la definición de la construcción Select ... Case .

Comentarios
Si testexpression coincide con cualquier cláusula Case expressionlist , las instrucciones que siguen a esa
instrucción Case se ejecutan hasta la siguiente instrucción Case , Case Else o End Select . A continuación, el
control pasa a la instrucción siguiente End Select . Si testexpression coincide con una cláusula de
expressionlist en más de una cláusula Case , solo se ejecutan las instrucciones que siguen a la primera
coincidencia.
La instrucción Case Else se utiliza para introducir el elsestatements que se va a ejecutar si no se encuentra
ninguna coincidencia entre el testexpression y una cláusula expressionlist en cualquiera de las otras
instrucciones Case . Aunque no es necesario, es una buena idea tener una Case Else instrucción en la
construcción de Select Case para administrar valores de testexpression imprevistos. Si ninguna cláusula de
expressionlist de Case coincide con testexpression y no hay ninguna instrucción Case Else , el control
pasa a la instrucción siguiente a End Select .
Puede usar varias expresiones o intervalos en cada cláusula de Case . Por ejemplo, la siguiente línea es válida.
Case 1 To 4, 7 To 9, 11, 13, Is > maxNumber

NOTE
La palabra clave Is utilizada en las instrucciones Case y Case Else no es igual que el operador is, que se utiliza
para la comparación de referencias de objetos.

Puede especificar intervalos y varias expresiones para las cadenas de caracteres. En el ejemplo siguiente, Case
coincide con cualquier cadena que sea exactamente igual a "manzanas", tiene un valor entre "NUTS" y "sopa"
en orden alfabético, o contiene el mismo valor exacto que el valor actual de testItem .
Case "apples", "nuts" To "soup", testItem

La configuración de Option Compare puede afectar a las comparaciones de cadenas. En Option Compare Text ,
las cadenas "manzanas" y "manzanas" se comparan como iguales, pero en Option Compare Binary no lo hacen.

NOTE
Una instrucción Case con varias cláusulas puede presentar un comportamiento conocido como cortocircuito. Visual
Basic evalúa las cláusulas de izquierda a derecha y, si una genera una coincidencia con testexpression , no se evalúan
las cláusulas restantes. El cortocircuito puede mejorar el rendimiento, pero puede producir resultados inesperados si
espera que se evalúen todas las expresiones de expressionlist . Para obtener más información sobre el cortocircuito,
vea Expresiones booleanas.

Si el código de un bloque de instrucciones Case o Case Else no necesita ejecutar más instrucciones en el
bloque, puede salir del bloque mediante la instrucción Exit Select . Esto transfiere el control inmediatamente
a la instrucción siguiente End Select .
Select Case construcciones se pueden anidar. Cada construcción de Select Case anidada debe tener una
instrucción End Select coincidente y debe estar dentro de un único bloque de instrucciones Case o
Case Else de la construcción de Select Case externa en la que está anidada.

Ejemplo
En el ejemplo siguiente se usa una construcción Select Case para escribir una línea que se corresponda con el
valor de la variable number . La segunda instrucción Case contiene el valor que coincide con el valor actual de
number , por lo que la instrucción que escribe "between 6 and 8, inclusive" se ejecuta.
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

Vea también
Choose
End (instrucción)
If...Then...Else (instrucción)
Option Compare (instrucción)
Exit (instrucción)
Instrucción Set (Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

Declara un procedimiento de propiedad Set que se usa para asignar un valor a una propiedad.

Sintaxis
[ <attributelist> ] [ accessmodifier ] Set (ByVal value [ As datatype ])
[ statements ]
End Set

Elementos
attributelist
Opcional. Vea lista de atributos.
accessmodifier
Opcional en, como máximo, una de las instrucciones Get y Set de esta propiedad. Puede ser uno de los
siguientes:
Protected
Friend
Private
Protected Friend

Vea Access levels in Visual Basic.


value
Obligatorio. Parámetro que contiene el nuevo valor para la propiedad.
datatype
Es obligatorio si se On``Option Strict . Tipo de datos del parámetro value . El tipo de datos especificado debe
ser el mismo que el del tipo de datos de la propiedad donde se declara esta instrucción Set .
statements
Opcional. Una o varias instrucciones que se ejecutan cuando se llama al procedimiento de propiedad Set .
End Set
Obligatorio. Finaliza la definición del procedimiento de propiedad Set .

Comentarios
Cada propiedad debe tener un procedimiento de propiedad Set a menos que la propiedad esté marcada
ReadOnly . El procedimiento Set se utiliza para establecer el valor de la propiedad.

Visual Basic llama automáticamente al procedimiento Set de una propiedad cuando una instrucción de
asignación proporciona un valor que se va a almacenar en la propiedad.
Visual Basic pasa un parámetro al procedimiento Set durante las asignaciones de propiedades. Si no
proporciona un parámetro para Set , el entorno de desarrollo integrado (IDE) utiliza un parámetro implícito
denominado value . El parámetro contiene el valor que se va a asignar a la propiedad. Normalmente, este valor
se almacena en una variable local privada y se devuelve cada vez que se llama al procedimiento Get .
El cuerpo de la declaración de propiedad solo puede contener los procedimientos Get y Set de la propiedad
entre la instrucción Property y la instrucción End Property . No puede almacenar nada que no sea esos
procedimientos. En concreto, no puede almacenar el valor actual de la propiedad. Debe almacenar este valor
fuera de la propiedad, porque si lo almacena dentro de cualquiera de los procedimientos de propiedad, el otro
procedimiento de propiedad no podrá tener acceso a él. El enfoque habitual es almacenar el valor en una
variable privada declarada en el mismo nivel que la propiedad. Debe definir un procedimiento de Set dentro de
la propiedad a la que se aplica.
El procedimiento Set toma como valor predeterminado el nivel de acceso de la propiedad que lo contiene a
menos que use accessmodifier en la instrucción Set .

Reglas
Niveles de acceso mixtos. Si va a definir una propiedad de lectura y escritura, puede especificar
opcionalmente un nivel de acceso diferente para el Get o el procedimiento de Set , pero no ambos. Si lo
hace, el nivel de acceso del procedimiento debe ser más restrictivo que el nivel de acceso de la propiedad.
Por ejemplo, si la propiedad se declara Friend , puede declarar el Set procedimiento Private , pero no
Public .

Si va a definir una propiedad WriteOnly , el procedimiento Set representa la propiedad completa. No se


puede declarar un nivel de acceso diferente para Set , porque esto establecería dos niveles de acceso
para la propiedad.

Comportamiento
Devolver desde un procedimiento de propiedad. Cuando el procedimiento Set devuelve al código
de llamada, la ejecución continúa después de la instrucción que proporcionó el valor que se va a
almacenar.
Set procedimientos de propiedad pueden devolver mediante la instrucción return o la instrucción Exit.
Las instrucciones Exit Property y Return producen una salida inmediata de un procedimiento de
propiedad. Cualquier número de instrucciones Exit Property y Return puede aparecer en cualquier
parte del procedimiento y se pueden mezclar instrucciones Exit Property y Return .

Ejemplo
En el ejemplo siguiente se usa la instrucción Set para establecer el valor de una propiedad.

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

Vea también
Get (instrucción)
Property (instrucción)
Sub (instrucción)
Procedimientos de propiedades
Stop (Instrucción, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Suspende la ejecución.

Sintaxis
Stop

Comentarios
Puede colocar Stop instrucciones en cualquier parte de los procedimientos para suspender la ejecución. El uso
de la instrucción Stop es similar al establecimiento de un punto de interrupción en el código.
La instrucción Stop suspende la ejecución, pero a diferencia de End , no cierra ningún archivo ni borra ninguna
variable, a menos que se encuentre en un archivo ejecutable (. exe) compilado.

NOTE
Si se encuentra la instrucción Stop en el código que se está ejecutando fuera del entorno de desarrollo integrado (IDE), se
invoca al depurador. Esto es así independientemente de si el código se compiló en modo de depuración o comercial.

Ejemplo
En este ejemplo se utiliza la instrucción Stop para suspender la ejecución de cada iteración a través del bucle
For...Next .

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

Vea también
End (instrucción)
Structure (Instrucción)
27/11/2019 • 11 minutes to read • Edit Online

Declara el nombre de una estructura e introduce la definición de las variables, propiedades, eventos y
procedimientos que la estructura incluye.

Sintaxis
[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Partial ] _
Structure name [ ( Of typelist ) ]
[ Implements interfacenames ]
[ datamemberdeclarations ]
[ methodmemberdeclarations ]
End Structure

Elementos
T ÉRM IN O DEF IN IC IÓ N

attributelist Opcional. Vea lista de atributos.

accessmodifier Opcional. Puede ser uno de los siguientes:

- público
- protegido
- Friend
- privado
- Friend protegido
- protegido privado

Vea Access levels in Visual Basic.

Shadows Opcional. Vea Shadows.

Partial Opcional. Indica una definición parcial de la estructura.


Vea partial.

name Obligatorio. Nombre de esta estructura. Vea Declared


Element Names.

Of Opcional. Especifica que se trata de una estructura


genérica.

typelist Obligatorio si se usa la palabra clave of . Lista de


parámetros de tipo de esta estructura. Consulte lista de
tipos.

Implements Opcional. Indica que esta estructura implementa los


miembros de una o más interfaces. Vea Implements
(instrucción).
T ÉRM IN O DEF IN IC IÓ N

interfacenames Es obligatorio si se utiliza la instrucción Implements .


Nombres de las interfaces implementadas por esta
estructura.

datamemberdeclarations Obligatorio. Cero o más instrucciones Const , Dim ,


Enum o Event que declaran miembros de datos de la
estructura.

methodmemberdeclarations Opcional. Cero o más declaraciones de Function ,


Operator , Property o Sub procedimientos, que
sirven como miembros de método de la estructura.

End Structure Obligatorio. Termina la definición de Structure .

Comentarios
La instrucción Structure define un tipo de valor compuesto que se puede personalizar. Una estructura
es una generalización del tipo definido por el usuario (UDT) de versiones anteriores de Visual Basic. Para
obtener más información, vea estructuras.
Las estructuras admiten muchas de las mismas características que las clases. Por ejemplo, las estructuras
pueden tener propiedades y procedimientos, pueden implementar interfaces y pueden tener
constructores con parámetros. No obstante, existen diferencias importantes entre las estructuras y las
clases en materias como la herencia, las declaraciones y la utilización. Además, las clases son tipos de
referencia y las estructuras son tipos de valor. Para obtener más información, vea estructuras y clases.
Structure solo se puede utilizar en un espacio de nombres o un nivel de módulo. Esto significa que el
contexto de la declaración de una estructura debe ser un archivo de código fuente, un espacio de
nombres, una clase, una estructura, un módulo o una interfaz y no puede ser un procedimiento o un
bloque. Para obtener más información, vea Declaration Contexts and Default Access Levels (Contextos de
declaración y niveles de acceso predeterminados).
El acceso predeterminado de las estructuras es Friend . Los niveles de acceso se pueden ajustar con los
modificadores de acceso. Para obtener más información, consulte niveles de acceso en Visual Basic.

Reglas
Anidamiento. Puede definirse una estructura dentro de otra. La estructura exterior se denomina
la estructura contenedoray la estructura interna se denomina estructura anidada. Sin embargo, no
se puede tener acceso a los miembros de una estructura anidada a través de la estructura
contenedora. En lugar de ello, se debe declarar una variable del tipo de datos de la estructura
anidada.
Declaración de miembro. Se debe declarar cada miembro de una estructura. Un miembro de
estructura no se puede proteger ni Protected Friend porque no se puede heredar nada de una
estructura. La propia estructura, sin embargo, puede ser de tipo Protected o Protected Friend .
En una estructura se pueden declarar cero o más variables no compartidas o eventos no
compartidos y no personalizados. No pueden utilizarse únicamente constantes, propiedades y
procedimientos, aunque algunos sean no compartidos.
Inicial. No se puede inicializar el valor de ningún miembro de datos de una estructura no
compartido como parte de su declaración. Dicho miembro de datos se debe inicializar mediante
un constructor con parámetros en la estructura o bien mediante la asignación de un valor al
miembro después de crear una instancia de la estructura.
Herencia. Una estructura no puede heredar de ningún tipo distinto de ValueType, del que todas
las estructuras heredan. En particular, una estructura no puede heredar de otra.
No se puede usar la instrucción Inherits en una definición de estructura, incluso para especificar
ValueType.
Aplicación. Si la estructura usa la instrucción Implements, debe implementar todos los miembros
definidos por cada interfaz que especifique en interfacenames .
Propiedad predeterminada. Una estructura puede especificar como máximo una propiedad
como su propiedad predeterminada, utilizando el modificador predeterminado . Para obtener más
información, vea default.

Comportamiento
Nivel de acceso. En una estructura, cada miembro se puede declarar con su propio nivel de
acceso. De forma predeterminada, todos los miembros de estructura tienen acceso público . Tenga
en cuenta que si la propia estructura utiliza un nivel de acceso más limitado, se restringe
automáticamente el acceso a sus miembros, aunque los niveles de acceso se ajusten con
modificadores.
ID. Una estructura está en ámbito en su espacio de nombres, clase, estructura o módulo
contenedores.
El ámbito de todos los miembros de la estructura es la estructura completa.
Validez. Una estructura no dispone por sí misma de período de duración. Más bien, cada
instancia de esa estructura tiene un período de duración independiente de todas las demás
instancias.
La duración de una instancia comienza cuando se crea mediante una nueva cláusula Operator .
Finaliza cuando finaliza el período de duración de la variable que la contiene.
No puede extender el período de duración de una instancia de estructura. Los módulos
proporcionan una aproximación a la funcionalidad de estructura estática. Para obtener más
información, vea Module Statement.
Los miembros de estructura disponen de un período de duración en función de cómo y donde se
declaran. Para obtener más información, vea "Lifetime" en la instrucción Class.
Evaluación. El código que se incluye fuera de una estructura debe calificar el nombre de un
miembro con el nombre de dicha estructura.
Si el código incluido en una estructura anidada realiza una referencia sin calificar a un elemento
de programación, Visual Basic busca este elemento en la estructura anidada en primer lugar, a
continuación en la estructura contenedora y así sucesivamente hasta el elemento contenedor
principal. Para obtener más información, consulta References to Declared Elements.
Consumo de memoria. Al igual que sucede con los demás tipos de datos compuestos, no puede
calcularse de forma precisa el consumo total de memoria de una estructura sumando las
asignaciones de almacenamiento nominal de sus miembros. Es más, no puede suponerse que el
orden de almacenamiento en memoria sea el mismo que el orden de la declaración. Si necesita
controlar el diseño de almacenamiento de una estructura, puede aplicar el atributo
StructLayoutAttribute a la instrucción Structure .
Ejemplo
En el siguiente ejemplo se utiliza la instrucción Structure para definir un conjunto de datos relacionados
de un empleado. Se muestra el uso de los miembros Public , Friend y Private para reflejar la
confidencialidad de los elementos de datos. También se muestran los miembros de evento, propiedad y
procedimiento.

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 obtener más información sobre cómo usar Structure s, consulte variable de estructura.

Vea también
Class (instrucción)
Interface (instrucción)
Module (instrucción)
Dim (instrucción)
Const (instrucción)
Enum (instrucción)
Event (instrucción)
Operator Statement
Property (instrucción)
Estructuras y clases
Sub (Instrucción, Visual Basic)
27/11/2019 • 12 minutes to read • Edit Online

Declara el nombre, los parámetros y el código que definen un procedimiento Sub .

Sintaxis
[ <attributelist> ] [ Partial ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] [
Async ]
Sub name [ (Of typeparamlist) ] [ (parameterlist) ] [ Implements implementslist | Handles
eventlist ]
[ statements ]
[ Exit Sub ]
[ statements ]
End Sub

Elementos
attributelist

Opcional. Vea lista de atributos.


Partial

Opcional. Indica la definición de un método parcial. Vea métodos parciales.


accessmodifier

Opcional. Puede ser uno de los siguientes:


Public
Protected
Friend
Private
Protected Friend
Private Protected
Vea Access levels in Visual Basic.
proceduremodifiers

Opcional. Puede ser uno de los siguientes:


Sobrecargas
Overrides
Overridable
NotOverridable
MustOverride
MustOverride Overrides

NotOverridable Overrides

Shared

Opcional. Vea Shared.


Shadows

Opcional. Vea Shadows.


Async

Opcional. Vea Async.


name

Obligatorio. Nombre del procedimiento. Vea Declared Element Names. Para crear un
procedimiento de constructor para una clase, establezca el nombre de una Sub procedimiento
en la palabra clave New . Para obtener más información, vea duración del objeto: cómo se crean
y destruyen los objetos.
typeparamlist

Opcional. Lista de parámetros de tipo para un procedimiento genérico. Consulte lista de tipos.
parameterlist

Opcional. Lista de nombres de variables locales que representan los parámetros de este
procedimiento. Vea lista de parámetros.
Implements

Opcional. Indica que este procedimiento implementa uno o varios procedimientos de Sub , cada
uno de los cuales se define en una interfaz implementada por la clase o estructura contenedora
de este procedimiento. Vea Implements (instrucción).
implementslist

Es necesario si se proporciona Implements . Lista de procedimientos Sub que se implementan.


implementedprocedure [ , implementedprocedure ... ]

Cada implementedprocedure tiene la sintaxis y las partes siguientes:


interface.definedname

PA RT E DESC RIP C IÓ N

interface Obligatorio. Nombre de una interfaz implementada


por la clase o estructura contenedora de este
procedimiento.

definedname Obligatorio. Nombre por el que se define el


procedimiento en interface .

Handles

Opcional. Indica que este procedimiento puede controlar uno o más eventos concretos. Vea
identificadores.
eventlist

Es necesario si se proporciona Handles . Lista de eventos que controla este procedimiento.


eventspecifier [ , eventspecifier ... ]

Cada eventspecifier tiene la sintaxis y las partes siguientes:


eventvariable.event

PA RT E DESC RIP C IÓ N

eventvariable Obligatorio. Variable de objeto declarada con el tipo


de datos de la clase o estructura que genera el
evento.

event Obligatorio. Nombre del evento que controla este


procedimiento.

statements

Opcional. Bloque de instrucciones que se ejecutarán dentro de este procedimiento.


End Sub

Finaliza la definición de este procedimiento.

Comentarios
Todo el código ejecutable debe estar dentro de un procedimiento. Use un procedimiento Sub cuando
no desee devolver un valor al código de llamada. Use una Function procedimiento cuando desee
devolver un valor.

Definir un procedimiento Sub


Solo puede definir un procedimiento Sub en el nivel de módulo. El contexto de la declaración para un
procedimiento Sub debe, por tanto, ser una clase, una estructura, un módulo o una interfaz y no puede
ser un archivo de código fuente, un espacio de nombres, un procedimiento o un bloque. Para obtener
más información, vea Declaration Contexts and Default Access Levels (Contextos de declaración y
niveles de acceso predeterminados).
Sub procedimientos tienen como valor predeterminado el acceso público. Puede ajustar sus niveles
de acceso mediante los modificadores de acceso.
Si el procedimiento usa la palabra clave Implements , la clase o estructura contenedora debe tener una
instrucción Implements que siga inmediatamente a su instrucción Class o Structure . La instrucción
Implements debe incluir cada interfaz que se especifica en implementslist . Sin embargo, el nombre
por el que una interfaz define el Sub (en definedname ) no tiene que coincidir con el nombre de este
procedimiento (en name ).

Devolver desde un procedimiento Sub


Cuando un procedimiento Sub devuelve al código de llamada, la ejecución continúa con la instrucción
después de la instrucción que lo llamó.
En el ejemplo siguiente se muestra un valor devuelto de un procedimiento Sub .
Sub mySub(ByVal q As String)
Return
End Sub

Las instrucciones Exit Sub y Return producen una salida inmediata de un procedimiento de Sub .
Cualquier número de instrucciones Exit Sub y Return puede aparecer en cualquier parte del
procedimiento y se pueden mezclar instrucciones Exit Sub y Return .

Llamar a un procedimiento Sub


Llame a un procedimiento de Sub mediante el nombre del procedimiento en una instrucción y, a
continuación, siga ese nombre con su lista de argumentos entre paréntesis. Solo se pueden omitir los
paréntesis si no se proporcionan argumentos. Sin embargo, el código es más legible si siempre incluye
los paréntesis.
Un procedimiento de Sub y un procedimiento Function pueden tener parámetros y realizar una serie
de instrucciones. Sin embargo, un procedimiento Function devuelve un valor y un procedimiento
Sub no. Por lo tanto, no se puede usar un procedimiento Sub en una expresión.

Puede usar la palabra clave Call al llamar a un procedimiento de Sub , pero esa palabra clave no se
recomienda para la mayoría de los usos. Para obtener más información, consulte instrucción call.
A veces Visual Basic reorganiza las expresiones aritméticas para aumentar la eficacia interna. Por ese
motivo, si la lista de argumentos incluye expresiones que llaman a otros procedimientos, no debe
asumir que se llamará a esas expresiones en un orden determinado.

Procedimientos sub asincrónicos


Mediante el uso de la característica Async, puede invocar funciones asincrónicas sin usar devoluciones
de llamada explícitas ni dividir manualmente el código en varias funciones o expresiones lambda.
Si marca un procedimiento con el modificador Async , puede usar el operador Await en el
procedimiento. Cuando el control alcanza una expresión de Await en el procedimiento de Async , el
control vuelve al llamador y el progreso en el procedimiento se suspende hasta que se completa la
tarea esperada. Una vez completada la tarea, la ejecución puede reanudarse en el procedimiento.

NOTE
Un procedimiento Async vuelve al llamador cuando se encuentra el primer objeto esperado que aún no se ha
completado o hasta que se alcanza el final del procedimiento Async , lo que ocurra primero.

También puede marcar una instrucción de función con el modificador Async . Una función Async
puede tener un tipo de valor devuelto de Task<TResult> o Task. Un ejemplo más adelante en este tema
muestra una función Async que tiene un tipo de valor devuelto de Task<TResult>.
Async Subprocedimientos se utilizan principalmente para los controladores de eventos, donde no se
puede devolver un valor. No se puede esperar a un procedimiento de Sub de Async , y el llamador de
un procedimiento de Sub de Async no puede detectar las excepciones que produce el procedimiento
Sub .

Un procedimiento Async no puede declarar ningún parámetro ByRef .


Para obtener más información sobre los procedimientos de Async , vea programación asincrónica con
Async y Await, flujo de control en programas asincrónicosy tipos de valor devueltos asincrónicos.
Ejemplo
En el ejemplo siguiente se usa la instrucción Sub para definir el nombre, los parámetros y el código
que forman el cuerpo de un procedimiento Sub .

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

Ejemplo
En el ejemplo siguiente, DelayAsync es un Function de Async que tiene un tipo de valor devuelto de
Task<TResult>. DelayAsync tiene una instrucción Return que devuelve un entero. Por lo tanto, la
declaración de función de DelayAsync debe tener un tipo de valor devuelto de Task(Of Integer) . Dado
que el tipo de valor devuelto es Task(Of Integer) , la evaluación de la expresión de Await en
DoSomethingAsync genera un entero, como se muestra en la siguiente instrucción:
Dim result As Integer = Await delayTask .

El procedimiento startButton_Click es un ejemplo de un procedimiento Async Sub . Dado que


DoSomethingAsync es una función Async , se debe esperar la tarea para la llamada a DoSomethingAsync ,
como se muestra en la siguiente instrucción: Await DoSomethingAsync() . El procedimiento de Sub de
startButton_Click debe definirse con el modificador Async porque tiene una expresión de Await .

' 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
Vea también
Implements (instrucción)
Function (instrucción)
Lista de parámetros
Dim (instrucción)
Call (instrucción)
Of
Matrices de parámetros
Utilizar una clase genérica
Solución de problemas de procedimientos
Métodos Partial
SyncLock (Instrucción)
27/11/2019 • 9 minutes to read • Edit Online

Adquiere un bloqueo exclusivo para un bloque de instrucciones antes de ejecutar el bloque.

Sintaxis
SyncLock lockobject
[ block ]
End SyncLock

Elementos
lockobject
Obligatorio. Expresión que se evalúa como una referencia de objeto.
block
Opcional. Bloque de instrucciones que se ejecutan cuando se adquiere el bloqueo.
End SyncLock
Finaliza un bloque de SyncLock .

Comentarios
La instrucción SyncLock garantiza que varios subprocesos no ejecuten el bloque de instrucciones al mismo
tiempo. SyncLock impide que cada subproceso entre en el bloque hasta que no lo ejecute ningún otro
subproceso.
El uso más común de SyncLock consiste en proteger los datos de la actualización a más de un subproceso
simultáneamente. Si las instrucciones que manipulan los datos deben ir a la finalización sin interrupción,
colóquelos dentro de un bloque SyncLock .
Un bloque de instrucciones protegido por un bloqueo exclusivo a veces se denomina sección crítica.

Reglas
Bifurcación. No se puede crear una bifurcación en un bloque SyncLock desde fuera del bloque.
Valor de bloqueo de objeto. No se puede Nothing el valor de lockobject . Debe crear el objeto de bloqueo
antes de usarlo en una instrucción SyncLock .
No se puede cambiar el valor de lockobject mientras se ejecuta un bloque de SyncLock . El mecanismo
requiere que el objeto de bloqueo permanezca sin cambios.
No se puede usar el operador Await en un bloque SyncLock .

Comportamiento
Método. Cuando un subproceso alcanza la instrucción SyncLock , evalúa la expresión lockobject y
suspende la ejecución hasta que adquiere un bloqueo exclusivo en el objeto devuelto por la expresión.
Cuando otro subproceso alcanza la instrucción SyncLock , no adquiere un bloqueo hasta que el primer
subproceso ejecuta la instrucción End SyncLock .
Datos protegidos. Si lockobject es una variable de Shared , el bloqueo exclusivo impide que un
subproceso de una instancia de la clase ejecute el bloque de SyncLock mientras otro subproceso lo está
ejecutando. Esto protege los datos que se comparten entre todas las instancias.
Si lockobject es una variable de instancia (no Shared ), el bloqueo impide que un subproceso que se
ejecuta en la instancia actual ejecute el bloque de SyncLock al mismo tiempo que otro subproceso de la
misma instancia. Esto protege los datos mantenidos por la instancia individual.
Adquisición y lanzamiento. Un bloque SyncLock se comporta como una construcción Try...Finally en la
que el bloque Try adquiere un bloqueo exclusivo en lockobject y el bloque Finally lo libera. Por este
motivo, el bloque SyncLock garantiza la liberación del bloqueo, independientemente de cómo salga del
bloque. Esto es así incluso en el caso de una excepción no controlada.
Llamadas de marco de trabajo. El bloque SyncLock adquiere y libera el bloqueo exclusivo mediante una
llamada a los métodos Enter y Exit de la clase Monitor en el espacio de nombres System.Threading.

Prácticas de programación
La expresión lockobject siempre debe evaluarse como un objeto que pertenezca exclusivamente a la clase. Debe
declarar un Private variable de objeto para proteger los datos que pertenecen a la instancia actual o una
variable de objeto Private Shared para proteger los datos comunes a todas las instancias.
No debe utilizar la palabra clave Me para proporcionar un objeto de bloqueo para los datos de instancia. Si el
código externo a la clase tiene una referencia a una instancia de la clase, podría usar esa referencia como un
objeto de bloqueo para un bloque SyncLock completamente diferente del suyo, protegiendo los datos diferentes.
De esta manera, la clase y la otra clase podrían bloquearse entre sí desde la ejecución de los bloques de SyncLock
no relacionados. Un bloqueo similar en una cadena puede ser problemático, ya que cualquier otro código del
proceso que use la misma cadena compartirá el mismo bloqueo.
Tampoco debe utilizar el método Me.GetType para proporcionar un objeto de bloqueo para los datos
compartidos. Esto se debe a que GetType siempre devuelve el mismo objeto Type para un nombre de clase
determinado. El código externo podría llamar a GetType en la clase y obtener el mismo objeto de bloqueo que
está utilizando. Esto daría lugar a que las dos clases se bloqueen entre sí desde sus bloques SyncLock .

Ejemplos
Descripción
En el ejemplo siguiente se muestra una clase que mantiene una lista de mensajes simple. Contiene los mensajes
de una matriz y el último elemento utilizado de esa matriz en una variable. En el procedimiento
addAnotherMessage se incrementa el último elemento y se almacena el mensaje nuevo. Estas dos operaciones
están protegidas por las instrucciones SyncLock y End SyncLock , porque una vez que se ha incrementado el
último elemento, el nuevo mensaje se debe almacenar antes de que cualquier otro subproceso pueda
incrementar el último elemento de nuevo.
Si la clase compartió una lista de mensajes entre todas sus instancias, las variables
simpleMessageList
messagesList y messagesLast se declararían como Shared . En este caso, la variable messagesLock también debe
ser Shared , de modo que haya un único objeto de bloqueo utilizado por cada instancia.
Código
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

Descripción
En el ejemplo siguiente se usan subprocesos y SyncLock . Siempre y cuando la instrucción SyncLock esté
presente, el bloque de instrucciones es una sección crítica y balance nunca se convierte en un número negativo.
Puede comentar las instrucciones SyncLock y End SyncLock para ver el efecto de salir de la palabra clave
SyncLock .

Código
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

Comentarios

Vea también
System.Threading.Monitor
System.Threading.Interlocked
Información general sobre las primitivas de sincronización
Then (Instrucción)
27/11/2019 • 2 minutes to read • Edit Online

Introduce un bloque de instrucciones que se va a compilar o ejecutar si una condición probada es true.

Comentarios
La palabra clave Then se puede usar en los siguientes contextos:
#If... Then... #Else (Directiva)
If...Then...Else (instrucción)

Vea también
Palabras clave
Throw (Instrucción, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Produce una excepción dentro de un procedimiento.

Sintaxis
Throw [ expression ]

Parte
expression
Proporciona información sobre la excepción que se va a producir. Opcional cuando reside en una instrucción
Catch , si es necesario.

Comentarios
La instrucción Throw produce una excepción que se puede controlar con el código estructurado de control de
excepciones ( Try ... Catch ... Finally ) o el código de control de excepciones no estructurado ( On Error GoTo ).
Puede utilizar la instrucción Throw para interceptar los errores dentro del código porque Visual Basic sube por la
pila de llamadas hasta que encuentra el código de control de excepciones adecuado.
Una instrucción Throw sin expresión solo se puede usar en una instrucción Catch , en cuyo caso la instrucción
vuelve a producir la excepción que controla actualmente la instrucción Catch .
La instrucción Throw restablece la pila de llamadas de la excepción expression . Si no se proporciona expression ,
la pila de llamadas permanece sin cambios. Puede tener acceso a la pila de llamadas de la excepción a través de la
propiedad StackTrace.

Ejemplo
En el código siguiente se usa la instrucción Throw para producir una excepción:

' Throws a new exception.


Throw New System.Exception("An exception has occurred.")

Vea también
Try...Catch...Finally (instrucción)
On Error (instrucción)
Instrucción Try...Catch...Finally (Visual Basic)
10/01/2020 • 24 minutes to read • Edit Online

Proporciona una manera de controlar algunos o todos los errores posibles que se pueden producir en un
bloque de código determinado, mientras se sigue ejecutando el código.

Sintaxis
Try
[ tryStatements ]
[ Exit Try ]
[ Catch [ exception [ As type ] ] [ When expression ]
[ catchStatements ]
[ Exit Try ] ]
[ Catch ... ]
[ Finally
[ finallyStatements ] ]
End Try

Componentes de
T ÉRM IN O DE ESQ UEM A JSO N

tryStatements Opcional. Instrucciones en las que se puede producir un


error. Puede ser una instrucción compuesta.

Catch Opcional. Se permiten varios bloques Catch . Si se


produce una excepción al procesar el bloque de Try ,
cada instrucción de Catch se examina en orden textual
para determinar si controla la excepción, con
exception que representa la excepción que se ha
producido.

exception Opcional. Cualquier nombre de variable. El valor inicial de


exception es el valor del error producido. Se utiliza con
Catch para especificar el error detectado. Si se omite, la
instrucción Catch detecta cualquier excepción.

type Opcional. Especifica el tipo de filtro de clase. Si el valor de


exception es del tipo especificado por type o de un
tipo derivado, el identificador se enlaza al objeto de
excepción.

When Opcional. Una instrucción Catch con una cláusula


When solo detecta excepciones cuando expression se
evalúa como True . Una cláusula When se aplica solo
después de comprobar el tipo de la excepción y
expression puede hacer referencia al identificador que
representa la excepción.
T ÉRM IN O DE ESQ UEM A JSO N

expression Opcional. Se debe poder convertir implícitamente en


Boolean . Cualquier expresión que describa un filtro
genérico. Normalmente se usa para filtrar por número de
error. Se utiliza con la palabra clave When para
especificar las circunstancias en las que se detecta el
error.

catchStatements Opcional. Instrucciones para controlar los errores que se


producen en el bloque de Try asociado. Puede ser una
instrucción compuesta.

Exit Try Opcional. Palabra clave que sale de la estructura de


Try...Catch...Finally . La ejecución se reanuda con
el código inmediatamente posterior a la instrucción
End Try . La instrucción Finally se seguirá
ejecutando. No se permite en los bloques de Finally .

Finally Opcional. Un bloque Finally siempre se ejecuta


cuando la ejecución deja parte de la instrucción
Try...Catch .

finallyStatements Opcional. Instrucciones que se ejecutan después de que


se haya producido el otro procesamiento de errores.

End Try Finaliza la estructura de Try...Catch...Finally .

Notas
Si espera que se produzca una excepción determinada durante una sección de código determinada,
coloque el código en un bloque de Try y use un bloque de Catch para conservar el control y controlar
la excepción si se produce.
Una instrucción Try…Catch está formada por un bloque Try seguido de una o varias cláusulas Catch ,
que especifican Controladores para distintas excepciones. Cuando se produce una excepción en un
bloque Try , Visual Basic busca la instrucción Catch que controla la excepción. Si no se encuentra una
instrucción Catch coincidente, Visual Basic examina el método que llamó al método actual, y así
sucesivamente en la pila de llamadas. Si no se encuentra ningún bloque Catch , Visual Basic muestra al
usuario un mensaje de excepción no controlada y detiene la ejecución del programa.
Puede usar más de una instrucción Catch en una instrucción Try…Catch . Si lo hace, el orden de las
cláusulas Catch es significativo porque se examinan en orden. Detectar las excepciones más específicas
antes que las menos específicas.
Las siguientes condiciones de la instrucción Catch son las menos específicas y detectarán todas las
excepciones que derivan de la clase Exception. Normalmente, debe usar una de estas variaciones como
último Catch bloque en la estructura Try...Catch...Finally , después de detectar todas las excepciones
específicas que espera. El flujo de control nunca puede llegar a un bloque Catch que siga cualquiera de
estas variaciones.
El type es Exception , por ejemplo: Catch ex As Exception

La instrucción no tiene exception variable, por ejemplo: Catch

Cuando una instrucción Try…Catch…Finally está anidada en otro bloque de Try , Visual Basic primero
examina cada instrucción Catch en el bloque de Try más interno. Si no se encuentra ninguna
instrucción Catch coincidente, la búsqueda continúa en las instrucciones de Catch del bloque de
Try…Catch…Finally exterior.

Las variables locales de un bloque Try no están disponibles en un bloque de Catch porque son
bloques independientes. Si desea utilizar una variable en más de un bloque, declare la variable fuera de
la estructura de Try...Catch...Finally .

TIP
La instrucción Try…Catch…Finally está disponible como fragmento de código de IntelliSense. En el
administrador de fragmentos de código, expanda patrones de código: Si, para cada uno, pruebe Catch,
Proper ty, etc. y, a continuación, control de errores (excepciones) . Para obtener más información, vea
Fragmentos de código.

Bloque Finally
Si tiene una o más instrucciones que se deben ejecutar antes de salir de la estructura de Try , utilice un
bloque de Finally . El control pasa al bloque Finally justo antes de salir de la estructura de Try…Catch .
Esto es así incluso si se produce una excepción en cualquier parte dentro de la estructura de Try .
Un bloque Finally es útil para ejecutar cualquier código que deba ejecutarse incluso si se produce una
excepción. El control se pasa al bloque Finally independientemente de cómo salga el bloque de
Try...Catch .

El código de un bloque de Finally se ejecuta incluso si el código encuentra una instrucción Return en
un bloque Try o Catch . El control no pasa de un bloque Try o Catch al bloque Finally
correspondiente en los casos siguientes:
Se encuentra una instrucción end en el bloque Try o Catch .
Se produce una StackOverflowException en el bloque de Try o Catch .
No es válido transferir explícitamente la ejecución a un bloque Finally . La transferencia de la ejecución
fuera de un bloque Finally no es válida, excepto a través de una excepción.
Si una instrucción Try no contiene al menos un bloque de Catch , debe contener un bloque de Finally
.

TIP
Si no tiene que detectar excepciones específicas, la instrucción Using se comporta como un bloque
Try…Finally y garantiza la eliminación de los recursos, independientemente de cómo salga del bloque. Esto es
así incluso con una excepción no controlada. Para obtener más información, vea Using (Instrucción).

Argumento de excepción
El exception argumento Catch bloque es una instancia de la clase Exception o una clase que deriva de
la clase Exception . La instancia de la clase Exception se corresponde con el error que se produjo en el
bloque de Try .
Las propiedades del objeto Exception ayudan a identificar la causa y la ubicación de una excepción. Por
ejemplo, la propiedad StackTrace muestra los métodos llamados que dieron lugar a la excepción, lo que
le ayuda a encontrar el lugar en el que se produjo el error en el código. Message devuelve un mensaje
que describe la excepción. HelpLink devuelve un vínculo a un archivo de ayuda asociado. InnerException
devuelve el objeto Exception que causó la excepción actual, o devuelve Nothing si no hay ningún
Exception original.

Consideraciones al usar una instrucción try... Catch (instrucción)


Use una instrucción Try…Catch solo para indicar la aparición de eventos de programa inusuales o
imprevistos. Entre los motivos se incluyen los siguientes:
La detección de excepciones en tiempo de ejecución crea una sobrecarga adicional y es probable
que sea más lenta que la comprobación previa para evitar excepciones.
Si no se controla correctamente un bloque Catch , es posible que la excepción no se notifique
correctamente a los usuarios.
El control de excepciones hace que un programa sea más complejo.
No siempre se necesita una instrucción Try…Catch para comprobar si hay una condición que es probable
que se produzca. En el ejemplo siguiente se comprueba si existe un archivo antes de intentar abrirlo. Esto
reduce la necesidad de detectar una excepción producida por el método OpenText.

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

Asegúrese de que el código de los bloques de Catch pueda notificar correctamente las excepciones a los
usuarios, ya sea a través del registro seguro para subprocesos o de los mensajes adecuados. De lo
contrario, es posible que las excepciones sigan siendo desconocidas.

Métodos asincrónicos
Si marca un método con el modificador Async , puede usar el operador Await en el método. Una
instrucción con el operador Await suspende la ejecución del método hasta que se completa la tarea
esperada. La tarea representa el trabajo en curso. Cuando finaliza la tarea asociada al operador de Await
, la ejecución se reanuda en el mismo método. Para obtener más información, vea flujo de control en
programas Async.
Una tarea devuelta por un método asincrónico puede finalizar en un estado de error, lo que indica que se
completó debido a una excepción no controlada. Una tarea también puede terminar en un estado
cancelado, lo que provoca que se produzca una OperationCanceledException fuera de la expresión Await.
Para detectar cualquier tipo de excepción, coloque la Await expresión asociada a la tarea en un bloque
de Try y Capture la excepción en el bloque de Catch . Más adelante en este tema se proporciona un
ejemplo.
Una tarea puede tener un estado de error porque varias excepciones eran responsables de su error. Por
ejemplo, la tarea podría ser el resultado de una llamada a Task.WhenAll. Cuando espera una tarea de este
tipo, la excepción detectada es solo una de las excepciones y no puede predecir qué excepción se
detectará. Más adelante en este tema se proporciona un ejemplo.
Una expresión de Await no puede estar dentro de un bloque de Catch o de Finally .

Iterators
Una función de iterador o Get descriptor de acceso realiza una iteración personalizada en una colección.
Un iterador usa una instrucción yield para devolver cada elemento de la colección de uno en uno. Se
llama a una función de iterador mediante un método for each... Instrucción siguiente.
Una instrucción Yield puede estar dentro de un bloque Try . Un bloque Try que contiene una
instrucción Yield puede tener bloques Catch y puede tener un bloque Finally . Vea la sección "Try
blocks in Visual Basic" de iteradores para obtener un ejemplo.
Una instrucción Yield no puede estar dentro de un bloque de Catch o un bloque Finally .
Si el cuerpo de For Each (fuera de la función de iterador) produce una excepción, no se ejecuta un
bloque de Catch en la función de iterador, pero se ejecuta un bloque de Finally en la función de
iterador. Un bloque Catch dentro de una función de iterador solo detecta las excepciones que se
producen dentro de la función de iterador.

Situaciones de confianza parcial


En situaciones de confianza parcial, como una aplicación hospedada en un recurso compartido de red,
Try...Catch...Finally no detecta las excepciones de seguridad que se producen antes de que se
invoque el método que contiene la llamada. En el ejemplo siguiente, cuando se coloca en un recurso
compartido de servidor y se ejecuta desde allí, se genera el error "System. Security. SecurityException:
error en la solicitud." Para obtener más información sobre las excepciones de seguridad, vea la clase
SecurityException.

Try
Process.Start("http://www.microsoft.com")
Catch ex As Exception
MsgBox("Can't load Web page" & vbCrLf & ex.Message)
End Try

En una situación de confianza parcial, tiene que colocar la instrucción Process.Start en un Sub
independiente. Se producirá un error en la llamada inicial a la Sub . Esto permite a Try...Catch
detectarla antes de que se inicie el Sub que contiene Process.Start y se produzca la excepción de
seguridad.

Ejemplos
La estructura de try... Detectar... Terminar
En el ejemplo siguiente se muestra la estructura de la instrucción Try...Catch...Finally .
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.
MessageBox.Show("end of Try block")
Catch ex As Exception
' Show the exception's message.
MessageBox.Show(ex.Message)

' Show the stack trace, which is a list of methods


' that are currently executing.
MessageBox.Show("Stack Trace: " & vbCrLf & ex.StackTrace)
Finally
' This line executes whether or not the exception occurs.
MessageBox.Show("in Finally block")
End Try
End Sub

Excepción en un método llamado desde un bloque try


En el ejemplo siguiente, el método CreateException produce una NullReferenceException . El código que
genera la excepción no está en un bloque Try . Por lo tanto, el método CreateException no controla la
excepción. El método RunSample controla la excepción porque la llamada al método CreateException
está en un bloque Try .
En el ejemplo se incluyen Catch instrucciones para varios tipos de excepciones, ordenadas de la más
específica a la más general.

Public Sub RunSample()


Try
CreateException()
Catch ex As System.IO.IOException
' Code that reacts to IOException.
Catch ex As NullReferenceException
MessageBox.Show("NullReferenceException: " & ex.Message)
MessageBox.Show("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

La instrucción Catch When


En el ejemplo siguiente se muestra cómo usar una instrucción Catch When para filtrar por una expresión
condicional. Si la expresión condicional se evalúa como True , se ejecuta el código del bloque de Catch .
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

Instrucciones try anidadas


El ejemplo siguiente tiene una instrucción Try…Catch que se encuentra en un bloque Try . El bloque
Catch interno produce una excepción que tiene su propiedad InnerException establecida en la
excepción original. El bloque Catch externo notifica su propia excepción y la excepción interna.

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

Control de excepciones para métodos asincrónicos


En el ejemplo siguiente se muestra el control de excepciones de los métodos asincrónicos. Para detectar
una excepción que se aplica a una tarea asincrónica, la expresión Await está en un bloque de Try del
llamador y la excepción se detecta en el bloque Catch .
Quite la marca de comentario de la línea Throw New Exception en el ejemplo para demostrar el control de
excepciones. La excepción se detecta en el bloque Catch , la propiedad IsFaulted de la tarea se
establece en True y la propiedad Exception.InnerException de la tarea se establece en la excepción.
Quite la marca de comentario de la línea Throw New OperationCancelledException para ver lo que pasa
cuando se cancela un proceso asincrónico. La excepción se captura en el bloque Catch y la propiedad
IsCanceled de la tarea se establece en True . Sin embargo, en algunas condiciones que no se aplican a
este ejemplo, IsFaulted se establece en True y IsCanceled se establece en False .

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

Controlar varias excepciones en métodos asincrónicos


En el ejemplo siguiente se muestra el control de excepciones en el que varias tareas pueden producir
varias excepciones. El bloque Try tiene la expresión de Await para la tarea que Task.WhenAll devuelve.
La tarea se completa cuando se completan las tres tareas a las que se aplica Task.WhenAll.
Cada una de las tres tareas produce una excepción. El bloque Catch recorre en iteración las excepciones,
que se encuentran en la propiedad Exception.InnerExceptions de la tarea que Task.WhenAll devuelve.
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

Vea también
Err
Exception
Exit (instrucción)
On Error (instrucción)
Procedimientos recomendados para usar fragmentos de código
Control de excepciones
Throw (instrucción)
Using (Instrucción, Visual Basic)
27/11/2019 • 8 minutes to read • Edit Online

Declara el principio de un bloque Using y, opcionalmente, adquiere los recursos del sistema que controla el
bloque.

Sintaxis
Using { resourcelist | resourceexpression }
[ statements ]
End Using

Elementos
T ÉRM IN O DEF IN IC IÓ N

resourcelist Necesario si no se proporciona resourceexpression . Lista


de uno o varios recursos del sistema que este Using bloque
controla, separados por comas.

resourceexpression Necesario si no se proporciona resourcelist . Variable o


expresión de referencia que hace referencia a un recurso del
sistema para que lo controle este bloque Using .

statements Opcional. Bloque de instrucciones que ejecuta el bloque


Using .

End Using Obligatorio. Finaliza la definición del bloque de Using y


desecha todos los recursos que controla.

Cada recurso del elemento resourcelist tiene la sintaxis y las partes siguientes:
resourcename As New resourcetype [ ( [ arglist ] ) ]

O bien,
resourcename As resourcetype = resourceexpression

Elementos resourcelist
T ÉRM IN O DEF IN IC IÓ N

resourcename Obligatorio. Variable de referencia que hace referencia a un


recurso del sistema que el bloque Using controla.

New Obligatorio si la instrucción Using adquiere el recurso. Si ya


ha adquirido el recurso, utilice la segunda alternativa de
sintaxis.
T ÉRM IN O DEF IN IC IÓ N

resourcetype Obligatorio. La clase del recurso. La clase debe implementar la


interfaz IDisposable.

arglist Opcional. Lista de argumentos que se pasan al constructor


para crear una instancia de resourcetype . Vea lista de
parámetros.

resourceexpression Obligatorio. Variable o expresión que hace referencia a un


recurso del sistema que cumple los requisitos de
resourcetype . Si usa la segunda alternativa de sintaxis,
debe adquirir el recurso antes de pasar el control a la
instrucción Using .

Comentarios
A veces, el código requiere un recurso no administrado, como un identificador de archivo, un contenedor COM o
una conexión SQL. Un bloque Using garantiza la eliminación de uno o más recursos de este tipo cuando el
código finaliza con ellos. Esto hace que estén disponibles para que los use otro código.
Los recursos administrados son eliminados por el recolector de elementos no utilizados (GC) de .NET Framework
sin necesidad de codificación adicional por su parte. No necesita un bloque Using para los recursos
administrados. Sin embargo, todavía puede usar un bloque Using para forzar la eliminación de un recurso
administrado en lugar de esperar al recolector de elementos no utilizados.
Un bloque Using tiene tres partes: adquisición, uso y eliminación.
La adquisición significa crear una variable e inicializarla para hacer referencia al recurso del sistema. La
instrucción Using puede adquirir uno o más recursos, o bien puede adquirir exactamente un recurso antes
de entrar en el bloque y suministrarlo a la instrucción Using . Si proporciona resourceexpression , debe
adquirir el recurso antes de pasar el control a la instrucción Using .
El uso significa tener acceso a los recursos y realizar acciones con ellos. Las instrucciones entre Using y
End Using representan el uso de los recursos.

La eliminación significa llamar al método Dispose en el objeto en resourcename . Esto permite que el objeto
finalice correctamente sus recursos. La instrucción End Using desecha los recursos del control del bloque
de Using .

Comportamiento
Un bloque de Using se comporta como una construcción Try ... Finally en la que el bloque de Try utiliza los
recursos y el bloque de Finally los desecha. Por este motivo, el bloque de Using garantiza la eliminación de los
recursos, con independencia de cómo salga del bloque. Esto es así incluso en el caso de una excepción no
controlada, excepto para un StackOverflowException.
El ámbito de cada variable de recurso adquirido por la instrucción Using se limita al bloque Using .
Si especifica más de un recurso del sistema en la instrucción Using , el efecto es el mismo que si anidara Using
bloques uno dentro de otro.
Si resourcename es Nothing , no se realiza ninguna llamada a Dispose y no se produce ninguna excepción.

Control de excepciones estructurado dentro de un bloque Using


Si necesita controlar una excepción que puede producirse en el bloque Using , puede Agregar a ella una
construcción Try completa... Finally . Si necesita controlar el caso en el que la instrucción Using no tiene éxito al
adquirir un recurso, puede probar si resourcename está Nothing .

Control de excepciones estructurado en lugar de un bloque Using


Si necesita un control más preciso sobre la adquisición de los recursos o si necesita código adicional en el bloque
Finally , puede volver a escribir el bloque de Using como una construcción Try ... Finally . En el ejemplo
siguiente se muestra el esqueleto Try y Using construcciones que son equivalentes en la adquisición y la
eliminación de resource .

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

NOTE
El código dentro del bloque Using no debe asignar el objeto de resourcename a otra variable. Al salir del bloque Using
, el recurso se desecha y la otra variable no puede tener acceso al recurso al que señala.

Ejemplo
En el ejemplo siguiente se crea un archivo denominado log. txt y se escriben dos líneas de texto en el archivo. En
el ejemplo también se lee el mismo archivo y se muestran las líneas de texto:
Dado que las clases TextWriter y TextReader implementan la interfaz IDisposable, el código puede usar
instrucciones Using para asegurarse de que el archivo se cierra correctamente después de las operaciones de
escritura y lectura.
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

Vea también
IDisposable
Try...Catch...Finally (instrucción)
Deshacerse de un recurso del sistema
Instrucción While...End While (Visual Basic)
27/11/2019 • 6 minutes to read • Edit Online

Ejecuta una serie de instrucciones siempre que se True una condición determinada.

Sintaxis
While condition
[ statements ]
[ Continue While ]
[ statements ]
[ Exit While ]
[ statements ]
End While

Elementos
T ÉRM IN O DEF IN IC IÓ N

condition Obligatorio. Boolean expresión. Si condition es


Nothing , Visual Basic lo trata como False .

statements Opcional. Una o más instrucciones que siguen While , que


se ejecutan cada vez que se True``condition .

Continue While Opcional. Transfiere el control a la siguiente iteración del


bloque While .

Exit While Opcional. Transfiere el control fuera del bloque While .

End While Obligatorio. Termina la definición del bloque While .

Comentarios
Use una estructura de While...End While cuando desee repetir un conjunto de instrucciones un número
indefinido de veces, siempre que una condición permanezca True . Si desea más flexibilidad con el punto de
prueba de la condición o el resultado para probarlo, puede que prefiera la acción... Instrucción Loop. Si desea
repetir las instrucciones un número establecido de veces, la instrucción for... La siguiente instrucción suele ser
una mejor opción.

NOTE
La palabra clave While también se usa en la. .. Instrucción Loop, la cláusula SKIP while y la cláusula Take while.

Si condition se True , todos los statements ejecutan hasta que se encuentre la instrucción End While . A
continuación, el control vuelve a la instrucción While y se comprueba de nuevo condition . Si condition
todavía está True , se repite el proceso. Si es False , el control pasa a la instrucción que sigue a la instrucción
End While .
La instrucción While siempre comprueba la condición antes de iniciar el bucle. El bucle continúa mientras la
condición permanece True . Si condition se False la primera vez que se escribe el bucle, no se ejecuta ni
siquiera una vez.
El condition suele ser el resultado de una comparación de dos valores, pero puede ser cualquier expresión
que se evalúe como un valor de tipo de datos booleano ( True o False ). Esta expresión puede incluir un valor
de otro tipo de datos, como un tipo numérico, que se ha convertido en Boolean .
Puede anidar While bucles colocando un bucle dentro de otro. También puede anidar distintos tipos de
estructuras de control entre sí. Para obtener más información, vea estructuras de control anidadas.

Salir
La instrucción Exit while puede proporcionar otra manera de salir de un bucle While . Exit While transfiere
inmediatamente el control a la instrucción que sigue a la instrucción End While .
Normalmente se usa Exit While después de evaluar alguna condición (por ejemplo, en una estructura de
If...Then...Else ). Es posible que desee salir de un bucle si detecta una condición que hace que sea
innecesario o imposible continuar la iteración, como un valor erróneo o una solicitud de finalización. Puede
utilizar Exit While al probar una condición que podría provocar un bucle sin fin, que es un bucle que podría
ejecutar un número muy grande o incluso infinito de veces. Después, puede usar Exit While para escapar el
bucle.
Puede colocar cualquier número de instrucciones Exit While en cualquier parte del bucle While .
Cuando se utiliza en bucles While anidados, Exit While transfiere el control fuera del bucle más interno y en
el siguiente nivel superior de anidamiento.
La instrucción Continue While transfiere inmediatamente el control a la siguiente iteración del bucle. Para
obtener más información, vea instrucción continue.

Ejemplo
En el ejemplo siguiente, las instrucciones del bucle continúan ejecutándose hasta que la variable de index sea
mayor que 10.

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

Ejemplo
En el ejemplo siguiente se muestra el uso de las instrucciones Continue While y Exit While .
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

Ejemplo
En el ejemplo siguiente se leen todas las líneas de un archivo de texto. El método OpenText abre el archivo y
devuelve un StreamReader que lee los caracteres. En la condición While , el método Peek de la StreamReader
determina si el archivo contiene caracteres adicionales.

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

Vea también
Estructuras de bucle
Do...Loop (instrucción)
For...Next (instrucción)
Boolean (tipo de datos)
Estructuras de control anidadas
Exit (instrucción)
Continue (instrucción)
With...End With (Instrucción, Visual Basic)
27/11/2019 • 7 minutes to read • Edit Online

Ejecuta una serie de instrucciones que hacen referencia repetidamente a un único objeto o estructura, por lo que
las instrucciones pueden utilizar una sintaxis simplificada al acceder a los miembros del objeto o estructura.
Cuando use una estructura, sola podrá leer los valores de los miembros o invocar métodos, y recibirá un error si
intenta asignar valores a los miembros de una estructura utilizada en una instrucción With...End With .

Sintaxis
With objectExpression
[ statements ]
End With

Elementos
T ÉRM IN O DEF IN IC IÓ N

objectExpression Obligatorio. Una expresión que se evalúa como un objeto. La


expresión puede ser arbitrariamente compleja y se evalúa
solo una vez. La expresión se puede evaluar como cualquier
tipo de datos, incluidos los tipos elementales.

statements Opcional. Una o varias instrucciones entre With y


End With que pueden hacer referencia a los miembros de
un objeto generado por la evaluación de
objectExpression .

End With Obligatorio. Termina la definición del bloque With .

Comentarios
Con With...End With , puede ejecutar una serie de instrucciones en un objeto especificado sin necesidad
especificar el nombre del objeto varias veces. En un bloque de instrucciones With , puede especificar un
miembro del objeto que comience por un punto, como si el objeto de la instrucción With lo precediera.
Por ejemplo, para cambiar varias propiedades de un único objeto, coloque las instrucciones de asignación de las
propiedades dentro del bloque With...End With y haga referencia al objeto una vez, en lugar de hacerlo en cada
una de las asignaciones de las propiedades.
Si el código tiene acceso al mismo objeto en varias instrucciones, la instrucción With le brinda las ventajas
siguientes:
No es necesario evaluar varias veces una expresión compleja ni asignar el resultado a una variable
temporal para hacer referencia a sus miembros varias veces.
El código resulta más legible al eliminar expresiones de calificación repetitivas.
El tipo de datos de objectExpression puede ser cualquier tipo de clase o estructura, o incluso un tipo elemental
de Visual Basic, como Integer . Si objectExpression produce un valor que no es un objeto, solo podrá leer los
valores de sus miembros o invocar métodos, y recibirá un error si intenta asignar valores a los miembros de una
estructura utilizada en una instrucción With...End With . Este es el mismo error que obtendría si invocara un
método que devolviera una estructura y accediera inmediatamente a un miembro del resultado de la función,
como GetAPoint().x = 1 , y le asignara un valor. El problema en ambos casos es que la estructura solo existe en la
pila de llamadas y no hay forma de que un miembro de la estructura modificada en estas situaciones pueda
escribir en una ubicación de forma que cualquier otro código del programa pueda observar el cambio.
objectExpression se evalúa una vez, tras su entrada en el bloque. No se puede reasignar objectExpression
desde el interior del bloque With .
En un bloque With , solo de puede acceder a los métodos y propiedades del objeto especificado sin calificarlos.
Se pueden usar métodos y propiedades de otros objetos, pero es necesario calificarlos con los nombres de
objeto.
Puede incluir una instrucción With...End With dentro de otra. Las instrucciones With...End With anidadas
pueden resultar confusas si los objetos a los que se hace referencia no están claros por el contexto. Debe
proporcionar una referencia completa a un objeto que esté en un bloque With externo cuando se haga
referencia al objeto desde dentro de un bloque With interno.
No se pueden crear bifurcaciones en un bloque de instrucciones With desde fuera del bloque.
A menos que el bloque contenga un bucle, las instrucciones se ejecutan una sola vez. Puede anidar diferentes
tipos de estructuras de control. Para obtener más información, vea estructuras de control anidadas.

NOTE
La palabra clave With también se puede usar en inicializadores de objeto. Para obtener más información y ejemplos, vea
inicializadores de objeto: tipos con nombre y anónimos y tipos anónimos.
Si usa un bloque With solo para inicializar las propiedades o campos de un objeto del que acaba de crear instancias,
considere la posibilidad de utilizar en su lugar un inicializador de objetos.

Ejemplo
En el ejemplo siguiente, cada bloque With ejecuta una serie de instrucciones en un único objeto.

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
Ejemplo
En el ejemplo siguiente se anidan las instrucciones With…End With . En la instrucción With anidada, la sintaxis
hace referencia al objeto interno.

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

Vea también
List<T>
Estructuras de control anidadas
Inicializadores de objeto: Tipos con nombre y anónimos
Tipos anónimos
Yield (Instrucción) (Visual Basic)
27/11/2019 • 7 minutes to read • Edit Online

Envía el siguiente elemento de una colección a una instrucción For Each...Next .

Sintaxis
Yield expression

Parámetros
T ÉRM IN O DEF IN IC IÓ N

expression Obligatorio. Una expresión que se pueda convertir


implícitamente al tipo de la función de iterador o Get
descriptor de acceso que contiene la instrucción Yield .

Comentarios
La instrucción Yield devuelve un elemento de una colección a la vez. La instrucción Yield se incluye en una
función de iterador o en un descriptor de acceso Get , que realiza iteraciones personalizadas en una colección.
Utilice una función de iterador mediante un ... Instrucción Next o una consulta LINQ. Cada iteración del bucle
For Each llama a la función de iterador. Cuando se alcanza una instrucción Yield en la función de iterador, se
devuelve expression y se conserva la ubicación actual en el código. La ejecución se reinicia desde esa
ubicación la próxima vez que se llama a la función del iterador.
Debe existir una conversión implícita del tipo de expression de la instrucción Yield al tipo de valor devuelto
del iterador.
Puede usar una instrucción Exit Function o Return para finalizar la iteración.
"Yield" no es una palabra reservada y tiene un significado especial solo cuando se utiliza en una función de
Iterator o un descriptor de acceso Get .

Para obtener más información sobre las funciones de iterador y los descriptores de acceso Get , vea
iteradores.

Funciones de iterador y obtener descriptores de acceso


La declaración de una función de iterador o Get descriptor de acceso debe cumplir los siguientes requisitos:
Debe incluir un modificador de iterador .
El tipo de valor devuelto debe ser IEnumerable, IEnumerable<T>, IEnumerator o IEnumerator<T>.
No puede tener ningún parámetro ByRef .
Una función de iterador no puede aparecer en un evento, un constructor de instancia, un constructor estático o
un destructor estático.
Una función de iterador puede ser una función anónima. Para obtener más información, consulta Iteradores.

Control de excepciones
Una instrucción Yield puede estar dentro de un bloque Try de una instrucción try... Detectar... Finally. Un
bloque Try que tiene una instrucción Yield puede tener bloques Catch y puede tener un bloque Finally .
Una instrucción Yield no puede estar dentro de un bloque de Catch o un bloque Finally .
Si el cuerpo de For Each (fuera de la función de iterador) produce una excepción, no se ejecuta un bloque de
Catch en la función de iterador, pero se ejecuta un bloque de Finally en la función de iterador. Un bloque
Catch dentro de una función de iterador solo detecta las excepciones que se producen dentro de la función de
iterador.

Implementación técnica
El código siguiente devuelve un IEnumerable (Of String) de una función de iterador y, a continuación, recorre
en iteración los elementos de la IEnumerable (Of String) .

Dim elements As IEnumerable(Of String) = MyIteratorFunction()



For Each element As String In elements
Next

La llamada a MyIteratorFunction no ejecuta el cuerpo de la función. En su lugar, la llamada devuelve un valor


IEnumerable(Of String) en la variable elements .
En una iteración del bucle For Each , se llama al método MoveNext para elements . Esta llamada ejecuta el
cuerpo de MyIteratorFunction hasta que se alcanza la siguiente instrucción Yield . La instrucción Yield
devuelve una expresión que determina no solo el valor de la variable element para su consumo por parte del
cuerpo del bucle, sino también la propiedad Current de los elementos, que es una IEnumerable (Of String) .
En cada iteración subsiguiente del bucle For Each , la ejecución del cuerpo del iterador continúa desde donde
se dejó, deteniéndose de nuevo al alcanzar una instrucción Yield . El bucle de For Each se completa cuando
se alcanza el final de la función de iterador o una instrucción Return o Exit Function .

Ejemplo
El ejemplo siguiente tiene una instrucción Yield que está dentro de un ... Siguiente bucle. Cada iteración del
cuerpo de la instrucción for each en Main crea una llamada a la función de iterador Power . Cada llamada a la
función de iterador prosigue con la siguiente ejecución de la instrucción Yield , que se produce durante la
siguiente iteración del bucle For…Next .
El tipo de valor devuelto del método iterador es IEnumerable<T>, un tipo de interfaz de iterador. Cuando se
llama al método iterador, este devuelve un objeto enumerable que contiene las potencias de un número.
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

Ejemplo
En el ejemplo siguiente se muestra un descriptor de acceso Get que es un iterador. La declaración de
propiedad incluye un modificador Iterator .

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 obtener más ejemplos, vea iteradores.

Vea también
Instrucciones
Cláusulas (Visual Basic)
05/12/2019 • 2 minutes to read • Edit Online

En los temas de esta sección se documentan Visual Basic cláusulas en tiempo de ejecución.

Esta sección
Alias
As
Handles
Implements
In
Into
Of

Secciones relacionadas
Referencia del lenguaje Visual Basic
Alias (Cláusula, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Indica que un procedimiento externo tiene otro nombre en su archivo DLL.

Comentarios
La palabra clave Alias se puede usar en este contexto:
Declare (instrucción)
En el ejemplo siguiente, se usa la palabra clave Alias para proporcionar el nombre de la función en advapi32. dll,
GetUserNameA , que getUserName se usa en lugar de en este ejemplo. En sub getUser se llama a la función
getUserName , que muestra el nombre del usuario actual.

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

Vea también
Palabras clave
As (Cláusula, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Presenta una cláusula As , que identifica un tipo de datos en una instrucción de declaración o una lista de
restricciones en un parámetro de tipo genérico.

Comentarios
La palabra clave As se puede usar en los siguientes contextos:
Aggregate (cláusula)
Class (instrucción)
Const (instrucción)
Declare (instrucción)
Delegate (instrucción)
Dim (instrucción)
Enum (instrucción)
Event (instrucción)
Para... Instrucciones Next
Para cada... Instrucciones Next
From (cláusula)
Function (instrucción)
Group Join (cláusula)
Interface (instrucción)
Operator Statement
Property (instrucción)
Structure (instrucción)
Sub (instrucción)
Try... Detectar... Finally (instrucciones)

Vea también
Crear una variable nueva
Tipos de datos
Declaración de variables
Lista de tipos
Generic Types in Visual Basic
Palabras clave
Handles (Cláusula, Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Declara que un procedimiento controla un evento especificado.

Sintaxis
proceduredeclaration Handles eventlist

Elementos
proceduredeclaration
La declaración de procedimiento Sub del procedimiento que controlará el evento.
eventlist
Lista de los eventos que proceduredeclaration debe controlar, separados por comas. Los eventos deben ser
generados bien por la clase base de la clase actual o bien por un objeto declarado mediante la palabra clave
WithEvents .

Comentarios
Utilice la palabra clave Handles al final de una declaración de procedimiento para que controle los eventos
generados por una variable de objeto declarada mediante el uso de la palabra clave WithEvents . La palabra
clave Handles también puede usarse en una clase derivada para controlar eventos de una clase base.
La palabra clave Handles y la instrucción AddHandler permiten especificar que determinados procedimientos
controlen eventos determinados, pero hay diferencias. Use la palabra clave Handles al definir un
procedimiento para especificar que controla un evento determinado. La instrucción AddHandler conecta los
procedimientos a los eventos en tiempo de ejecución. Para obtener más información, vea AddHandler
Statement.
Para los eventos personalizados, la aplicación invoca al descriptor de acceso AddHandler del evento cuando
agrega el procedimiento como un controlador de eventos. Para obtener más información sobre los eventos
personalizados, vea Event Statement.

Ejemplo
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

En el siguiente ejemplo se demuestra cómo una clase derivada puede usar la instrucción Handles para
controlar un evento de una clase base.

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

Ejemplo
El ejemplo siguiente contiene dos controladores de eventos de botón para un proyecto de aplicación de
WPF .

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

Ejemplo
El siguiente ejemplo es equivalente al ejemplo anterior. El eventlist en la cláusula Handles contiene los
eventos de ambos botones.
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

Vea también
WithEvents
AddHandler (instrucción)
RemoveHandler (instrucción)
Event (instrucción)
RaiseEvent (instrucción)
Eventos
Implements (Cláusula, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Indica que un miembro de clase o estructura proporciona la implementación para un miembro definido en una
interfaz.

Comentarios
La palabra clave Implements no es igual que la instrucción Implements. Use la instrucción Implements para
especificar que una clase o estructura implementa una o más interfaces y, a continuación, para cada miembro,
use la palabra clave Implements para especificar qué interfaz y qué miembro implementa.
Si una clase o estructura implementa una interfaz, debe incluir la instrucción Implements inmediatamente
después de la instrucción de clase o instrucción de estructura, y debe implementar todos los miembros definidos
por la interfaz.

Reimplementación
En una clase derivada, puede volver a implementar un miembro de interfaz que la clase base ya ha
implementado. Esto no es lo mismo que reemplazar el miembro de clase base en los siguientes aspectos:
No es necesario reemplazar el miembro de la clase base para que se pueda volver a implementar.
Puede volver a implementar el miembro con un nombre diferente.
La palabra clave Implements se puede utilizar en los contextos siguientes:
Event (instrucción)
Function (instrucción)
Property (instrucción)
Sub (instrucción)

Vea también
Implements (instrucción)
Interface (instrucción)
Class (instrucción)
Structure (instrucción)
In (Cláusula, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica el grupo que la variable de bucle va a recorrer en un bucle For Each , o especifica la colección que se va
a consultar en una cláusula From , Join o Group Join .

Comentarios
La palabra clave In se puede utilizar en los contextos siguientes:
For Each...Next (instrucción)
From (cláusula)
Join (cláusula)
Group Join (cláusula)

Vea también
Palabras clave
Into (Cláusula, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Identifica las funciones de agregado o agrupaciones que se van a aplicar a una colección.

Comentarios
La palabra clave Each se usa en los contextos siguientes:
Aggregate (cláusula)
Group By (cláusula)
Group Join (cláusula)

Vea también
Palabras clave
Of (Cláusula, Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Presenta una cláusula Of , que identifica un parámetro de tipo en una clase genérica , una estructura, una
interfaz, un delegado o un procedimiento. Para obtener información sobre los tipos genéricos, vea tipos
genéricos en Visual Basic.

Usar la palabra clave of


En el ejemplo de código siguiente se usa la palabra clave Of para definir el contorno de una clase que toma
dos parámetros de tipo. Restringe el parámetro keyType por la interfaz IComparable, lo que significa que el
código utilizado debe proporcionar un argumento de tipo que implementa IComparable. Esto es necesario
para que el procedimiento add pueda llamar al método IComparable.CompareTo. Para más información
sobre las restricciones, vea Type List.

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

Si completa la definición de clase anterior, puede construir una variedad de clases dictionary a partir de ella.
Los tipos que se proporcionan a entryType y keyType determinan qué tipo de entrada contiene la clase y qué
tipo de clave asocia a cada entrada. Debido a la restricción, debe proporcionar a keyType un tipo que
implementa IComparable.
En el ejemplo de código siguiente se crea un objeto que contiene String entradas y asocia una clave Integer
a cada una de ellas. Integer implementa IComparable y, por tanto, satisface la restricción en keyType .

Dim d As New dictionary(Of String, Integer)

La palabra clave Of se puede usar en los siguientes contextos:


Class (instrucción)
Delegate (instrucción)
Function (instrucción)
Interface (instrucción)
Structure (instrucción)
Sub (instrucción)

Vea también
IComparable
Lista de tipos
Generic Types in Visual Basic
In
Out
Contextos de declaración y niveles de acceso
predeterminados (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

En este tema se describe qué tipos de Visual Basic se pueden declarar dentro de los demás tipos y cuál es
el valor predeterminado de los niveles de acceso si no se especifica.

Niveles de contexto de declaración


El contexto de la declaración de un elemento de programación es la región de código en la que se declara.
A menudo, se trata de otro elemento de programación, que se llama elemento contenedor.
Los niveles de los contextos de declaración son los siguientes:
Nivel de espacio de nombres : dentro de un archivo de código fuente o espacio de nombres pero
no dentro de una clase, estructura, módulo o interfaz
Nivel de módulo : dentro de una clase, una estructura, un módulo o una interfaz, pero no dentro de
un procedimiento o bloque
Nivel de procedimiento : dentro de un procedimiento o bloque (como If o For )
En la tabla siguiente se muestran los niveles de acceso predeterminados para varios elementos de
programación declarados, en función de sus contextos de declaración.

N IVEL DE ESPA C IO DE N IVEL DE


EL EM EN TO DEC L A RA DO N O M B RES N IVEL DE M Ó DULO P RO C EDIM IEN TO

Variable (instrucción Dim) No admitido Private ( en


Public Public
Structure , no permitido
en Interface )

Constant (instrucción No admitido Private ( en


Public Public
const) Structure , no permitido
en Interface )

Enumeración (instrucción Friend Public No admitido


enum)

Class (instrucción de clase) Friend Public No admitido

Structure (instrucción Friend Public No admitido


Structure)

Module (instrucción de Friend No admitido No admitido


módulo)

Interface (instrucción Friend Public No admitido


interface)
N IVEL DE ESPA C IO DE N IVEL DE
EL EM EN TO DEC L A RA DO N O M B RES N IVEL DE M Ó DULO P RO C EDIM IEN TO

Procedure (instrucción No admitido Public No admitido


function, Sub Statement)

Referencia externa No admitido Public (no se permite No admitido


(instrucción Declare) en Interface )

Operator (instrucción de No admitido Public (no se permite No admitido


operador) en Interface o
Module )

Property (instrucción de No admitido Public No admitido


propiedad)

Propiedad default (valor No admitido Public (no se permite No admitido


predeterminado) en Module )

Event (instrucción de No admitido Public No admitido


evento)

Delegate (instrucción Friend Public No admitido


Delegate)

Para obtener más información, consulte niveles de acceso en Visual Basic.

Vea también
Friend
Private
Public
Lista de atributos (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Especifica los atributos que se van a aplicar a un elemento de programación declarado. Los diversos
atributos se separan con comas. A continuación se encuentra la sintaxis de un atributo.

Sintaxis
[ attributemodifier ] attributename [ ( attributearguments | attributeinitializer ) ]

Elementos

attributemodifier Se requiere para los atributos aplicados al principio de un


archivo de código fuente. Puede ser un ensamblado o un
módulo.

attributename Obligatorio. Nombre del atributo.

attributearguments Opcional. Lista de argumentos posicionales para este


atributo. Los argumentos múltiples se separan mediante
comas.

attributeinitializer Opcional. Lista de inicializadores de variable o propiedad


para este atributo. Los inicializadores múltiples se
separan mediante comas.

Comentarios
Puede aplicar uno o varios atributos a casi cualquier elemento de programación (tipos, procedimientos,
propiedades, etc.). Los atributos aparecen en los metadatos del ensamblado y pueden ayudarle a anotar el
código o especificar cómo usar un elemento de programación determinado. Puede aplicar atributos
definidos por Visual Basic y el .NET Framework, y puede definir sus propios atributos.
Para obtener más información sobre Cuándo usar atributos, vea información general sobre los atributos.
Para obtener información sobre los nombres de atributo, vea nombres de elementos declarados.

Reglas
Ubicación. Puede aplicar atributos a la mayoría de los elementos de programación declarados.
Para aplicar uno o varios atributos, coloque un bloque de atributos al principio de la declaración
del elemento. Cada entrada de la lista de atributos especifica un atributo que se desea aplicar y el
modificador y los argumentos que se usan para esta invocación del atributo.
Corchetes angulares. Si proporciona una lista de atributos, debe encerrarla entre corchetes
angulares (" < " y " > ").
Par te de la declaración. El atributo debe formar parte de la declaración del elemento, no de una
instrucción independiente. Puede usar la secuencia de continuación de línea (" _ ") para extender la
instrucción de declaración en varias líneas de código fuente.
Modificadores. Se requiere un modificador de atributo ( Assembly o Module ) en cada atributo
aplicado a un elemento de programación al principio de un archivo de código fuente. No se
permiten modificadores de atributo en los atributos aplicados a los elementos que no están al
principio de un archivo de código fuente.
Argumentos. Todos los argumentos posicionales de un atributo deben preceder a cualquier
inicializador de variable o propiedad.

Ejemplo
En el ejemplo siguiente se aplica el atributo DllImportAttribute a una definición de esquema de un
procedimiento Function .

<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 el procedimiento con atributos representa un punto de entrada de una
biblioteca de vínculos dinámicos (DLL) no administrada. El atributo proporciona el nombre del archivo
DLL como argumento posicional y la otra información como inicializadores de variables.

Vea también
Ensamblado
Module <keyword>
Información general de atributos
Interrumpir y combinar instrucciones en código
Lista de parámetros (Visual Basic)
27/11/2019 • 6 minutes to read • Edit Online

Especifica los parámetros que un procedimiento espera cuando se llama. Varios parámetros se separan
mediante comas. A continuación se encuentra la sintaxis de un parámetro.

Sintaxis
[ <attributelist> ] [ Optional ] [{ ByVal | ByRef }] [ ParamArray ]
parametername[( )] [ As parametertype ] [ = defaultvalue ]

Elementos
attributelist
Opcional. Lista de atributos que se aplican a este parámetro. Debe incluir la lista de atributos entre corchetes
angulares (" < " y " > ").
Optional
Opcional. Especifica que este parámetro no es necesario cuando se llama al procedimiento.
ByVal
Opcional. Especifica que el procedimiento no puede reemplazar o volver a asignar el elemento variable
subyacente al argumento correspondiente en el código de llamada.
ByRef
Opcional. Especifica que el procedimiento puede modificar el elemento variable subyacente en el código de
llamada de la misma manera que el propio código de llamada puede.
ParamArray
Opcional. Especifica que el último parámetro de la lista de parámetros es una matriz opcional de elementos
del tipo de datos especificado. Esto permite al código de llamada pasar un número arbitrario de argumentos
al procedimiento.
parametername
Obligatorio. Nombre de la variable local que representa el parámetro.
parametertype
Es obligatorio si se On``Option Strict . Tipo de datos de la variable local que representa el parámetro.
defaultvalue
Obligatorio para los parámetros de Optional . Cualquier expresión constante o constante que se evalúe
como el tipo de datos del parámetro. Si el tipo es Object , o una clase, una interfaz, una matriz o una
estructura, el valor predeterminado solo se puede Nothing .

Comentarios
Los parámetros se incluyen entre paréntesis y se separan mediante comas. Un parámetro se puede declarar
con cualquier tipo de datos. Si no se especifica parametertype , el valor predeterminado es Object .
Cuando el código de llamada llama al procedimiento, pasa un argumento a cada parámetro necesario. Para
obtener más información, vea diferencias entre parámetros y argumentos.
El argumento que el código de llamada pasa a cada parámetro es un puntero a un elemento subyacente en
el código de llamada. Si este elemento no es variable (una constante, un literal, una enumeración o una
expresión), es imposible que cualquier código lo cambie. Si es un elemento variable (una variable declarada,
un campo, una propiedad, un elemento de matriz o un elemento de estructura), el código de llamada puede
cambiarlo. Para obtener más información, vea diferencias entre argumentos modificables y no modificables.
Si se pasa un elemento variable ByRef , el procedimiento también lo puede cambiar. Para obtener más
información, vea diferencias entre pasar un argumento por valor y por referencia.

Reglas
Paréntesis. Si especifica una lista de parámetros, debe escribirla entre paréntesis. Si no hay ningún
parámetro, todavía puede usar paréntesis que incluyan una lista vacía. Esto mejora la legibilidad del
código al aclarar que el elemento es un procedimiento.
Parámetros opcionales. Si usa el modificador Optional en un parámetro, todos los parámetros
subsiguientes de la lista también deben ser opcionales y declararse mediante el modificador
Optional .

Cada declaración de parámetro opcional debe proporcionar la cláusula defaultvalue .


Para obtener más información, vea parámetros opcionales.
Matrices de parámetros. Debe especificar ByVal para un parámetro ParamArray .
No puede usar Optional y ParamArray en la misma lista de parámetros.
Para obtener más información, consulte matrices de parámetros.
Pasando el mecanismo. El mecanismo predeterminado para cada argumento es ByVal , lo que
significa que el procedimiento no puede cambiar el elemento variable subyacente. Sin embargo, si el
elemento es un tipo de referencia, el procedimiento puede modificar el contenido o los miembros del
objeto subyacente, aunque no puede reemplazar o volver a asignar el propio objeto.
Nombres de parámetro. Si el tipo de datos del parámetro es una matriz, siga parametername
inmediatamente entre paréntesis. Para obtener más información sobre los nombres de parámetros,
vea nombres de elementos declarados.

Ejemplo
En el ejemplo siguiente se muestra un procedimiento Function que define dos parámetros.

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?")

Vea también
DllImportAttribute
Function (instrucción)
Sub (instrucción)
Declare (instrucción)
Structure (instrucción)
Option Strict (instrucción)
Información general de atributos
Interrumpir y combinar instrucciones en código
Lista de tipos (Visual Basic)
27/11/2019 • 7 minutes to read • Edit Online

Especifica los parámetros de tipo para un elemento de programación genérico . Varios parámetros se
separan mediante comas. A continuación se encuentra la sintaxis de un parámetro de tipo.

Sintaxis
[genericmodifier] typename [ As constraintlist ]

Elementos
T ÉRM IN O DEF IN IC IÓ N

genericmodifier Opcional. Solo se puede usar en interfaces y delegados


genéricos. Puede declarar un tipo covariante mediante la
palabra clave out o contravariante mediante la palabra
clave in . Vea Covarianza y contravarianza.

typename Obligatorio. Nombre del parámetro de tipo. Se trata de


un marcador de posición que se reemplazará por un tipo
definido proporcionado por el argumento de tipo
correspondiente.

constraintlist Opcional. Lista de requisitos que restringen el tipo de


datos que se puede proporcionar para typename . Si
tiene varias restricciones, enciérrelos entre llaves ( { } ) y
sepárelas con comas. Debe introducir la lista de
restricciones con la palabra clave as . Solo se usa As una
vez, al principio de la lista.

Comentarios
Cada elemento de programación genérico debe tomar al menos un parámetro de tipo. Un parámetro de
tipo es un marcador de posición para un tipo específico (un elemento construido) que el código de cliente
especifica cuando crea una instancia del tipo genérico. Puede definir una clase, una estructura, una
interfaz, un procedimiento o un delegado genéricos.
Para obtener más información sobre cuándo definir un tipo genérico, vea tipos genéricos en Visual Basic.
Para obtener más información sobre los nombres de parámetros de tipo, vea nombres de elementos
declarados.

Reglas
Paréntesis. Si proporciona una lista de parámetros de tipo, debe encerrarla entre paréntesis y
debe introducir la lista con la palabra clave . Solo se usa Of una vez, al principio de la lista.
Restricciones. Una lista de restricciones en un parámetro de tipo puede incluir los elementos
siguientes en cualquier combinación:
Cualquier número de interfaces. El tipo proporcionado debe implementar cada interfaz en
esta lista.
A lo sumo una clase. El tipo proporcionado debe heredar de esa clase.
Palabra clave New . El tipo proporcionado debe exponer un constructor sin parámetros al que
pueda tener acceso el tipo genérico. Esto resulta útil si se restringe un parámetro de tipo
mediante una o más interfaces. Un tipo que implementa interfaces no expone
necesariamente un constructor y, en función del nivel de acceso de un constructor, el código
dentro del tipo genérico podría no tener acceso a él.
La palabra clave Class o la palabra clave Structure . La palabra clave Class restringe un
parámetro de tipo genérico para exigir que cualquier argumento de tipo pasado a él sea un
tipo de referencia, por ejemplo una cadena, una matriz o un delegado, o un objeto creado a
partir de una clase. La palabra clave Structure restringe un parámetro de tipo genérico para
exigir que cualquier argumento de tipo pasado a él sea un tipo de valor, por ejemplo, una
estructura, una enumeración o un tipo de datos elemental. No puede incluir Class y
Structure en el mismo constraintlist .

El tipo proporcionado debe cumplir todos los requisitos que se incluyen en constraintlist .
Las restricciones de cada parámetro de tipo son independientes de las restricciones en otros
parámetros de tipo.

Comportamiento
Sustitución en tiempo de compilación. Cuando se crea un tipo construido a partir de un
elemento de programación genérico, se proporciona un tipo definido para cada parámetro de tipo.
El compilador de Visual Basic sustituye el tipo proporcionado por cada aparición de typename
dentro del elemento genérico.
Ausencia de restricciones. Si no especifica ninguna restricción en un parámetro de tipo, el
código se limita a las operaciones y miembros admitidos por el tipo de datos Object para ese
parámetro de tipo.

Ejemplo
En el ejemplo siguiente se muestra una definición de esqueleto de una clase de diccionario genérico,
incluida una función esqueleto para agregar una nueva entrada al diccionario.

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

Ejemplo
Dado que dictionary es genérico, el código que lo usa puede crear una variedad de objetos a partir de él,
cada uno con la misma funcionalidad pero actuando en un tipo de datos diferente. En el ejemplo siguiente
se muestra una línea de código que crea un objeto dictionary con String entradas y Integer claves.
Dim dictInt As New dictionary(Of String, Integer)

Ejemplo
En el ejemplo siguiente se muestra la definición de esqueleto equivalente generada por el ejemplo
anterior.

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

Vea también
Of
New (operador)
Niveles de acceso en Visual Basic
Object Data Type
Function (instrucción)
Structure (instrucción)
Sub (instrucción)
Utilizar una clase genérica
Covarianza y contravarianza
In
Out
Etiquetas XML recomendadas para comentarios de
documentación (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

El compilador de Visual Basic puede procesar comentarios de documentación en el código en un archivo XML.
Puede usar herramientas adicionales para procesar el archivo XML en la documentación de.
Los comentarios XML se permiten en construcciones de código como tipos y miembros de tipo. En el caso de los
tipos parciales, solo una parte del tipo puede tener comentarios XML, aunque no hay ninguna restricción en el
comentario de sus miembros.

NOTE
Los comentarios de documentación no se pueden aplicar a espacios de nombres. La razón es que un espacio de nombres
puede abarcar varios ensamblados, y no todos los ensamblados deben cargarse al mismo tiempo.

El compilador procesa cualquier etiqueta que sea XML válida. Las siguientes etiquetas proporcionan
funcionalidad de uso común en la documentación del usuario.

<c> <code> <example>

<excepción > 1 <incluye > 1 <list>

<para> <param > 1 <paramref>

<permiso > 1 <remarks> <returns>

<consulte > 1 <seealso > 1 <summary>

<typeparam > 1 <value>

(1 el compilador comprueba la sintaxis).

NOTE
Si desea que aparezcan corchetes angulares en el texto de un Comentario de documentación, use &lt; y &gt; . Por
ejemplo, la cadena "&lt;text in angle brackets&gt;" aparecerá como <text in angle brackets> .

Vea también
Documentar el código con XML
-doc
Crear documentación XML
<c > (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Indica que el texto de una descripción es código.

Sintaxis
<c>text</c>

Parámetros
PA RÁ M ET RO DESC RIP C IÓ N

text El texto que le gustaría indicar como código.

Comentarios
La etiqueta <c> proporciona una manera de indicar que el texto de una descripción debe marcarse como código.
Use <code> para indicar varias líneas como código.
Compile con -doc para procesar los comentarios de documentación de un archivo.

Ejemplo
En este ejemplo se usa la etiqueta <c> de la sección Summary para indicar que Counter es code.

''' <summary>
''' Resets the value 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

Vea también
Etiquetas XML para comentarios
> de código de <(Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Indica que el texto es varias líneas de código.

Sintaxis
<code>content</code>

Parámetros
content
Texto que se va a marcar como código.

Comentarios
Use la etiqueta <code> para indicar varias líneas como código. Use <c> para indicar que el texto dentro de una
descripción debe marcarse como código.
Compile con -doc para procesar los comentarios de documentación de un archivo.

Ejemplo
En este ejemplo se usa la etiqueta <> de código para incluir código de ejemplo para usar el campo ID .

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

Vea también
Etiquetas XML para comentarios
> de ejemplo <(Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica un ejemplo para el miembro.

Sintaxis
<example>description</example>

Parámetros
description
Una descripción del ejemplo de código.

Comentarios
La etiqueta <example> permite especificar un ejemplo de cómo usar un método u otro miembro de la biblioteca.
Esto normalmente implica el uso de la etiqueta <code>.
Compile con -doc para procesar los comentarios de documentación de un archivo.

Ejemplo
En este ejemplo se usa la etiqueta <example> para incluir un ejemplo de uso del campo ID .

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

Vea también
Etiquetas XML para comentarios
<> de excepciones (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica qué excepciones se pueden iniciar.

Sintaxis
<exception cref="member">description</exception>

Parámetros
member
Una referencia a una excepción que está disponible desde el entorno de compilación actual. El compilador
comprueba si la excepción dada existe y traduce member al nombre de elemento canónico en la salida XML.
member debe aparecer entre comillas dobles (" ").

description
Una descripción.

Comentarios
Use la etiqueta <exception> para especificar qué excepciones se pueden iniciar. Esta etiqueta se aplica a una
definición de método.
Compile con -doc para procesar los comentarios de documentación de un archivo.

Ejemplo
En este ejemplo se usa la etiqueta <exception> para describir una excepción que la función IntDivide puede
iniciar.

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

Vea también
Etiquetas XML para comentarios
<incluir > (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Hace referencia a otro archivo que describe los tipos y miembros en el código fuente.

Sintaxis
<include file="filename" path="tagpath[@name='id']" />

Parámetros
filename
Obligatorio. El nombre del archivo que contiene la documentación. El nombre de archivo se puede calificar con una
ruta de acceso. Escriba filename entre comillas dobles ("").
tagpath
Obligatorio. La ruta de acceso de las etiquetas de filename que conduce a la etiqueta name . Escriba la ruta de
acceso entre comillas dobles ("").
name
Obligatorio. Especificador de nombre en la etiqueta que precede a los comentarios. Name tendrá un id .
id
Obligatorio. El identificador de la etiqueta que precede a los comentarios. Incluya el identificador entre comillas
simples (' ').

Comentarios
Use la etiqueta <include> para hacer referencia a los comentarios de otro archivo que describen los tipos y
miembros del código fuente. Esto es una alternativa a colocar los comentarios de documentación directamente en
el archivo de código fuente.
La etiqueta <include> usa la recomendación W3C XML Path Language (XPath) versión 1,0. Para obtener más
información acerca de cómo personalizar el uso de <include> , vea https://www.w3.org/TR/xpath.

Ejemplo
En este ejemplo se usa la etiqueta <include> para importar los comentarios de documentación de los miembros
de un archivo denominado commentFile.xml .

''' <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
El formato del commentFile.xml es el siguiente.

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

Vea también
Etiquetas XML para comentarios
lista de <> (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Define una lista o una tabla.

Sintaxis
<list type="type">
<listheader>
<term>term</term>
<description>description</description>
</listheader>
<item>
<term>term</term>
<description>description</description>
</item>
</list>

Parámetros
type
El tipo de la lista. Debe ser una "viñeta" para una lista con viñetas, "número" para una lista numerada o "tabla" para
una tabla de dos columnas.
term
Solo se usa cuando type es "Table". Un término para definir, que se define en la etiqueta de descripción.
description
Cuando type es "Bullet" o "Number", description es un elemento de la lista cuando type es "Table" description
es la definición de term .

Comentarios
El bloque <listheader> define el encabezado de una tabla o de una lista de definiciones. Al definir una tabla, solo
tiene que proporcionar una entrada para term en el encabezado.
Cada elemento de la lista se especifica con un bloque <item> . Al crear una lista de definiciones, debe especificar
term y description . Sin embargo, para una tabla, una lista con viñetas o una lista numerada, solo tiene que
proporcionar una entrada para description .
Una lista o una tabla puede tener tantos bloques de <item> como sea necesario.
Compile con -doc para procesar los comentarios de documentación de un archivo.

Ejemplo
En este ejemplo se usa la etiqueta <list> para definir una lista con viñetas en la sección Comentarios.
''' <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

Vea también
Etiquetas XML para comentarios
<para > (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica que el contenido está formateado como un párrafo.

Sintaxis
<para>content</para>

Parámetros
content
El texto del párrafo.

Comentarios
La etiqueta <para> es para su uso dentro de una etiqueta, como <> de Resumen, <comentarios >o <devuelve >y
permite agregar la estructura al texto.
Compile con -doc para procesar los comentarios de documentación de un archivo.

Ejemplo
En este ejemplo se usa la etiqueta <para> para dividir la sección Comentarios para el método UpdateRecord en
dos párrafos.

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

Vea también
Etiquetas XML para comentarios
<> de parámetros (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Define un nombre de parámetro y una descripción.

Sintaxis
<param name="name">description</param>

Parámetros
name
Nombre de un parámetro de método. Ponga el nombre entre comillas dobles (" ").
description
Descripción del parámetro.

Comentarios
La etiqueta <param> debe usarse en el comentario de una declaración de método para describir uno de los
parámetros del método.
El texto de la etiqueta <param> aparecerá en las siguientes ubicaciones:
Información de parámetros de IntelliSense. Para obtener más información, vea Using IntelliSense.
Examinador de objetos. Para obtener más información, vea Ver la estructura del código.
Compile con -doc para procesar los comentarios de documentación de un archivo.

Ejemplo
En este ejemplo se usa la etiqueta <param> para describir el parámetro id .

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

Vea también
Etiquetas XML para comentarios
<paramref > (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Da formato a una palabra como parámetro.

Sintaxis
<paramref name="name"/>

Parámetros
name
Nombre del parámetro al que se hace referencia. Ponga el nombre entre comillas dobles (" ").

Comentarios
La etiqueta <paramref> proporciona una manera de indicar que una palabra es un parámetro. El archivo XML se
puede procesar para dar formato a este parámetro de alguna manera distinta.
Compile con -doc para procesar los comentarios de documentación de un archivo.

Ejemplo
En este ejemplo se usa la etiqueta <paramref> para hacer referencia al parámetro id .

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

Vea también
Etiquetas XML para comentarios
<> de permisos (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica un permiso necesario para el miembro.

Sintaxis
<permission cref="member">description</permission>

Parámetros
member
Referencia a un miembro o campo al cual se puede llamar desde el entorno de compilación actual. El compilador
comprueba si el elemento de código dado existe y traduce member al nombre de elemento canónico en la salida
XML. Escriba member entre comillas ("").
description
Descripción del acceso al miembro.

Comentarios
Use la etiqueta <permission> para documentar el acceso de un miembro. Utilice la clase PermissionSet para
especificar el acceso a un miembro.
Compile con -doc para procesar los comentarios de documentación de un archivo.

Ejemplo
En este ejemplo se usa la etiqueta <permission> para describir que el método ReadFile requiere la
FileIOPermission.

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

Vea también
Etiquetas XML para comentarios
<Comentarios > (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica una sección de comentarios para el miembro.

Sintaxis
<remarks>description</remarks>

Parámetros
description
Descripción del miembro.

Comentarios
Use la etiqueta <remarks> para agregar información sobre un tipo, complementando la información especificada
con <> de Resumen.
Esta información aparece en el Examinador de objetos. Para obtener información sobre el Examinador de objetos,
vea ver la estructura del código.
Compile con -doc para procesar los comentarios de documentación de un archivo.

Ejemplo
En este ejemplo se usa la etiqueta <remarks> para explicar lo que hace el método UpdateRecord .

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

Vea también
Etiquetas XML para comentarios
<devuelve > (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica el valor devuelto de la propiedad o función.

Sintaxis
<returns>description</returns>

Parámetros
description
Descripción del valor devuelto.

Comentarios
Use la etiqueta <returns> del comentario para una declaración de método que describa el valor devuelto.
Compile con -doc para procesar los comentarios de documentación de un archivo.

Ejemplo
En este ejemplo se usa la etiqueta <returns> para explicar lo que devuelve la función DoesRecordExist .

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

Vea también
Etiquetas XML para comentarios
<Ver > (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica un vínculo a otro miembro.

Sintaxis
<see cref="member"/>

Parámetros
member
Referencia a un miembro o campo al cual se puede llamar desde el entorno de compilación actual. El compilador
comprueba si el elemento de código dado existe y pasa member al nombre de elemento en el resultado XML.
member debe aparecer entre comillas dobles (" ").

Comentarios
Use la etiqueta <see> para especificar un vínculo desde dentro del texto. Use <> seeAlso para indicar el texto que
desea que aparezca en la sección "vea también".
Compile con -doc para procesar los comentarios de documentación de un archivo.

Ejemplo
En este ejemplo se usa la etiqueta <see> de la sección UpdateRecord notas para hacer referencia al método
DoesRecordExist .

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

Vea también
Etiquetas XML para comentarios
<seealso > (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica un vínculo que aparece en la sección Vea también.

Sintaxis
<seealso cref="member"/>

Parámetros
member
Referencia a un miembro o campo al cual se puede llamar desde el entorno de compilación actual. El compilador
comprueba si el elemento de código dado existe y pasa member al nombre de elemento en el resultado XML.
member debe aparecer entre comillas dobles (" ").

Comentarios
Use la etiqueta <seealso> para especificar el texto que desea que aparezca en la sección Vea también. Use <see>
para especificar un vínculo desde dentro del texto.
Compile con -doc para procesar los comentarios de documentación de un archivo.

Ejemplo
En este ejemplo se usa la etiqueta <seealso> de la sección DoesRecordExist notas para hacer referencia al método
UpdateRecord .

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

Vea también
Etiquetas XML para comentarios
> de Resumen de <(Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica el resumen del miembro.

Sintaxis
<summary>description</summary>

Parámetros
description
Resumen del objeto.

Comentarios
Use la etiqueta <summary> para describir un tipo o un miembro de tipo. Use <remarks> para agregar información
adicional a una descripción de tipo.
El texto de la etiqueta <summary> es el único origen de información sobre el tipo en IntelliSense y también se
muestra en el Examinador de objetos. Para obtener información sobre el Examinador de objetos, vea ver la
estructura del código.
Compile con -doc para procesar los comentarios de documentación de un archivo.

Ejemplo
En este ejemplo se usa la etiqueta <summary> para describir el método ResetCounter y la propiedad Counter .

''' <summary>
''' Resets the value 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

Vea también
Etiquetas XML para comentarios
<typeparam > (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Define un nombre de parámetro de tipo y una descripción.

Sintaxis
<typeparam name="name">description</typeparam>

Parámetros
name
Nombre del parámetro de tipo. Ponga el nombre entre comillas dobles (" ").
description
Descripción del parámetro de tipo.

Comentarios
Use la etiqueta <typeparam> del comentario para un tipo genérico o una declaración de miembro genérico para
describir uno de los parámetros de tipo.
Compile con -doc para procesar los comentarios de documentación de un archivo.

Ejemplo
En este ejemplo se usa la etiqueta <typeparam> para describir el parámetro id .

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

Vea también
Etiquetas XML para comentarios
> de valor <(Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica la descripción de una propiedad.

Sintaxis
<value>property-description</value>

Parámetros
property-description
Una descripción de la propiedad.

Comentarios
Use la etiqueta <value> para describir una propiedad. Tenga en cuenta que al agregar una propiedad mediante el
Asistente para código en el entorno de desarrollo de Visual Studio, se agregará una etiqueta <summary > para la
nueva propiedad. Después, debe agregar manualmente una etiqueta de <value> para describir el valor que
representa la propiedad.
Compile con -doc para procesar los comentarios de documentación de un archivo.

Ejemplo
En este ejemplo se usa la etiqueta <value> para describir el valor que contiene la propiedad Counter .

''' <summary>
''' Resets the value 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

Vea también
Etiquetas XML para comentarios
Propiedades de eje XML (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

En los temas de esta sección se documenta la sintaxis de las propiedades del eje XML en Visual Basic. Las
propiedades del eje XML facilitan el acceso a XML directamente en el código.

Esta sección
T EM A DESC RIP C IÓ N

Propiedad del eje de atributo XML Describe cómo obtener acceso a los atributos de un objeto
XElement.

Propiedad del eje secundario XML Describe cómo obtener acceso a los elementos secundarios
de un objeto XElement.

Propiedad del eje descendiente XML Describe cómo obtener acceso a los descendientes de un
objeto XElement.

Propiedad de indexador de extensión Describe cómo obtener acceso a los elementos individuales
de una colección de objetos XElement o XAttribute.

Propiedad de valor XML Describe cómo obtener acceso al valor del primer elemento
de una colección de objetos XElement o XAttribute.

Vea también
XML
Propiedad de eje para atributos XML (Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

Proporciona acceso al valor de un atributo para un XElement objeto o al primer elemento de una colección de
objetos XElement.

Sintaxis
object.@attribute
' -or-
object.@<attribute>

Elementos
object
Obligatorio. Objeto XElement o colección de objetos XElement.
.@
Obligatorio. Denota el inicio de una propiedad de eje de atributo.
<
Opcional. Denota el principio del nombre del atributo cuando attribute no es un identificador válido en Visual
Basic.
attribute
Obligatorio. Nombre del atributo al que se va a tener acceso, con el formato [ prefix :] name .

PA RT E DESC RIP C IÓ N

prefix Opcional. Prefijo de espacio de nombres XML para el atributo.


Debe ser un espacio de nombres XML global definido con una
instrucción Imports .

name Obligatorio. Nombre del atributo local. Vea nombres de


atributos y elementos XML declarados.

>
Opcional. Denota el final del nombre del atributo cuando attribute no es un identificador válido en Visual Basic.

Valor devuelto
Cadena que contiene el valor de attribute . Si el nombre de atributo no existe, se devuelve Nothing .

Comentarios
Puede usar una propiedad de eje de atributo XML para tener acceso al valor de un atributo por nombre desde un
objeto XElement o desde el primer elemento de una colección de objetos XElement. Puede recuperar un valor de
atributo por nombre o agregar un nuevo atributo a un elemento especificando un nuevo nombre precedido por el
identificador @.
Cuando se hace referencia a un atributo XML mediante el identificador @, el valor del atributo se devuelve como
una cadena y no es necesario especificar explícitamente la propiedad Value.
Las reglas de nomenclatura para los atributos XML difieren de las reglas de nomenclatura para los identificadores
de Visual Basic. Para obtener acceso a un atributo XML que tiene un nombre que no es un identificador de Visual
Basic válido, incluya el nombre entre corchetes angulares (< y >).

Espacios de nombres XML


El nombre de una propiedad de eje de atributo solo puede usar prefijos de espacio de nombres XML declarados
globalmente mediante la instrucción Imports . No puede utilizar prefijos de espacio de nombres XML declarados
localmente dentro de literales de elemento XML. Para obtener más información, vea instrucción Imports (espacio
de nombres XML).

Ejemplo
En el ejemplo siguiente se muestra cómo obtener los valores de los atributos XML denominados type de una
colección de elementos XML que se denominan phone .

' 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 muestra el siguiente texto:


<phoneTypes>

<type>home</type>

<type>work</type>

</phoneTypes>

Ejemplo
En el ejemplo siguiente se muestra cómo crear atributos para un elemento XML mediante declaración, como parte
del XML, y dinámicamente agregando un atributo a una instancia de un objeto XElement. El atributo type se crea
mediante declaración y el atributo owner se crea dinámicamente.

Dim phone2 As XElement = <phone type="home">206-555-0144</phone>


phone2.@owner = "Harris, Phyllis"

Console.WriteLine(phone2)

Este código muestra el siguiente texto:


<phone type="home" owner="Harris, Phyllis">206-555-0144</phone>

Ejemplo
En el ejemplo siguiente se usa la sintaxis de corchetes angulares para obtener el valor del atributo XML
denominado number-type , que no es un identificador válido en Visual Basic.

Dim phone As XElement =


<phone number-type=" work">425-555-0145</phone>

Console.WriteLine("Phone type: " & phone.@<number-type>)

Este código muestra el siguiente texto:


Phone type: work

Ejemplo
En el ejemplo siguiente se declara ns como un prefijo de espacio de nombres XML. A continuación, usa el prefijo
del espacio de nombres para crear un literal XML y acceder al primer nodo secundario con el nombre completo "
ns:name ".

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 muestra el siguiente texto:


Phone type: home

Vea también
XElement
Propiedades del eje XML
Literales XML
Crear XML en Visual Basic
Nombres de atributos y elementos XML declarados
Propiedades de eje secundario XML (Visual Basic)
08/01/2020 • 4 minutes to read • Edit Online

Proporciona el acceso a los elementos secundarios de uno de los siguientes: un objeto XElement, un objeto
XDocument, una colección de objetos XElement o una colección de objetos XDocument.

Sintaxis
object.<child>

Componentes de
T ÉRM IN O DE ESQ UEM A JSO N

object Obligatoria. Un objeto XElement, un objeto XDocument, una


colección de objetos XElement o una colección de objetos
XDocument.

.< Obligatoria. Denota el inicio de una propiedad de eje


secundario.

child Obligatoria. Nombre de los nodos secundarios a los que se va


a tener acceso, con el formato [prefix:]name .

- Prefix : opcional. Prefijo de espacio de nombres XML para


el nodo secundario. Debe ser un espacio de nombres XML
global definido con una instrucción Imports .
- Name : necesario. Nombre del nodo secundario local. Vea
nombres de atributos y elementos XML declarados.

> Obligatoria. Denota el final de una propiedad de eje


secundario.

Valor devuelto
Una colección de objetos XElement.

Notas
Puede usar una propiedad de eje secundario XML para tener acceso a los nodos secundarios por nombre desde un
objeto XElement o XDocument, o desde una colección de objetos XElement o XDocument. Utilice la propiedad XML
Value para tener acceso al valor del primer nodo secundario de la colección devuelta. Para obtener más
información, vea propiedad valor XML.
El compilador Visual Basic convierte las propiedades del eje secundario en llamadas al método Elements.

Espacios de nombres XML


El nombre de una propiedad de eje secundario puede usar únicamente prefijos de espacios de nombres XML
declarados globalmente con la instrucción Imports . No puede utilizar prefijos de espacio de nombres XML
declarados localmente dentro de literales de elemento XML. Para obtener más información, vea instrucción
Imports (espacio de nombres XML).

Ejemplo
En el ejemplo siguiente se muestra cómo obtener acceso a los nodos secundarios llamados phone desde el objeto
contact .

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 muestra el siguiente texto:


Home Phone = 206-555-0144

Ejemplo
En el ejemplo siguiente se muestra cómo tener acceso a los nodos secundarios denominados phone desde la
colección devuelta por la propiedad contact del eje secundario del objeto contacts .

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 muestra el siguiente texto:


Home Phone = 206-555-0144

Ejemplo
En el ejemplo siguiente se declara ns como un prefijo de espacio de nombres XML. A continuación, se usa el
prefijo del espacio de nombres para crear un literal XML y obtener acceso al primer nodo secundario con el
nombre completo ns:name .
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 muestra el siguiente texto:


Patrick Hines

Vea también
XElement
Propiedades del eje XML
Literales XML
Crear XML en Visual Basic
Nombres de atributos y elementos XML declarados
Propiedad de eje descendiente XML Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Proporciona acceso a los descendientes de los elementos siguientes: un objeto XElement, un objeto XDocument,
una colección de objetos XElement o una colección de objetos XDocument.

Sintaxis
object...<descendant>

Elementos
object Obligatorio. Un objeto XElement, un objeto XDocument, una colección de objetos XElement o una
colección de objetos XDocument.
...< Obligatorio. Denota el inicio de una propiedad de eje descendiente.
descendant Obligatorio. Nombre de los nodos descendientes a los que se va a tener acceso, con el formato [
prefix:]name .

PA RT E DESC RIP C IÓ N

prefix Opcional. Prefijo de espacio de nombres XML para el nodo


descendiente. Debe ser un espacio de nombres XML global
que se define mediante una instrucción Imports .

name Obligatorio. Nombre local del nodo descendiente. Vea


nombres de atributos y elementos XML declarados.

> Obligatorio. Denota el final de una propiedad de eje descendiente.

Valor devuelto
Una colección de objetos XElement.

Comentarios
Puede usar una propiedad de eje descendiente XML para tener acceso a los nodos descendientes por nombre de
un objeto XElement o XDocument, o de una colección de objetos XElement o XDocument. Utilice la propiedad
Value XML para tener acceso al valor del primer nodo descendiente de la colección devuelta. Para obtener más
información, vea propiedad valor XML.
El compilador Visual Basic convierte las propiedades de los ejes descendientes en llamadas al método
Descendants.

Espacios de nombres XML


El nombre de una propiedad de eje descendiente solo puede utilizar espacios de nombres XML declarados
globalmente con la instrucción Imports . No puede utilizar espacios de nombres XML declarados localmente
dentro de literales de elemento XML. Para obtener más información, vea instrucción Imports (espacio de nombres
XML).

Ejemplo
En el ejemplo siguiente se muestra cómo obtener acceso al valor del primer nodo descendiente denominado name
y los valores de todos los nodos descendientes denominados phone del objeto contacts .

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 muestra el siguiente texto:


Name: Patrick Hines

Home Phone = 206-555-0144

Ejemplo
En el ejemplo siguiente se declara ns como un prefijo de espacio de nombres XML. A continuación, usa el prefijo
del espacio de nombres para crear un literal XML y tener acceso al valor del primer nodo secundario con el nombre
completo ns:name .

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 muestra el siguiente texto:


Name: Patrick Hines

Vea también
XElement
Propiedades del eje XML
Literales XML
Crear XML en Visual Basic
Nombres de atributos y elementos XML declarados
Propiedad de indizador de extensión (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Proporciona acceso a los elementos individuales de una recopilación.

Sintaxis
object(index)

Elementos
T ÉRM IN O DEF IN IC IÓ N

object Obligatorio. Colección consultable. Es decir, una colección que


implementa IEnumerable<T> o IQueryable<T>.

( Obligatorio. Denota el inicio de la propiedad de indizador.

index Obligatorio. Expresión de tipo entero que especifica la posición


de base cero de un elemento de la colección.

) Obligatorio. Denota el final de la propiedad de indizador.

Valor devuelto
Objeto de la ubicación especificada en la colección, o Nothing si el índice está fuera del intervalo.

Comentarios
Puede usar la propiedad de indizador de extensión para tener acceso a los elementos individuales de una
colección. Esta propiedad de indizador se utiliza normalmente en la salida de las propiedades del eje XML. Las
propiedades XML secundario y del eje descendiente XML devuelven colecciones de objetos XElement o un valor de
atributo.
El compilador Visual Basic convierte las propiedades de indizador de extensión en llamadas al método
ElementAtOrDefault . A diferencia de un indizador de matriz, el método ElementAtOrDefault devuelve Nothing si el
índice está fuera del intervalo. Este comportamiento es útil cuando no se puede determinar fácilmente el número
de elementos de una colección.
Esta propiedad de indizador es como una propiedad de extensión para las colecciones que implementan
IEnumerable<T> o IQueryable<T>: solo se usa si la colección no tiene un indizador o una propiedad
predeterminada.
Para tener acceso al valor del primer elemento de una colección de objetos XElement o XAttribute, puede usar la
propiedad Value XML. Para obtener más información, vea propiedad valor XML.

Ejemplo
En el ejemplo siguiente se muestra cómo usar el indizador de extensión para tener acceso al segundo nodo
secundario de una colección de objetos XElement. Se tiene acceso a la colección mediante la propiedad del eje
secundario, que obtiene todos los elementos secundarios denominados phone en el objeto contact .

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 muestra el siguiente texto:


Second phone number: 425-555-0145

Vea también
XElement
Propiedades del eje XML
Literales XML
Crear XML en Visual Basic
Propiedad de valor XML
Value (Propiedad XML) (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Proporciona acceso al valor del primer elemento de una colección de objetos XElement.

Sintaxis
object.Value

Elementos
T ÉRM IN O DEF IN IC IÓ N

object Obligatorio. Una colección de objetos XElement.

Valor devuelto
String que contiene el valor del primer elemento de la colección, o Nothing si la colección está vacía.

Comentarios
La propiedad Value facilita el acceso al valor del primer elemento de una colección de objetos XElement. Esta
propiedad comprueba primero si la colección contiene al menos un objeto. Si la colección está vacía, esta
propiedad devuelve Nothing . De lo contrario, esta propiedad devuelve el valor de la Value propiedad del primer
elemento de la colección.

NOTE
Cuando se tiene acceso al valor de un atributo XML mediante el identificador '@', el valor de atributo se devuelve como un
String y no es necesario especificar explícitamente la propiedad Value.

Para tener acceso a otros elementos de una colección, puede usar la propiedad de indizador de extensión XML.
Para más información, consulte extensión de la propiedad Indexer.

Herencia
La mayoría de los usuarios no tendrá que implementar IEnumerable<T>y, por tanto, puede omitir esta sección.
La propiedad Value es una propiedad de extensión para los tipos que implementan IEnumerable(Of XElement) . El
enlace de esta propiedad de extensión es como el enlace de métodos de extensión: Si un tipo implementa una de
las interfaces y define una propiedad con el nombre "Value", esa propiedad tiene prioridad sobre la propiedad de
extensión. En otras palabras, esta propiedad de Value se puede invalidar definiendo una nueva propiedad en una
clase que implementa IEnumerable(Of XElement) .

Ejemplo
En el ejemplo siguiente se muestra cómo utilizar la propiedad Value para tener acceso al primer nodo de una
colección de objetos XElement. En el ejemplo se usa la propiedad del eje secundario para obtener la colección de
todos los nodos secundarios denominados phone que se encuentran en el objeto contact .

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 muestra el siguiente texto:


Phone number: 206-555-0144

Ejemplo
En el ejemplo siguiente se muestra cómo obtener el valor de un atributo XML de una colección de objetos
XAttribute. En el ejemplo se usa la propiedad de eje de atributo para mostrar el valor del atributo type de todos
los elementos phone .

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 muestra el siguiente texto:

home
work

Vea también
XElement
IEnumerable<T>
Propiedades del eje XML
Literales XML
Crear XML en Visual Basic
Métodos de extensión
Propiedad de indexador de extensión
Propiedad del eje secundario XML
Propiedad del eje de atributo XML
Literales XML (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

En los temas de esta sección se documenta la sintaxis de los literales XML en Visual Basic. La sintaxis de los
literales XML permite incorporar XML directamente en el código.

Esta sección
T EM A DESC RIP C IÓ N

Literal de elemento XML Describe la sintaxis de literales que representan objetos


XElement.

Literal de documento XML Describe la sintaxis de literales que representan objetos


XDocument.

Literal de CDATA XML Describe la sintaxis de literales que representan objetos


XCData.

Literal de comentario XML Describe la sintaxis de literales que representan objetos


XComment.

Literal de instrucción de procesamiento XML Describe la sintaxis de literales que representan objetos
XProcessingInstruction.

Vea también
XML
Literal de elemento XML (Visual Basic)
27/11/2019 • 9 minutes to read • Edit Online

Literal que representa un objeto XElement.

Sintaxis
<name [ attributeList ] />
-or-
<name [ attributeList ] > [ elementContents ] </[ name ]>

Elementos
<

Obligatorio. Abre la etiqueta del elemento de inicio.


name

Obligatorio. Nombre del elemento. El formato es uno de los siguientes:


Texto literal del nombre del elemento, con el formato [ePrefix:]eName , donde:

PA RT E DESC RIP C IÓ N

ePrefix Opcional. Prefijo de espacio de nombres XML para el


elemento. Debe ser un espacio de nombres XML
global que se define con una instrucción Imports en
el archivo o en el nivel de proyecto, o un espacio de
nombres XML local que se define en este elemento o
en un elemento primario.

eName Obligatorio. Nombre del elemento. El formato es uno


de los siguientes:

: Texto literal. Vea nombres de atributos y elementos


XML declarados.
-Expresión insertada con el formato
<%= eNameExp %> . El tipo de eNameExp debe ser
String o un tipo que se pueda convertir
implícitamente a XName.

Expresión incrustada con el formato <%= nameExp %> . El tipo de nameExp debe ser String o un tipo
que se pueda convertir implícitamente en XName. No se permite una expresión incrustada en una
etiqueta de cierre de un elemento.
attributeList

Opcional. Lista de atributos declarados en el literal.


attribute [ attribute ... ]

Cada attribute tiene una de las siguientes sintaxis:


Asignación de atributos, con el formato [aPrefix:]aName=aValue , donde:

PA RT E DESC RIP C IÓ N

aPrefix Opcional. Prefijo de espacio de nombres XML para el


atributo. Debe ser un espacio de nombres XML global
que se define con una instrucción Imports o un
espacio de nombres XML local que se define en este
elemento o en un elemento primario.

aName Obligatorio. Nombre del atributo. El formato es uno


de los siguientes:

: Texto literal. Vea nombres de atributos y elementos


XML declarados.
-Expresión insertada con el formato
<%= aNameExp %> . El tipo de aNameExp debe ser
String o un tipo que se pueda convertir
implícitamente a XName.

aValue Opcional. Valor del atributo. El formato es uno de los


siguientes:

-Texto literal, entre comillas.


-Expresión insertada con el formato
<%= aValueExp %> . Se permite cualquier tipo.

Expresión incrustada con el formato <%= aExp %> .


/>

Opcional. Indica que el elemento es un elemento vacío, sin contenido.


>

Obligatorio. Finaliza la etiqueta de elemento inicial o vacía.


elementContents

Opcional. Contenido del elemento.


content [ content ... ]

Cada content puede ser una de las siguientes:


Texto literal. Todo el espacio en blanco de elementContents se convierte en significativo si hay texto
literal.
Expresión incrustada con el formato <%= contentExp %> .
Literal de elemento XML.
Literal de comentario XML. Vea literal de comentario XML.
Literal de instrucción de procesamiento XML. Vea literal de instrucción de procesamiento XML.
Literal de CDATA XML. Vea literal CDATA XML.
</[name]>

Opcional. Representa la etiqueta de cierre del elemento. No se permite el parámetro opcional name
cuando es el resultado de una expresión incrustada.
Valor devuelto
Un objeto XElement.

Comentarios
Puede usar la sintaxis de literales del elemento XML para crear XElement objetos en el código.

NOTE
Un literal XML puede abarcar varias líneas sin utilizar caracteres de continuación de línea. Esta característica permite copiar
contenido de un documento XML y pegarlo directamente en un programa Visual Basic.

Las expresiones incrustadas del formulario <%= exp %> permiten agregar información dinámica a un literal de
elemento XML. Para obtener más información, vea expresiones incrustadas en XML.
El compilador Visual Basic convierte el literal de elemento XML en llamadas al constructor XElement y, si es
necesario, el constructor XAttribute.

Espacios de nombres XML


Los prefijos de espacios de nombres XML son útiles cuando es necesario crear literales XML con elementos del
mismo espacio de nombres muchas veces en el código. Puede usar prefijos globales de espacio de nombres XML,
que se definen mediante la instrucción Imports , o prefijos locales, que se definen mediante la sintaxis del
atributo xmlns:xmlPrefix="xmlNamespace" . Para obtener más información, vea instrucción Imports (espacio de
nombres XML).
De acuerdo con las reglas de ámbito de los espacios de nombres XML, los prefijos locales tienen prioridad sobre
los prefijos globales. Sin embargo, si un literal XML define un espacio de nombres XML, ese espacio de nombres
no está disponible para las expresiones que aparecen en una expresión incrustada. La expresión incrustada solo
puede tener acceso al espacio de nombres XML global.
El compilador Visual Basic convierte cada espacio de nombres XML global utilizado por un literal XML en una
definición de espacio de nombres local en el código generado. Los espacios de nombres XML globales que no se
utilizan no aparecen en el código generado.

Ejemplo
En el ejemplo siguiente se muestra cómo crear un elemento XML simple que tiene dos elementos vacíos
anidados.

Dim test1 As XElement =


<outer>
<inner1></inner1>
<inner2/>
</outer>

Console.WriteLine(test1)

En el ejemplo se muestra el texto siguiente. Observe que el literal conserva la estructura de los elementos vacíos.

<outer>
<inner1></inner1>
<inner2 />
</outer>
Ejemplo
En el ejemplo siguiente se muestra cómo utilizar expresiones incrustadas para asignar un nombre a un elemento
y crear atributos.

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 muestra el siguiente texto:

<book isbn="1234" author="My Author" year="1999" title="My Book" />

Ejemplo
En el ejemplo siguiente se declara ns como un prefijo de espacio de nombres XML. A continuación, usa el prefijo
del espacio de nombres para crear un literal XML y muestra el formulario final del elemento.

' 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 muestra el siguiente texto:


<ns:outer xmlns:ns="http://SomeNamespace">
<ns:middle xmlns:ns="http://NewNamespace">
<ns:inner1 />
<inner2 xmlns="http://SomeNamespace" />
</ns:middle>
</ns:outer>

Observe que el compilador ha convertido el prefijo del espacio de nombres XML global en una definición de
prefijo para el espacio de nombres XML. El elemento <NS: Middle > vuelve a definir el prefijo de espacio de
nombres XML para el elemento de > <NS: inner1. Sin embargo, el elemento <NS: inner2 > utiliza el espacio de
nombres definido por la instrucción Imports .

Vea también
XElement
Nombres de atributos y elementos XML declarados
Literal de comentario XML
Literal de CDATA XML
Literales XML
Crear XML en Visual Basic
Expresiones incrustadas en XML
Imports (instrucción), espacio de nombres XML
Literal de documento XML (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Literal que representa un objeto XDocument.

Sintaxis
<?xml version="1.0" [encoding="encoding"] [standalone="standalone"] ?>
[ piCommentList ]
rootElement
[ piCommentList ]

Elementos
T ÉRM IN O DEF IN IC IÓ N

encoding Opcional. Texto literal que declara Qué codificación utiliza el


documento.

standalone Opcional. Texto literal. Debe ser "Yes" o "no".

piCommentList Opcional. Lista de instrucciones de procesamiento XML y


comentarios XML. Tiene el siguiente formato:

piComment [ piComment ... ]

Cada piComment puede ser una de las siguientes:

- literal de instrucción de procesamiento XML.


- literal de comentario XML.

rootElement Obligatorio. Elemento raíz del documento. El formato es uno


de los siguientes:

Literal de elemento XML.


Expresión incrustada con la forma <%= elementExp
%> . El elementExp devuelve uno de los siguientes:

Un objeto XElement.
Colección que contiene un objeto XElement y
cualquier número de objetos XComment y
XProcessingInstruction.

Para obtener más información, vea expresiones incrustadas en


XML.

Valor devuelto
Un objeto XDocument.
Comentarios
Un literal de documento XML se identifica mediante la declaración XML al principio del literal. Aunque cada literal
de documento XML debe tener exactamente un elemento XML raíz, puede tener cualquier número de instrucciones
de procesamiento XML y comentarios XML.
Un literal de documento XML no puede aparecer en un elemento XML.

NOTE
Un literal XML puede abarcar varias líneas sin utilizar caracteres de continuación de línea. Esto le permite copiar contenido de
un documento XML y pegarlo directamente en un programa de Visual Basic.

El compilador Visual Basic convierte el literal del documento XML en llamadas a los constructores XDocument y
XDeclaration.

Ejemplo
En el ejemplo siguiente se crea un documento XML que tiene una declaración XML, una instrucción de
procesamiento, un comentario y un elemento que contiene otro elemento.

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)

Vea también
XElement
XProcessingInstruction
XComment
XDocument
Literal de instrucción de procesamiento XML
Literal de comentario XML
Literal de elemento XML
Literales XML
Crear XML en Visual Basic
Expresiones incrustadas en XML
Literal de CDATA XML (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Literal que representa un objeto XCData.

Sintaxis
<![CDATA[content]]>

Elementos
<![CDATA[
Obligatorio. Denota el inicio de la sección XML CDATA.
content
Obligatorio. Contenido de texto para que aparezca en la sección XML CDATA.
]]>
Obligatorio. Denota el final de la sección.

Valor devuelto
Un objeto XCData.

Comentarios
Las secciones CDATA XML contienen texto sin formato que se debe incluir, pero no analizar, con el XML que lo
contiene. Una sección CDATA XML puede contener cualquier texto. Esto incluye los caracteres XML reservados. La
sección CDATA XML finaliza con la secuencia "]] >". Esto implica los puntos siguientes:
No se puede usar una expresión insertada en un literal CDATA XML porque los delimitadores de expresión
incrustados son contenido XML CDATA válido.
Las secciones CDATA XML no se pueden anidar porque content no pueden contener el valor "]] >".
Puede asignar un literal CDATA XML a una variable o incluirlo en un literal de elemento XML.

NOTE
Un literal XML puede abarcar varias líneas, pero no utiliza caracteres de continuación de línea. Esto le permite copiar
contenido de un documento XML y pegarlo directamente en un programa de Visual Basic.

El compilador Visual Basic convierte el literal CDATA XML en una llamada al constructor XCData.

Ejemplo
En el ejemplo siguiente se crea una sección CDATA que contiene el texto "puede contener etiquetas de > XML de
<literal".
Dim cdata As XCData = <![CDATA[Can contain literal <XML> tags]]>

Vea también
XCData
Literal de elemento XML
Literales XML
Crear XML en Visual Basic
Literal de comentario XML (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Literal que representa un objeto XComment.

Sintaxis
<!-- content -->

Elementos
T ÉRM IN O DEF IN IC IÓ N

<!-- Obligatorio. Denota el inicio del comentario XML.

content Obligatorio. Texto que se va a mostrar en el comentario XML.


No puede contener una serie de dos guiones (--) ni terminar
con un guión adyacente a la etiqueta de cierre.

--> Obligatorio. Denota el final del comentario XML.

Valor devuelto
Un objeto XComment.

Comentarios
Los literales de comentario XML no incluyen el contenido del documento; contienen información sobre el
documento. La sección de comentarios XML finaliza con la secuencia "-->". Esto implica los puntos siguientes:
No se puede usar una expresión insertada en un literal de comentario XML porque los delimitadores de
expresión incrustados son contenido de comentario XML válido.
Las secciones de comentarios XML no se pueden anidar porque content no pueden contener el valor "--
>".
Puede asignar un literal de comentario XML a una variable o puede incluirlo en un literal de elemento XML.

NOTE
Un literal XML puede abarcar varias líneas sin utilizar caracteres de continuación de línea. Esta característica permite copiar
contenido de un documento XML y pegarlo directamente en un programa Visual Basic.

El compilador Visual Basic convierte el literal de comentario XML en una llamada al constructor XComment.

Ejemplo
En el ejemplo siguiente se crea un comentario XML que contiene el texto "This is a comment".
Dim com As XComment = <!-- This is a comment -->

Vea también
XComment
Literal de elemento XML
Literales XML
Crear XML en Visual Basic
Literal de instrucción de procesamiento XML (Visual
Basic)
27/11/2019 • 2 minutes to read • Edit Online

Literal que representa un objeto XProcessingInstruction.

Sintaxis
<?piName [ = piData ] ?>

Elementos
<?
Obligatorio. Denota el inicio del literal de instrucción de procesamiento XML.
piName
Obligatorio. Nombre que indica la aplicación a la que se destina la instrucción de procesamiento. No puede
comenzar por "XML" o "XML".
piData
Opcional. Cadena que indica cómo la aplicación de destino piName debe procesar el documento XML.
?>
Obligatorio. Denota el final de la instrucción de procesamiento.

Valor devuelto
Un objeto XProcessingInstruction.

Comentarios
Los literales de instrucciones de procesamiento XML indican cómo deben procesar las aplicaciones un documento
XML. Cuando una aplicación carga un documento XML, la aplicación puede comprobar las instrucciones de
procesamiento XML para determinar cómo procesar el documento. La aplicación interpreta el significado de
piName y piData .

El literal de documento XML utiliza una sintaxis similar a la de la instrucción de procesamiento XML. Para obtener
más información, vea literal de documento XML.

NOTE
El elemento piName no puede comenzar con las cadenas "XML" o "XML", ya que la especificación XML 1,0 reserva esos
identificadores.

Puede asignar un literal de instrucción de procesamiento XML a una variable o incluirlo en un literal de
documento XML.
NOTE
Un literal XML puede abarcar varias líneas sin necesidad de caracteres de continuación de línea. Esto le permite copiar
contenido de un documento XML y pegarlo directamente en un programa de Visual Basic.

El compilador Visual Basic convierte el literal de instrucción de procesamiento XML en una llamada al constructor
XProcessingInstruction.

Ejemplo
En el ejemplo siguiente se crea una instrucción de procesamiento que identifica una hoja de estilos para un
documento XML.

Dim pi As XProcessingInstruction =
<?xml-stylesheet type="text/xsl" href="show_book.xsl"?>

Vea también
XProcessingInstruction
Literal de documento XML
Literales XML
Crear XML en Visual Basic
Mensajes de error (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Al escribir, compilar o ejecutar una aplicación de Visual Basic, pueden producirse los siguientes tipos de errores:
1. Errores en tiempo de diseño, que se producen al escribir una aplicación en Visual Studio.
2. Errores en tiempo de compilación, que se producen cuando se compila una aplicación en Visual Studio o en
un símbolo del sistema.
3. Errores en tiempo de ejecución, que se producen al ejecutar una aplicación en Visual Studio o como un
archivo ejecutable independiente.
Para obtener información sobre cómo solucionar un error específico, vea Recursos adicionales para
programadores de Visual Basic.

Errores en tiempo de ejecución


Si una aplicación Visual Basic intenta realizar una acción que el sistema no puede ejecutar, se produce un error en
tiempo de ejecución y Visual Basic inicia un objeto Exception . Visual Basic puede generar errores personalizados
de cualquier tipo de datos, incluidos Exception objetos, mediante la instrucción Throw . Una aplicación puede
identificar el error y mostrar el número de error y el mensaje de una excepción detectada. Si no se detecta ningún
error, la aplicación finaliza.
El código puede capturar y examinar los errores en tiempo de ejecución. Si se incluye el código que produce el
error en un bloque Try , puede capturar cualquier error producido dentro de un bloque Catch coincidente. Para
obtener información sobre cómo capturar errores en tiempo de ejecución y responder a ellos en el código, vea
Instrucción Try...Catch...Finally.

Errores en tiempo de compilación


Si el compilador de Visual Basic encuentra un problema en el código, se produce un error en tiempo de
compilación. En el Editor de código, puede identificar fácilmente qué línea de código provocó el error porque
aparece una línea ondulada debajo de la línea de código. Aparece el mensaje de error si selecciona la línea
ondulada o abre la lista de errores , en la que también se muestran otros mensajes.
Si un identificador tiene un subrayado ondulado y aparece un subrayado corto debajo del carácter situado más a
la derecha, puede generar un código auxiliar para la clase, el constructor, el método, la propiedad, el campo o la
enumeración. Para más información, vea Generar a partir del uso.
Si resuelve las advertencias del compilador de Visual Basic, puede escribir código que se ejecuta con mayor
rapidez y con menos errores. Estas advertencias identifican código que puede producir errores cuando se ejecuta
la aplicación. Por ejemplo, el compilador generará una advertencia cuando intente invocar un miembro de una
variable de objeto sin asignar, volver de una función sin establecer el valor devuelto o ejecutar un bloque Try con
errores en la lógica para detectar excepciones. Para más información sobre advertencias, incluidas las formas de
activarlas y desactivarlas, vea Configurar advertencias en Visual Basic.
'#ElseIf' debe ir precedida de la instrucción '#If' o
'#ElseIf' correspondiente
23/10/2019 • 2 minutes to read • Edit Online

#ElseIf es una directiva de compilación condicional. Un #ElseIf cláusula debe ir precedida por una coincidencia
#If o #ElseIf cláusula.
Identificador de error : BC30014

Para corregir este error


1. Compruebe que un carácter #If o #ElseIf no se ha separado de esto #ElseIf por un bloque de
compilación condicional intermedio o colocada incorrectamente #End If .
2. Si el #ElseIf está precedido por un #Else directiva, quite el #Else o cámbielo por un #ElseIf .
3. Si todo lo demás es correcto, agregue una directiva #If al principio del bloque de compilación condicional.

Vea también
#If...Then...#Else (directivas)
Las instrucciones '#Region' y '#End Region' no son
válidas en los cuerpos de método y operaciones
lambda de varias líneas
23/10/2019 • 2 minutes to read • Edit Online

El #Region bloque debe declararse en un nivel de clase, módulo o espacio de nombres. Una región contraíble
puede incluir uno o varios procedimientos, pero no puede comenzar ni terminar dentro de un procedimiento.
Identificador de error : BC32025

Para corregir este error


1. Asegúrese de que el procedimiento anterior esté terminado correctamente con un End Function o End Sub
instrucción.
2. Asegúrese de que el #Region y #End Region las directivas tienen el mismo bloque de código.

Vea también
#Region (directiva)
no se puede aplicar '<atributo > ' porque el formato
del GUID '<número > ' no es correcto
25/11/2019 • 2 minutes to read • Edit Online

Un bloque de atributos COMClassAttribute especifica un identificador único global (GUID) que no se ajusta al
formato adecuado para un GUID. COMClassAttribute utiliza GUID para identificar de forma única la clase, la interfaz
y el evento de creación.
Un GUID consta de 16 bytes, de los cuales los ocho primeros son numéricos y el resto son binarios. Se genera
mediante utilidades de Microsoft como Uuidgen. exe y se garantiza que es único en el espacio y en el tiempo.
Identificador de error : BC32500

Para corregir este error


1. Determine el GUID o los GUID correctos necesarios para identificar el objeto COM.
2. Asegúrese de que las cadenas del GUID presentadas en el bloque de atributos COMClassAttribute se copian
correctamente.

Vea también
Guid
Información general de atributos
'<classname >' no es conforme a CLS porque la
interfaz '<interfacename >' implementa no es
conforme a CLS
23/10/2019 • 2 minutes to read • Edit Online

Una clase o interfaz se marca como <CLSCompliant(True)> cuando se deriva (o lo implementa) de un tipo marcado
como <CLSCompliant(False)> o que no está marcado.
Para una clase o interfaz sea compatible con la independencia del lenguaje y componentes independientes del
lenguaje (CLS), su jerarquía de herencia completa debe ser compatible. Esto significa que cada tipo del que hereda,
directa o indirectamente, debe ser compatible. De forma similar, si una clase implementa una o varias interfaces,
todas deben conformes a lo largo de su jerarquía de herencia.
Al aplicar CLSCompliantAttribute a un elemento de programación, establezca el parámetro isCompliant del
atributo en True o False para indicar conformidad o disconformidad. No hay ningún valor predeterminado para
este parámetro, por lo que debe proporcionar uno.
Si no se aplica CLSCompliantAttribute a un elemento, se considera que no es conforme.
De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC40029

Para corregir este error


Si necesita compatibilidad con CLS, defina este tipo dentro de una jerarquía de herencia diferente para el
esquema de implementación.
Si requiere que este tipo permanezca dentro de su esquema de implementación o de la jerarquía de
herencia actuales, quite el CLSCompliantAttribute de su definición o márquelo como <CLSCompliant(False)> .
'<elementname >' está obsoleto (advertencia de
Visual Basic)
23/10/2019 • 2 minutes to read • Edit Online

Una instrucción intenta obtener acceso a un elemento de programación que se ha marcado con el atributo
ObsoleteAttribute y la directiva para tratarlo como una advertencia.
Puede marcar que un elemento de programación ya no está en uso aplicándole ObsoleteAttribute . Si lo hace,
puede establecer la propiedad IsError del atributo en True o False . Si se establece en True , el compilador trata
como un error los intentos de usar el elemento. Si se establece en False o se deja el valor predeterminado False ,
el compilador emite una advertencia si se produce un intento de usar el elemento.
De forma predeterminada, este mensaje es una advertencia, ya que la propiedad IsError de ObsoleteAttribute es
False . Para más información sobre cómo ocultar las advertencias o cómo tratarlas como errores, vea Configuring
Warnings in Visual Basic.
Identificador de error : BC40008

Para corregir este error


Asegúrese de que la referencia del código fuente escriba correctamente el nombre del elemento.

Vea también
Información general de atributos
'<eventname >' es un evento y no se puede llamar
directamente
23/10/2019 • 2 minutes to read • Edit Online

' < eventname >' es un evento y no se puede llamar directamente. Use un RaiseEvent instrucción para generar un
evento.
Una llamada a procedimiento especifica un evento para el nombre del procedimiento. Un controlador de eventos
es un procedimiento, pero el propio evento es un dispositivo de señalización, que debe generarse y controlarse.
Identificador de error : BC32022

Para corregir este error


1. Use un RaiseEvent instrucción para señalar un evento e invocar el procedimiento o procedimientos que lo
procesan.

Vea también
RaiseEvent (instrucción)
'<expresión >' no puede utilizarse como una
restricción de tipo
23/10/2019 • 2 minutes to read • Edit Online

Una lista de restricciones incluye una expresión que no representa una restricción válida en un parámetro de tipo.
Una lista de restricciones impone requisitos al argumento de tipo pasado al parámetro de tipo. Puede especificar
los requisitos siguientes en cualquier combinación:
El argumento de tipo debe implementar una o varias interfaces
El argumento de tipo debe heredar de al menos una clase
El argumento de tipo debe exponer un constructor sin parámetros al que el código de creación pueda
acceder (incluya la restricción New ).
Si no incluye ninguna clase o interfaz específica en la lista de restricciones, puede imponer un requisito más general
especificando uno de los elementos siguientes:
El argumento de tipo debe ser un tipo de valor (incluya la restricción Structure ).
El argumento de tipo debe ser un tipo de referencia (incluya la restricción Class ).
No es posible especificar Structure y Class para el mismo parámetro de tipo ni se pueden especificar estas
restricciones más de una vez.
Identificador de error : BC32061

Para corregir este error


Compruebe que la expresión y sus elementos estén escritos correctamente.
Si la expresión no cumple los requisitos de la lista de requisitos anterior, quítela de la lista de restricciones.
Si la expresión hace referencia a una interfaz o una clase, compruebe que el compilador tenga acceso a dicha
interfaz o clase. Puede que deba calificar su nombre y quizás tenga que agregar una referencia al proyecto.
Para obtener más información, vea "Referencias a proyectos" en References to Declared Elements.

Vea también
Generic Types in Visual Basic
Value Types and Reference Types
Referencias a elementos declarados
'<functionname >' no se ha declarado (Smart
Device/Visual Basic Error del compilador)
23/10/2019 • 2 minutes to read • Edit Online

< functionname > no se ha declarado. La funcionalidad de E/S de archivos está disponible normalmente en el
espacio de nombres Microsoft.VisualBasic , pero la versión de destino de .NET Compact Framework no la admite.
Identificador de error : BC30766

Para corregir este error


Realice operaciones de archivo con funciones definidas en el espacio de nombres System.IO .

Vea también
System.IO
Acceso a archivos con Visual Basic
'<nombreDeInterfaz >. <membername >' ya está
implementado por la clase base<nombredeclasebase
>'. Reimplementación de <tipo > supone
23/10/2019 • 2 minutes to read • Edit Online

Una propiedad, procedimiento o evento en una clase derivada utiliza una Implements cláusula que especifica un
miembro de interfaz que ya está implementado en la clase base.
Una clase derivada puede volver a implementar un miembro de interfaz implementado por su clase base. Esto no
es el mismo que reemplazar la implementación de la clase base. Para obtener más información, consulte
Implements.
De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC42015

Para corregir este error


Si piensa volver a implementar el miembro de interfaz, no es necesario realizar ninguna acción. Código de la
clase derivada tiene acceso al miembro nuevamente implementado a menos que use el MyBase palabra
clave para acceder a la implementación de la clase base.
Si no tiene pensado volver a implementar el miembro de interfaz, quite la cláusula Implements de la
declaración de propiedad, procedimiento o evento.

Vea también
Interfaces
'<palabra clave >' es válido solo dentro de un
método de instancia
23/10/2019 • 2 minutes to read • Edit Online

El Me , MyClass , y MyBase palabras clave que hacen referencia a instancias de clase específica. No se pueden
utilizar dentro de un compartido Function o Sub procedimiento.
Identificador de error : BC30043

Para corregir este error


Quite la palabra clave del procedimiento o quite la Shared palabra clave de la declaración de procedimiento.

Vea también
Asignación de variables de objeto
Me, My, MyBase y MyClass
Fundamentos de la herencia
'<membername > ' no puede exponer el tipo
'<TypeName > ' fuera del proyecto a través de
<containerType > '<containertypename > '
23/11/2019 • 2 minutes to read • Edit Online

Una variable, un parámetro de procedimiento o un valor devuelto de función se expone fuera de su contenedor,
pero se declara como un tipo que no se debe exponer fuera del contenedor.
El código esqueleto siguiente muestra una situación que genera este error.

Private Class privateClass


End Class
Public Class mainClass
Public exposedVar As New privateClass
End Class

Un tipo que se declara Protected , Friend , Protected Friend o Private está diseñado para tener acceso limitado
fuera de su contexto de declaración. Si se usa como el tipo de datos de una variable con acceso menos restringido,
se anularía este propósito. En el código de esqueleto anterior, exposedVar se Public y exponería privateClass al
código que no debería tener acceso a él.
Identificador de error : BC30909

Para corregir este error


Cambie el nivel de acceso de la variable, el parámetro de procedimiento o la función que debe ser al menos tan
restrictivo como el nivel de acceso de su tipo de datos.

Vea también
Niveles de acceso en Visual Basic
' <membername > ' es ambiguo en las interfaces
heredadas ' <interfacename1 > ' y ' <interfacename2
>'
23/10/2019 • 2 minutes to read • Edit Online

La interfaz hereda dos o más miembros con el mismo nombre de varias interfaces.
IDENTIFICADOR de error : BC30685

Para corregir este error


Convierta el valor a la interfaz base que desea utilizar; por ejemplo:

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

Vea también
Interfaces
<mensaje > Este error también podría ser debido a la
combinación de una referencia de archivo con una
referencia de proyecto al ensamblado
'<assemblyname >'
23/10/2019 • 2 minutes to read • Edit Online

<mensaje > Este error también podría ser debido a la combinación de una referencia de archivo con una referencia
de proyecto al ensamblado '<assemblyname >. En este caso, intente reemplazar la referencia de archivo a
'<nombredearchivodeensamblado >' en el proyecto '<projectname1 >' con una referencia de proyecto a
'<projectname2 >'.
Código del proyecto accede a un miembro de otro proyecto, pero la configuración de la solución no admite el
compilador de Visual Basic resolver la referencia.
Para obtener acceso a un tipo definido en otro ensamblado, el compilador de Visual Basic debe tener una referencia
a ese ensamblado. Debe ser una referencia única y no ambigua, que no produzca referencias circulares entre
proyectos.
Identificador de error : BC30971

Para corregir este error


1. Determine qué proyecto produce el mejor ensamblado para que el proyecto haga referencia a este. Para
tomar esta decisión, puede usar criterios como la facilidad de acceso a archivos y la frecuencia de las
actualizaciones.
2. En las propiedades del proyecto, agregue una referencia al proyecto que contiene el ensamblado que define
el tipo que está usando.

Vea también
Administrar referencias en un proyecto
Referencias a elementos declarados
Administrar propiedades de soluciones y proyectos
Solucionar problemas de referencias rotas
'<methodname >' tiene varias definiciones con firmas
idénticas
23/10/2019 • 2 minutes to read • Edit Online

Un Function o Sub declaración de procedimiento utiliza el procedimiento idéntico nombre y lista de argumentos
que una declaración anterior. Una posible causa es un intento de sobrecargar el procedimiento original. Los
procedimientos sobrecargados deben tener distintas listas de argumentos.
Identificador de error : BC30269

Para corregir este error


Cambiar el nombre del procedimiento o la lista de argumentos, o quite la declaración duplicada.

Vea también
Referencias a elementos declarados
Consideraciones sobre la sobrecarga de procedimientos
'<nombre >' es ambiguo en el espacio de nombres
'<namespacename >'
23/10/2019 • 2 minutes to read • Edit Online

Se proporcionó un nombre que es ambiguo y, por tanto, entra en conflicto con otro nombre. El compilador de
Visual Basic no tiene ninguna regla de resolución de conflictos; deben eliminar la ambigüedad de los nombres
usted mismo.
Identificador de error : BC30560

Para corregir este error


Use el nombre completo.

Vea también
Espacios de nombres en Visual Basic
Namespace (instrucción)
'<nombre1 >' es ambiguo y se ha importado de los
espacios de nombres o tipos<nombre2 >'
23/10/2019 • 2 minutes to read • Edit Online

Se proporcionó un nombre que es ambiguo y, por tanto, entra en conflicto con otro nombre. El compilador de
Visual Basic no tiene ninguna regla de resolución de conflictos; deben eliminar la ambigüedad de los nombres
usted mismo.
Identificador de error : BC30561

Para corregir este error


1. Eliminar la ambigüedad de nombre mediante la eliminación de importaciones de espacio de nombres.
2. Use el nombre completo.

Vea también
Imports (instrucción), espacio de nombres y tipo .NET
Espacios de nombres en Visual Basic
Namespace (instrucción)
el > <proceduresignature1 no es conforme a CLS
porque sobrecarga <proceduresignature2 > que
difiere de él solo en la matriz de tipos de parámetro
de matriz o en el rango de los tipos de parámetro de
matriz
23/10/2019 • 2 minutes to read • Edit Online

Un procedimiento o propiedad está marcado como <CLSCompliant(True)> cuando invalida otro procedimiento o
propiedad y la única diferencia entre sus listas de parámetros es el nivel de anidamiento de una matriz escalonada
o el rango de una matriz.
En las declaraciones siguientes, las declaraciones segunda y tercera generan este error:
Overloads Sub ProcessArray(arrayParam() As Integer)

Overloads Sub ProcessArray(arrayParam()() As Integer)

Overloads Sub ProcessArray(arrayParam(,) As Integer)

La segunda declaración cambia el parámetro unidimensional original arrayParam a una matriz de matrices. La
tercera declaración cambia arrayParam a una matriz bidimensional (rango 2). Aunque Visual Basic permite que las
sobrecargas solo difieran en uno de estos cambios, tal sobrecarga no es compatible con los componentes
independientes del lenguaje y del lenguaje (CLS).
Al aplicar CLSCompliantAttribute a un elemento de programación, establezca el parámetro isCompliant del
atributo en True o False para indicar conformidad o disconformidad. No hay ningún valor predeterminado para
este parámetro, por lo que debe proporcionar uno.
Si no se aplica CLSCompliantAttribute a un elemento, se considera que no es conforme.
De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
IDENTIFICADOR de error : BC40035

Para corregir este error


Si requiere la conformidad con CLS, defina las sobrecargas para que difieran entre sí de forma más distinta que
solo los cambios citados en esta página de ayuda.
Si necesita que las sobrecargas solo difieran en los cambios citados en esta página de ayuda, quite el
CLSCompliantAttribute de sus definiciones o márquelos como <CLSCompliant(False)> .

Vea también
Sobrecarga de procedimientos
Sobrecargas
" debe implementar "" para la interfaz """ />

<Type1 > '<TypeName > ' debe


implementar '<membername > '
para la interfaz '<InterfaceName
>'
23/11/2019 • 2 minutes to read • Edit Online

'<TypeName > ' debe implementar '<membername > ' para la interfaz
'<InterfaceName > '. La implementación de la propiedad debe tener
especificadores ' ReadOnly '/' WriteOnly ' coincidentes.
Una clase o estructura notifica a que implemente una interfaz pero no
implementa un procedimiento, una propiedad o un evento definidos por la
interfaz. Se deben implementar todos los miembros de la interfaz.
Identificador de error : BC30154

Para corregir este error


1. Declare un miembro con el mismo nombre y la misma signatura
que el definido en la interfaz. Asegúrese de incluir al menos la
instrucción End Function , End Sub o End Property .
2. Agregue una cláusula Implements al final de la instrucción
Function , Sub , Property o Event . Por ejemplo:

Public Event ItHappened() Implements IBaseInterface.ItHappened

3. Al implementar una propiedad, asegúrese de que ReadOnly o


WriteOnly se utiliza de la misma manera que en la definición de la
interfaz.
4. Al implementar una propiedad, declare Get y Set procedimientos,
según corresponda.

Vea también
Implements (instrucción)
Interfaces
" debe implementar "" para la interfaz """ />

<type1 > ' <typename > ' debe


implementar ' <methodname > '
para la interfaz ' <interfacename
>'
23/10/2019 • 2 minutes to read • Edit Online

Una clase o estructura notifica a que implemente una interfaz pero no


implementa un procedimiento definido por la interfaz. Se deben
implementar todos los miembros de la interfaz.
IDENTIFICADOR de error : BC30149

Para corregir este error


1. Declare un procedimiento con el mismo nombre y la misma
signatura que el definido en la interfaz. Asegúrese de incluir al
menos la instrucción End Function o End Sub .
2. Agregue una cláusula Implements al final de la instrucción
Function o Sub . Por ejemplo:

Public Sub DoSomething() Implements IBaseInterface.DoSomething

Vea también
Implements (instrucción)
Interfaces
'<typename >' no puede heredar de <tipo >
'<nombreDeTipoBase >' porque expande el acceso
de la base de <tipo > fuera del ensamblado
23/10/2019 • 2 minutes to read • Edit Online

Una clase o interfaz hereda de una clase base o interfaz, pero tiene un nivel de acceso menos restrictivo.
Por ejemplo, un Public interfaz hereda de un Friend interfaz, o un Protected clase hereda de un Private clase.
Esto expone la clase base o interfaz para tener acceso a más allá del nivel deseado.
Identificador de error : BC30910

Para corregir este error


Cambiar el nivel de acceso de la clase derivada o interfaz sea al menos tan restrictiva como de la clase base o
interfaz.
-o bien-
Si necesita el nivel de acceso menos restrictivo, quite el Inherits instrucción. No se puede heredar de una
clase base más restringido o interfaz.

Vea también
Class (instrucción)
Interface (instrucción)
Inherits (instrucción)
Niveles de acceso en Visual Basic
'<typename >' es un tipo delegado
23/10/2019 • 2 minutes to read • Edit Online

'<typename >' es un tipo delegado. Construcción de delegado permite una única expresión AddressOf como una
lista de argumentos. A menudo se puede usar una expresión de AddressOf en lugar de una construcción de
delegado.
Un New cláusula crea una instancia de una clase de delegado proporciona una lista de argumentos no válido al
constructor de delegado.
Puede proporcionar una sola AddressOf expresión al crear una nueva instancia de delegado.
Este error puede producirse si no pasa ningún argumento al constructor de delegado, si se pasa más de un
argumento, o si se pasa un único argumento que no es válido AddressOf expresión.
Identificador de error : BC32008

Para corregir este error


Usar una sola AddressOf expresión en la lista de argumentos para la clase de delegado en el New cláusula.

Vea también
New (operador)
AddressOf (operador)
Delegados
Cómo: Invocar un método delegado
'<typename >' es un tipo y no se puede usar como
una expresión.
23/10/2019 • 2 minutes to read • Edit Online

Aparece un nombre de tipo cuando se necesita una expresión. Las expresiones deben constar de la combinación de
variables, constantes, literales, propiedades y llamadas al procedimiento Function .
Identificador de error : BC30108

Para corregir este error


Quite el nombre de tipo y construya la expresión con elementos válidos.

Vea también
Operadores y expresiones
Un carácter de comilla doble no es un símbolo
(token) de comentario válido para campos
delimitados donde EscapeQuote está establecido en
True
25/11/2019 • 2 minutes to read • Edit Online

Se proporcionó una comilla como delimitador para TextFieldParser , pero EscapeQuotes está establecido en True .

Para corregir este error


Establezca EscapeQuotes en False .

Vea también
SetDelimiters
Delimiters
TextFieldParser
Leer archivos de texto delimitado por comas
Una llamada a una propiedad o un método no puede
incluir una referencia a un objeto privado como un
argumento o un valor de retorno
25/11/2019 • 2 minutes to read • Edit Online

Entre las causas posibles de este error se incluyen:


Un cliente invocó una propiedad o un método de un componente fuera de proceso e intentó pasar una
referencia a un objeto privado como uno de los argumentos.
Un componente fuera de proceso invocó un método de devolución de llamada en su cliente e intentó pasar
una referencia a un objeto privado.
Un componente fuera de proceso intentó pasar una referencia a un objeto privado como un argumento de
un evento que estaba generando.
Un cliente intentó asignar una referencia de objeto privado a un argumento ByRef de un evento que estaba
controlando.

Para corregir este error


1. Quite la referencia.

Vea también
Private
Se creó una referencia al ensamblado de
interoperabilidad ' <assembly1 > ' incrustado debido
a una referencia indirecta a ese ensamblado desde el
ensamblado ' <assembly2 > '
26/10/2019 • 2 minutes to read • Edit Online

Se ha creado una referencia al ensamblado de interoperabilidad "<ensamblado1>" insertado debido a una


referencia indirecta a dicho ensamblado desde el ensamblado "<ensamblado2>". Considere cambiar la propiedad
"Incrustar tipos de interoperabilidad" en uno de los ensamblados.
Ha agregado una referencia a un ensamblado (ensamblado1) cuya propiedad Embed Interop Types está establecida
en True . Esto indica al compilador que incruste la información de tipo de interoperabilidad desde este
ensamblado. Sin embargo, el compilador no puede incrustar información de tipo de interoperabilidad desde este
ese ensamblado porque otro ensamblado al que ha hecho referencia (ensamblado2) también hace referencia a este
ensamblado (ensamblado1) y tiene la propiedad Embed Interop Types establecida en False .

NOTE
Para el compilador de línea de comandos, el establecimiento de la propiedad Embed Interop Types de una referencia a
ensamblado en True equivale a hacer referencia al ensamblado utilizando la opción -link .

Identificador de error : BC40059

Para resolver esta advertencia


Para incrustar información de tipo de interoperabilidad para ambos ensamblados, establezca la propiedad
Embed Interop Types de todas las referencias a ensamblado1 en True .

Para quitar la advertencia, puede establecer la propiedad Embed Interop Types de ensamblado1 en False .
En este caso, un ensamblado de interoperabilidad primario (PIA) proporciona información de tipo de
interoperabilidad.

Vea también
-Link (Visual Basic)
Interoperating with Unmanaged Code (Interoperar con código no administrado)
No se ha especificado un formulario de inicio
25/11/2019 • 2 minutes to read • Edit Online

La aplicación usa la clase WindowsFormsApplicationBase pero no especifica el formulario de inicio.


Esto puede ocurrir si la casilla Habilitar marco de aplicación está activada en el diseñador de proyectos, pero no
se ha especificado el formulario de inicio . Para obtener más información, consulte Application Page, Project
Designer (Visual Basic).

Para corregir este error


1. Especifique un objeto de inicio para la aplicación.
Para obtener más información, consulte Application Page, Project Designer (Visual Basic).
2. Invalide el método OnCreateMainForm para establecer la propiedad MainForm en el formulario de inicio.

Vea también
WindowsFormsApplicationBase
OnCreateMainForm
MainForm
Información general sobre el modelo de aplicaciones de Visual Basic
Acceso de miembro compartido, miembro de
constante, miembro de enumeración o tipo anidado
a través de una instancia de; no se evaluará la
expresión de calificación
29/10/2019 • 3 minutes to read • Edit Online

Una variable de instancia de una clase o estructura se utiliza para tener acceso a una variable, una propiedad, un
procedimiento o un evento Shared definidos en esa clase o estructura. Esta advertencia también puede producirse
si se usa una variable de instancia para tener acceso a un miembro compartido implícitamente de una clase o
estructura, como una constante o una enumeración, o una clase o estructura anidada.
El propósito de compartir un miembro es crear una sola copia de ese miembro y hacer que esa copia única esté
disponible para cada instancia de la clase o estructura en la que se declara. Es coherente con este propósito para
tener acceso a un miembro Shared a través del nombre de su clase o estructura, en lugar de una variable que
contiene una instancia individual de esa clase o estructura.
El acceso a un miembro Shared a través de una variable de instancia puede hacer que el código sea más difícil de
entender si se oculta el hecho de que el miembro es Shared . Además, si dicho acceso forma parte de una
expresión que realiza otras acciones, como un procedimiento Function que devuelve una instancia del miembro
compartido, Visual Basic omite la expresión y cualquier otra acción que, de lo contrario, realizaría.
Para obtener más información y un ejemplo, vea Shared.
De forma predeterminada, este mensaje es una advertencia. Para más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC42025

Ejemplo
En el ejemplo siguiente se genera bc42025:

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 esta advertencia


Use el nombre de la clase o estructura que define el miembro Shared para tener acceso a él, tal como se muestra
en el ejemplo siguiente:
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

NOTE
Debe alertar sobre los efectos del ámbito cuando dos elementos de programación tienen el mismo nombre. En el ejemplo
anterior, si declara una instancia de mediante Dim testClass As TestClass = Nothing , el compilador trata una llamada a
testClass.SayHello() como un acceso al método a través del nombre de la clase y no se produce ninguna advertencia.

Vea también
Shared
Ámbito en Visual Basic
El operando 'AddressOf' debe ser el nombre de un
método (sin paréntesis)
29/10/2019 • 2 minutes to read • Edit Online

El operador AddressOf crea una instancia de delegado de procedimiento que hace referencia a un procedimiento
específico. La sintaxis es la siguiente:

AddressOf procedurename

Se han insertado paréntesis alrededor del argumento siguiente a AddressOf , donde no se necesita ninguno.
Identificador de error : BC30577

Ejemplo
En el ejemplo siguiente se genera bc30577:

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 corregir este error


1. Quite los paréntesis alrededor del argumento siguiente AddressOf como se muestra en el ejemplo siguiente:

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. Asegúrese de que el argumento es un nombre de método.

Vea también
AddressOf (operador)
Delegados
Error inesperado porque no se puede conseguir un
recurso del sistema operativo necesario para el inicio
de una instancia única
25/11/2019 • 2 minutes to read • Edit Online

La aplicación no pudo obtener un recurso de sistema operativo necesario. Algunas de las posibles causas de este
problema son:
La aplicación no tiene permisos para crear objetos de sistema operativo con nombre.
Common Language Runtime no tiene permisos para crear archivos asignados a memoria.
La aplicación necesita acceder a un objeto de sistema operativo, pero hay otro proceso que lo está utilizando.

Para corregir este error


1. Confirme que la aplicación tiene permisos suficientes para crear objetos de sistema operativo con nombre.
2. Confirme que Common Language Runtime tiene permisos suficientes para crear archivos asignados a
memoria.
3. Reinicie el equipo para borrar cualquier proceso que pueda estar haciendo uso del recurso necesario para
conectarse a la aplicación de instancia original.
4. Anote las circunstancias en las que se ha produjo el error y llame a los Servicios de soporte técnico de
Microsoft.

Vea también
Página de aplicación, Diseñador de proyectos (Visual Basic)
Conceptos básicos del depurador
Hable con nosotros
El nombre de miembro de tipo anónimo sólo se
puede inferir a partir de un nombre simple o
completo sin argumentos
29/10/2019 • 2 minutes to read • Edit Online

No se puede inferir un nombre de miembro de tipo anónimo a partir de una expresión compleja.
Identificador de error : BC36556

Ejemplo
En el ejemplo siguiente se genera BC36556:

Dim numbers() As Integer = { 1, 2, 3, 4, 5 }


Dim instanceName = New With {numbers(3)}

Para obtener más información sobre los orígenes de los que los tipos anónimos pueden y no pueden inferir
nombres y tipos de miembros, vea Cómo: inferir nombres y tipos de propiedades en declaraciones de tipos
anónimos.

Para corregir este error


Asigne la expresión a un nombre de miembro, como se muestra en el código siguiente:

Dim numbers() As Integer = { 1, 2, 3, 4, 5 }


Dim instanceName = New With { .number = numbers(3) }

Vea también
Tipos anónimos
Deducir tipos y nombres de propiedades en declaraciones de tipos anónimos
Argumento no opcional (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

El número y los tipos de argumentos deben coincidir con los esperados. Hay un número de argumentos incorrecto
o un argumento omitido no es opcional. Un argumento solo se puede omitir en una llamada a un procedimiento
definido por el usuario si se declaró Optional en la definición del procedimiento.

Para corregir este error


1. Proporcione todos los argumentos necesarios.
2. Asegúrese de que los argumentos omitidos son opcionales. Si no es así, proporcione el argumento en la
llamada o declare el parámetro Optional en la definición.

Vea también
Tipos de error
Los límites de matriz no pueden aparecer en los
especificadores de tipo
29/10/2019 • 2 minutes to read • Edit Online

Los tamaños de la matriz no se pueden declarar como parte de un especificador de tipo de datos.
Identificador de error : BC30638

Ejemplo
En el ejemplo siguiente se genera BC30638:

Dim array As Integer(8)

Para corregir este error


Especifique el tamaño de la matriz inmediatamente después del nombre de la variable en lugar de colocar el
tamaño de la matriz después del tipo, como se muestra en el ejemplo siguiente:

Dim array(8) As Integer

Defina una matriz e inicialícela con el número deseado de elementos, como se muestra en el ejemplo
siguiente:

Dim array() As Integer = New Integer(8) {}

Vea también
Matrices
Una matriz declarada como variable de control de
bucle no se puede declarar con un tamaño inicial
29/10/2019 • 2 minutes to read • Edit Online

Un bucle For Each usa una matriz como su variable de iteración, pero inicializa esa matriz.
Identificador de error : BC32039

Ejemplo
En el ejemplo siguiente se genera bc32039:

Dim arrayList As New List(Of Integer())


For Each listElement(1) As Integer In arrayList

Next

Para corregir este error


Quite la inicialización de la declaración de la variable de iteración tal y como se muestra en el ejemplo siguiente:

Dim arrayList As New List(Of Integer())


For Each listElement() As Integer In arrayList

Next

o bien, puede usar la inferencia de tipos:

Dim arrayList As New List(Of Integer())


For Each listElement In arrayList

Next

Vea también
For...Next (instrucción)
Matrices
Colecciones
Falta la expresión de subíndice de matriz
23/10/2019 • 2 minutes to read • Edit Online

Una inicialización de matriz deja al menos uno de los subíndices que definen los límites de la matriz. Por ejemplo, la
instrucción puede contener la expresión myArray (5,5,,10) , que deja el tercer subíndice.
Identificador de error : BC30306

Para corregir este error


Proporcione el subíndice que falta.

Vea también
Matrices
Las matrices declaradas como miembros de
estructura no se pueden declarar con un tamaño
inicial
23/10/2019 • 2 minutes to read • Edit Online

Una matriz de una estructura se declara con un tamaño inicial. No se puede inicializar ningún elemento de
estructura y declarar un tamaño de matriz es una forma de inicialización.
Identificador de error : BC31043

Ejemplo
En el ejemplo siguiente se genera BC31043:

Structure DemoStruct
Public demoArray(9) As Integer
End Structure

Para corregir este error


1. Defina la matriz en la estructura como dinámica (sin tamaño inicial).
2. Si necesita un determinado tamaño de matriz, puede redimensionar una matriz dinámica con una
instrucción ReDim cuando se esté ejecutando el código. Esto se ilustra en el siguiente ejemplo:

Structure DemoStruct
Public demoArray() As Integer
End Structure
Sub UseStruct()
Dim struct As DemoStruct
ReDim struct.demoArray(9)
Struct.demoArray(2) = 777
End Sub

Vea también
Matrices
Declarar una estructura
'As Any' no se admite en instrucciones 'Declare'
23/10/2019 • 2 minutes to read • Edit Online

El tipo de datos Any se usó con las instrucciones Declare en Visual Basic 6,0 y versiones anteriores para permitir
el uso de argumentos que podrían contener cualquier tipo de datos. Sin embargo, Visual Basic admite la
sobrecarga, por lo que hace que el tipo de datos Any esté obsoleto.
Identificador de error : BC30828

Para corregir este error


1. Declare los parámetros del tipo específico que desea usar; por ejemplo,.

Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" (


ByVal lpBuffer As String,
ByRef nSize As Integer) As Integer

2. Use el atributo MarshalAsAttribute para especificar As Any cuando se espera Void* en el procedimiento al
que se llama.

Declare Sub SetData Lib "..\LIB\UnmgdLib.dll" (


ByVal x As Short,
<System.Runtime.InteropServices.MarshalAsAttribute(
System.Runtime.InteropServices.UnmanagedType.AsAny)>
ByVal o As Object)

Vea también
MarshalAsAttribute
Tutorial: Llamar a las API de Windows
Declare (instrucción)
Crear prototipos en código administrado
El atributo '<attributeName > ' no se puede aplicar
varias veces
25/11/2019 • 2 minutes to read • Edit Online

El atributo solo se puede aplicar una vez. El atributo AttributeUsage determina si un atributo se puede aplicar más
de una vez.
Identificador de error : BC30663

Para corregir este error


1. Asegúrese de que el atributo solo se aplica una vez.
2. Si usa atributos personalizados desarrollados por usted, considere la posibilidad de cambiar su
AttributeUsage atributo para permitir el uso de varios atributos, como en el ejemplo siguiente.

<AttributeUsage(AllowMultiple := True)>

Vea también
AttributeUsageAttribute
Creación de atributos personalizados
AttributeUsage
Error de automatización
25/11/2019 • 2 minutes to read • Edit Online

Se ha producido un error al ejecutar un método u obtener o establecer una propiedad de una variable de objeto. El
error se notificó a través de la aplicación que creó el objeto.

Para corregir este error


1. Compruebe las propiedades del objeto Err para conocer el origen y naturaleza del error.
2. Use la instrucción On Error Resume Next justo antes de la instrucción de acceso y busque los errores justo
después de la instrucción de acceso.

Vea también
Tipos de error
Hable con nosotros
Valor de suma de comprobación incorrecto; no tiene
dígitos hexadecimales o el número de dígitos
hexadecimales es impar
31/10/2019 • 2 minutes to read • Edit Online

Un valor de suma de comprobación contiene dígitos hexadecimales no válidos o un número impar de dígitos.
Cuando ASP.NET genera un archivo de origen de Visual Basic (extensión .vb), calcula una suma de comprobación y
la coloca en un archivo se origen oculto que se identifica por medio de #externalchecksum . Un usuario también
puede generar un archivo .vb con el mismo fin, aunque lo más conveniente es dejar este proceso para uso interno.
De forma predeterminada, este mensaje es una advertencia. Para obtener información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC42033

Para corregir este error


1. Si ASP.NET genera el archivo de origen de Visual Basic, reinicie la compilación del proyecto.
2. Si esta advertencia persiste tras el reinicio, reinstale ASP.NET e intente compilar de nuevo.
3. Si la advertencia persiste o no usa ASP.NET, reúna información sobre las circunstancias y notifíquelo a los
Servicios de soporte técnico de Microsoft.

Vea también
ASP.NET Overview (Información general de ASP.NET)
Hable con nosotros
Convención de llamada a archivo DLL no válida
23/10/2019 • 2 minutes to read • Edit Online

Los argumentos pasados a una biblioteca de vínculos dinámicos (DLL) deben coincidir exactamente con los
esperados por la rutina. Convenciones de llamada ocupan de número, tipo y orden de los argumentos. El programa
puede estar llamando a una rutina en un archivo DLL que se pasa el tipo incorrecto o el número de argumentos.

Para corregir este error


1. Asegúrese de que todos los tipos de argumento coinciden con los especificados en la declaración de la
rutina que está llamando.
2. Asegúrese de que está pasando el mismo número de argumentos indicada en la declaración de la rutina que
está llamando.
3. Si la rutina de la DLL espera argumentos por valor, asegúrese de que ByVal se especifica para esos
argumentos en la declaración de la rutina.

Vea también
Tipos de error
Call (instrucción)
Declare (instrucción)
Modo de archivo incorrecto
23/10/2019 • 2 minutes to read • Edit Online

Las instrucciones que se utilizan para manipular el contenido del archivo deben ser adecuadas para el modo en que
se abrió el archivo. Entre las posibles causas se incluyen:
Un FilePutObject o FileGetObject instrucción especifica un archivo secuencial.
Un Print instrucción especifica un archivo abierto para un modo de acceso distinto Output o Append .
Un Input instrucción especifica un archivo abierto para un modo de acceso distinto Input

Se intenta escribir en un archivo de solo lectura.

Para corregir este error


Asegúrese de que FilePutObject y FileGetObject sólo hacen referencia a archivos abiertos para Random o
Binary acceso.

Asegúrese de que Print especifica un archivo abierto para cualquiera Output o Append modo de acceso.
Si no es así, utilice otra instrucción para colocar datos en el archivo o vuelva a abrir el archivo en un modo
adecuado.
Asegúrese de que Input especifica un archivo abierto para Input . Si no es así, utilice otra instrucción para
colocar datos en el archivo o vuelva a abrir el archivo en un modo adecuado.
Si está escribiendo en un archivo de solo lectura, cambie el estado de lectura/escritura del archivo o no
intente escribir en él.
Use la funcionalidad disponible en el objeto My.Computer.FileSystem .

Vea también
FileSystem
Solución de problemas: Leer y escribir en archivos de texto
Número o nombre de archivo incorrecto
23/10/2019 • 2 minutes to read • Edit Online

Se produjo un error al intentar obtener acceso al archivo especificado. Entre las posibles causas de este error son:
La instrucción hace referencia a un archivo con un nombre de archivo o un número que no se especificó en
el FileOpen instrucción o que se especificó en un FileOpen instrucción pero era posteriormente cerrado.
Una instrucción hace referencia a un archivo con un número que está fuera del intervalo del número de
archivos.
Una instrucción hace referencia a un nombre de archivo o un número que no es válido.

Para corregir este error


1. Asegúrese de que se especifica el nombre de archivo en un FileOpen instrucción. Tenga en cuenta que si se
ha invocado el FileClose instrucción sin argumentos, puede haber accidentalmente cerrado todos los
archivos abiertos.
2. Si el código genera números de archivo de forma algorítmica, asegúrese de que los números son válidos.
3. Compruebe los nombres de archivo para asegurarse de que se ajusten a las convenciones del sistema
operativo.

Vea también
FileOpen
Convenciones de nomenclatura de Visual Basic
Longitud de registro incorrecta
23/10/2019 • 2 minutes to read • Edit Online

Entre las causas posibles de este error se incluyen:


La longitud de una variable de registro especificada en un FileGet , FileGetObject , FilePut o
FilePutObject instrucción difiere de la longitud especificada en la correspondiente FileOpen instrucción.

La variable en un FilePut o FilePutObject instrucción es o incluye una cadena de longitud variable.


La variable en un FilePut o FilePutObject es o incluye un Variant tipo.

Para corregir este error


1. Asegúrese de que la suma de los tamaños de las variables de longitud fija en el tipo definido por el usuario
define el tipo de la variable de registro es el mismo que el valor se indica en la FileOpen la instrucción Len
cláusula.
2. Si la variable en un FilePut o FilePutObject instrucción es o incluye una cadena de longitud variable,
asegúrese de que la cadena de longitud variable tiene al menos 2 caracteres menor que la longitud de
registro especificada en el Len cláusula de la FileOpen instrucción.
3. Si la variable en un FilePut o FilePutObject es o incluye un Variant Asegúrese de que la cadena de
longitud variable es menor que la longitud del registro especificada en al menos 4 bytes el Len cláusula de
la FileOpen instrucción.

Vea también
FileGet
FileGetObject
FilePut
FilePutObject
Dado que no se espera esta llamada, la ejecución del
método actual continúa antes de que se complete la
llamada.
31/10/2019 • 9 minutes to read • Edit Online

Dado que no se esperaba esta llamada, la ejecución del método actual continuará antes de que se complete la
llamada. Considere la posibilidad de aplicar el operador Await al resultado de la llamada.
El método actual llama a un método asincrónico que devuelve un Task o un Task<TResult> y no aplica el operador
Await al resultado. La llamada al método asincrónico inicia una tarea asincrónica. Pero, dado que no se aplica
ningún operador Await , el programa continúa sin esperar a que la tarea concluya. En la mayoría de los casos, no
se espera ese comportamiento. Normalmente otros aspectos del método de llamada dependen de los resultados
de la llamada o, como mínimo, se espera que el método llamado se complete antes de volver del método que
contiene la llamada.
Otro problema igual de importante es lo que sucede con las excepciones que se producen en el método
asincrónico llamado. Una excepción que aparece en un método que devuelve un valor Task o Task<TResult> se
almacena en la tarea devuelta. Si no espera la tarea o comprueba explícitamente las excepciones, se perderá la
excepción. Si espera la tarea, su excepción se volverá a producir.
El procedimiento recomendado es esperar siempre la llamada.
De forma predeterminada, este mensaje es una advertencia. Para más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC42358

Para resolver esta advertencia


Considere la posibilidad de suprimir la advertencia solamente si está seguro de que no quiere esperar a que se
complete la llamada asincrónica y que el método llamado no producirá excepciones. En ese caso, puede suprimir la
advertencia asignando el resultado de la tarea de la llamada a una variable.
En el ejemplo siguiente se muestra cómo provocar la advertencia, cómo suprimirla y cómo esperar la llamada:
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

En el ejemplo, si elige Call #1 o Call #2, el método asincrónico no esperado ( CalledMethodAsync ) termina después
de que se completen su llamador ( CallingMethodAsync ) y el llamador del llamador ( StartButton_Click ). La última
línea de la salida siguiente muestra cuándo finaliza el método llamado. La entrada y la salida del controlador de
eventos que llama a CallingMethodAsync en el ejemplo completo se marcan en la salida.

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.

Ejemplo
La siguiente aplicación de Windows Presentation Foundation (WPF) contiene los métodos del ejemplo anterior. En
los pasos siguientes se configura la aplicación:
1. Cree una aplicación WPF y asígnele el nombre AsyncWarning .
2. En el Editor de código de Visual Studio, elija la pestaña MainWindow.xaml .
Si la pestaña no está visible, abra el menú contextual de MainWindow.xaml en el Explorador de
soluciones y elija Ver código .
3. Reemplace el código de la vista XAML de MainWindow. xaml por el código siguiente:

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

En la vista Diseño de MainWindow.xaml aparece una ventana simple que contiene un botón y un cuadro de
texto.
Para obtener más información sobre el Diseñador XAML, vea Tutorial: Crear una IU usando el Diseñador
XAML. Para obtener información sobre cómo crear su propia interfaz de usuario simple, vea las secciones
"To create a WPF application" (Para crear una aplicación WPF) y "To design a simple WPF MainWindow"
(Para diseñar una ventana MainWindow simple de WPF) de Walkthrough: Accessing the Web by Using
Async and Await (Tutorial: Acceso a la web usando async y await).
4. Reemplace el código en el archivo MainWindow.xaml.vb por el código siguiente.

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. Presione la tecla F5 para ejecutar el programa y elija el botón Inicio .


La salida esperada aparece al final del código.

Vea también
Await (operador)
Programación asincrónica con Async y Await
No se puede convertir un tipo anónimo en un árbol
de expresión porque se utiliza una propiedad del tipo
para inicializar otra propiedad.
29/10/2019 • 2 minutes to read • Edit Online

El compilador no acepta la conversión de un tipo anónimo en un árbol de expresión cuando se usa una propiedad
del tipo anónimo para inicializar otra propiedad del tipo anónimo. Por ejemplo, en el código siguiente, Prop1 se
declara en la lista de inicialización y, a continuación, se utiliza como valor inicial de Prop2 .
Identificador de error : BC36548

Ejemplo
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 corregir este error


Asigne el valor inicial de Prop1 a una variable local. Asigne esa variable a Prop1 y Prop2 , tal y como se muestra
en el código siguiente:

Sub Main()
Dim temp = 2
ExpressionExample(Function() New With {.Prop1 = temp, .Prop2 = temp})
End Sub

Vea también
Tipos anónimos (Visual Basic)
Árboles de expresión (Visual Basic)
Cómo: usar árboles de expresión para generar consultas dinámicas (Visual Basic)
No se puede crear el componente ActiveX
31/10/2019 • 2 minutes to read • Edit Online

Intentó poner un control ActiveX en un formulario en el tiempo de diseño o agregar un formulario a un proyecto
con un control ActiveX en él, pero no se pudo encontrar la información asociada correspondiente en el Registro.

Para corregir este error


Puede que la información en el Registro se haya eliminado o esté dañada. Reinstale el control ActiveX o póngase
en contacto con el proveedor del control.

Vea también
Tipos de error
Hable con nosotros
No se puede hacer referencia a '<name > ' porque es
miembro del campo con tipo de valor '<name > ' de
la clase '<className > ' que tiene ' System.
MarshalByRefObject ' como clase base
27/11/2019 • 2 minutes to read • Edit Online

La clase System.MarshalByRefObject habilita las aplicaciones que admiten el acceso remoto a objetos en los límites
del dominio de aplicación. Los tipos deben heredar de la clase MarshalByRejectObject cuando el tipo se utiliza en
los límites del dominio de aplicación. No se debe copiar el estado del objeto porque los miembros del objeto no se
pueden usar fuera del dominio de aplicación en el que se crearon.
Identificador de error : BC30310

Para corregir este error


1. Compruebe la referencia para asegurarse de que el miembro al que se hace referencia es válido.
2. Califique explícitamente el miembro con la palabra clave Me .

Vea también
MarshalByRefObject
Dim (instrucción)
No se puede hacer referencia a un miembro de
instancia de una clase desde un método compartido
o un inicializador de método compartido sin una
instancia explícita de la clase
27/11/2019 • 2 minutes to read • Edit Online

Ha intentado hacer referencia a un miembro no compartido de una clase desde un procedimiento compartido. En
el ejemplo siguiente se muestra este tipo de situación:

Class Sample
Public x as Integer
Public Shared Sub SetX()
x = 10
End Sub
End Class

En el ejemplo anterior, la instrucción de asignación x = 10 genera este mensaje de error. Esto se debe a que un
procedimiento compartido está intentando obtener acceso a una variable de instancia.
La variable x es un miembro de instancia porque no se ha declarado como Shared. Cada instancia de la clase
Sample contiene su propia variable individual x . Cuando una instancia establece o cambia el valor de x , no
afecta al valor de x en ninguna otra instancia.
Sin embargo, el procedimiento SetX se Shared entre todas las instancias de la clase Sample . Esto significa que no
está asociado a ninguna instancia de la clase, sino que funciona independientemente de las instancias individuales.
Dado que no tiene conexión con una instancia determinada, setX no puede tener acceso a una variable de
instancia. Debe funcionar solo en Shared variables. Cuando SetX establece o cambia el valor de una variable
compartida, el nuevo valor está disponible para todas las instancias de la clase.
Identificador de error : BC30369

Para corregir este error


1. Decida si desea que el miembro se comparta entre todas las instancias de la clase o que se mantenga
individual para cada instancia.
2. Si desea que se comparta una sola copia del miembro entre todas las instancias, agregue la palabra clave
Shared a la declaración de miembro. Conserve la palabra clave Shared en la declaración de procedimiento.

3. Si desea que cada instancia tenga su propia copia individual del miembro, no especifique Shared para la
declaración de miembro. Quite la palabra clave Shared de la declaración de procedimiento.

Vea también
Shared
No se puede crear el archivo temporal necesario
23/10/2019 • 2 minutes to read • Edit Online

Está llena o la unidad que contiene el directorio especificado por la variable de entorno TEMP, o la variable de
entorno TEMP especifica un directorio o unidad no válida o de solo lectura.

Para corregir este error


1. Eliminar archivos de la unidad, si está completa.
2. Especifique una unidad diferente en la variable de entorno TEMP.
3. Especifique una unidad válida para la variable de entorno TEMP.
4. Quitar la restricción de solo lectura de la unidad especificada actualmente o directorio.

Vea también
Tipos de error
No se puede abrir '<nombre de archivo > ' para
escritura
27/11/2019 • 2 minutes to read • Edit Online

No se puede abrir el archivo especificado para escribir en él, quizás porque ya se ha abierto.
Identificador de error : BC2012

Para corregir este error


1. Cierre el archivo y vuelva a abrirlo.
2. Compruebe los permisos del archivo.

Vea también
WriteAllText
WriteAllBytes
Escritura en archivos
No se encuentra la clase '<className > '
27/11/2019 • 2 minutes to read • Edit Online

No se encuentra la clase '<className > '. Esta situación suele ser consecuencia de un 'Microsoft.VisualBasic.dll'
discordante.
No se pudo encontrar un miembro definido.
Identificador de error : BC31098

Para corregir este error


1. Vuelva a compilar el programa para ver si el error se repite.
2. Si el error se repite, guarde el trabajo y reinicie Visual Studio.
3. Si el error persiste, vuelva a instalar Visual Basic.
4. Si el error persiste después de la reinstalación, informe al respecto a los Servicios de soporte técnico de
Microsoft.

Vea también
Hable con nosotros
Esta clase no admite automatización o no admite la
interfaz esperada
31/10/2019 • 2 minutes to read • Edit Online

La clase especificada en la llamada a la función GetObject o a la función CreateObject no ha expuesto una interfaz
de programación, o bien el proyecto se ha cambiado de .dll a .exe (o a la inversa).

Para corregir este error


1. Consulte la documentación de la aplicación que creó el objeto para conocer las limitaciones en cuanto al uso
de la automatización con esta clase de objeto.
2. Si cambió un proyecto de .dll a .exe o a la inversa, deberá eliminar manualmente el registro del antiguo .dll o
.exe.

Vea también
Tipos de error
Hable con nosotros
La instrucción 'Class' debe terminar con la instrucción
'End Class' correspondiente
23/10/2019 • 2 minutes to read • Edit Online

Class se usa para iniciar un Class bloquear; por lo tanto, solo puede aparecer al principio del bloque, con la
instrucción correspondiente End Class final del bloque de instrucción. O bien hay un redundantes Class
instrucción, o bien no ha terminado su Class bloque con End Class .
Identificador de error : BC30481

Para corregir este error


Busque y quite la instrucción Class innecesaria.
Concluir la Class bloque con la instrucción correspondiente End Class .

Vea también
End <palabra clave > instrucción
Class (instrucción)
Formato del Portapapeles no válido
23/10/2019 • 2 minutes to read • Edit Online

El formato de Portapapeles especificado no es compatible con el método que se está ejecutando. Entre las posibles
causas de este error son:
Usar el Portapapeles GetText o SetText método con un formato de Portapapeles distinto vbCFText o
vbCFLink .

Usar el Portapapeles GetData o SetData método con un formato de Portapapeles distinto vbCFBitmap ,
vbCFDIB , o vbCFMetafile .

Mediante el GetData o SetData métodos de un DataObject con un formato de Portapapeles en el intervalo


reservado por Microsoft Windows para formatos registrados (& HC000 - & HFFFF), cuando ese formato de
Portapapeles no se ha registrado con Microsoft Windows .

Para corregir este error


Quitar el formato no válido y especifique uno válido.

Vea también
Portapapeles: agregar otros formatos
Expresión constante no se puede representar en el
tipo '<typename >'
23/10/2019 • 2 minutes to read • Edit Online

Está intentando evaluar una constante que no encaja en el tipo de destino, normalmente porque desborda el
intervalo.
Identificador de error : BC30439

Para corregir este error


1. Cambiar el tipo de destino para que pueda controlar la constante.

Vea también
Información general sobre las constantes
Constantes y enumeraciones
Las constantes deben ser de tipo intrínseco o
enumerado; no pueden ser de tipo clase, estructura,
parámetro de tipo ni matriz
23/10/2019 • 2 minutes to read • Edit Online

Ha intentado declarar una constante como una clase, estructura o tipo de matriz, o como un parámetro de tipo
definido por un tipo genérico contenedor.
Las constantes deben ser de un tipo intrínseco ( Boolean , Byte , Date , Decimal , Double , Integer , Long , Object ,
SByte , Short , Single , String , UInteger , ULong , o UShort ), o un Enum tipo basado en uno de los tipos enteros.

Identificador de error : BC30424

Para corregir este error


1. Declare la constante como intrínseco o Enum tipo.
2. Una constante puede ser también un valor especial como True , False ,o Nothing . El compilador considera
que estos valores predefinidos son del tipo intrínseco adecuado.

Vea también
Constantes y enumeraciones
Tipos de datos
Tipos de datos
Constructor '<nombre >' no se puede llamar a sí
mismo
23/10/2019 • 2 minutes to read • Edit Online

Un Sub New procedimiento en una clase o estructura se llama a sí mismo.


Es el propósito de un constructor inicializar una instancia de una clase o estructura cuando sea primera creado. Una
clase o estructura puede tener varios constructores, siempre que tengan listas de parámetros diferentes. Se permite
un constructor para llamar a otro constructor para llevar a cabo su funcionalidad además de su propio. Pero no
tiene sentido que un constructor llame a sí mismo y de hecho el resultado sería una recursividad infinita si lo
permite.
Identificador de error : BC30298

Para corregir este error


1. Compruebe la lista de parámetros del constructor que se llama. Debe ser diferente de la que realiza la
llamada de constructor.
2. Si no piensa llamar a un constructor diferente, quite el Sub New llamar por completo.

Vea también
Duración del objeto: ¿Cómo se crean y destruyen objetos
Copiar el valor del parámetro 'ByRef'
'<parametername >' en el argumento coincidente
restringe del tipo '<typename1 >' al tipo
'<nombredetipo2 >'
23/10/2019 • 3 minutes to read • Edit Online

Se llama a un procedimiento con un argumento que se amplía al tipo de parámetro correspondiente, y la


conversión de parámetro para el argumento es de restricción.
Al definir una clase o estructura, puede definir uno o varios operadores de conversión para convertir ese tipo de
clase o estructura a otros tipos. También puede definir operadores de conversión inversos para convertir esos otros
tipos de nuevo a su clase o tipo de estructura. Cuando se usa el tipo de clase o estructura en una llamada a
procedimiento, Visual Basic puede utilizar estos operadores de conversión para convertir al tipo de un argumento
al tipo del parámetro correspondiente.
Si se pasa el argumento ByRef, Visual Basic a veces copia el valor del argumento en una variable local en el
procedimiento en lugar de pasar una referencia. En tal caso, cuando el procedimiento vuelve, Visual Basic debe, a
continuación, copiar el valor de la variable local en el argumento en el código de llamada.
Si un valor de argumento ByRef se copia en el procedimiento y el argumento y el parámetro son del mismo tipo,
no es necesario realizar ninguna conversión. Pero si los tipos son diferentes, Visual Basic debe convertir en ambas
direcciones. Si uno de los tipos es su tipo de clase o estructura, Visual Basic debe convertir a y desde el otro tipo. Si
es una de estas conversiones de ampliación, la conversión inversa podría ser de restricción.
Identificador de error : BC32053

Para corregir este error


Si es posible, utilice un argumento de llamada del mismo tipo como el parámetro de procedimiento, por lo
que no es necesario realizar ninguna conversión de Visual Basic.
Si necesita llamar al procedimiento con un argumento de tipo diferente del tipo de parámetro pero no es
necesario devolver un valor al argumento de llamada, defina el parámetro para que sea ByVal en lugar de
ByRef .

Si tiene que devolver un valor al argumento de llamada, defina el operador de conversión inversa como
Widening, si es posible.

Vea también
Procedimientos
Argumentos y parámetros de procedimiento
Paso de argumentos por valor y por referencia
Procedimientos de operadores
Operator (instrucción)
Cómo: Definir un operador
Cómo: Definir un operador de conversión
Conversiones de tipos en Visual Basic
Conversiones de ampliación y de restricción
El modificador 'Custom' no es válido en eventos
declarados sin tipos de delegado explícitos
23/10/2019 • 2 minutes to read • Edit Online

A diferencia de un evento no personalizado, un Custom Event declaración requiere un As cláusula después del
nombre de evento que se especifica explícitamente el tipo de delegado para el evento.
Los eventos no personalizados pueden ser definido con un As cláusula y explícita el tipo delegado, o con un
parámetro de lista inmediatamente después del nombre de evento.
Identificador de error : BC31122

Para corregir este error


1. Defina a un delegado con la misma lista de parámetros como el evento personalizado.
Por ejemplo, si la Custom Event se ha definido por
Custom Event Test(ByVal sender As Object, ByVal i As Integer) , a continuación, el delegado
correspondiente sería la siguiente.

Delegate Sub TestDelegate(ByVal sender As Object, ByVal i As Integer)

2. Reemplazar la lista de parámetros del evento personalizado con un As cláusula que especifica el tipo de
delegado.
Continuando con el ejemplo, Custom Event declaración se volvería como sigue.

Custom Event Test As TestDelegate

Ejemplo
Este ejemplo se declara un Custom Event y especifica los As cláusula con un tipo de delegado.

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

Vea también
Event (instrucción)
Delegate (instrucción)
Eventos
Los tipos de datos de los parámetros de tipo no se
pueden inferir de estos argumentos
23/10/2019 • 2 minutes to read • Edit Online

Los tipos de datos de los parámetros de tipo no se pueden inferir de estos argumentos. Especificar los tipos de
datos explícitamente puede corregir este error.
Este error se produce cuando en caso de error en la resolución de sobrecarga. Se produce como un mensaje
subordinado que indica por qué se ha eliminado un candidato de sobrecarga determinado. El mensaje de error
explica que el compilador no puede usar la inferencia de tipos para buscar tipos de datos para los parámetros de
tipo.

NOTE
Al especificar argumentos no es una opción (por ejemplo, para operadores de consulta en expresiones de consulta), el
mensaje de error aparece sin la segunda oración.

El código siguiente muestra el error.

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

Identificador de error : BC36647 y BC36644

Para corregir este error


Es posible que pueda especificar un tipo de datos para el parámetro o parámetros de tipo en lugar de confiar en la
inferencia de tipo.

Vea también
Conversión de delegado flexible
Generic Procedures in Visual Basic
Conversiones de tipos en Visual Basic
Se esperaba una declaración
23/10/2019 • 2 minutes to read • Edit Online

Una instrucción no declarativa, como una asignación o una instrucción del bucle, se produce fuera de cualquier
procedimiento. Sólo se permiten declaraciones procedimientos externos.
Como alternativa, se declara un elemento de programación sin una palabra clave como Dim o Const .
Identificador de error : BC30188

Para corregir este error


Mueva la instrucción no declarativa en el cuerpo de un procedimiento.
Comience la declaración con una palabra clave de declaración adecuada.
Asegúrese de que una palabra clave no está mal escrita.

Vea también
Procedimientos
Dim (instrucción)
Propiedad predeterminada '<nombrepropiedad1 >'
entra en conflicto con la propiedad predeterminada
'<nombrepropiedad2 >' en '<classname >', por lo
que se debe declarar como 'Shadows'
23/10/2019 • 2 minutes to read • Edit Online

Se declara una propiedad con el mismo nombre que una propiedad definida en la clase base. En esta situación, la
propiedad de esta clase debe ocultar la propiedad de clase base.
Este mensaje es una advertencia. De forma predeterminada, se da por supuesto que es Shadows . Para más
información sobre cómo ocultar las advertencias o cómo tratarlas como errores, vea Configuring Warnings in
Visual Basic.
Identificador de error : BC40007

Para corregir este error


Agregar el Shadows palabra clave para la declaración o cambie el nombre de la propiedad que se declara.

Vea también
Shadows
Sombrear en Visual Basic
El acceso a la propiedad predeterminada es ambiguo
entre los miembros heredados de la interfaz '
<defaultpropertyname > ' de la interfaz '
<interfacename1 > ' y ' <defaultpropertyname > ' de
la interfaz ' <interfacename2 > '
23/10/2019 • 2 minutes to read • Edit Online

Una interfaz hereda de dos interfaces, cada una de las cuales declara una propiedad predeterminada con el mismo
nombre. El compilador no puede resolver un acceso a esta propiedad predeterminada sin calificación. Esto se
ilustra en el siguiente ejemplo:

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

Cuando se especifica testObj(1) , el compilador intenta resolverlo en la propiedad predeterminada. Sin embargo,
hay dos propiedades predeterminadas posibles debido a las interfaces heredadas, por lo que el compilador señala
este error.
IDENTIFICADOR de error : BC30686

Para corregir este error


Evite la herencia de miembros con el mismo nombre. En el ejemplo anterior, si testObj no necesita ninguno
de los miembros de, por ejemplo, Iface2 , declárelo de la siguiente manera:

Dim testObj As Iface1

O bien
Implemente la interfaz heredada en una clase. A continuación, puede implementar cada una de las
propiedades heredadas con nombres diferentes. Sin embargo, solo uno de ellos puede ser la propiedad
predeterminada de la clase de implementación. Esto se ilustra en el siguiente ejemplo:
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

Vea también
Interfaces
Clase delegada<classname >' no tiene ningún
método Invoke, por lo que una expresión de este tipo
no puede ser el destino de una llamada al método
23/10/2019 • 2 minutes to read • Edit Online

Una llamada a Invoke a través de un delegado ha fallado porque Invoke no está implementado en la clase de
delegado.
Identificador de error : BC30220

Para corregir este error


1. Asegúrese de que se ha creado una instancia de la clase de delegado con una Dim instrucción y que se ha
asignado un procedimiento a la instancia de delegado con el AddressOf operador.
2. Busque el código que implementa la clase de delegado y asegúrese de que implementa el Invoke
procedimiento.

Vea también
Delegados
Delegate (instrucción)
AddressOf (operador)
Dim (instrucción)
Las clases derivadas no pueden provocar eventos de
clase base
23/10/2019 • 2 minutes to read • Edit Online

Un evento puede generarse solo desde el espacio de declaración en el que se declara. Por lo tanto, una clase no
puede provocar los eventos de cualquier otra clase, incluso uno desde el que se deriva.
Identificador de error : BC30029

Para corregir este error


Mover el Event instrucción o el RaiseEvent instrucción para que estén en la misma clase.

Vea también
Event (instrucción)
RaiseEvent (instrucción)
Error de E/S del dispositivo
23/10/2019 • 2 minutes to read • Edit Online

Se produjo un error de entrada o salido mientras el programa estaba usando un dispositivo como una impresora o
unidad de disco.

Para corregir este error


Asegúrese de que el dispositivo está funcionando correctamente y, a continuación, vuelva a intentar la
operación.

Vea también
Tipos de error
Se debe llamar primero a la función 'Dir' con un
argumento 'Pathname'
23/10/2019 • 2 minutes to read • Edit Online

Una llamada inicial a la Dir función no incluye el PathName argumento. La primera llamada a Dir debe incluir un
PathName , las llamadas posteriores, pero a Dir no es necesario incluir parámetros para recuperar el elemento
siguiente.

Para corregir este error


1. Proporcione un PathName argumento en la llamada de función.

Vea también
Dir
Se esperaba el fin de instrucción
23/10/2019 • 2 minutes to read • Edit Online

La instrucción es sintácticamente completa, pero un elemento de programación adicional sigue al elemento que se
complete la instrucción. Falta un terminador de línea al final de cada instrucción.
Un terminador de línea divide los caracteres de un archivo de código fuente de Visual Basic en líneas. Ejemplos de
terminadores de línea son el Unicode carro devuelto carácter (& HD), el Unicode avance de línea carácter (& alta
disponibilidad), y seguido del carácter de avance de línea Unicode del carácter de retorno de carro Unicode. Para
obtener más información acerca de los terminadores de línea, consulte el especificación del lenguaje Visual Basic.
Identificador de error : BC30205

Para corregir este error


1. Comprueba si dos instrucciones diferentes se colocaron en la misma línea.
2. Insertar un terminador de línea después del elemento que se complete la instrucción.

Vea también
Cómo: Interrumpir y combinar instrucciones en código
Instrucciones
Error al crear el manifiesto del ensamblado: <mensaje
de error >
31/10/2019 • 2 minutes to read • Edit Online

El compilador Visual Basic llama a Assembly Linker (al. exe, también conocido como ALink) para generar un
ensamblado con un manifiesto. El vinculador ha informado de un error en una fase previa a la emisión de la
creación del ensamblado.
Esto puede suceder si existen problemas con el archivo de clave o el contenedor de claves especificado. Para firmar
completamente un ensamblado, debe proporcionar un archivo de clave válido que contenga información sobre las
claves pública y privada. Para retrasar la firma de un ensamblado, debe activar la casilla Retrasar solo firma y
proporcionar un archivo de clave válido que contenga información sobre la clave pública. La clave privada no es
necesaria cuando un ensamblado tiene la firma retrasada. Para obtener más información, vea Cómo: Firmar un
ensamblado con un nombre seguro.
Identificador de error : BC30140

Para corregir este error


1. Examine el mensaje de error citado y consulte el tema al. exe. en el caso de error, explicación más detallada y
consejos
2. Si el error persiste, reúna información sobre las circunstancias y notifíquelo a los Servicios de soporte
técnico de Microsoft.

Vea también
Cómo: Firmar un ensamblado con un nombre seguro
Página Firma, Diseñador de proyectos
Al. exe
Hable con nosotros
Error al crear recursos Win32: <mensaje de error >
31/10/2019 • 2 minutes to read • Edit Online

El compilador Visual Basic llama a Assembly Linker (al. exe, también conocido como ALink) para generar un
ensamblado con un manifiesto. El vinculador ha informado de un error al crear un recurso en memoria. Esto podría
deberse a un problema con el entorno o a que el equipo tiene poca memoria.
Identificador de error : BC30136

Para corregir este error


1. Examine el mensaje de error citado y consulte el tema al. exe. para obtener una explicación más detallada y
consejos.
2. Si el error persiste, reúna información sobre las circunstancias y notifíquelo a los Servicios de soporte
técnico de Microsoft.

Vea también
Al. exe
Hable con nosotros
Error al cargar la biblioteca DLL (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Una biblioteca de vínculos dinámicos (DLL) es una biblioteca especificada en la cláusula Lib de una instrucción
Declare . Entre las posibles causas de este error se incluyen:

El archivo no es un ejecutable DLL.


El archivo no es una DLL de Microsoft Windows.
El archivo DLL hace referencia a otro archivo DLL que no está presente.
El archivo dll o el archivo DLL al que se hace referencia no se encuentra en un directorio especificado en la
ruta de acceso.

Para corregir este error


Si el archivo es un archivo de texto de origen y, por lo tanto, no es un ejecutable DLL, se debe compilar y
vincular a un formulario ejecutable DLL.
Si el archivo no es una DLL de Microsoft Windows, obtenga el equivalente de Microsoft Windows.
Si el archivo DLL hace referencia a otro archivo DLL que no está presente, obtenga el archivo DLL al que se
hace referencia y haga que esté disponible.
Si el archivo dll o el archivo DLL al que se hace referencia no se encuentra en un directorio especificado por
la ruta de acceso, mueva el archivo DLL a un directorio al que se hace referencia.

Vea también
Declare (instrucción)
Error al guardar el archivo de recursos de Win32
temporal '<nombreDeArchivo > ': mensaje de error
de <
31/10/2019 • 2 minutes to read • Edit Online

El compilador Visual Basic llama a Assembly Linker (al. exe, también conocido como ALink) para generar un
ensamblado con un manifiesto. El vinculador ha informado de un error al obtener un nombre de archivo para
usarlo para escribir en un recurso en memoria.
Identificador de error : BC30137

Para corregir este error


1. Examine el mensaje de error citado y consulte el tema al. exe. para obtener una explicación más detallada y
consejos.
2. Si el error persiste, reúna información sobre las circunstancias y notifíquelo a los Servicios de soporte
técnico de Microsoft.

Vea también
Al. exe
Hable con nosotros
Se produjeron errores al compilar los esquemas XML
del proyecto
23/10/2019 • 2 minutes to read • Edit Online

Se produjeron errores al compilar los esquemas XML en el proyecto. Por este motivo, IntelliSense XML no está
disponible.
Hay un error en un esquema de definición de esquemas XML (XSD) incluido en el proyecto. Este error se produce
cuando se agrega un archivo de esquema (.xsd) de XSD que entra en conflicto con el esquema XSD existente
configurado para el proyecto.
Identificador de error : BC36810

Para corregir este error


Haga doble clic en la advertencia en el lista de errores ventana. Visual Basic le llevará a la ubicación del
archivo XSD que es el origen de la advertencia. Corrija el error en el esquema XSD.
Asegúrese de que todos los necesarios archivos XSD de esquema (.xsd) se incluyen en el proyecto. Que deba
hacer clic mostrar todos los archivos en el proyecto menú para ver la XSD de archivos en el
Explorador de soluciones . Haga clic en un archivo .xsd y, a continuación, haga clic en incluir en el
proyecto para incluir el archivo en el proyecto.
Si usas el Asistente XML a esquema, este error puede producirse si deducir esquemas más de una vez desde
el mismo origen. En este caso, puede quitar los archivos de esquema XSD existentes desde el proyecto,
agregue un archivo XML nuevo a la plantilla de elemento de esquema y, a continuación, proporcionar el XML
al Asistente para esquemas con todos los orígenes XML aplicable para el proyecto.
Si no se identifica ningún error en el esquema XSD, el compilador XML no puede tener suficiente
información para proporcionar un mensaje de error detallado. Es posible que pueda obtener información
más detallada del error si está seguro de que los espacios de nombres XML para los archivos .xsd incluyan
en el proyecto coinciden con los espacios de nombres XML identificados en el esquema XML en Visual
Studio.

Vea también
Lista de errores (Ventana)
XML
Se superó el tiempo de espera de evaluación de la
expresión o instrucción
31/10/2019 • 2 minutes to read • Edit Online

La evaluación de una expresión no se completó de manera oportuna.


Identificador de error : BC30722

Para corregir este error


1. Compruebe que el código especificado es correcto.
2. Simplifique la expresión para que tarde menos tiempo en ejecutarse.

Vea también
Depurar en Visual Studio
Evento '<eventname1 >' no se puede implementar el
evento '<eventname2 >' en la interfaz '<interfaz >'
porque sus tipos de delegado<delegate1 >' y
'<delegate2 >' no coinciden
23/10/2019 • 2 minutes to read • Edit Online

Visual Basic no puede implementar un evento porque el tipo de delegado del evento no coincide con el tipo de
delegado del evento en la interfaz. Este error puede producirse cuando define varios eventos en una interfaz e
intenta implementarlos juntos con el mismo evento. Un evento puede implementar dos o más eventos solo si
todos los eventos implementados se declaran con la sintaxis As y si se especifica el mismo tipo delegado.
Identificador de error : BC31423

Para corregir este error


Implemente los eventos por separado.
-O bien-
Definir los eventos en la interfaz usando el As sintaxis y especifique el mismo tipo de delegado.

Vea también
Event (instrucción)
Delegate (instrucción)
Eventos
Los eventos no se pueden declarar con un tipo
delegado que tenga un tipo de valor devuelto
23/10/2019 • 2 minutes to read • Edit Online

Se especificó un delegado para un procedimiento function.


Identificador de error : BC31084

Para corregir este error


Especifique un delegado para un Sub procedimiento.

Vea también
Eventos
Los métodos no compartidos no pueden controlar los
eventos de variables WithEvents compartidas
23/10/2019 • 2 minutes to read • Edit Online

Una variable declarada con el Shared modificador es una variable compartida. Una variable compartida identifica
exactamente una ubicación de almacenamiento. Una variable declarada con el WithEvents modificador afirma que
el tipo al que pertenece la variable controla el conjunto de eventos que provoca la variable. Cuando se asigna un
valor a la variable, la propiedad creada por el WithEvents declaración modo se desenlaza cualquier controlador de
eventos existente y enlaza el nuevo controlador de eventos a través de la Add método.
Identificador de error : BC30594

Para corregir este error


Declare el controlador de eventos Shared .

Vea también
Shared
WithEvents
La expresión no genera un valor
23/10/2019 • 2 minutes to read • Edit Online

Ha intentado usar una expresión que no genera un valor en un contexto que genera valores, como la llamada a un
Sub en un contexto donde un Function se espera.

Identificador de error : BC30491

Para corregir este error


Cambie la expresión por otra que produzca un valor.

Vea también
Tipos de error
Expresión tiene el tipo '<typename >' que es un tipo
restringido y no se puede usar para tener acceso a
miembros heredados de 'Object' o 'ValueType'
23/10/2019 • 2 minutes to read • Edit Online

Una expresión se evalúa como un tipo que no se puede realizar la conversión boxing por common language
runtime (CLR), pero tiene acceso a un miembro que requiere la conversión boxing.
Laconversión boxing hace referencia al procesamiento necesario para convertir un tipo a Object o, en ocasiones, a
ValueType. Common language runtime no puede encerrar ciertos tipos de estructura, por ejemplo ArgIterator,
RuntimeArgumentHandle, y TypedReference.
Esta expresión intenta utilizar el tipo restringido para llamar a un método heredado de Object o ValueType, tales
como GetHashCode o ToString. Para obtener acceso a este método, Visual Basic ha intentado una conversión
boxing implícita que produce este error.
Identificador de error : BC31393

Para corregir este error


1. Localice la expresión que se evalúa en el tipo mencionado.
2. Busque la parte de la instrucción que intenta llamar al método se hereda de Object o ValueType.
3. Reescriba la instrucción para evitar la llamada al método.

Vea también
Conversiones implícitas y explícitas
La expresión es un valor y, por lo tanto, no puede ser
destino de una asignación
23/10/2019 • 2 minutes to read • Edit Online

Una instrucción intenta asignar un valor a una expresión. Solo puede asignar un valor a una variable, propiedad o
elemento de matriz de escritura en tiempo de ejecución. En el ejemplo siguiente se muestra cómo se puede
producir este error.

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.

Pueden aplicarse ejemplos similares a las propiedades y los elementos de la matriz.


Acceso indirecto. El acceso indirecto a través de un tipo de valor también puede generar este error. Considere el
siguiente ejemplo de código, que intenta establecer el valor de Point accediendo indirectamente a través
Locationde.

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

La última instrucción del ejemplo anterior produce un error porque solo crea una asignación temporal para la Point
estructura devuelta por Location la propiedad. Una estructura es un tipo de valor y la estructura temporal no se
conserva después de que se ejecute la instrucción. El problema se resuelve declarando y usando una variable para
Location, lo que crea una asignación más permanente para Point la estructura. En el ejemplo siguiente se muestra
código que puede reemplazar la última instrucción del ejemplo anterior.

Dim exitLocation as New System.Drawing.Point(140, exitButton.Location.Y)


exitButton.Location = exitLocation

IDENTIFICADOR de error : BC30068

Para corregir este error


Si la instrucción asigna un valor a una expresión, reemplace la expresión por una única variable, propiedad o
elemento de matriz de escritura.
Si la instrucción hace acceso indirecto a través de un tipo de valor (normalmente una estructura), cree una
variable que contenga el tipo de valor.
Asigne la estructura adecuada (u otro tipo de valor) a la variable.
Use la variable para tener acceso a la propiedad y asignarle un valor.
Vea también
Operadores y expresiones
Instrucciones
Solución de problemas de procedimientos
Expresión de tipo <tipo > no es consultable
23/10/2019 • 2 minutes to read • Edit Online

Expresión de tipo <tipo > no es consultable. Asegúrese de que no falta una importación de espacio de nombres o
de referencia de ensamblado para el proveedor LINQ.
Puede consultables tipos se definen en el System.Linq, System.Data.Linq, y System.Xml.Linq espacios de nombres.
Debe importar uno o varios de estos espacios de nombres para realizar consultas LINQ.
El System.Linq espacio de nombres permite a los objetos de consulta como colecciones y matrices mediante LINQ.
El System.Data.Linq espacio de nombres le permite consultar los conjuntos de datos de ADO.NET y las bases de
datos de SQL Server mediante LINQ.
El System.Xml.Linq espacio de nombres le permite consultar XML con LINQ y usar características XML en Visual
Basic.
Identificador de error : BC36593

Para corregir este error


1. Agregar un Import instrucción para el System.Linq, System.Data.Linq, o System.Xml.Linq espacio de
nombres al archivo de código. También puede importar los espacios de nombres para el proyecto mediante
el referencias página del Diseñador de proyectos (mi proyecto ).
2. Asegúrese de que el tipo que se ha identificado como el origen de la consulta es un tipo consultable. Es decir,
un tipo que implementa IEnumerable<T> o IQueryable<T>.

Vea también
System.Linq
System.Data.Linq
System.Xml.Linq
Introducción a LINQ en Visual Basic
LINQ
XML
Referencias y la instrucción Imports
Imports (instrucción), espacio de nombres y tipo .NET
Página Referencias, Diseñador de proyectos (Visual Basic)
La expresión llama de forma recursiva a la propiedad
contenedora '<PropertyName > '
23/11/2019 • 2 minutes to read • Edit Online

Una instrucción en el procedimiento Set de una definición de propiedad almacena un valor en el nombre de la
propiedad.
El enfoque recomendado para contener el valor de una propiedad es definir una variable Private en el contenedor
de la propiedad y utilizarla en los procedimientos Get y Set . A continuación, el procedimiento Set debe
almacenar el valor entrante en esta variable Private .
El procedimiento Get se comporta como un procedimiento Function , por lo que puede asignar un valor al
nombre de la propiedad y devolver el control al encontrar la instrucción End Get . Sin embargo, el enfoque
recomendado consiste en incluir la variable Private como valor en una instrucción return.
El procedimiento Set se comporta como un procedimiento Sub , que no devuelve ningún valor. Por lo tanto, el
nombre del procedimiento o de la propiedad no tiene ningún significado especial dentro de un procedimiento de
Set , y no se puede almacenar un valor en él.

En el ejemplo siguiente se muestra el enfoque que puede producir este error, seguido del enfoque recomendado.

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

De forma predeterminada, este mensaje es una advertencia. Para más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC42026

Para corregir este error


Vuelva a escribir la definición de la propiedad para usar el enfoque recomendado, tal como se muestra en el
ejemplo anterior.

Vea también
Procedimientos de propiedades
Property (instrucción)
Set (instrucción)
Expresión demasiado compleja
23/10/2019 • 2 minutes to read • Edit Online

Una expresión de punto flotante contiene demasiadas subexpresiones anidadas.

Para corregir este error


Divida la expresión en varias expresiones independientes según sea necesario para impedir que se está
produciendo el error.

Vea también
Operadores y expresiones
El atributo 'Extension' sólo se puede aplicar a las
declaraciones 'Module', 'Sub' o 'Function'
23/10/2019 • 2 minutes to read • Edit Online

La única manera de extender un tipo de datos en Visual Basic es definir un método de extensión dentro de un
módulo estándar. El método de extensión puede ser un procedimiento Sub o un procedimiento Function . Todos
los métodos de extensión se deben marcar con el atributo de extensión, <Extension()> , del espacio de nombres
System.Runtime.CompilerServices. Opcionalmente, un módulo que contiene un método de extensión se puede
marcar de la misma manera. Ningún otro uso del atributo de extensión es válido.
Identificador de error : BC36550

Para corregir este error


Quite el atributo de extensión.
Rediseñe la extensión como un método, definido en un módulo envolvente.

Ejemplo
En el ejemplo siguiente se define un método Print para el tipo de datos String .

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

Vea también
Información general de atributos
Métodos de extensión
Module (instrucción)
Archivo ya abierto
23/10/2019 • 2 minutes to read • Edit Online

A veces se debe cerrar un archivo antes que otro FileOpen o puede producirse otra operación. Entre las causas
posibles de este error se incluyen:
Modo de salida secuencial FileOpen ejecutó la operación para un archivo que ya está abierto
La instrucción hace referencia a un archivo abierto.

Para corregir este error


1. Cierre el archivo antes de ejecutar la instrucción.

Vea también
FileOpen
Archivo demasiado grande para su lectura en una
matriz de bytes
23/10/2019 • 2 minutes to read • Edit Online

El tamaño del archivo que está intentando leer en una matriz de bytes supera los 4 GB. El
My.Computer.FileSystem.ReadAllBytes método no puede leer un archivo que supera este tamaño.

Para corregir este error


Use un StreamReader para leer el archivo. Para obtener más información, consulte conceptos básicos de .NET
Framework de E/S de archivos y el sistema de archivos (Visual Basic).

Vea también
ReadAllBytes
StreamReader
Acceso a archivos con Visual Basic
Cómo: Leer texto de archivos con StreamReader
No se encontró el nombre del archivo o de la clase
durante la operación de automatización (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

No se encontró el nombre especificado para el nombre de archivo o la clase en una llamada a la función de
GetObject .

Para corregir este error


Compruebe los nombres e inténtelo de nuevo. Asegúrese de que el nombre usado para el parámetro class
coincida con el registrado en el sistema.

Vea también
Tipos de error
No se encuentra el archivo (error en tiempo de
ejecución de Visual Basic)
23/10/2019 • 2 minutes to read • Edit Online

No se encontró el archivo que se especifique. El error tiene las siguientes causas posibles:
La instrucción hace referencia a un archivo que no existe.
Se ha intentado llamar a un procedimiento en una biblioteca de vínculos dinámicos (DLL), pero la biblioteca
especificada en el Lib cláusula de la Declare no se encuentra la instrucción.
Se intentó abrir un proyecto o cargar un archivo de texto que no existe.

Para corregir este error


1. Compruebe la ortografía del nombre de archivo y la especificación de ruta de acceso.

Vea también
Declare (instrucción)
El primer operando de una expresión 'If' binaria debe
ser un tipo que acepte valores NULL o un tipo de
referencia
27/03/2020 • 2 minutes to read • Edit Online

Una If expresión puede tomar dos o tres argumentos. Cuando se envían solo dos argumentos, el primer
argumento debe ser un tipo de referencia o un tipo de valor que acepta valores NULL. Si el primer argumento se
Nothing evalúa como algo distinto de , se devuelve su valor. Si el primer argumento Nothing se evalúa como , se
evalúa y devuelve el segundo argumento.
Por ejemplo, el código If siguiente contiene dos expresiones, una con tres argumentos y otra con dos
argumentos. Las expresiones calculan y devuelven el mismo valor.

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

Las siguientes expresiones provocan este error:

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 de error : BC33107

Para corregir este error


Si no puede cambiar el código para que el primer argumento sea un tipo de If valor que If...Then...Else
acepta valores NULL o un tipo de referencia, considere la posibilidad de convertir en una expresión de tres
argumentos o en una instrucción.

Console.WriteLine(If(choice1 < choice2, 1, 2))


Console.WriteLine(If(booleanVar, "Test returns True.", "Test returns False."))

Vea también
Operador If
Instrucción If...Then...Else
Tipos de valores que aceptan valores NULL
La primera instrucción de este 'Sub New' debe ser
una llamada a 'MyBase.New' o 'MyClass.New'
(constructor no accesible sin parámetros)
23/10/2019 • 2 minutes to read • Edit Online

La primera instrucción de este 'Sub New' debe ser una llamada a 'MyBase.New' o 'MyClass.New' porque clase
base<basename >' de '<derivedname >' no tiene un 'Sub New' accesible que se puede llamar sin argumentos.
En una clase derivada, cada constructor debe llamar a un constructor de clase base ( MyBase.New ). Si la clase base
tiene un constructor sin parámetros accesible para las clases derivadas, MyBase.New se puede llamar de forma
automática. Si no es así, debe llamar a un constructor de clase base con parámetros y no puede realizarse
automáticamente. En este caso, la primera instrucción de cada constructor de clase derivada debe llamar a un
constructor con parámetros en la clase base, o llamar a otro constructor en la clase derivada que realiza un
constructor de clase base llamada.
Identificador de error : BC30148

Para corregir este error


O bien llamada MyBase.New indicando los parámetros necesarios, o llamar a un constructor del mismo nivel
que realiza una llamada de este tipo.
Por ejemplo, si la clase base tiene un constructor que se declara como
Public Sub New(ByVal index as Integer) , la primera instrucción de la clase derivada podría ser el constructor
de clase MyBase.New(100) .

Vea también
Fundamentos de la herencia
La primera instrucción de este 'Sub New' debe ser
una llamada explícita a 'MyBase.New' o
'MyClass.New' porque el '<nombreconstructor >' en
la clase base<nombredeclasebase >' de
'<derivedclassname >' está marcado como obsoleto:
'< ErrorMessage >'
23/10/2019 • 2 minutes to read • Edit Online

Un constructor de clase no realiza una llamada de manera explícita a un constructor de clase base y el constructor
de clase base se marca con el atributo ObsoleteAttribute y la directiva para tratarlo como un error.
Cuando un constructor de clase derivada no llama a un constructor de clase base, Visual Basic intenta generar una
llamada implícita a un constructor de clase base sin parámetros. Si no hay ningún constructor accesible en la clase
base que se pueda llamar sin argumentos, Visual Basic no se puede generar una llamada implícita. En este caso, el
constructor necesario se marca con el ObsoleteAttribute atributo, por lo que Visual Basic no puede llamarlo.
Para marcar que cualquier elemento de programación ya no está en uso, aplíquele ObsoleteAttribute . Si lo hace,
puede establecer la propiedad IsError del atributo en True o False . Si se establece en True , el compilador trata
como un error los intentos de usar el elemento. Si se establece en False o se deja el valor predeterminado False ,
el compilador emite una advertencia si se produce un intento de usar el elemento.
Identificador de error : BC30920

Para corregir este error


1. Examine el mensaje de error indicado y tome las medidas adecuadas.
2. Incluya una llamada a MyBase.New() o MyClass.New() como la primera instrucción de Sub New en la clase
derivada.

Vea también
Información general de atributos
'For Each' en el tipo '<typename >' es ambigua
porque el tipo implementa varias creaciones de
instancias de 'IEnumerable (Of T)'
23/10/2019 • 2 minutes to read • Edit Online

Un For Each instrucción especifica una variable de iterador que tiene más de un GetEnumerator método.
La variable de iterador debe ser de un tipo que implementa el System.Collections.IEnumerable o
System.Collections.Generic.IEnumerable<T> interfaz en uno de los Collections espacios de nombres de .NET
Framework. Es posible que una clase implementar más de una interfaz genérica construida, con un argumento de
tipo diferente para cada construcción. Si se usa una clase que hace esto para la variable de iterador, esa variable
tiene más de un GetEnumerator método. En tal caso, Visual Basic no puede elegir qué método va a llamar.
Identificador de error : BC32096

Para corregir este error


Usar DirectCast (operador) o TryCast (operador) convertir el tipo de variable de iterador para la interfaz que
define el GetEnumerator método que desee usar.

Vea también
For Each...Next (instrucción)
Interfaces
La referencia de <referencia de ensamblado de
confianza > no es válida
23/10/2019 • 2 minutes to read • Edit Online

La referencia de <referencia de ensamblado de confianza > no es válida. Los ensamblados con signo de nombre
seguro deben especificar una clave pública en las declaraciones InternalsVisibleTo.
El nombre de ensamblado pasado InternalsVisibleToAttribute al constructor de atributos identifica un ensamblado
con nombre seguro, pero no incluye PublicKey un atributo.
IDENTIFICADOR de error : BC31535

Para corregir este error


1. Determine la clave pública del ensamblado de confianza con nombre seguro. Incluya la clave pública como
parte del nombre del ensamblado pasado al InternalsVisibleToAttribute constructor de atributo mediante el
PublicKey atributo.

Vea también
AssemblyName
Ensamblados de confianza
Función '<NombreDeProcedimiento >' no devuelve
un valor en todas las rutas de código
23/10/2019 • 2 minutes to read • Edit Online

Función '<NombreDeProcedimiento >' no devuelve un valor en todas las rutas de código. ¿Falta alguna instrucción
'Return'?
Un Function procedimiento tiene al menos una ruta de acceso posibles a través de su código que no devuelve un
valor.
Puede devolver un valor desde un Function procedimiento en cualquiera de las maneras siguientes:
Incluya el valor en un instrucción Return.
Asigne el valor para el Function procedimiento asigne un nombre y, a continuación, realizar un
Exit Function instrucción.

Asigne el valor para el Function procedimiento asigne un nombre y, a continuación, realizar el


End Function instrucción.

Si el control se transfiere a Exit Function o End Function y no ha asignado ningún valor para el nombre del
procedimiento, el procedimiento devuelve el valor predeterminado del tipo de datos devuelto. Para obtener más
información, vea "Comportamiento" en instrucción Function.
De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC42105

Para corregir este error


Compruebe la lógica del flujo de control y asegúrese de que asignar un valor antes de cada instrucción que
genera un valor devuelto.
Es más fácil garantizar que todos los valores devueltos desde el procedimiento devuelve un valor si siempre
usa el Return instrucción. Si lo hace, la última instrucción antes de End Function debe ser un Return
instrucción.

Vea también
Procedimientos de función
Function (instrucción)
Página Compilación, Diseñador de proyectos (Visual Basic)
Se deshabilitó la evaluación de funciones porque se
excedió el tiempo de espera de una evaluación de
funciones anterior
31/10/2019 • 2 minutes to read • Edit Online

La evaluación de la función está deshabilitada porque se agotó el tiempo de espera de evaluación de la función
anterior. Para volver a habilitar la evaluación de funciones, vuelva a ejecutar el paso o reinicie la depuración.
En el depurador de Visual Studio, una expresión especifica una llamada a procedimiento, pero otra evaluación ha
agotado de tiempo de espera.
Las posibles causas de que se agote el tiempo de espera de una llamada a un procedimiento incluyen un bucle
infinito o un bucle sin fin. Para obtener más información, vea para... Instrucción siguiente.
Un caso especial de un bucle infinito es la recursividad. Para obtener más información, vea procedimientos
recursivos.
Identificador de error : BC30957

Para corregir este error


1. Si es posible, Determine cuál era la evaluación de la función anterior y qué hizo que se agotara el tiempo de
espera. De lo contrario, es posible que se produzca este error de nuevo.
2. O bien, ejecute paso a paso de nuevo el depurador, o finalice y reinicie la depuración.

Vea también
Depurar en Visual Studio
Desplazarse por el código con el depurador
Los parámetros genéricos utilizados como tipos de
parámetros opcionales deben tener restricción de
clase
23/10/2019 • 2 minutes to read • Edit Online

Se declara un procedimiento con un parámetro opcional que se utiliza un parámetro de tipo que no esté
restringido a ser un tipo de referencia.
Siempre debe proporcionar un valor predeterminado para cada parámetro opcional. Si el parámetro es de un tipo
de referencia, el valor opcional debe ser Nothing , que es un valor válido para cualquier tipo de referencia. Sin
embargo, si el parámetro es de un tipo de valor, ese tipo debe ser un tipo de datos básico predefinido por Visual
Basic. Esto es porque un tipo de valor compuesto, como una estructura definida por el usuario, no tiene ningún
valor predeterminado válido.
Cuando se usa un parámetro de tipo para un parámetro opcional, debe garantizar que es de un tipo de referencia
para evitar la posibilidad de un tipo de valor no tiene ningún valor predeterminado válido. Esto significa que debe
restringir el parámetro de tipo con el Class palabra clave o con el nombre de una clase específica.
Identificador de error : BC32124

Para corregir este error


Restringir el parámetro de tipo para aceptar sólo un tipo de referencia o no lo utilice para el parámetro opcional.

Vea también
Generic Types in Visual Basic
Lista de tipos
Class (instrucción)
Parámetros opcionales
Estructuras
Nothing
'Get' descriptor de acceso de propiedad
'<propertyname >' no es accesible
23/10/2019 • 2 minutes to read • Edit Online

Una instrucción intenta recuperar el valor de una propiedad cuando no tiene acceso a la propiedad Get
procedimiento.
Si el Get Statement está marcada con un acceso más restrictivo nivel que su Property Statement, podría producirse
un error de un intento de leer el valor de propiedad en los casos siguientes:
El Get instrucción está marcada como privada y el código de llamada está fuera de la clase o estructura en
la que se define la propiedad.
El Get instrucción está marcada como Protected y el código de llamada no está en la clase o estructura en la
que se define la propiedad, ni en una clase derivada.
El Get instrucción está marcada como Friend y el código de llamada no está en el mismo ensamblado en el
que se define la propiedad.
Identificador de error : BC31103

Para corregir este error


Si tiene el control del código fuente definiendo la propiedad, considere la posibilidad de declarar la Get
procedimiento con el mismo nivel de acceso que la propiedad propiamente dicha.
Si no tiene control sobre el código fuente definiendo la propiedad, o si debe restringir el Get procedimiento
de nivel de acceso a la propiedad propiamente dicha, intente mover la instrucción que lee el valor de
propiedad en una región de código que tiene un mejor acceso a la propiedad.

Vea también
Procedimientos de propiedades
Cómo: Declarar una propiedad con niveles de acceso mixtos
La cláusula Handles requiere una variable WithEvents
definida en el tipo contenedor o en uno de sus tipos
base
23/10/2019 • 2 minutes to read • Edit Online

No proporcionó una variable WithEvents en la cláusula Handles . La palabra clave Handles al final de una
declaración de procedimiento hace que controle los eventos generados por una variable de objeto declarada
mediante la palabra clave WithEvents .
Identificador de error : BC30506

Para corregir este error


Proporcione la variable de WithEvents necesaria.

Ejemplo
En el ejemplo siguiente, Visual Basic genera BC30506 de error del compilador porque la palabra clave WithEvents
no se utiliza en la definición de la instancia de System.Timers.Timer.

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

El ejemplo siguiente se compila correctamente porque la variable _timer1 se define con la palabra clave
WithEvents :
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

Vea también
Handles
Se esperaba un identificador
23/10/2019 • 2 minutes to read • Edit Online

Un elemento de programación que no es un nombre de elemento declarado reconocible, se produce cuando el


contexto requiere un nombre de elemento. Una posible causa es que se ha especificado en algún lugar un atributo
distinto al principio de la instrucción.
Identificador de error : BC30203

Para corregir este error


Compruebe que todos los atributos de la instrucción se colocan al principio.
Compruebe que todos los nombres de elemento en la instrucción estén escritos correctamente.

Vea también
Nombres de elementos declarados
Información general de atributos
El identificador es demasiado largo
23/10/2019 • 2 minutes to read • Edit Online

El nombre o identificador de cada elemento de programación se limita a 1023 caracteres. Además, un nombre
completo no puede superar los 1023 caracteres. Esto significa que la cadena de identificador completa (
<namespace>.<...>.<namespace>.<class>.<element> ) no puede tener más de 1023 caracteres, incluido el operador de
acceso a miembros ( . ) caracteres.
Identificador de error : BC30033

Para corregir este error


Reduzca la longitud del identificador.

Vea también
Nombres de elementos declarados
Se esperaba un inicializador
23/10/2019 • 2 minutes to read • Edit Online

Ha intentado declarar una instancia de una clase con un inicializador de objeto en el que la lista de inicialización
está vacía, tal como se muestra en el ejemplo siguiente.
' Not valid.

' Dim aStudent As New Student With {}

Al menos un campo o propiedad se debe inicializar en la lista de inicializadores, como se muestra en el ejemplo
siguiente.
Dim aStudent As New Student With {.year = "Senior"}

Identificador de error : BC30996

Para corregir este error


1. Inicializar al menos un campo o propiedad en el inicializador o no use un inicializador de objeto.

Vea también
Inicializadores de objeto: Tipos con nombre y anónimos
Cómo: Declarar un objeto usando un inicializador de objeto
Se sobrepasó el final del archivo
23/10/2019 • 2 minutes to read • Edit Online

Ya sea un Input instrucción está leyendo desde un archivo que está vacío o uno en el que todos los datos se usa o
ha usado el EOF función con un archivo abierto para acceso binario.

Para corregir este error


1. Use la EOF función inmediatamente antes de la Input instrucción para detectar el final del archivo.
2. Si el archivo está abierto para acceso binario, utilice Seek y Loc .

Vea también
Input
EOF
Seek
Loc
Se produjo un error interno en <ubicación >
31/10/2019 • 2 minutes to read • Edit Online

Se ha producido un error interno. La línea en la que se produjo está incluida en el mensaje de error.

Para corregir este error


Asegúrese de que este error no fue generado por la instrucción Error o Raise método; en caso contrario,
póngase en contacto con los servicios de soporte técnico de Microsoft para informar de las condiciones en las
que apareció el mensaje.

Vea también
Conceptos básicos del depurador
Conversión implícita de '<typename1 >' a
'<nombredetipo2 >' en copiar el valor del parámetro
'ByRef' '<parametername >' en el argumento
correspondiente.
23/10/2019 • 2 minutes to read • Edit Online

Se llama a un procedimiento con un ByRef argumento de un tipo diferente del parámetro correspondiente.
Si se pasa un argumento ByRef , Visual Basic a veces copia el valor del argumento en una variable local en el
procedimiento en lugar de pasar una referencia. En tal caso, cuando el procedimiento vuelve, Visual Basic debe, a
continuación, copiar el valor de la variable local en el argumento en el código de llamada.
Si un valor de argumento ByRef se copia en el procedimiento y el argumento y el parámetro son del mismo tipo,
no es necesario realizar ninguna conversión. Pero si los tipos son diferentes, Visual Basic debe convertir en ambas
direcciones. Dado que no se puede usar CType o cualquiera de las otras palabras clave de conversión en un
argumento de procedimiento o parámetro, dicha conversión siempre es implícito.
De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC41999

Para corregir este error


Si es posible, utilice un argumento de llamada del mismo tipo como el parámetro de procedimiento, por lo
que no es necesario realizar ninguna conversión de Visual Basic.
Si necesita llamar al procedimiento con un argumento de tipo diferente del tipo de parámetro pero no es
necesario devolver un valor al argumento de llamada, defina el parámetro para que sea ByVal en lugar de
ByRef .

Vea también
Procedimientos
Argumentos y parámetros de procedimiento
Paso de argumentos por valor y por referencia
Conversiones implícitas y explícitas
'Is' requiere operandos que tienen tipos de referencia,
pero este operando tiene el tipo de valor '<typename
>'
23/10/2019 • 2 minutes to read • Edit Online

El Is operador de comparación determina si dos variables de objeto hacen referencia a la misma instancia. Esta
comparación no está definida para los tipos de valor.
Identificador de error : BC30020

Para corregir este error


Utilice el operador de comparación aritmética adecuado o Like operador para comparar dos tipos de valor.

Vea también
Is (operador)
Like (operador)
Operadores de comparación
El operando 'IsNot' de tipo 'nombreDeTipo' solo se
puede comparar con 'Nothing', porque
'nombreDeTipo' es un tipo que acepta valores NULL
27/03/2020 • 2 minutes to read • Edit Online

Una variable declarada como un tipo de valor que Nothing acepta IsNot valores NULL se ha comparado con una
expresión que no sea el uso del operador.
ID de error : BC32128

Para corregir este error


Para comparar un tipo que acepta valores NULL con una expresión distinta de Nothing con el operador IsNot ,
llame al método GetType en el tipo que acepta valores NULL y compare el resultado con la expresión, como se
muestra en el ejemplo siguiente.

Dim number? As Integer = 5

If number IsNot Nothing Then


If number.GetType() IsNot Type.GetType("System.Int32") Then

End If
End If

Vea también
Tipos de valores que aceptan valores NULL
Operador IsNot
Las etiquetas que son números deben ir seguidas de
dos puntos
23/10/2019 • 2 minutes to read • Edit Online

Los números de línea siguen las mismas reglas que otros tipos de etiquetas y deben contener un signo de dos
puntos.
IDENTIFICADOR de error : BC30801

Para corregir este error


Coloque el número seguido de un signo de dos puntos al principio de una línea de código. por ejemplo:

400: X += 1

Vea también
GoTo (instrucción)
La expresión lambda no se quitará de este
controlador de eventos
23/10/2019 • 2 minutes to read • Edit Online

La expresión lambda no se quitará de este controlador de eventos. Asigne la expresión lambda a una variable y use
la variable para agregar y quitar el evento.
Cuando se usan expresiones lambda con controladores de eventos, es posible que no vea el comportamiento que
espera. El compilador genera un nuevo método para cada definición de expresión lambda, incluso si son idénticos.
Por lo tanto, el código siguiente muestra False .

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

Cuando se usan expresiones lambda con controladores de eventos, esto puede provocar resultados inesperados. En
el ejemplo siguiente, la instrucción RemoveHandler no quita la expresión lambda agregada por AddHandler .

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

De forma predeterminada, este mensaje es una advertencia. Para más información sobre cómo ocultar las
advertencias o tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC42326

Para corregir este error


Para evitar la advertencia y quitar la expresión lambda, asigne la expresión lambda a una variable y use la variable
en las instrucciones AddHandler y RemoveHandler , tal y como se muestra en el ejemplo siguiente.
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

Vea también
Expresiones lambda
Conversión de delegado flexible
Eventos
Las expresiones lambda no son válidas en la primera
expresión de una instrucción 'Select Case'
23/10/2019 • 2 minutes to read • Edit Online

No se puede usar una expresión lambda para la expresión de prueba en un Select Case instrucción. Definiciones
de la expresión lambda que devuelven las funciones y la expresión de prueba de un Select Case instrucción debe
ser un tipo de datos básico.
El código siguiente provoca este error:

' Select Case (Function(arg) arg Is Nothing)


' List of the cases.
' End Select

Identificador de error : BC36635

Para corregir este error


Examine el código para determinar si podría funcionar una construcción condicional diferente como, por
ejemplo, una instrucción If...Then...Else .
Puede haber pensado llamar a la función, tal como se muestra en el código siguiente:

Dim num? As Integer


Select Case ((Function(arg? As Integer) arg Is Nothing)(num))
' List of the cases
End Select

Vea también
Expresiones lambda
If...Then...Else (instrucción)
Select...Case (instrucción)
Resolución enlazada tempranamente; pueden
producirse errores en tiempo de ejecución
23/10/2019 • 2 minutes to read • Edit Online

Un objeto se asigna a una variable que se declara de la Object Data Type.


Cuando se declara una variable como Object , el compilador debe realizar enlace más tarde, que produce
operaciones adicionales en tiempo de ejecución. También expone la aplicación a posibles errores en tiempo de
ejecución. Por ejemplo, si asigna un Form a la Object variable y, a continuación, intente obtener acceso a la
XmlDocument.NameTable propiedad, el tiempo de ejecución produce una MemberAccessException porque el Form
clase no expone un NameTable propiedad.
Si se declara la variable es de un tipo específico, el compilador puede realizar enlace anticipado en tiempo de
compilación. Esto da como resultado un mejor rendimiento, acceso controlado a los miembros del tipo específico y
mejorar la legibilidad del código.
De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC42017

Para corregir este error


Si es posible, declare la variable sea de un tipo específico.

Vea también
Enlace en tiempo de compilación y en tiempo de ejecución
Declaración de variables de objeto
La resolución de sobrecarga enlazada
tardíamente<no se puede aplicar a '
nombreprocedimiento > ' porque la instancia de
acceso es un tipo de interfaz
23/10/2019 • 3 minutes to read • Edit Online

El compilador está intentando resolver una referencia a una propiedad o procedimiento sobrecargado, pero se
produce un error en la referencia porque Object un argumento es de tipo y el objeto de referencia tiene el tipo de
datos de una interfaz. El Object argumento obliga al compilador a resolver la referencia como enlazada en tiempo
de ejecución.
En estas circunstancias, el compilador resuelve la sobrecarga a través de la clase de implementación en lugar de a
través de la interfaz subyacente. Si la clase cambia el nombre de una de las versiones sobrecargadas, el compilador
no considera que la versión es una sobrecarga porque su nombre es diferente. Esto, a su vez, hace que el
compilador omita la versión a la que se ha cambiado el nombre cuando podría haber sido la opción correcta para
resolver la referencia.
IDENTIFICADOR de error : BC30933

Para corregir este error


Use CType para convertir el argumento de Object en el tipo especificado por la firma de la sobrecarga a la
que desea llamar.
Tenga en cuenta que no ayuda a convertir el objeto que hace referencia en la interfaz subyacente. Debe
convertir el argumento para evitar este error.

Ejemplo
En el ejemplo siguiente se muestra una llamada a un Sub procedimiento sobrecargado que produce este error en
tiempo de compilación.

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
En el ejemplo anterior, si el compilador permitía s1 la llamada a como escrita, la resolución se realizaría c1 a
través de la clase i1 en lugar de la interfaz. Esto significa que el compilador no tendría s2 en cuenta porque su
nombre es c1 diferente en, aunque es la opción i1 correcta tal y como se define en.
Puede corregir el error cambiando la llamada a cualquiera de las siguientes líneas de código:

refer.s1(CType(o1, Integer))
refer.s1(CType(o1, Double))

Cada una de las líneas de código anteriores convierte explícitamente Object la o1 variable a uno de los tipos de
parámetros definidos para las sobrecargas.

Vea también
Sobrecarga de procedimientos
Resolución de sobrecargas
Función CType
'.' o '!' inicial sólo puede aparecer dentro de una
instrucción 'With'
23/10/2019 • 2 minutes to read • Edit Online

Un punto (.) o signo de exclamación (!) que no está dentro un With bloque aparece sin una expresión de la
izquierda. Acceso a miembros ( . ) y acceso a miembros de diccionario ( ! ) requieren una expresión que especifica
el elemento que contiene el miembro. Esto debe aparecer inmediatamente a la izquierda del descriptor de acceso o
como destino de una With bloque que contiene el acceso a miembros.
Identificador de error : BC30157

Para corregir este error


1. Asegúrese de que el With bloque tiene el formato correcto.
2. Si no hay ningún With bloquear, agregue una expresión a la izquierda del descriptor de acceso que se
evalúa como un elemento definido que contiene el miembro.

Vea también
Caracteres especiales en el código
With...End With (instrucción)
La línea es demasiado larga
23/10/2019 • 2 minutes to read • Edit Online

Líneas de texto de origen no pueden superar los 65535 caracteres.


Identificador de error : BC30494

Para corregir este error


Reduzca la longitud de la línea a 65535 caracteres o menos.

Vea también
Tipos de error
Ya no se admiten instrucciones 'Line' (error del
compilador de Visual Basic)
23/10/2019 • 2 minutes to read • Edit Online

Ya no se admiten instrucciones de línea. Funcionalidad de E/S de archivos está disponible como


Microsoft.VisualBasic.FileSystem.LineInput y funcionalidad de gráficos está disponible como
System.Drawing.Graphics.DrawLine .

Identificador de error : BC30830

Para corregir este error


1. Si realiza el acceso a archivos, utilice Microsoft.VisualBasic.FileSystem.LineInput .
2. Si está realizando gráficos, use System.Drawing.Graphics.Drawline .

Vea también
System.IO
System.Drawing
Acceso a archivos con Visual Basic
El método no tiene una firma compatible con el
delegado
23/10/2019 • 2 minutes to read • Edit Online

Hay una incompatibilidad entre las firmas del método y el delegado que está intentando usar. La instrucción
Delegate define los tipos de parámetro y los tipos de valores devueltos de una clase de delegado. Cualquier
procedimiento que tiene que coincidan con los parámetros de tipos compatibles y devolver tipos que pueden
usarse para crear una instancia de este tipo de delegado.
Identificador de error : BC36563

Vea también
AddressOf (operador)
Delegate (instrucción)
Resolución de sobrecargas
Generic Types in Visual Basic
Los métodos de 'System.Nullable(Of T)' no se pueden
utilizar como operandos del operador 'AddressOf'
23/10/2019 • 2 minutes to read • Edit Online

Una instrucción usa la AddressOf operador con un operando que representa un procedimiento de la Nullable<T>
estructura.
Identificador de error : BC32126

Para corregir este error


Reemplace el nombre del procedimiento en el AddressOf cláusula con un operando que no es un miembro
de Nullable<T>.
Escribir una clase que contiene el método de Nullable<T> que desea usar. En el ejemplo siguiente, la
NullableWrapper clase define un nuevo método denominado GetValueOrDefault . Dado que este nuevo
método no es un miembro de Nullable<T>, éste puede aplicarse a nullInstance , una instancia de un tipo
que acepta valores NULL, para formar un argumento para AddressOf .

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

Vea también
Nullable<T>
AddressOf (operador)
Tipos de valor que aceptan valores NULL
Generic Types in Visual Basic
Las instrucciones 'Module' sólo pueden ocurrir en el
nivel de archivo o de espacio de nombres
23/10/2019 • 2 minutes to read • Edit Online

Module las instrucciones deben aparecer en la parte superior del archivo de origen inmediatamente después de
Option y Imports instrucciones, los atributos globales y las declaraciones de espacio de nombres, pero antes de
todas las demás declaraciones.
Identificador de error : BC30617

Para corregir este error


Mueva la instrucción Module a la parte superior de la declaración del espacio de nombres o el archivo de
código fuente.

Vea también
Module (instrucción)
Nombre <membername > no es conforme a CLS
23/10/2019 • 2 minutes to read • Edit Online

Un ensamblado está marcado como <CLSCompliant(True)> pero expone un miembro con un nombre que comienza
con un carácter de subrayado ( _ ).
Un elemento de programación puede contener uno o más caracteres de subrayado, pero to sea compatible con la
independencia del lenguaje y componentes independientes del lenguaje (CLS), no debe comenzar con un carácter
de subrayado. Vea Declared Element Names.
Al aplicar CLSCompliantAttribute a un elemento de programación, establezca el parámetro isCompliant del
atributo en True o False para indicar conformidad o disconformidad. No hay ningún valor predeterminado para
este parámetro, por lo que debe proporcionar uno.
Si no se aplica CLSCompliantAttribute a un elemento, se considera que no es conforme.
De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC40031

Para corregir este error


Si tiene control sobre el código fuente, cambie el nombre de miembro para que no comienza con un carácter
de subrayado.
Si necesita que el nombre de miembro permanecen sin cambios, quite el CLSCompliantAttribute de su
definición o márquelo como <CLSCompliant(False)> . Todavía puede marcar el ensamblado como
<CLSCompliant(True)> .

Vea también
Nombres de elementos declarados
Convenciones de nomenclatura de Visual Basic
No se<ha declarado el nombre ' nombre > '
23/10/2019 • 3 minutes to read • Edit Online

Una instrucción hace referencia a un elemento de programación, pero el compilador no puede encontrar un
elemento con ese nombre exacto.
IDENTIFICADOR de error : BC30451

Para corregir este error


1. Compruebe que el nombre de la instrucción de referencia esté bien escrito. Visual Basic no distingue entre
mayúsculas y minúsculas, pero cualquier otra variación en la ortografía se considera un nombre
completamente diferente. Tenga en cuenta que el carácter de subrayado ( _ ) es parte del nombre y, por
tanto, parte de la ortografía.
2. Compruebe que tiene el operador de acceso a miembros . () entre un objeto y su miembro. Por ejemplo, si
tiene un control TextBox denominado TextBox1 , para tener acceso a su propiedad Text debe escribir
TextBox1.Text . Si en su lugar escribe TextBox1Text , ha creado un nombre diferente.

3. Si la ortografía es correcta y la sintaxis de cualquier acceso de miembro de objeto es correcta, compruebe


que se ha declarado el elemento. Para obtener más información, vea elementos declarados.
4. Si se ha declarado el elemento de programación, compruebe que está en el ámbito. Si la instrucción de
referencia está fuera de la región que declara el elemento de programación, es posible que deba calificar el
nombre del elemento. Para obtener más información, consulta Scope in Visual Basic.
5. Si no usa un tipo completo o un nombre de miembro (por ejemplo, el código hace referencia a una
propiedad como MethodInfo.Name en lugar de System.Reflection.MethodInfo.Name ), agregue una instrucción
Imports.
6. Si intenta compilar un proyecto de estilo SDK (un proyecto con un *archivo. vbproj que comienza con la
línea <Project Sdk="Microsoft.NET.Sdk"> ) y el mensaje de error hace referencia a un tipo o miembro del
ensamblado Microsoft. VisualBasic. dll, configure la aplicación para compilar con una referencia a la
biblioteca en tiempo de ejecución de Visual Basic. De forma predeterminada, un subconjunto de la biblioteca
se incrusta en el ensamblado en un proyecto de estilo SDK.
Por ejemplo, el ejemplo siguiente no se compila porque no
Microsoft.VisualBasic.CompilerServices.Conversions.ChangeType se puede encontrar el método. No se
incrusta en el subconjunto del tiempo de ejecución de Visual Basic incluido en la aplicación.

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 solucionar este error, agregue el <VBRuntime>Default</VBRuntime> elemento a la sección


<PropertyGroup> de proyectos, como se muestra en el siguiente archivo de proyecto de Visual Basic.
<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>

Vea también
Resumen de constantes y declaraciones
Convenciones de nomenclatura de Visual Basic
Nombres de elementos declarados
Referencias a elementos declarados
Nombre <namespacename > en el espacio de
nombres raíz <fullnamespacename > no es conforme
a CLS
24/10/2019 • 2 minutes to read • Edit Online

Un ensamblado se marca como <CLSCompliant(True)> , pero un elemento del nombre del espacio de nombres raíz
comienza con un carácter de subrayado ( _ ).
Un elemento de programación puede contener uno o más guiones bajos, pero para que sea compatible con la
independencia del lenguaje y los componentes independientes del lenguaje (CLS), no debe comenzar con un
carácter de subrayado. Vea Declared Element Names.
Al aplicar CLSCompliantAttribute a un elemento de programación, establezca el parámetro isCompliant del
atributo en True o False para indicar conformidad o disconformidad. No hay ningún valor predeterminado para
este parámetro, por lo que debe proporcionar uno.
Si no se aplica CLSCompliantAttribute a un elemento, se considera que no es conforme.
De forma predeterminada, este mensaje es una advertencia. Para obtener información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC40039

Para corregir este error


Si requiere la conformidad con CLS, cambie el nombre del espacio de nombres raíz para que ninguno de sus
elementos comience con un carácter de subrayado.
Si requiere que el nombre del espacio de nombres permanezca inalterado, quite el CLSCompliantAttribute
del ensamblado o márquelo como <CLSCompliant(False)> .

Vea también
Namespace (instrucción)
Espacios de nombres en Visual Basic
-rootnamespace
Página de aplicación, Diseñador de proyectos (Visual Basic)
Nombres de elementos declarados
Convenciones de nomenclatura de Visual Basic
Namespace o tipo especificado en las
importaciones<nombrecompletoelemento >' no
contiene ningún miembro público o no se encuentra
23/10/2019 • 2 minutes to read • Edit Online

Namespace o tipo especificado en las importaciones<nombrecompletoelemento >' no contiene ningún miembro


público o no se encuentra. Asegúrese de que el espacio de nombres o el tipo se define y contiene a al menos un
miembro público. Asegúrese de que el nombre de alias no contiene otros alias.
Un Imports instrucción especifica un elemento contenedor que no se puede encontrar o no define Public
miembros.
Un que contiene el elemento puede ser el espacio de nombres, clase, estructura, módulo, interfaz o enumeración. El
elemento contenedor contiene a miembros, como variables, procedimientos u otros elementos que lo contiene.
El propósito de la importación es permitir que el código para obtener acceso a los miembros de tipo o espacio de
nombres sin tener que calificarlos. También podría necesitar el proyecto agregar una referencia al espacio de
nombres o tipo. Para obtener más información, vea "Importar elementos contenedores" en References to Declared
Elements.
Si el compilador no encuentra el elemento contenedor especificado, no se puede resolver las referencias que lo
usan. Si encuentra el elemento, pero el elemento no exponen ninguno Public miembros, ninguna referencia
puede ser correcta. En cualquier caso, tiene sentido para importar el elemento.
Tenga en cuenta que si importa un elemento contenedor y asignarle un alias de importación, a continuación, no se
puede usar ese alias de importación para importar otro elemento. El código siguiente genera un error del
compilador.

Imports winfrm = System.Windows.Forms

' The following statement is INVALID because it reuses an import alias.

Imports behave = winfrm.Design.Behavior`

Identificador de error : BC40056

Para corregir este error


1. Compruebe que el elemento contenedor es accesible desde el proyecto.
2. Compruebe que la especificación del elemento contenedor no incluye ningún alias de importación desde
otra importación.
3. Compruebe que el elemento contenedor expone al menos una Public miembro.

Vea también
Imports (instrucción), espacio de nombres y tipo .NET
Namespace (instrucción)
Public
Espacios de nombres en Visual Basic
Referencias a elementos declarados
Namespace o tipo especificado en el nivel de
proyecto Imports'<nombrecompletoelemento >' no
contiene ningún miembro público o no se encuentra
23/10/2019 • 3 minutes to read • Edit Online

Namespace o tipo especificado en el nivel de proyecto Imports'<nombrecompletoelemento >' no contiene ningún


miembro público o no se encuentra. Asegúrese de que el espacio de nombres o el tipo se define y contiene a al
menos un miembro público. Asegúrese de que el nombre de alias no contiene otros alias.
Una propiedad de importación de un proyecto especifica un elemento contenedor que no se puede encontrar o no
define Public miembros.
Un que contiene el elemento puede ser el espacio de nombres, clase, estructura, módulo, interfaz o enumeración. El
elemento contenedor contiene a miembros, como variables, procedimientos u otros elementos que lo contiene.
El propósito de la importación es permitir que el código para obtener acceso a los miembros de tipo o espacio de
nombres sin tener que calificarlos. También podría necesitar el proyecto agregar una referencia al espacio de
nombres o tipo. Para obtener más información, vea "Importar elementos contenedores" en References to Declared
Elements.
Si el compilador no encuentra el elemento contenedor especificado, no se puede resolver las referencias que lo
usan. Si encuentra el elemento, pero el elemento no exponen ninguno Public miembros, ninguna referencia
puede ser correcta. En cualquier caso, tiene sentido para importar el elemento.
Usa el Diseñador de proyectos para especificar los elementos que se van a importar. Use la espacios de
nombres impor tados sección de la referencias página. Puede tener acceso a la Diseñador de proyectos
haciendo doble clic en el mi proyecto icono en el Explorador de soluciones .
Identificador de error : BC40057

Para corregir este error


1. Abra el Diseñador de proyectos y cambie a la referencia página.
2. En el espacios de nombres impor tados sección, compruebe que el elemento contenedor es accesible
desde el proyecto.
3. Compruebe que el elemento contenedor expone al menos una Public miembro.

Vea también
Página Referencias, Diseñador de proyectos (Visual Basic)
Administrar propiedades de soluciones y proyectos
Public
Espacios de nombres en Visual Basic
Referencias a elementos declarados
Se necesita un índice de matriz de propiedades
31/10/2019 • 2 minutes to read • Edit Online

Este valor de propiedad consiste en una matriz, más que en un único valor. No especificó el índice de la propiedad
de matriz a la que intenta acceder.

Para corregir este error


Consulte la documentación del componente para encontrar el rango de índices adecuados para la matriz.
Especifique un índice adecuado en la instrucción de acceso a la propiedad.

Vea también
Tipos de error
Hable con nosotros
La función anidada no tiene una signatura
compatible con el delegado ' <delegatename > '
23/10/2019 • 2 minutes to read • Edit Online

Se ha asignado una expresión lambda a un delegado que tiene una firma no compatible. Por ejemplo, en el código
siguiente, el delegado Del tiene dos parámetros de entero.

Delegate Function Del(ByVal p As Integer, ByVal q As Integer) As Integer

El error se produce si una expresión lambda con un argumento se declara como de tipo Del :

' Neither of these is valid.


' Dim lambda1 As Del = Function(n As Integer) n + 1
' Dim lambda2 As Del = Function(n) n + 1

Identificador de error : BC36532

Para corregir este error


Ajuste la definición de delegado o la expresión lambda asignada para que las firmas sean compatibles.

Vea también
Conversión de delegado flexible
Expresiones lambda
No se encontró ningún método 'Main' accesible con
una firma apropiada en '<nombre >'
23/10/2019 • 2 minutes to read • Edit Online

Las aplicaciones de línea de comandos deben tener un Sub Main definido. Main debe declararse como
Public Shared si está definido en una clase o como Public si está definido en un módulo.

Identificador de error : BC30737

Para corregir este error


Definir un Public Sub Main procedimiento para el proyecto. Declara como Shared si y solo si se define dentro
de una clase.

Vea también
Estructura de un programa de Visual Basic
Procedimientos
No compatible con CLS <membername > no se
permite en una interfaz conforme a CLS
23/10/2019 • 2 minutes to read • Edit Online

Una propiedad, procedimiento o evento en una interfaz se marca como <CLSCompliant(True)> cuando la propia
interfaz está marcada como <CLSCompliant(False)> o no está marcada.
Para una interfaz sea compatible con la independencia del lenguaje y componentes independientes del lenguaje
(CLS), deben ser compatible con todos sus miembros.
Al aplicar CLSCompliantAttribute a un elemento de programación, establezca el parámetro isCompliant del
atributo en True o False para indicar conformidad o disconformidad. No hay ningún valor predeterminado para
este parámetro, por lo que debe proporcionar uno.
Si no se aplica CLSCompliantAttribute a un elemento, se considera que no es conforme.
De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC40033

Para corregir este error


Si requiere conformidad con CLS y tiene control sobre el código fuente de interfaz, marque la interfaz como
<CLSCompliant(True)> si todos sus miembros son conformes.

Si requiere conformidad con CLS y no tiene control sobre el código fuente de interfaz, o si no cumple las
condiciones ser compatible, defina a este miembro dentro de una interfaz diferente.
Si necesita que este miembro permanezca dentro de su interfaz actual, quite el CLSCompliantAttribute de su
definición o márquelo como <CLSCompliant(False)> .

Vea también
Interface (instrucción)
No se admite la inferencia de tipos que acepten
valores NULL en este contexto
27/03/2020 • 2 minutes to read • Edit Online

Los tipos de valor y las estructuras se pueden declarar que aceptan valores NULL.

Dim a? As Integer
Dim b As Integer?

Sin embargo, no puede usar la declaración que acepta valores NULL en combinación con la inferencia de tipos. Los
siguientes ejemplos provocan este error.

' Not valid.


' Dim c? = 10
' Dim d? = a

ID de error : BC36629

Para corregir este error


Utilice As una cláusula para declarar la variable como un tipo de valor que acepta valores NULL.

Vea también
Tipos de valores que aceptan valores NULL
Inferencia de tipo de variable local
El número de índices sobrepasa el número de
dimensiones de la matriz indizada
23/10/2019 • 2 minutes to read • Edit Online

El número de índices usado para obtener acceso a un elemento de matriz debe ser exactamente igual al rango de la
matriz, es decir, el número de dimensiones que tiene declaradas.
Identificador de error : BC30106

Para corregir este error


Quite los subíndices de la referencia de la matriz hasta que el número total de subíndices sea igual al rango
de la matriz. Por ejemplo:

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"

Vea también
Matrices
El objeto o la clase no admite el conjunto de eventos
23/10/2019 • 2 minutes to read • Edit Online

Se intentó usar un WithEvents variable con un componente que no puede funcionar como un origen de eventos
para el conjunto de eventos especificado. Por ejemplo, desea recibir los eventos de un objeto y, después, cree otro
objeto que Implements el primer objeto. Aunque es posible que cree que puede recibir los eventos del objeto
implementado, esto no es siempre el caso. Implements solo se implementa una interfaz para los métodos y
propiedades. WithEvents no se admite para privada UserControls , porque el tipo de información necesaria para
generar el ObjectEvent no está disponible en tiempo de ejecución.

Para corregir este error


1. No puede recibir eventos para un componente que no del origen de eventos.

Vea también
WithEvents
Implements (instrucción)
Se requiere un objeto (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Las referencias a las propiedades y los métodos requieren a menudo un calificador de objeto explícito. Este es un
caso.

Para corregir este error


1. Compruebe que las referencias a una propiedad o un método de objeto tienen un calificador de objeto
válido. Especifique un calificador de objeto si no ha proporcionado uno.
2. Compruebe la ortografía del calificador de objeto y asegúrese de que el objeto está visible en la parte del
programa en la que hace referencia.
3. Si se proporciona una ruta de acceso al comando Open de un archivo de la aplicación host, compruebe que
los argumentos de la misma son correctos.
4. Compruebe la documentación del objeto y asegúrese de que la acción es válida.

Vea también
Tipos de error
Variable de objeto o de bloque With no establecida
23/10/2019 • 4 minutes to read • Edit Online

Se está haciendo referencia a una variable de objeto no válido. Este error puede producirse por varias razones:
Se declaró una variable sin especificar un tipo. Si una variable se declara sin especificar un tipo, el valor
predeterminado es Type Object .
Por ejemplo, una Dim x variable declarada con sería de tipo Object; una variable declarada con
Dim x As String sería String de tipo.

TIP
La Option Strict instrucción no permite tipos implícitos que generan un Object tipo. Si omite el tipo, se
producirá un error en tiempo de compilación. Consulte Option Strict (instrucción).

Está intentando hacer referencia a un objeto que se ha establecido en Nothing .


Está intentando obtener acceso a un elemento de una variable de matriz que no se ha declarado
correctamente.
Por ejemplo, una matriz declarada como products() As String desencadenará el error si se intenta hacer
referencia a un elemento de la matriz. products(3) = "Widget" La matriz no tiene elementos y se trata como
un objeto.
Está intentando obtener acceso al código dentro de With...End With un bloque antes de que se haya
inicializado el bloque. Un With...End With bloque se debe inicializar ejecutando el punto de With entrada
de la instrucción.

NOTE
En versiones anteriores de Visual Basic o VBA, este error también se desencadenaba asignando un valor a una variable sin
usar la Set palabra clave ( x = "name" en lugar de Set x = "name" ). La Set palabra clave ya no es válida en Visual
Basic .net.

Para corregir este error


1. Establezca Option Strict en On agregando el código siguiente al principio del archivo:

Option Strict On

Al ejecutar el proyecto, aparecerá un error del compilador en el lista de errores para cualquier variable que
se especificó sin un tipo.
2. Si no desea habilitar Option Strict , busque en el código las variables que se especificaron sin un tipo (
Dim x en lugar de Dim x As String ) y agregue el tipo previsto a la declaración.

3. Asegúrese de que no hace referencia a una variable de objeto que se ha Nothing establecido en. Busque en el
código la palabra Nothing clave y revise el código para que el objeto no se establezca en Nothing hasta que
se haya hecho referencia a él.
4. Asegúrese de que las variables de matriz se dimensionan antes de tener acceso a ellas. Puede asignar una
dimensión la primera vez que cree la matriz ( Dim x(5) As String en lugar de Dim x() As String ), o bien use
la ReDim palabra clave para establecer las dimensiones de la matriz antes de tener acceso a ella por primera
vez.
5. Asegúrese de que With el bloque se inicializa ejecutando el punto de With entrada de la instrucción.

Vea también
Declaración de variables de objeto
ReDim (instrucción)
With...End With (instrucción)
Declaración de un operador debe ser uno de: +,-,
*,,/, ^, &, Like, Mod y, Or, Xor, no, < <, >>...
23/10/2019 • 2 minutes to read • Edit Online

Puede declarar sólo un operador que sea apto para la sobrecarga. En la tabla siguiente se enumera los operadores
que se puede declarar.

T IP O O P ERA DO RES

Unario + , - , IsFalse , IsTrue , Not

Binary + , - , * , / , \ , & , ^ , >> , << , = , <> , > , >= ,


< , <= , And , Like , Mod , Or , Xor

Conversión (unaria) CType

Tenga en cuenta que el = operador en la lista binaria es el operador de comparación, no el operador de


asignación.
Identificador de error : BC33000

Para corregir este error


1. Seleccione un operador del conjunto de operadores sobrecargables.
2. Si necesita la función de sobrecarga de un operador que no se puede sobrecargar directamente, cree un
procedimiento Function que tome los parámetros adecuados y devuelva el valor adecuado.

Vea también
Operator (instrucción)
Procedimientos de operadores
Cómo: Definir un operador
Cómo: Definir un operador de conversión
Function (instrucción)
Se esperaba 'Optional'
23/10/2019 • 2 minutes to read • Edit Online

Un argumento opcional en una declaración de procedimiento va seguido de un argumento necesario. Cada


argumento que sigue a un argumento opcional también debe ser opcional.
Identificador de error : BC30202

Para corregir este error


1. Si el argumento debe ser necesario, muévalo para que preceda al primer argumento opcional en la lista de
argumentos.
2. Si el argumento está pensado para que sea opcional, use la Optional palabra clave.

Vea también
Parámetros opcionales
Los parámetros opcionales deben especificar un valor
predeterminado
29/10/2019 • 2 minutes to read • Edit Online

Los parámetros opcionales deben proporcionar valores predeterminados que se pueden utilizar si un
procedimiento que realiza la llamada no proporciona ningún parámetro.
Identificador de error : BC30812

Ejemplo
En el ejemplo siguiente se genera BC30812:

Sub Proc1(x As Integer, Optional y As String)


Console.WriteLine("Default argument is: " & y)
End Sub

Para corregir este error


Especifique los valores predeterminados para los parámetros opcionales:

Sub Proc1(x As Integer, Optional y As String = "Default Value")


Console.WriteLine("Default argument is: " & y)
End Sub

Vea también
Optional
El ordinal no es válido
23/10/2019 • 2 minutes to read • Edit Online

La llamada a una biblioteca de vínculos dinámicos (DLL) indica que use un número en lugar de un nombre de
procedimiento mediante el #num sintaxis. Este error tiene las siguientes causas posibles:
Un intento para convertir el #num expresión a un error de ordinal.
El #num especificado no se especifica ninguna función en el archivo DLL.
Una biblioteca de tipos tiene una declaración no válida, lo que resulta en un uso interno de un número
ordinal no válido.

Para corregir este error


1. Asegúrese de que la expresión representa un número válido, o llame al procedimiento por nombre.
2. Asegúrese de que #num identifica una función válida en el archivo DLL.
3. Aislar la causa del problema marcando como comentario el código de la llamada del procedimiento. Escribir
un Declare declaración para el procedimiento y notificar el problema para el proveedor de la biblioteca de
tipos.

Vea también
Declare (instrucción)
Memoria insuficiente (error del compilador de Visual
Basic)
23/10/2019 • 2 minutes to read • Edit Online

Se necesita más memoria que la disponible.


Identificador de error : BC2004

Para corregir este error


Cierre las aplicaciones innecesarias, documentos y archivos de código fuente.
Eliminar formularios y controles innecesarios, por lo menos se cargan al mismo tiempo
Reducir el número de Public variables.
Compruebe el espacio en disco disponible.
Aumente la memoria RAM disponible al instalar memoria adicional o reasignar memoria.
Asegúrese de que la memoria se libera cuando ya no es necesaria.

Vea también
Tipos de error
Espacio de pila insuficiente (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

La pila es un área de trabajo de memoria que aumenta y disminuye dinámicamente con las demandas del
programa en ejecución. Se han superado sus límites.

Para corregir este error


1. Compruebe que los procedimientos no estén demasiado anidados.
2. Asegúrese de que los procedimientos recursivos se terminan correctamente.
3. Si las variables locales requieren más espacio de variables locales que el disponible, intente declarar algunas
variables en el nivel de módulo. También puede declarar todas las variables en el procedimiento static
anteponiendo la palabra clave Property , Sub o Function con Static . O bien, puede usar la instrucción
Static para declarar variables estáticas individuales dentro de los procedimientos.

4. Vuelva a definir algunas cadenas de longitud fija como cadenas de longitud variable, ya que las cadenas de
longitud fija utilizan más espacio de pila que las cadenas de longitud variable. También puede definir la
cadena en el nivel de módulo en el que no se requiere espacio de pila.
5. Compruebe el número de llamadas a funciones DoEvents anidadas mediante el cuadro de diálogo Calls
para ver los procedimientos que están activos en la pila.
6. Asegúrese de que no ocasionó un "evento en cascada" desencadenando un evento que llama a un
procedimiento de evento que ya está en la pila. Un evento en cascada es similar a una llamada a
procedimiento recursivo no terminada, pero es menos obvio, ya que la llamada se realiza mediante Visual
Basic en lugar de una llamada explícita en el código. Utilice el cuadro de diálogo Calls para ver los
procedimientos que están activos en la pila.

Vea también
Ventana Memoria
Espacio para cadenas insuficiente (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Con Visual Basic, puede usar cadenas muy grandes. Sin embargo, los requisitos de otros programas y la forma de
trabajar con las cadenas pueden producir este error.

Para corregir este error


1. Asegúrese de que una expresión que requiera la creación de cadenas temporales durante la evaluación no
esté causando el error.
2. Quite las aplicaciones innecesarias de la memoria para crear más espacio.

Vea también
Tipos de error
Resumen de manipulación de cadenas
Desbordamiento (Error de Visual Basic)
23/10/2019 • 2 minutes to read • Edit Online

Un literal representa un valor fuera de los límites del tipo de datos a la que se está asignando.
Identificador de error : BC30036

Para corregir este error


Consulte el intervalo de valores para el tipo de datos y vuelva a escribir el literal para ajustarse a dicho intervalo
de destino.

Vea también
Tipos de datos
Desbordamiento (Error en tiempo de ejecución de
Visual Basic)
23/10/2019 • 2 minutes to read • Edit Online

Se produce un desbordamiento al intentar una asignación que supera los límites del destino de la asignación.

Para corregir este error


1. Asegúrese de que los resultados de tipo de datos, cálculos y las asignaciones de las conversiones no están
demasiado grande para representarlo dentro del intervalo de variables permitido para ese tipo de valor y
asignación el valor a una variable de un tipo que pueden contener un mayor intervalo de valores , si es
necesario.
2. Asegúrese de que las asignaciones de propiedades están dentro del intervalo de la propiedad a la que se
realizan.
3. Asegúrese de que números que se usan en los cálculos que se convierten en enteros no tienen resultados
más largos que los enteros.

Vea también
Int32.MaxValue
Double.MaxValue
Tipos de datos
Tipos de error
No se encuentra la ruta de acceso
23/10/2019 • 2 minutes to read • Edit Online

Durante una operación de acceso a archivos o acceso a disco, el sistema operativo no pudo encontrar la ruta de
acceso especificada. La ruta de acceso a un archivo incluye la especificación de unidad además de los directorios y
subdirectorios que deben recorrerse para localizar el archivo. Una ruta de acceso puede ser relativa o absoluta.

Para corregir este error


Compruebe y vuelva a especificar la ruta de acceso.

Vea también
Tipos de error
Error de acceso a la ruta o al archivo
23/10/2019 • 2 minutes to read • Edit Online

Durante una operación de acceso a archivos o acceso a disco, el sistema operativo no se pudo realizar una conexión
entre la ruta de acceso y el nombre de archivo.

Para corregir este error


1. Asegúrese de que la especificación de archivo tiene el formato correcto. Un nombre de archivo puede
contener una relativa o completa (absoluta) ruta de acceso. Una ruta de acceso completa se inicia con el
nombre de unidad (si la ruta de acceso está en otra unidad) y muestra la ruta de acceso explícita desde la
raíz en el archivo. Cualquier ruta de acceso que no es un nombre completo es relativa a la unidad actual y el
directorio.
2. Asegúrese de que no ha intentado guardar un archivo que desea reemplazar un archivo de solo lectura
existente. Si este es el caso, cambie el atributo de sólo lectura del archivo de destino o guarde el archivo con
un nombre de archivo diferente.
3. Asegúrese de que no intentó abrir un archivo de solo lectura en secuencial Output o Append modo. Si este
es el caso, abra el archivo en Input modo o cambiar el atributo de sólo lectura del archivo.
4. Asegúrese de que no ha intentado cambiar un proyecto de Visual Basic dentro de una base de datos o
documento.

Vea también
Tipos de error
Permiso denegado (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Se intentó escribir en un disco protegido contra escritura o para tener acceso a un archivo bloqueado.

Para corregir este error


1. Para abrir un archivo protegido contra escritura, cambie el atributo de protección contra escritura del
archivo.
2. Asegúrese de que otro proceso no haya bloqueado el archivo y espere a que se abra el archivo hasta que el
otro proceso lo libere.
3. Para tener acceso al registro, compruebe que los permisos de usuario incluyen este tipo de acceso al
registro.

Vea también
Tipos de error
El argumento o la llamada al procedimiento no es
válido (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Parte de la llamada no se puede completar.

Para corregir este error


Compruebe los intervalos permitidos para los argumentos para asegurarse de que ninguna disposición supera
los valores permitidos.

Vea también
Tipos de error
Propiedad '<propertyname >' no devuelve un valor
en todas las rutas de código
23/10/2019 • 2 minutes to read • Edit Online

Propiedad '<propertyname >' no devuelve un valor en todas las rutas de código. Podría producirse una excepción
de referencia nula en tiempo de ejecución al usar el resultado.
Una propiedad Get procedimiento tiene al menos una ruta de acceso posibles a través de su código que no
devuelve un valor.
Puede devolver un valor de una propiedad Get procedimiento en cualquiera de las maneras siguientes:
Asigne el valor al nombre de propiedad y, a continuación, realizar un Exit Property instrucción.
Asigne el valor al nombre de propiedad y, a continuación, realizar el End Get instrucción.
Incluya el valor en un instrucción Return.
Si el control se transfiere a Exit Property o End Get y no ha asignado ningún valor para el nombre de propiedad,
el Get procedimiento devuelve el valor predeterminado de la propiedad tipo de datos. Para obtener más
información, vea "Comportamiento" en instrucción Function.
De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC42107

Para corregir este error


Compruebe la lógica del flujo de control y asegúrese de que asignar un valor antes de cada instrucción que
genera un valor devuelto.
Es más fácil garantizar que todos los valores devueltos desde el procedimiento devuelve un valor si siempre
usa el Return instrucción. Si lo hace, la última instrucción antes de End Get debe ser un Return
instrucción.

Vea también
Procedimientos de propiedades
Property (instrucción)
Get (instrucción)
El índice de la matriz de propiedades no es válido
23/10/2019 • 2 minutes to read • Edit Online

El valor proporcionado no es válido para un índice de matriz de propiedades.

Para corregir este error


Compruebe la documentación del componente para asegurarse de que el índice está dentro del intervalo válido
para la propiedad especificada.

Vea también
Matrices
El procedimiento Let de la propiedad no está
definido y el procedimiento Get no ha devuelto un
objeto
23/10/2019 • 2 minutes to read • Edit Online

Solo pueden aplicar determinadas propiedades, métodos y las operaciones a Collection objetos. Especifica una
operación o propiedad que es exclusiva para colecciones, pero el objeto no es una colección.

Para corregir este error


1. Compruebe la ortografía del nombre de objeto o propiedad o compruebe que el objeto es un Collection
objeto.
2. Examine el Add método usado para agregar el objeto a la colección para asegurarse de la sintaxis es
correcta y que se han escrito correctamente los identificadores.

Vea también
Collection
Propiedad no encontrada
23/10/2019 • 2 minutes to read • Edit Online

Este objeto no admite la propiedad especificada.

Para corregir este error


1. Compruebe la ortografía del nombre de la propiedad.
2. Compruebe la documentación del objeto para asegurarse de que no intenta tener acceso a algo parecido a
una propiedad "text" cuando el objeto realmente es compatible con un "título" o una propiedad con el
mismo nombre.

Vea también
Tipos de error
No se encuentra la propiedad ni el método
23/10/2019 • 2 minutes to read • Edit Online

La propiedad de objeto o método de objeto que se hace referencia no está definida.

Para corregir este error


Es posible que haya escrito mal el nombre del objeto. Para ver qué propiedades y métodos se definen para un
objeto, mostrar el Examinador de objetos. Seleccione la biblioteca de objetos adecuados para ver una lista de
propiedades y métodos disponibles.

Vea también
Tipos de error
Variable de rango <variable > oculta una variable en
un bloque de inclusión, una variable de rango
definida anteriormente o una variable declarada de
forma implícita en una expresión de consulta
23/10/2019 • 2 minutes to read • Edit Online

Un nombre de variable de rango especificado en un Select , From , Aggregate , o Let cláusula duplica el nombre
de una variable de rango definido anteriormente en la consulta o el nombre de una variable que se declara
implícitamente por la consulta, Por ejemplo, un nombre de campo o el nombre de una función de agregado.
Identificador de error : BC36633

Para corregir este error


Asegúrese de que todas las variables de rango en un ámbito determinado de consulta tienen nombres únicos.
Puede incluir una consulta entre paréntesis para asegurarse de que las consultas anidadas tienen un ámbito
único.

Vea también
Introducción a LINQ en Visual Basic
From (cláusula)
Let (cláusula)
Aggregate (cláusula)
Select (cláusula)
El nombre de una variable de rango sólo se puede
inferir a partir de un nombre simple o completo sin
argumentos
23/10/2019 • 2 minutes to read • Edit Online

Un elemento de programación que toma uno o más argumentos se incluye en una consulta LINQ. El compilador no
puede inferir una variable de rango de ese elemento de programación.
Identificador de error : BC36599

Para corregir este error


Proporcione un nombre de variable explícito para el elemento de programación, tal y como se muestra en el código
siguiente:

Dim query = From var1 In collection1


Select VariableAlias= SampleFunction(var1), var1

Vea también
Introducción a LINQ en Visual Basic
Select (cláusula)
Necesaria una referencia al ensamblado
'<assemblyidentity >' que contiene el tipo
'<typename >', pero no se encontró una referencia
adecuada debido a la ambigüedad entre los
proyectos<projectname1 >' y '< projectname2 >'
23/10/2019 • 2 minutes to read • Edit Online

Una expresión usa un tipo como, por ejemplo, una clase, estructura, interfaz, enumeración o delegado, que se
define fuera del proyecto. Sin embargo, hay referencias de proyectos a más de un ensamblado que definen ese
tipo.
Los proyectos citados generan ensamblados con el mismo nombre. Por lo tanto, el compilador no puede
determinar qué ensamblado debe usar para el tipo al que se está accediendo.
Para obtener acceso a un tipo definido en otro ensamblado, el compilador de Visual Basic debe tener una referencia
a ese ensamblado. Debe ser una referencia única y no ambigua, que no produzca referencias circulares entre
proyectos.
Identificador de error : BC30969

Para corregir este error


1. Determine qué proyecto produce el mejor ensamblado para que el proyecto haga referencia a este. Para
tomar esta decisión, puede usar criterios como la facilidad de acceso a archivos y la frecuencia de las
actualizaciones.
2. En las propiedades del proyecto, agregue una referencia al archivo que contiene el ensamblado que define el
tipo que está usando.

Vea también
Administrar referencias en un proyecto
Referencias a elementos declarados
Administrar propiedades de soluciones y proyectos
Solucionar problemas de referencias rotas
Necesaria una referencia al ensamblado
'<assemblyname >' que contiene la clase
base<classname >'
23/10/2019 • 2 minutes to read • Edit Online

Necesaria una referencia al ensamblado '<assemblyname >' que contiene la clase base<classname >'. Agregue
una al proyecto.
La clase está definida en una biblioteca de vínculos dinámicos (DLL) o un ensamblado al que no se hace referencia
directamente en el proyecto. El compilador de Visual Basic requiere una referencia para evitar la ambigüedad en
caso de la clase está definida en más de una DLL o ensamblado.
Identificador de error : BC30007

Para corregir este error


Incluya el nombre de la DLL o el ensamblado no referenciados en las referencias del proyecto.

Vea también
Administrar referencias en un proyecto
Solucionar problemas de referencias rotas
La operación solicitada no está disponible porque no
está definida la función de biblioteca en tiempo de
ejecución '<función > '.
26/10/2019 • 2 minutes to read • Edit Online

Visual Basic está intentando realizar una llamada interna a una función en el tiempo de ejecución de Visual Basic
(Microsoft. VisualBasic. dll) que no se puede encontrar.
Identificador de error : BC35000
Este error se produce en los proyectos de estilo SDK (proyectos con un archivo *. vbproj que comienza con la línea
<Project Sdk="Microsoft.NET.Sdk"> ). De forma predeterminada, solo un subconjunto del ensamblado Microsoft.
VisualBasic. dll se incrusta en el ensamblado de la aplicación y <función > no se incluye en ese subconjunto.

Para corregir este error


En lugar de insertar un subconjunto del tiempo de ejecución de Visual Basic en el ensamblado, debe compilar con
una referencia a él. Para ello, agregue el siguiente elemento a la sección <PropertyGroup> del archivo *. vbproj :

<VBRuntime>Default</VBRuntime>

Vea también
-vbruntime (( opción del compilador)
Reanudar sin error
23/10/2019 • 2 minutes to read • Edit Online

Un Resume aparecido instrucción fuera del código de control de errores o el código pasó de un controlador de
errores, aunque se ha producido ningún error.

Para corregir este error


1. Mover el Resume instrucción en un controlador de errores, o eliminarlo.
2. No se pueden producir los saltos a etiquetas en los procedimientos, de modo que busque el procedimiento
para la etiqueta que identifica el controlador de errores. Si encuentra una etiqueta duplicada especificada
como destino de un GoTo instrucción que no sea un On Error GoTo instrucción, cambiar la etiqueta de línea
para que coincida con su destino pretendido.

Vea también
Resume (instrucción)
On Error (instrucción)
Tipo de función de valor devuelto
'<NombreDeProcedimiento >' no es conforme a CLS
23/10/2019 • 3 minutes to read • Edit Online

Un Function procedimiento está marcado como <CLSCompliant(True)> pero devuelve un tipo que está marcado
como <CLSCompliant(False)> , no está marcado o no cumple los requisitos porque es un tipo no conforme.
Para que un procedimiento sea conforme a la Independencia del lenguaje y componentes independientes del
lenguaje (CLS), solo debe usar tipos conformes a CLS. Esto se aplica a los tipos de los parámetros, el tipo de valor
devuelto y los tipos de todas sus variables locales.
Los siguientes tipos de datos de Visual Basic no son conformes a CLS:
SByte (tipo de datos)
UInteger (tipo de datos)
ULong (tipo de datos)
UShort (tipo de datos)
Al aplicar CLSCompliantAttribute a un elemento de programación, establezca el parámetro isCompliant del
atributo en True o False para indicar conformidad o disconformidad. No hay ningún valor predeterminado para
este parámetro, por lo que debe proporcionar uno.
Si no se aplica CLSCompliantAttribute a un elemento, se considera que no es conforme.
De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC40027

Para corregir este error


Si el Function procedimiento debe devolver este tipo determinado, quite el CLSCompliantAttribute. El
procedimiento no puede ser conforme a CLS.
Si el Function procedimiento debe ser conforme a CLS, cambie el tipo de valor devuelto al tipo conforme a
CLS más próximo. Por ejemplo, en lugar de UInteger , quizá pueda usar Integer si no necesita que el
intervalo de valores esté por encima de 2.147.483.647. Si necesita el intervalo extendido, puede reemplazar
UInteger por Long .

Si trabaja con objetos de automatización o COM, tenga en cuenta que algunos tipos tienen anchos de datos
diferente que en .NET Framework. Por ejemplo, int suele ser de 16 bits en otros entornos. Si va a devolver
un entero de 16 bits a esos componentes, declárelo como Short en lugar de Integer en el código
administrado de Visual Basic.
'Set' descriptor de acceso de propiedad
'<propertyname >' no es accesible
23/10/2019 • 2 minutes to read • Edit Online

Una instrucción intenta almacenar el valor de una propiedad cuando no tiene acceso a la propiedad Set
procedimiento.
Si el instrucción Set está marcada con un acceso más restrictivo nivel que su Property Statement, podría producirse
un error de un intento para establecer el valor de propiedad en los casos siguientes:
El Set instrucción está marcada como privada y el código de llamada está fuera de la clase o estructura en
la que se define la propiedad.
El Set instrucción está marcada como Protected y el código de llamada no está en la clase o estructura en la
que se define la propiedad, ni en una clase derivada.
El Set instrucción está marcada como Friend y el código de llamada no está en el mismo ensamblado en el
que se define la propiedad.
Identificador de error : BC31102

Para corregir este error


Si tiene el control del código fuente definiendo la propiedad, considere la posibilidad de declarar la Set
procedimiento con el mismo nivel de acceso que la propiedad propiamente dicha.
Si no tiene control sobre el código fuente definiendo la propiedad, o si debe restringir el Set procedimiento
de nivel de acceso a la propiedad propiamente dicha, intente mover la instrucción que establece el valor de
propiedad en una región de código que tiene un mejor acceso a la propiedad.

Vea también
Procedimientos de propiedades
Cómo: Declarar una propiedad con niveles de acceso mixtos
Algunas subclaves no se pueden eliminar
23/10/2019 • 2 minutes to read • Edit Online

Se ha intentado eliminar una clave del registro, pero la operación no se pudo porque algunas subclaves no se
puede eliminar. Normalmente, esto es debido a una falta de permisos.

Para corregir este error


Asegúrese de que tiene permisos suficientes para eliminar las subclaves especificadas.

Vea también
Microsoft.VisualBasic.MyServices.RegistryProxy
DeleteSubKey
RegistryPermission
La instrucción no puede terminar un bloque fuera de
una línea de la instrucción 'If'
23/10/2019 • 2 minutes to read • Edit Online

Una sola línea If instrucción contiene varias instrucciones separadas por dos puntos (:), uno de los cuales es un
End declaración de un bloque de control fuera de la línea If . Línea If instrucciones no utilizan el End If
instrucción.
Identificador de error : BC32005

Para corregir este error


Mover la línea If instrucción fuera del bloque de control que contiene el End If instrucción.

Vea también
If...Then...Else (instrucción)
La instrucción no es válida en un espacio de nombres
23/10/2019 • 2 minutes to read • Edit Online

La instrucción no puede aparecer en el nivel de un espacio de nombres. Las declaraciones sola permitidas en el
nivel de espacio de nombres son el módulo, clase, interfaz, delegado, enumeración y declaraciones de estructura.
Identificador de error : BC30001

Para corregir este error


Mueva la instrucción a una ubicación dentro de un módulo, clase, interfaz, estructura, enumeración o definición
de delegado.

Vea también
Ámbito en Visual Basic
Espacios de nombres en Visual Basic
La instrucción no es válida dentro de un método o
una expresión lambda de varias líneas
23/10/2019 • 2 minutes to read • Edit Online

La instrucción no es válida dentro de un Sub , Function , propiedad Get , o la propiedad Set procedimiento.
Algunas instrucciones se pueden colocar en el nivel de clase o módulo. Otros, como Option Strict , debe estar en
el nivel de espacio de nombres y preceder a todas las demás declaraciones.
Identificador de error : BC30024

Para corregir este error


Quite la instrucción del procedimiento.

Vea también
Sub (instrucción)
Function (instrucción)
Get (instrucción)
Set (instrucción)
Las constantes de cadena deben terminar en comillas
dobles
23/10/2019 • 2 minutes to read • Edit Online

Las constantes de cadena deben comenzar y terminar con comillas.


ErrorID: BC30648

Para corregir este error


Asegúrese de que el literal de cadena finaliza con una comilla ("). Si pega los valores de otros editores de texto,
asegúrese de que los caracteres pegados son comillas dobles válidas y no uno de los caracteres que se
asemejan a, por ejemplo, "inteligente" o "llave" entre comillas ("o") o dos comillas (").

Vea también
Cadenas
Estructura '<structurename >' debe contener al
menos una variable miembro de instancia o
declaración de evento de al menos una instancia no
esté marcada como 'Custom'
23/10/2019 • 2 minutes to read • Edit Online

Una definición de estructura no incluye las variables no compartidas o eventos no personalizados no compartidos.
Cada estructura debe tener una variable o un evento que se aplica a cada instancia concreta (no compartida) en
lugar de a todas las instancias colectivamente (Shared). Procedimientos, propiedades y constantes no compartidas
no cumplen este requisito. Además, si no hay ninguna variable no compartida y un solo evento no compartido, ese
evento no puede ser un Custom eventos.
Identificador de error : BC30941

Para corregir este error


Definir al menos una variable o evento que no es Shared . Si define un solo evento, debe ser compartidas, así
como no compartidos.

Vea también
Estructuras
Cómo: Declarar una estructura
Structure (instrucción)
No se encontró 'Sub Main' en '<nombre >'
23/10/2019 • 2 minutes to read • Edit Online

Falta Sub Main o se ha especificado una ubicación incorrecta para la instrucción.


Identificador de error : BC30420

Para corregir este error


1. Indique la instrucción Sub Main que falta o, si existe, muévala a la ubicación adecuada del código. Para
obtener más información sobre Sub Main , consulte procedimiento Main en Visual Basic.
2. Especifique la ubicación del objeto de inicio del proyecto en el formulario de inicio cuadro de la
Diseñador de proyectos .

Vea también
Sub (instrucción)
Procedimiento Main en Visual Basic
Sub o Function no definida (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Se debe definir una Sub o Function para que se llame a. Las causas posibles de este error son:
Error al escribir el nombre del procedimiento.
Intentar llamar a un procedimiento desde otro proyecto sin agregar explícitamente una referencia a ese
proyecto en el cuadro de diálogo referencias .
Especificar un procedimiento que no es visible para el procedimiento que realiza la llamada.
Declarar una rutina de biblioteca de vínculos dinámicos (DLL) de Windows o una rutina de recursos de
código de Macintosh que no está en la biblioteca o el recurso de código especificado.

Para corregir este error


1. Asegúrese de que el nombre del procedimiento esté escrito correctamente.
2. Busque el nombre del proyecto que contiene el procedimiento al que desea llamar en el cuadro de diálogo
referencias . Si no aparece, haga clic en el botón examinar para buscarlo. Active la casilla situada a la
izquierda del nombre del proyecto y, a continuación, haga clic en Aceptar .
3. Compruebe el nombre de la rutina.

Vea también
Tipos de error
Administrar referencias en un proyecto
Sub (instrucción)
Function (instrucción)
El subíndice está fuera del intervalo (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Un subíndice de matriz no es válido porque está fuera del intervalo permitido. El valor de subíndice más bajo de
una dimensión es siempre 0, y el valor de subíndice más alto lo devuelve el método GetUpperBound de esa
dimensión.

Para corregir este error


Cambiar el subíndice para que esté dentro del intervalo válido.

Vea también
Array.GetUpperBound
Matrices
TextFieldParser no puede finalizar la operación de
lectura porque se ha superado el tamaño máximo de
búfer
23/10/2019 • 2 minutes to read • Edit Online

No se puede completar la operación porque se ha superado el tamaño máximo del búfer (10 000 000 bytes).

Para corregir este error


Asegúrese de que no hay ningún campo con formato incorrecto en el archivo.

Vea también
OpenTextFieldParser
TextFieldParser
Cómo: Leer archivos de texto con varios formatos
Análisis de archivos de texto con el objeto TextFieldParser
El tipo de la variable<' variablename > ' no se inferirá
porque está enlazado a un campo en un ámbito de
inclusión
23/10/2019 • 3 minutes to read • Edit Online

El tipo de la variable<' variablename > ' no se inferirá porque está enlazado a un campo en un ámbito de inclusión.
Cambie el nombre de '<variablename > ' o use el nombre completo (por ejemplo, ' me. variablename ' o ' MyBase.
variablename ').
Una variable de control de bucle en su código tiene el mismo nombre que un campo de la clase u otro ámbito de
inclusión. Dado que la variable de control se utiliza sin una cláusula As , se enlaza al campo en el ámbito de
inclusión y el compilador no crea una nueva variable para ella ni infiere su tipo.
En el ejemplo siguiente, Index , es decir, la variable de control en la instrucción For , se enlaza al campo Index de
la clase Customer . El compilador no crea una nueva variable para la variable de control Index ni infiere su tipo.

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

De forma predeterminada, este mensaje es una advertencia. Para obtener información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
IDENTIFICADOR de error : BC42110
Para resolver esta advertencia
Convierta la variable de control de bucle en local cambiando su nombre por un identificador que tampoco
sea el nombre de un campo de la clase.

For I = 1 To 10

Asegúrese de que la variable de control de bucle se enlaza al campo de clase agregando el prefijo Me. al
nombre de variable.

For Me.Index = 1 To 10

En lugar de basarse en la inferencia de tipo local, use una cláusula As para especificar un tipo para la
variable de control de bucle.
For Index As Integer = 1 To 10

Ejemplo
El código siguiente muestra el ejemplo anterior con la primera corrección en contexto.

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

Vea también
Option Infer (instrucción)
For Each...Next (instrucción)
For...Next (instrucción)
Procedimientos: Hacer referencia a la instancia actual de un objeto
Inferencia de tipo de variable local
Me, My, MyBase y MyClass
Esta matriz es fija o está bloqueada temporalmente
(Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Este error tiene las siguientes causas posibles:


Usar ReDim para cambiar el número de elementos de una matriz de tamaño fijo.
Redimensionar una matriz dinámica de nivel de módulo, en la que se ha pasado un elemento como
argumento a un procedimiento. Si se pasa un elemento, la matriz está bloqueada para evitar la
desasignación de memoria para el parámetro de referencia dentro del procedimiento.
Se intentó asignar un valor a una variable Variant que contiene una matriz, pero el Variant está
bloqueado actualmente.

Para corregir este error


1. Haga que la matriz original sea dinámica en lugar de fija declarándola con ReDim (si la matriz se declara
dentro de un procedimiento) o declarándolo sin especificar el número de elementos (si la matriz se declara
en el nivel de módulo).
2. Determine si realmente necesita pasar el elemento, ya que es visible en todos los procedimientos del
módulo.
3. Determine qué está bloqueando el Variant y Remedy.

Vea también
Matrices
Esta clave ya está asociada con un elemento de esta
colección
23/10/2019 • 2 minutes to read • Edit Online

La clave especificada para un miembro de la colección ya identifica a otro miembro de la colección. Una clave es
una cadena especificada en el Add método que identifica de forma única un miembro específico de una colección.

Para corregir este error


Usar otra clave para este miembro.

Vea también
Tipos de error
Demasiados archivos
23/10/2019 • 2 minutes to read • Edit Online

Más archivos se crearon en el directorio raíz del sistema operativo que permite o se han abierto más archivos que
el número especificado en el archivos = establecer en el archivo CONFIG. Archivo SYS.

Para corregir este error


1. Si el programa es abrir, cerrar o guardar archivos en el directorio raíz, cambiar el programa para que utilice
un subdirectorio.
2. Aumentar el número de archivos especificados en su archivos = establecer en el archivo CONFIG. SYS y
reinicie el equipo.

Vea también
Tipos de error
El tipo '<TypeName > ' no tiene constructores
31/10/2019 • 2 minutes to read • Edit Online

Un tipo no admite una llamada a Sub New() . Una causa probable puede ser un archivo binario o un compilador
dañado.
Identificador de error : BC30251

Para corregir este error


1. Si el tipo está en proyecto distinto o en un archivo al que se hace referencia, reinstale el proyecto o archivo
en cuestión.
2. Si el tipo se encuentra en el mismo proyecto, vuelva a compilar el ensamblado que contiene dicho tipo.
3. Si el error se repite, vuelva a instalar el compilador de Visual Basic.
4. Si el error persiste, reúna información sobre las circunstancias y notifíquelo a los Servicios de soporte
técnico de Microsoft.

Vea también
Objetos y clases
Hable con nosotros
Tipo <typename > no es conforme a CLS
23/10/2019 • 2 minutes to read • Edit Online

Una variable, propiedad o valor devuelto de función se declara con un tipo de datos que no es conforme a CLS.
Para una aplicación sea compatible con la independencia del lenguaje y componentes independientes del lenguaje
(CLS), debe utilizar solo tipos conformes a CLS.
Los siguientes tipos de datos de Visual Basic no son conformes a CLS:
SByte (tipo de datos)
UInteger (tipo de datos)
ULong (tipo de datos)
UShort (tipo de datos)
Identificador de error : BC40041

Para corregir este error


Si la aplicación debe ser conforme a CLS, cambie el tipo de datos de este elemento para el tipo conforme a
CLS más próximo. Por ejemplo, en lugar de UInteger , quizá pueda usar Integer si no necesita que el
intervalo de valores esté por encima de 2.147.483.647. Si necesita el intervalo extendido, puede reemplazar
UInteger por Long .

Si la aplicación no necesita ser compatible con CLS, no es necesario cambiar nada. Sin embargo debe ser
consciente de que no.
Tipo de '<typename >' no está definido
23/10/2019 • 2 minutes to read • Edit Online

La instrucción hace referencia a un tipo que no se ha definido. Puede definir un tipo en una instrucción de
declaración como Enum , Structure , Class , o Interface .
Identificador de error : BC30002

Para corregir este error


Asegúrese de que la definición de tipo y su referencia usan la misma ortografía.
Asegúrese de que la definición de tipo es accesible para la referencia. Por ejemplo, si el tipo está en otro
módulo y se ha declarado Private , mueva la definición de tipo al que hace referencia a módulo o declárelo
Public .

Asegúrese de que el espacio de nombres del tipo no se ha redefinido en el proyecto. Si es así, utilice el
Global palabra clave para el nombre de tipo completo. Por ejemplo, si un proyecto define un espacio de
nombres denominado System , System.Object tipo no se puede acceder a menos que se completa con el
Global palabra clave: Global.System.Object .

Si el tipo está definido, pero no se registra la biblioteca de objetos o la biblioteca de tipos en el que se define
en Visual Basic, haga clic Agregar referencia en el proyecto menú y, a continuación, seleccione el objeto
adecuado biblioteca o biblioteca de tipos.
Asegúrese de que el tipo está en un ensamblado que es parte del perfil de .NET Framework de destino. Para
obtener más información, consulte Solucionar problemas de versión de .NET Framework de destino.

Vea también
Espacios de nombres en Visual Basic
Enum (instrucción)
Structure (instrucción)
Class (instrucción)
Interface (instrucción)
Administrar referencias en un proyecto
No se pudieron inferir los argumentos de tipo a partir
del delegado
23/10/2019 • 2 minutes to read • Edit Online

Una instrucción de asignación usa AddressOf para asignar la dirección de un procedimiento genérico a un
delegado, pero no proporciona ningún argumento de tipo al procedimiento genérico.
Normalmente, cuando se invoca un tipo genérico, se facilita un argumento de tipo para cada parámetro de tipo
definido por el tipo genérico. Si no se facilita ningún argumento de tipo, el compilador intenta inferir los tipos que
se deben pasar a los parámetros de tipo. Si el contexto no proporciona suficiente información para que el
compilador infiera los tipos, se genera un error.
Identificador de error : BC36564

Para corregir este error


Especifique los argumentos de tipo para el procedimiento genérico en la expresión AddressOf .

Vea también
Generic Types in Visual Basic
AddressOf (operador)
Generic Procedures in Visual Basic
Lista de tipos
Métodos de extensión
No coinciden los tipos (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Intentó convertir un valor a otro tipo de forma que no es válido.

Para corregir este error


1. Compruebe la asignación para asegurarse de que es válida.
2. Asegúrese de que no pasó un objeto a un procedimiento que espera una sola propiedad o valor.
3. Asegúrese de que no ha utilizado un nombre de módulo o de proyecto en el que se esperaba una expresión.

Vea también
Tipos de error
No se puede<inferir el tipo de ' variablename > '
porque los límites del bucle y la variable Step no se
amplían al mismo tipo
23/10/2019 • 2 minutes to read • Edit Online

Ha escrito un For...Next bucle en el que el compilador no puede inferir un tipo de datos para la variable de
control de bucle, ya que se cumplen las condiciones siguientes:
El tipo de datos de la variable de control de bucle no se especifica con una cláusula As .
Los límites del bucle y la variable step contienen al menos dos tipos de datos.
No existe ninguna conversión estándar entre los tipos de datos.
Por consiguiente, el compilador no puede inferir el tipo de datos de la variable de control de un bucle.
En el ejemplo siguiente, la variable de paso es un carácter y los límites del bucle son ambos enteros. Dado que no
hay ninguna conversión estándar entre los caracteres y los enteros, se genera este error.

Dim stepVar = "1"c


Dim m = 0
Dim n = 20

' Not valid.


' For i = 1 To 10 Step stepVar
' Loop processing
' Next

IDENTIFICADOR de error : BC30982

Para corregir este error


Cambie los tipos de los límites del bucle y la variable Step según sea necesario para que al menos uno de
ellos sea un tipo al que se amplíen los demás. En el ejemplo anterior, cambie el tipo de stepVar a Integer .

Dim stepVar = 1

-o bien-

Dim stepVar As Integer = 1

Use funciones de conversión explícitas para convertir los límites del bucle y la variable de paso en los tipos
adecuados. En el ejemplo anterior, aplique la Val función a stepVar .

For i = 1 To 10 Step Val(stepVar)


' Loop processing
Next

Vea también
Val
For...Next (instrucción)
Conversiones implícitas y explícitas
Inferencia de tipo de variable local
Option Infer (instrucción)
Funciones de conversión de tipos
Conversiones de ampliación y de restricción
Tipo de miembro '<membername >' no es conforme
a CLS
23/10/2019 • 3 minutes to read • Edit Online

El tipo de datos especificado para este miembro no es parte de la independencia del lenguaje y componentes
independientes del lenguaje (CLS). No es un error dentro del componente, ya que .NET Framework y Visual Basic
admiten este tipo de datos. Sin embargo, es posible que otro componente escrito en código estrictamente
conforme a CLS no admite este tipo de datos. Es posible que este componente no pueda interactuar correctamente
con el componente.
Los siguientes tipos de datos de Visual Basic no son conformes a CLS:
SByte (tipo de datos)
UInteger (tipo de datos)
ULong (tipo de datos)
UShort (tipo de datos)
De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC40025

Para corregir este error


Si el componente solo con otros componentes de .NET Framework, o no se comunica con otros
componentes, no es necesario cambiar nada.
Si trabaja con un componente no está escrito para .NET Framework, podría ser capaz de determinar
mediante la reflexión o de documentación, si es compatible con este tipo de datos. Si es así, no es necesario
cambiar nada.
Si trabaja con un componente que no admite este tipo de datos, debe reemplazar con el tipo conforme a CLS
más próximo. Por ejemplo, en lugar de UInteger , quizá pueda usar Integer si no necesita que el intervalo
de valores esté por encima de 2.147.483.647. Si necesita el intervalo extendido, puede reemplazar UInteger
por Long .
Si trabaja con objetos de automatización o COM, tenga en cuenta que algunos tipos tienen anchos de datos
diferente que en .NET Framework. Por ejemplo, uint suele ser de 16 bits en otros entornos. Si se pasa un
argumento de 16 bits a esos componentes, declárelo como UShort en lugar de UInteger en el código
administrado de Visual Basic.

Vea también
Reflexión
Tipo de valor opcional para el parámetro opcional
<parametername > no es conforme a CLS
23/10/2019 • 3 minutes to read • Edit Online

Un procedimiento se marca como <CLSCompliant(True)> , pero declara un parámetro opcional con valor
predeterminado de un tipo no conforme.
Para que un procedimiento sea conforme a la Independencia del lenguaje y componentes independientes del
lenguaje (CLS), solo debe usar tipos conformes a CLS. Esto se aplica a los tipos de los parámetros, el tipo de valor
devuelto y los tipos de todas sus variables locales. También se aplica a los valores predeterminados de parámetros
opcionales.
Los siguientes tipos de datos de Visual Basic no son conformes a CLS:
SByte (tipo de datos)
UInteger (tipo de datos)
ULong (tipo de datos)
UShort (tipo de datos)
Al aplicar el atributo CLSCompliantAttribute a un elemento de programación, establezca el parámetro isCompliant
del atributo como True o False para indicar compatibilidad o incompatibilidad. No hay ningún valor
predeterminado para este parámetro, por lo que debe proporcionar uno.
Si no aplica CLSCompliantAttribute a un elemento, se considera que no es conforme.
De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC40042

Para corregir este error


Si el parámetro opcional debe tener un valor predeterminado de este tipo particular, quite
CLSCompliantAttribute. El procedimiento no puede ser conforme a CLS.
Si el procedimiento debe ser conforme a CLS, cambie el tipo de este valor predeterminado al tipo conforme
a CLS más próximo. Por ejemplo, en lugar de UInteger , quizá pueda usar Integer si no necesita que el
intervalo de valores esté por encima de 2.147.483.647. Si necesita el intervalo extendido, puede reemplazar
UInteger por Long .

Si trabaja con objetos de automatización o COM, tenga en cuenta que algunos tipos tienen anchos de datos
diferente que en .NET Framework. Por ejemplo, int suele ser de 16 bits en otros entornos. Si se acepta un
entero de 16 bits de esos componentes, declárelo como Short en lugar de Integer en el código
administrado de Visual Basic.
Tipo de parámetro '<parametername >' no es
conforme a CLS
23/10/2019 • 3 minutes to read • Edit Online

Un procedimiento está marcado como <CLSCompliant(True)> pero declara un parámetro con un tipo que está
marcado como <CLSCompliant(False)> , no está marcado o no cumple los requisitos porque es un tipo no conforme.
Para que un procedimiento sea conforme a la Independencia del lenguaje y componentes independientes del
lenguaje (CLS), solo debe usar tipos conformes a CLS. Esto se aplica a los tipos de los parámetros, el tipo de valor
devuelto y los tipos de todas sus variables locales.
Los siguientes tipos de datos de Visual Basic no son conformes a CLS:
SByte (tipo de datos)
UInteger (tipo de datos)
ULong (tipo de datos)
UShort (tipo de datos)
Al aplicar CLSCompliantAttribute a un elemento de programación, establezca el parámetro isCompliant del
atributo en True o False para indicar conformidad o disconformidad. No hay ningún valor predeterminado para
este parámetro, por lo que debe proporcionar uno.
Si no se aplica CLSCompliantAttribute a un elemento, se considera que no es conforme.
De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC40028

Para corregir este error


Si el procedimiento debe tomar un parámetro de este tipo particular, quite el CLSCompliantAttribute. El
procedimiento no puede ser conforme a CLS.
Si el procedimiento debe ser conforme a CLS, cambie el tipo de este parámetro para el tipo conforme a CLS
más próximo. Por ejemplo, en lugar de UInteger , quizá pueda usar Integer si no necesita que el intervalo
de valores esté por encima de 2.147.483.647. Si necesita el intervalo extendido, puede reemplazar UInteger
por Long .
Si trabaja con objetos de automatización o COM, tenga en cuenta que algunos tipos tienen anchos de datos
diferente que en .NET Framework. Por ejemplo, int suele ser de 16 bits en otros entornos. Si se acepta un
entero de 16 bits de esos componentes, declárelo como Short en lugar de Integer en el código
administrado de Visual Basic.
Los parámetros de tipo no se pueden utilizar como
calificadores
23/10/2019 • 2 minutes to read • Edit Online

Un elemento de programación está calificado con una cadena de calificación que incluye un parámetro de tipo.
Un parámetro de tipo representa un requisito para un tipo que se va a proporcionar cuando se construya el tipo
genérico. No representa un tipo definido específico. Una cadena de calificación debe incluir solo los elementos que
se definen en tiempo de compilación.
El código siguiente puede generar este error:

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

IDENTIFICADOR de error : BC32098

Para corregir este error


1. Quite el parámetro de tipo de la cadena de calificación o reemplácelo por un tipo definido.
2. Si necesita usar un tipo construido para buscar el elemento de programación que se va a calificar, debe usar
la lógica de programa adicional.

Vea también
Referencias a elementos declarados
Generic Types in Visual Basic
Lista de tipos
No se puede crear el ensamblado con nombre seguro
del archivo de clave '<filename >': <error >
23/10/2019 • 2 minutes to read • Edit Online

No se pudo crear un ensamblado con nombre seguro en el archivo de clave especificado.


Identificador de error : BC31026

Para corregir este error


1. Compruebe que se ha especificado el archivo de clave correcto y que no está bloqueado por otra aplicación.

Vea también
Sn.exe (herramienta de nombre seguro))
No se puede incrustar el archivo de recursos
'<filename > ': mensaje de error <
31/10/2019 • 2 minutes to read • Edit Online

El compilador Visual Basic llama a Assembly Linker (al. exe, también conocido como ALink) para generar un
ensamblado con un manifiesto. El vinculador ha informado de un error al incrustar un archivo de recursos COM+
nativo directamente en el ensamblado.
Identificador de error : BC30143

Para corregir este error


1. Examine el mensaje de error citado y consulte el tema al. exe. para obtener una explicación más detallada y
consejos.
2. Si el error persiste, reúna información sobre las circunstancias y notifíquelo a los Servicios de soporte
técnico de Microsoft.

Vea también
Al. exe
Hable con nosotros
No se puede emitir el ensamblado: <mensaje de
error >
31/10/2019 • 2 minutes to read • Edit Online

El compilador Visual Basic llama a Assembly Linker (al. exe, también conocido como ALink) para generar un
ensamblado con un manifiesto, y el vinculador informa de un error en la fase de emisión de la creación del
ensamblado.
Identificador de error : BC30145

Para corregir este error


1. Examine el mensaje de error citado y consulte el tema al. exe para obtener una explicación más detallada y
consejos.
2. Intente firmar el ensamblado manualmente, mediante el archivo al. exe o SN. exe (herramienta de nombre
seguro).
3. Si el error persiste, reúna información sobre las circunstancias y notifíquelo a los Servicios de soporte
técnico de Microsoft.
Para firmar el ensamblado manualmente
1. Use SN. exe (herramienta de nombre seguro)) para crear un archivo de par de claves pública y privada.
Este archivo tiene la extensión . snk .
2. Elimine la referencia COM que está provocando el error en el proyecto.
3. Abra el símbolo del sistema para desarrolladores para Visual Studio.
En Windows 10, escriba símbolo del sistema para desarrolladores en el cuadro de búsqueda de la
barra de tareas. A continuación, seleccione símbolo del sistema para desarrolladores para VS 2017
en la lista de resultados.
4. Cambie el directorio al directorio en el que desea colocar el contenedor de ensamblado.
5. Escriba el comando siguiente:

tlbimp <path to COM reference file> /out:<output assembly name> /keyfile:<path to .snk file>

Un ejemplo del comando real que puede escribir es:

tlbimp c:\windows\system32\msi.dll /out:Interop.WindowsInstaller.dll /keyfile:"c:\documents and


settings\mykey.snk"

TIP
Utilice comillas dobles si una ruta de acceso o archivo contiene espacios.

6. En Visual Studio, agregue una referencia de ensamblado .NET al archivo que acaba de crear.
Vea también
Al. exe
Sn.exe (Herramienta de nombre seguro)
Cómo: Crear un par de claves pública y privada
Hable con nosotros
No se puede encontrar el archivo necesario
'<nombreDeArchivo > '
31/10/2019 • 2 minutes to read • Edit Online

Falta un archivo requerido por Visual Studio o está dañado.


Identificador de error : BC30655

Para corregir este error


Vuelva a instalar Visual Studio.

Vea también
Hable con nosotros
No se pueden obtener los nombres de los puertos
serie a causa de un error interno del sistema
31/10/2019 • 2 minutes to read • Edit Online

Se produjo un error interno al llamar a la propiedad My.Computer.Ports.SerialPortNames .

Para corregir este error


1. Consulte conceptos básicos del depurador para obtener más información sobre la solución de problemas.
2. Anote las circunstancias en las que se ha produjo el error y llame a los Servicios de soporte técnico de
Microsoft.

Vea también
SerialPortNames
Conceptos básicos del depurador
Hable con nosotros
No se puede vincular al archivo de recursos
'<nombreDeArchivo > ': mensaje de error <
31/10/2019 • 2 minutes to read • Edit Online

El compilador Visual Basic llama a Assembly Linker (al. exe, también conocido como ALink) para generar un
ensamblado con un manifiesto. El vinculador ha informado de un error al vincular a un archivo de recursos COM+
nativo desde el ensamblado.
Identificador de error : BC30144

Para corregir este error


1. Examine el mensaje de error citado y consulte el tema al. exe. para obtener una explicación más detallada y
consejos.
2. Si el error persiste, reúna información sobre las circunstancias y notifíquelo a los Servicios de soporte
técnico de Microsoft.

Vea también
Al. exe
Hable con nosotros
No se puede cargar la información de la clase
'<className > '
31/10/2019 • 2 minutes to read • Edit Online

Se realizó una referencia a una clase que no está disponible.


Identificador de error : BC30712

Para corregir este error


1. Compruebe que la clase está definida y que ha escrito el nombre correctamente.
2. Intente obtener acceso a uno de los miembros declarados en el módulo. En algunos casos, el entorno de
depuración no encuentra los miembros porque los módulos donde se declaran no se han cargado todavía.

Vea también
Depurar en Visual Studio
No se puede escribir el resultado en memoria
31/10/2019 • 2 minutes to read • Edit Online

Se ha producido un problema al escribir una salida en la memoria.


Identificador de error : BC31020

Para corregir este error


1. Vuelva a compilar el programa para ver si el error vuelve a suceder.
2. Si el error continúa, guarde el trabajo y reinicie Visual Studio.
3. Si el error se repite, reinstale Visual Basic.
4. Si el error persiste después de la reinstalación, informe al respecto a los Servicios de soporte técnico de
Microsoft.

Vea también
Hable con nosotros
No se puede escribir el archivo temporal porque la
ruta de acceso temporal no está disponible
31/10/2019 • 2 minutes to read • Edit Online

Visual Basic no pudo determinar la ruta de acceso donde se almacenan los archivos temporales.
Identificador de error : BC30698

Para corregir este error


1. Reinicie Visual Studio.
2. Si el problema persiste, vuelva a instalar Visual Studio.

Vea también
Hable con nosotros
No se puede escribir en el archivo de salida
'<nombreDeArchivo > ': error de <
31/10/2019 • 2 minutes to read • Edit Online

Se ha producido un problema al crear el archivo.


No se puede abrir un archivo de salida para escritura. Puede que otro proceso haya abierto el archivo (o la carpeta
que lo contiene) o puede que este tenga establecido el atributo de solo lectura.
A continuación indicamos las situaciones más habituales en la que un archivo se abre de forma exclusiva:
La aplicación ya se está ejecutando y usando sus archivos. Para solucionar este problema, asegúrese de que
la aplicación no se está ejecutando.
Otra aplicación ha abierto el archivo. Para solucionar este problema, asegúrese de que ninguna otra
aplicación está accediendo a los archivos. No siempre queda del todo claro qué aplicación está accediendo a
los archivos; en tal caso, reiniciar el equipo constituye la forma más sencilla de finalizar la aplicación.
Esta excepción se generará aun cuando solo haya un archivo de salida del proyecto marcado como de solo lectura.
Identificador de error : BC31019

Para corregir este error


1. Vuelva a compilar el programa para ver si el error se repite.
2. Si el error continúa, guarde el trabajo y reinicie Visual Studio.
3. Si el error continúa, reinicie el equipo.
4. Si el error se repite, reinstale Visual Basic.
5. Si el error persiste después de la reinstalación, informe al respecto a los Servicios de soporte técnico de
Microsoft.
Para consultar los atributos de archivo en el Explorador de archivos
1. Abra la carpeta que le interese.
2. Haga clic en el icono vistas y elija detalles .
3. Haga clic con el botón secundario en el encabezado de columna y elija atributos en la lista desplegable.
Para cambiar los atributos de un archivo o carpeta
1. En el Explorador de archivos , haga clic con el botón derecho en el archivo o la carpeta y elija
propiedades .
2. En la sección atributos de la ficha General , desactive la casilla solo lectura .
3. Haga clic en Aceptar .

Vea también
Hable con nosotros
El tipo subyacente <typename > de Enum no es
conforme a CLS
23/10/2019 • 3 minutes to read • Edit Online

El tipo de datos especificado para esta enumeración no es parte de la independencia del lenguaje y componentes
independientes del lenguaje (CLS). No es un error dentro del componente, ya que .NET Framework y Visual Basic
admiten este tipo de datos. Sin embargo, es posible que otro componente escrito en código estrictamente
conforme a CLS no admite este tipo de datos. Es posible que este componente no pueda interactuar correctamente
con el componente.
Los siguientes tipos de datos de Visual Basic no son conformes a CLS:
SByte (tipo de datos)
UInteger (tipo de datos)
ULong (tipo de datos)
UShort (tipo de datos)
De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC40032

Para corregir este error


Si el componente solo con otros componentes de .NET Framework, o no se comunica con otros
componentes, no es necesario cambiar nada.
Si trabaja con un componente no está escrito para .NET Framework, podría ser capaz de determinar
mediante la reflexión o de documentación, si es compatible con este tipo de datos. Si es así, no es necesario
cambiar nada.
Si trabaja con un componente que no admite este tipo de datos, debe reemplazar con el tipo conforme a CLS
más próximo. Por ejemplo, en lugar de UInteger , quizá pueda usar Integer si no necesita que el intervalo
de valores esté por encima de 2.147.483.647. Si necesita el intervalo extendido, puede reemplazar UInteger
por Long .
Si trabaja con objetos de automatización o COM, tenga en cuenta que algunos tipos tienen anchos de datos
diferente que en .NET Framework. Por ejemplo, uint suele ser de 16 bits en otros entornos. Si se pasa un
argumento de 16 bits a esos componentes, declárelo como UShort en lugar de UInteger en el código
administrado de Visual Basic.

Vea también
Reflexión (Visual Basic)
Reflexión
El uso de una variable de iteración en una expresión
lambda puede producir resultados inesperados.
23/10/2019 • 2 minutes to read • Edit Online

Uso de la variable de iteración en una expresión lambda puede producir resultados inesperados. En su lugar, cree
una variable local dentro del bucle y asígnele el valor de la variable de iteración.
Esta advertencia aparece cuando se usa una variable de iteración de bucle en una expresión lambda que se declara
dentro del bucle. Por ejemplo, en el ejemplo siguiente hace que aparezca una advertencia.

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

El ejemplo siguiente muestra los resultados inesperados que pueden producirse.

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

El For bucle crea una matriz de las expresiones lambda, cada una de las cuales devuelve el valor de la variable de
iteración del bucle i . Cuando se evalúan las expresiones lambda en el For Each bucle, es probable que vea 0, 1, 2,
3 y 4 muestra, los valores sucesivos de i en el For bucle. En su lugar, verá que el valor final de i muestra cinco
veces:
5

De forma predeterminada, este mensaje es una advertencia. Para más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC42324

Para corregir este error


Asigne el valor de la variable de iteración a una variable local y use la variable local en la expresión lambda.

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

Vea también
Expresiones lambda
Valor de tipo '<typename1 >' no se puede convertir a
'<nombredetipo2 >'
23/10/2019 • 2 minutes to read • Edit Online

Valor de tipo '<typename1 >' no se puede convertir a '<nombredetipo2 >'. Discordancia de tipos podría ser
debido a la mezcla de una referencia de archivo con una referencia de proyecto al ensamblado '<assemblyname >'.
Intente reemplazar la referencia de archivo a '<filepath >' en el proyecto '<projectname1 >' con una referencia de
proyecto a '<projectname2 >'.
En una situación donde un proyecto hace una referencia de proyecto y una referencia de archivo, el compilador no
puede garantizar que se puede convertir un tipo a otro.
El pseudocódigo siguiente muestra una situación que puede generar este error.
' ================ 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

Proyecto P1 hace una referencia de proyecto indirecta a través del proyecto P2 al proyecto P3 y también una
referencia de archivos directas a P3 . La declaración de commonObject usa la referencia de archivo a P3 , mientras
que la llamada a P2.getCommonClass usa la referencia al proyecto P3 .
El problema en esta situación es que la referencia de archivo especifica una ruta de acceso y nombre del archivo de
salida de P3 (generalmente p3.dll tanto), mientras que las referencias de proyecto identifican el proyecto de origen
( P3 ) por el nombre del proyecto. Por este motivo, el compilador no puede garantizar que el tipo P3.commonClass
procede del mismo código fuente a través de las dos referencias diferentes.
Esta situación se produce normalmente cuando las referencias de proyecto y se mezclan las referencias de archivo.
En la ilustración anterior, el problema no ocurriría si P1 realiza una referencia al proyecto directo P3 en lugar de
una referencia de archivo.
Identificador de error : BC30955
Para corregir este error
Cambiar la referencia de archivo a una referencia de proyecto.

Vea también
Conversiones de tipos en Visual Basic
Administrar referencias en un proyecto
Valor de tipo '<typename1 >' no se puede convertir a
'<nombredetipo2 >' (varias referencias de archivo)
23/10/2019 • 2 minutes to read • Edit Online

Valor de tipo '<typename1 >' no se puede convertir a '<nombredetipo2 >'. Discordancia de tipos podría ser
debido a la combinación de una referencia a '<rutadeaccesodearchivo1 >' en el proyecto '<projectname1 >' con
una referencia a '<rutadeaccesodearchivo2 >' en el proyecto '<projectname2 >'. Si ambos ensamblados son
idénticos, intente reemplazar estas referencias para que ambas procedan de la misma ubicación.
En una situación donde un proyecto realiza más de una referencia de archivo a un ensamblado, el compilador no
puede garantizar que se puede convertir un tipo a otro.
Cada referencia de archivo especifica una ruta de acceso y nombre del archivo de salida de un proyecto
(normalmente un archivo DLL). El compilador no puede garantizar que los archivos de salida procedan del mismo
origen, o que representan la misma versión del mismo ensamblado. Por lo tanto, no puede garantizar que los tipos
en las distintas referencias son del mismo tipo, o incluso que uno puede convertirse a otro.
Puede usar una referencia de archivo si sabe que los ensamblados de referencia tienen la misma identidad de
ensamblado. La identidad del ensamblado incluye el nombre, la versión, la clave pública, si existe, y la referencia
cultural del ensamblado. Esta información identifica de forma exclusiva el ensamblado.
Identificador de error : BC30961

Para corregir este error


Si los ensamblados de referencia tienen la misma identidad de ensamblado, quitar o reemplazar una de las
referencias de archivo, por lo que hay solo una referencia de archivo.
Si los ensamblados de referencia no tienen la misma identidad de ensamblado, a continuación, cambie el
código para que no intenta convertir a un tipo de una a un tipo en el otro.

Vea también
Conversiones de tipos en Visual Basic
Administrar referencias en un proyecto
Un valor de tipo 'tipo1' no se puede convertir en
'tipo2'
23/10/2019 • 2 minutes to read • Edit Online

No se puede convertir el valor de tipo 'tipo1' a 'tipo2'. Puede usar la propiedad 'Value' para obtener el valor de
cadena del primer elemento de '<Elementoprimario >'.
Se intentó convertir implícitamente un literal XML a un tipo específico. El literal XML no se puede convertir
implícitamente al tipo especificado.
Identificador de error : BC31194

Para corregir este error


Use la propiedad Value del literal XML para hacer referencia a su valor como String . Use la función CType ,
otra función de conversión de tipo o la clase Convert para convertir el valor como el tipo especificado.

Vea también
Convert
Funciones de conversión de tipos
Literales XML
XML
La variable ' <variablename > ' oculta una variable
en un bloque de inclusión
23/10/2019 • 2 minutes to read • Edit Online

Una variable encerrada en un bloque tiene el mismo nombre que otra variable local.
IDENTIFICADOR de error : BC30616

Para corregir este error


Cambie el nombre de la variable en el bloque incluido para que no sea el mismo que cualquier otra variable
local. Por ejemplo:

Dim a, b, x As Integer
If a = b Then
Dim y As Integer = 20 ' Uniquely named block variable.
End If

Una causa común de este error es el uso de Catch e As Exception dentro de un controlador de eventos. En
este caso, asigne un nombre a la variable de bloque Catch ex en lugar de e .
Otro origen común de este error es un intento de obtener acceso a una variable local declarada dentro de un
bloque Try en un bloque Catch independiente. Para corregir esto, declare la variable fuera de la estructura
Try...Catch...Finally .

Vea también
Try...Catch...Finally (instrucción)
Declaración de variables
Variable '<NombreDeVariable >' se utiliza antes de
que se le ha asignado un valor
23/10/2019 • 2 minutes to read • Edit Online

Variable '<NombreDeVariable >' se utiliza antes de que se le ha asignado un valor. Podría producirse una excepción
de referencia nula en tiempo de ejecución.
Una aplicación tiene al menos una ruta de acceso posibles a través de su código que lee una variable antes de
asignar cualquier valor a él.
Si nunca se ha asignado un valor a una variable, contiene el valor predeterminado para su tipo de datos. Para un
tipo de datos de referencia, el valor predeterminado es Nothing. Leer una variable de referencia que tiene un valor
de Nothing puede producir una excepción NullReferenceException en algunas circunstancias.
De forma predeterminada, este mensaje es una advertencia. Para obtener más información sobre cómo ocultar las
advertencias o cómo tratarlas como errores, vea Configuring Warnings in Visual Basic.
Identificador de error : BC42104

Para corregir este error


Compruebe la lógica del flujo de control y asegúrese de que la variable tiene un valor válido antes de que el
control pasa a cualquier instrucción que lo lee.
Una manera de garantizar que la variable siempre tiene un valor válido es inicializarla como parte de su
declaración. Consulte "Inicialización" en Dim (instrucción).

Vea también
Dim (instrucción)
Declaración de variables
Solución de problemas de variables
La variable utiliza un tipo de Automation no
compatible con Visual Basic
27/11/2019 • 2 minutes to read • Edit Online

Ha intentado usar una variable definida en una biblioteca de tipos o una biblioteca de objetos que tiene un tipo de
datos no admitido por Visual Basic.

Para corregir este error


Use una variable de un tipo reconocido por Visual Basic.
O bien,
Si se produce este error al usar FileGet o FileGetObject , asegúrese de que el archivo que está intentando
usar se ha escrito con FilePut o FilePutObject .

Vea también
Tipos de datos
Las propiedades del eje XML no admiten enlace en
tiempo de ejecución
23/10/2019 • 2 minutes to read • Edit Online

Se ha hecho referencia a una propiedad de eje XML para un objeto sin tipo.
Identificador de error : BC31168

Para corregir este error


Asegúrese de que el objeto es un tipo seguro XElement objeto antes de hacer referencia a la propiedad de eje
XML.

Vea también
Propiedades del eje XML
XML
La excepción del comentario XML debe tener un
atributo 'cref'
23/10/2019 • 2 minutes to read • Edit Online

La etiqueta <exception > proporciona una manera de documentar las excepciones que puede producir un método.
El atributo cref necesario designa el nombre de un miembro, que se comprueba en el generador de
documentación. Si el miembro existe, se traduce al nombre de elemento canónico en el archivo de documentación.
Identificador de error : BC42319

Para corregir este error


Agregue el atributo cref a la excepción como se indica a continuación:

<exception cref="member">description</exception>

Vea también
<exception>
Crear documentación XML
Etiquetas XML para comentarios
No se admiten referencias de entidad XML
23/10/2019 • 2 minutes to read • Edit Online

Una referencia de entidad (por ejemplo, © ) que no está definido en el XML 1.0 specification se incluye como un
valor de un literal XML. Solo & , " , < , > , y ' se admiten referencias de entidad XML en literales XML.
Identificador de error : BC31180

Para corregir este error


Quite la referencia de entidad no admitido.

Vea también
Literales XML y la especificación XML 1.0
Literales XML
XML
No se admiten literales XML ni propiedades XML en
código incrustado en ASP.NET
23/10/2019 • 2 minutes to read • Edit Online

No se admiten literales XML ni propiedades XML en código incrustado en ASP.NET. Para usar características XML,
mueva el código al código subyacente.
Un literal XML o la propiedad de eje XML se define dentro del código incrustado ( <%= => ) en un archivo de
ASP.NET.
Identificador de error : BC31200

Para corregir este error


Mueva el código que incluya el literal XML o la propiedad de eje XML a un archivo de código subyacente
ASP.NET.

Vea también
Literales XML
Propiedades del eje XML
XML
URI de espacio de nombres XML
http://www.w3.org/XML/1998/namespace ; se puede
enlazar sólo a 'xmlns'
23/10/2019 • 2 minutes to read • Edit Online

El URI http://www.w3.org/XML/1998/namespace se utiliza en una declaración de espacio de nombres XML. Este URI es
un espacio de nombres reservado y no puede incluirse en una declaración de espacio de nombres XML.
Identificador de error : BC31183

Para corregir este error


Quite la declaración de espacio de nombres XML o reemplace el identificador URI
http://www.w3.org/XML/1998/namespace con un URI de espacio de nombres válido.

Vea también
Imports (instrucción), espacio de nombres XML
Literales XML
XML
Referencia (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

En esta sección se proporcionan vínculos a información de referencia sobre diversos aspectos de la programación
de Visual Basic.

Esta sección
Referencia del lenguaje Visual Basic
Proporciona información de referencia sobre diversos aspectos del lenguaje Visual Basic.
Compilador de línea de comandos de Visual Basic
Proporciona vínculos a información sobre el compilador de línea de comandos, que proporciona una alternativa a
la compilación de programas desde el IDE de Visual Studio.
Información de referencia de .NET Framework
Proporciona vínculos a información sobre cómo trabajar con la biblioteca de clases de .NET Framework.
Especificación del lenguaje de Visual Basic
Proporciona vínculos a la especificación completa del lenguaje Visual Basic, que contiene información detallada
sobre todos los aspectos del lenguaje.

Secciones relacionadas
Elementos generales de la interfaz de usuario (Visual Studio)
Contiene temas sobre los cuadros de diálogo y las ventanas que se usan en Visual Studio.
Herramientas XML en Visual Studio
Proporciona vínculos a temas sobre diversas herramientas XML disponibles en Visual Studio.
Referencia de automatización y extensibilidad
Proporciona vínculos a temas que describen la automatización y extensibilidad en Visual Studio, tanto para
componentes compartidos como para componentes específicos del lenguaje.
Visual Basic compilador de línea de comandos
05/12/2019 • 2 minutes to read • Edit Online

El compilador de línea de comandos de Visual Basic proporciona una alternativa a la compilación de


programas desde el entorno de desarrollo integrado (IDE) de Visual Studio. Esta sección contiene
descripciones de las opciones del compilador de Visual Basic.
Cada opción del compilador está disponible en dos formatos: -option y /option . En la documentación
solo se muestra el formato -option.

En esta sección
Compilación desde la línea de comandos
Describe el Visual Basic compilador de línea de comandos, que se proporciona como una alternativa a la
compilación de programas desde el IDE de Visual Studio.
Opciones del compilador de Visual Basic, por orden alfabético
Muestra las opciones del compilador en una tabla alfabética
Opciones del compilador de Visual Basic, por categoría
Presenta las opciones del compilador en grupos funcionales.
Compilar desde la línea de comandos (Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Un proyecto de Visual Basic se compone de uno o varios archivos de código fuente independientes. Durante el
proceso conocido como compilación, estos archivos se reúnen en un paquete, un único archivo ejecutable que se
puede ejecutar como una aplicación.
Visual Basic proporciona un compilador de línea de comandos como alternativa a la compilación de programas
desde el entorno de desarrollo integrado (IDE) de Visual Studio. El compilador de línea de comandos está diseñado
para situaciones en las que no necesita el conjunto completo de características en el IDE, por ejemplo, cuando usa o
escribe en equipos con memoria de sistema o espacio de almacenamiento limitados.
Para compilar archivos de código fuente desde el IDE de Visual Studio, elija el comando compilar en el menú
compilar .

TIP
Al compilar archivos de proyecto mediante el IDE de Visual Studio, puede mostrar información sobre el comando de VBC
asociado y sus modificadores en la ventana de salida. Para mostrar esta información, abra el cuadro de diálogo Opciones,
proyectos y soluciones, compilar y ejecutary, a continuación, establezca el nivel de detalle de la salida de la compilación del
proyecto de MSBuild en normal o en un nivel más alto de detalle. Para obtener más información, consulte Cómo: Ver,
guardar y configurar archivos de registro de compilación.

Puede compilar archivos de proyecto (. vbproj) en un símbolo del sistema mediante MSBuild. Para obtener más
información, vea referencia de la línea de comandos y Tutorial: usar MSBuild.

Esta sección
Cómo: invocar el compilador de línea de comandos
Describe cómo invocar el compilador de línea de comandos en el símbolo del sistema de MS-DOS o en un
subdirectorio específico.
Líneas de comandos de compilación de ejemplo
Proporciona una lista de líneas de comandos de ejemplo que puede modificar para su propio uso.

Secciones relacionadas
Compilador de línea de comandos de Visual Basic
Proporciona listas de opciones del compilador organizadas en orden alfabético o por propósito.
\ de compilación condicional
Compilar y limpiar proyectos y soluciones en Visual Studio
Describe cómo organizar lo que se incluirá en compilaciones diferentes, elegir las propiedades del proyecto y
asegurarse de que los proyectos se compilan en el orden correcto.
Cómo: Invocar al compilador de la línea de
comandos (Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

Puede invocar el compilador de línea de comandos escribiendo el nombre de su archivo ejecutable en la línea de
comandos, también conocido como el símbolo del sistema de MS-DOS. Si compila desde el símbolo del sistema de
Windows predeterminado, debe escribir la ruta de acceso completa al archivo ejecutable. Para invalidar este
comportamiento predeterminado, puede usar el Símbolo del sistema para desarrolladores para Visual Studio o
modificar la variable de entorno PATH. Ambos permiten compilar desde cualquier directorio simplemente
escribiendo el nombre del compilador.

NOTE
Es posible que el equipo muestre nombres o ubicaciones diferentes para algunos de los elementos de la interfaz de usuario
de Visual Studio en las siguientes instrucciones. La edición de Visual Studio que se tenga y la configuración que se utilice
determinan estos elementos. Para obtener más información, vea Personalizar el IDE.

Para invocar el compilador mediante el Símbolo del sistema para


desarrolladores para Visual Studio
1. Abra la carpeta programa de Visual Studio Tools dentro del grupo de programas Microsoft Visual Studio.
2. Puede usar el Símbolo del sistema para desarrolladores de Visual Studio para tener acceso al compilador
desde cualquier directorio del equipo, si Visual Studio está instalado.
3. Invoque el Símbolo del sistema para desarrolladores para Visual Studio.
4. En la línea de comandos, escriba vbc.exe sourceFileName y, a continuación, presione Entrar.
Por ejemplo, si ha almacenado el código fuente en un directorio llamado SourceFiles , abra el símbolo del
sistema y escriba cd SourceFiles para cambiar a ese directorio. Si el directorio contiene un archivo de
código fuente denominado Source.vb , puede compilarlo escribiendo vbc.exe Source.vb .

Para establecer la variable de entorno PATH en el compilador para el


símbolo del sistema de Windows
1. Use la característica búsqueda de Windows para encontrar VBC. exe en el disco local.
El nombre exacto del directorio donde se encuentra el compilador depende de la ubicación del directorio de
Windows y de la versión del ".NET Framework" instalada. Si tiene más de una versión de ".NET Framework"
instalada, debe determinar qué versión usar (normalmente la última versión).
2. En el menú Inicio , haga clic con el botón secundario en mi PC y, a continuación, haga clic en propiedades
en el menú contextual.
3. Haga clic en el Opciones avanzadas y a continuación, haga clic en Variables de entorno .
4. En el panel variables del sistema , seleccione ruta de acceso en la lista y haga clic en Editar .
5. En el cuadro de diálogo Editar variable del sistema , mueva el punto de inserción hasta el final de la
cadena en el campo de valor de la variable y escriba un punto y coma (;) seguido por el nombre de
directorio completo que se encuentra en el paso 1.
6. Haga clic en Aceptar para confirmar las modificaciones y cerrar los cuadros de diálogo.
Después de cambiar la variable de entorno PATH, puede ejecutar el compilador Visual Basic en el símbolo
del sistema de Windows desde cualquier directorio del equipo.

Para invocar el compilador mediante el símbolo del sistema de


Windows
1. En el menú Inicio , haga clic en la carpeta accesorios y, a continuación, abra el símbolo del sistema de
Windows .
2. En la línea de comandos, escriba vbc.exe sourceFileName y, a continuación, presione Entrar.
Por ejemplo, si ha almacenado el código fuente en un directorio llamado SourceFiles , abra el símbolo del
sistema y escriba cd SourceFiles para cambiar a ese directorio. Si el directorio contiene un archivo de
código fuente denominado Source.vb , puede compilarlo escribiendo vbc.exe Source.vb .

Vea también
Compilador de línea de comandos de Visual Basic
Compilación condicional
Líneas de comandos de compilación de ejemplo
(Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Como alternativa a la compilación de programas Visual Basic desde Visual Studio, puede compilar desde la
línea de comandos para generar archivos ejecutables (. exe) o archivos de biblioteca de vínculos dinámicos (.
dll).
El compilador de línea de comandos de Visual Basic admite un conjunto completo de opciones que
controlan los archivos de entrada y salida, los ensamblados y las opciones de depuración y preprocesador.
Cada opción está disponible en dos formas intercambiables: -option y /option . En esta documentación
solo se muestra el formulario -option .
En la tabla siguiente se enumeran algunas líneas de comandos de ejemplo que puede modificar para su
propio uso.

PA RA USO

Compile File. VB y cree File. exe vbc -reference:Microsoft.VisualBasic.dll File.vb

Compile File. VB y cree File. dll vbc -target:library File.vb

Compile File. VB y cree My. exe vbc -out:My.exe File.vb

Compile File. VB y cree una biblioteca y un ensamblado de vbc -target:library -ref:.\debug\bin\ref\file.dll


referencia denominado File. dll. File.vb

Compilar todos los archivos Visual Basic en el directorio vbc -define:DEBUG=1 -optimize -out:File2.exe *.vb
actual, con optimizaciones en y el símbolo de DEBUG
definido, produciendo archivo2. exe

Compilar todos los archivos Visual Basic en el directorio vbc -target:library -out:File2.dll -nowarn -
actual, generando una versión de depuración de archivo2. nologo -debug *.vb
dll sin mostrar el logotipo o las advertencias

Compilar todos los archivos Visual Basic del directorio vbc -target:library -out:Something.dll *.vb
actual en un archivo. dll

TIP
Al compilar un proyecto mediante el IDE de Visual Studio, puede mostrar información sobre el comando de VBC
asociado con sus opciones del compilador en la ventana salida. Para mostrar esta información, abra el cuadro de
diálogo Opciones, proyectos y soluciones, compilar y ejecutary, a continuación, establezca el nivel de detalle de la
salida de la compilación del proyecto de MSBuild en normal o en un nivel más alto de detalle.

Vea también
Compilador de línea de comandos de Visual Basic
Compilación condicional
Visual Basic opciones del compilador por orden
alfabético
15/01/2020 • 8 minutes to read • Edit Online

El compilador de línea de comandos de Visual Basic se proporciona como una alternativa a la compilación de
programas desde el entorno de desarrollo integrado (IDE) de Visual Studio. A continuación se muestra una lista de
las opciones del compilador de la línea de comandos Visual Basic ordenadas alfabéticamente.
Cada opción del compilador está disponible en dos formatos: -option y /option . En la documentación solo se
muestra el formato -option.

O P C IÓ N F IN A L IDA D

@ (especificar archivo de respuesta) Especifica un archivo de respuesta.

-? Muestra las opciones del compilador. Este comando equivale a


especificar la opción -help . No se produce ninguna
compilación.

-additionalfile Asigna nombre a otros archivos que no afectan directamente


a la generación de código, pero que los analizadores pueden
usar para generar errores o advertencias.

-addmodule Hace que el compilador facilite al proyecto que se está


compilando toda la información de tipos presente en los
archivos especificados.

-analyzer Ejecuta los analizadores de este ensamblado (forma abreviada:


-a).

-baseaddress Especifica la dirección base de un archivo DLL.

-bugreport Crea un archivo que contiene información que permite


notificar un error fácilmente.

-checksumalgorithm:<alg> Especifique el algoritmo para calcular la suma de


comprobación del archivo de origen almacenada en el archivo
PDB. Los valores admitidos son: SHA1 (predeterminado) o
SHA256.
Debido a problemas de colisión con SHA1, Microsoft
recomienda SHA256 o superior.

-codepage Especifica la página de códigos que se va a usar para todos los


archivos de código fuente de la compilación.

-debug Crea información de depuración.

-define Define símbolos de compilación condicional.

-delaysign Especifica si el ensamblado estará firmado total o


parcialmente.
O P C IÓ N F IN A L IDA D

-deterministic Hace que el compilador genere un ensamblado cuyo


contenido binario es idéntico en todas las compilaciones si las
entradas son idénticas.

-doc Procesa los comentarios de documentación generando un


archivo XML.

-errorreport Especifica cómo el compilador de Visual Basic debe informar


de los errores internos del compilador.

-filealign Especifica dónde se alinean las secciones del archivo de salida.

-help Muestra las opciones del compilador. Este comando equivale a


especificar la opción -? . No se produce ninguna compilación.

-highentropyva Indica si un archivo ejecutable determinado admite selección


aleatoria del diseño del espacio de direcciones (ASLR) de alta
entropía.

-imports Importa un espacio de nombres desde un ensamblado


especificado.

-keycontainer Especifica un nombre de contenedor de claves para un par de


claves que asigna un nombre seguro al ensamblado.

-keyfile Especifica un archivo que contiene una clave o un par de


claves para asignar un nombre seguro al ensamblado.

-langversion Especifique la versión de idioma|:|9|9,0|10|10,0 11 11,0.

-libpath Especifica la ubicación de los ensamblados a los que hace


referencia la opción -Reference .

-linkresource Crea un vínculo a un recurso administrado.

-main Especifica la clase que contiene el procedimiento Sub Main


que se va a utilizar en el inicio.

-moduleassemblyname Especifica el nombre del ensamblado del que un módulo


formará parte.

-modulename:<string> Especifica el nombre del módulo de origen.

-netcf Establece el compilador para que tenga como destino el .NET


Compact Framework.

-noconfig No compila con Vbc.rsp.

-nologo Suprime la información de titular del compilador.

-nostdlib Hace que el compilador no haga referencia a las bibliotecas


estándar.
O P C IÓ N F IN A L IDA D

-nowarn Suprime la capacidad del compilador para generar


advertencias.

-nowin32manifest Indica al compilador que no inserte ningún manifiesto de la


aplicación en el archivo ejecutable.

-optimize Habilita o deshabilita la optimización de código.

-optioncompare Especifica si las comparaciones de cadenas deben ser binarias


o usar la semántica de texto específica de la configuración
regional.

-optionexplicit Exige la declaración explícita de variables.

-optioninfer Permite el uso de la inferencia de tipo de variable local en


declaraciones de variables.

-optionstrict Exige una semántica de lenguaje estricta.

-out Especifica un directorio de salida.

-parallel[+|-] Especifica si hay que usar la compilación simultánea (+).

-platform Especifica la plataforma del procesador que el compilador


destina para el archivo de salida.

-preferreduilang Especifique el nombre del lenguaje de salida preferido.

-quiet Evita que el compilador muestre código de errores y


advertencias relacionados con la sintaxis.

-recurse Busca en los subdirectorios los archivos de código fuente que


se deben compilar.

-reference Importa metadatos de un ensamblado.

/refonly Genera solo un ensamblado de referencia.

/refout Especifica la ruta de acceso de salida de un ensamblado de


referencia.

-removeintchecks Deshabilita las comprobaciones de desbordamiento con


enteros.

-resource Inserta un recurso administrado en un ensamblado.

-rootnamespace Especifica un espacio de nombres para todas las declaraciones


de tipos.

-ruleset:<file> Especifica un archivo de conjunto de reglas que deshabilita


diagnósticos específicos.
O P C IÓ N F IN A L IDA D

-sdkpath Especifica la ubicación de Mscorlib.dll y


Microsoft.VisualBasic.dll.

-subsystemversion Especifica la versión mínima del subsistema que el archivo


ejecutable generado puede utilizar.

-target Especifica el formato de la salida.

-utf8output Muestra los resultados del compilador en codificación UTF-8.

-vbruntime Especifica que el compilador debe compilar sin una referencia a


la biblioteca de tiempo de ejecución de Visual Basic o con una
referencia a una biblioteca de tiempo de ejecución específica.

-verbose Muestra información adicional durante la compilación.

-warnaserror Promueve las advertencias a errores.

-win32icon Inserta un archivo .ico en el archivo de salida.

-win32manifest Identifica un archivo de manifiesto de la aplicación Win32


definido por el usuario que se va a insertar en un archivo
ejecutable portable (PE) del proyecto.

-win32resource Inserta un recurso Win32 en el archivo de salida.

Vea también
Opciones del compilador de Visual Basic, por categoría
Administración de propiedades de soluciones y proyectos
@ (Especificar archivo de respuesta, Visual Basic)
27/11/2019 • 3 minutes to read • Edit Online

Especifica un archivo que contiene las opciones del compilador y los archivos de código fuente que se van a
compilar.

Sintaxis
@response_file

Argumentos
response_file
Obligatorio. Archivo que muestra las opciones del compilador o los archivos de código fuente que se van a
compilar. Escriba el nombre de archivo entre comillas ("") si contiene un espacio.

Comentarios
El compilador procesa las opciones del compilador y los archivos de código fuente especificados en un archivo de
respuesta como si hubieran sido especificados en la línea de comandos.
Para especificar más de un archivo de respuesta en una compilación, especifique varias opciones de archivo de
respuesta, como las siguientes.

@file1.rsp @file2.rsp

En un archivo de respuesta, pueden aparecer varias opciones del compilador y archivos de código fuente en una
sola línea. Una única especificación de opción de compilador debe aparecer en una línea (no puede abarcar varias
líneas). Los archivos de respuesta pueden tener comentarios que comienzan por el símbolo # .
Puede combinar las opciones especificadas en la línea de comandos con las opciones especificadas en uno o
varios archivos de respuesta. El compilador procesa las opciones de comando a medida que las encuentra. Por lo
tanto, los argumentos de la línea de comandos pueden reemplazar las opciones enumeradas anteriormente en
archivos de respuesta. Por el contrario, las opciones de un archivo de respuesta invalidan las opciones enumeradas
anteriormente en la línea de comandos o en otros archivos de respuesta.
Visual Basic proporciona el archivo Vbc. RSP, que se encuentra en el mismo directorio que el archivo Vbc. exe. El
archivo Vbc. rsp se incluye de forma predeterminada a menos que se use la opción -noconfig . Para obtener más
información, vea -noconfig.

NOTE
La opción @ no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar desde la línea
de comandos.

Ejemplo
Las líneas siguientes proceden de un archivo de respuesta de ejemplo.
# build the first output file
-target:exe
-out:MyExe.exe
source1.vb
source2.vb

Ejemplo
En el ejemplo siguiente se muestra cómo usar la opción @ con el archivo de respuesta denominado File1.rsp .

vbc @file1.rsp

Vea también
Compilador de línea de comandos de Visual Basic
-noconfig
Líneas de comandos de compilación de ejemplo
-addmodule
23/10/2019 • 2 minutes to read • Edit Online

Hace que el compilador facilite al proyecto que se está compilando toda la información de tipos presente en los
archivos especificados.

Sintaxis
-addmodule:fileList

Argumentos
fileList
Requerido. Lista delimitada por comas de archivos que contienen metadatos, pero que no contienen manifiestos
de ensamblado. Los nombres de archivo que contienen espacios deben ir entre comillas ("").

Comentarios
Los archivos enumerados por el parámetro fileList se deben crear con la opción -target:module o con otro
equivalente del compilador para -target:module .
Todos los módulos agregados con -addmodule deben estar en el mismo directorio que el archivo de salida en
tiempo de ejecución. Es decir, puede especificar un módulo en cualquier directorio en tiempo de compilación,
pero el módulo debe estar en el directorio de la aplicación en tiempo de ejecución. Si no es así, obtendrá un error
de TypeLoadException.
Si se especifica (implícita o explícitamente) una opciónde destino (Visual Basic) distinta de -target:module con
-addmodule , los archivos que se pasan a -addmodule forman parte del ensamblado del proyecto. Se requiere un
ensamblado para ejecutar un archivo de salida que tiene uno o más archivos agregados con -addmodule .
Use -Reference (Visual Basic) para importar metadatos de un archivo que contiene un ensamblado.

NOTE
La opción -addmodule no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar
desde la línea de comandos.

Ejemplo
En el código siguiente se crea un módulo.

' t1.vb
' Compile with vbc /target:module t1.vb.
' Outputs t1.netmodule.

Public Class TestClass


Public i As Integer
End Class
En el código siguiente se importan los tipos del módulo.

' 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

Al ejecutar t1 , genera 802 .

Vea también
Compilador de línea de comandos de Visual Basic
-Target (Visual Basic)
-Reference (Visual Basic)
Líneas de comandos de compilación de ejemplo
-baseaddress
23/10/2019 • 2 minutes to read • Edit Online

Especifica una dirección base predeterminada al crear un archivo DLL.

Sintaxis
-baseaddress:address

Argumentos
T ÉRM IN O DEF IN IC IÓ N

address Obligatorio. La dirección base del archivo DLL. Esta dirección


debe especificarse como un número hexadecimal.

Comentarios
La dirección base predeterminada para un archivo DLL se establece mediante el .NET Framework.
Tenga en cuenta que la palabra de orden inferior de esta dirección se redondea. Por ejemplo, si especifica
0x11110001, se redondea a 0x11110000.
Para completar el proceso de firma de un archivo DLL, use la opción –R de la herramienta de nombres seguros
(SN. exe).
Esta opción se omite si el destino no es un archivo DLL.

PA RA SET - B A SEA DDRESS EN EL IDE DE VISUA L ST UDIO

1. Seleccione un proyecto en el Explorador de soluciones . En el menú Proyecto , haga clic en Propiedades .


2. Haga clic en la pestaña Compilar .
3. Haga clic en Avanzado .
4. Modifique el valor en el cuadro dirección base del archivo dll: . Nota: El cuadro dirección base del archivo dll: es de
solo lectura, a menos que el destino sea un archivo dll.

Vea también
Compilador de línea de comandos de Visual Basic
-Target (Visual Basic)
Líneas de comandos de compilación de ejemplo
SN. exe (herramienta de nombre seguro))
-bugreport
31/01/2020 • 4 minutes to read • Edit Online

Crea un archivo que se puede usar al archivar un informe de errores.

Sintaxis
-bugreport:file

Argumentos
T ÉRM IN O DE ESQ UEM A JSO N

file Obligatoria. Nombre del archivo que contendrá el informe de


errores. Escriba el nombre de archivo entre comillas ("") si el
nombre contiene un espacio.

Notas
La siguiente información se agrega a file :
Una copia de todos los archivos de código fuente en la compilación.
Una lista de las opciones del compilador utilizadas en la compilación.
Información de versión sobre el compilador, el Common Language Runtime y el sistema operativo.
Resultados del compilador, si los hay.
Una descripción del problema, para el que se le solicita.
Una descripción de cómo cree que el problema debe corregirse, para lo que se le solicita.
Dado que una copia de todos los archivos de código fuente se incluye en file , puede que desee reproducir el
defecto de código (sospechoso) en el programa más corto posible.

IMPORTANT
La opción -bugreport genera un archivo que contiene información potencialmente confidencial. Esto incluye la hora actual,
la versión del compilador, la versión .NET Framework, la versión del sistema operativo, el nombre de usuario, los argumentos
de línea de comandos con los que se ejecutó el compilador, todo el código fuente y el formato binario de cualquier
ensamblado al que se hace referencia. Se puede tener acceso a esta opción si se especifican las opciones de línea de
comandos en el archivo Web. config para una compilación del lado servidor de una aplicación ASP.NET. Para evitarlo,
modifique el archivo Machine. config para que no permita a los usuarios compilar en el servidor.

Si esta opción se usa con -errorreport:prompt , -errorreport:queue o -errorreport:send y la aplicación encuentra


un error interno del compilador, la información de file se envía a Microsoft Corporation. Esa información
ayudará a los ingenieros de Microsoft a identificar la causa del error y puede ayudar a mejorar la próxima versión
de Visual Basic. De forma predeterminada, no se envía información a Microsoft. Sin embargo, al compilar una
aplicación mediante -errorreport:queue , que está habilitada de forma predeterminada, la aplicación recopila sus
informes de errores. A continuación, cuando el administrador del equipo inicia sesión, el sistema de informes de
errores muestra una ventana emergente que permite al administrador reenviar a Microsoft los informes de
errores que se produjeron desde el inicio de sesión.

NOTE
La opción -bugreport no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible cuando se
compila desde la línea de comandos.

Ejemplo
En el ejemplo siguiente se compila T2. VB y se coloca toda la información de informes de errores en el archivo
Problem. txt.

vbc -bugreport:problem.txt t2.vb

Vea también
Compilador de línea de comandos de Visual Basic
-debug (Visual Basic)
-errorreport
Líneas de comandos de compilación de ejemplo
trustLevel (elemento) para securityPolicy (esquema de configuración de ASP.NET)
-codePage (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica la página de códigos que se va a utilizar para todos los archivos de código fuente en la compilación.

Sintaxis
-codepage:id

Argumentos
T ÉRM IN O DEF IN IC IÓ N

id Obligatorio. El compilador usa la página de códigos


especificada por id para interpretar la codificación de los
archivos de código fuente.

Comentarios
Para compilar el código fuente guardado con una codificación específica, puede usar -codepage para especificar
qué página de códigos debe usarse. La opción -codepage se aplica a todos los archivos de código fuente de la
compilación. Para obtener más información, vea codificación de caracteres en el .NET Framework.
La opción -codepage no es necesaria si los archivos de código fuente se guardaron mediante la página de códigos
ANSI actual, Unicode o UTF-8 con una firma. De forma predeterminada, Visual Studio guarda todos los archivos de
código fuente con la página de códigos ANSI actual, a menos que el usuario especifique otra codificación en el
cuadro de diálogo codificación . Visual Studio usa el cuadro de diálogo codificación para abrir los archivos de
código fuente guardados con una página de códigos diferente.

NOTE
La opción -codepage no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar desde
la línea de comandos.

Vea también
Compilador de línea de comandos de Visual Basic
-debug (Visual Basic)
10/01/2020 • 2 minutes to read • Edit Online

Hace que el compilador genere información de depuración y la coloque en los archivos de salida.

Sintaxis
-debug[+ | -]

-debug:[full | pdbonly]

Argumentos
T ÉRM IN O DE ESQ UEM A JSO N

+ | - Opcional. Al especificar + o -debug , el compilador genera


información de depuración y la coloca en un archivo. pdb.
Especificar - tiene el mismo efecto que no especificar
-debug .

full | pdbonly Opcional. Especifica el tipo de información de depuración


generado por el compilador. Si no especifica -debug:pdbonly
, el valor predeterminado es full , lo que le permite asociar
un depurador al programa en ejecución. El argumento
pdbonly permite la depuración del código fuente cuando el
programa se inicia en el depurador, pero solo muestra código
de lenguaje de ensamblado cuando el programa en ejecución
está asociado al depurador.

Notas
Use esta opción para crear versiones de depuración. Si no especifica -debug , -debug+ o -debug:full , no podrá
depurar el archivo de salida del programa.
De forma predeterminada, no se emite información de depuración ( -debug- ). Para emitir información de
depuración, especifique -debug o -debug+ .
Para obtener información sobre cómo configurar el rendimiento de depuración de una aplicación, consulte
Facilitar la depuración de una imagen.

PA RA SET - DEB UG EN EL EN TO RN O DE DESA RRO L LO IN T EGRA DO DE VISUA L ST UDIO

1. con un proyecto seleccionado en Explorador de soluciones , en el menú proyecto , haga clic en propiedades .
2. Haga clic en la pestaña compilar .
3. Haga clic en Opciones de compilación avanzadas .
4. modifique el valor en el cuadro generar información de depuración .
Ejemplo
En el ejemplo siguiente se coloca información de depuración en el archivo de salida App.exe .

vbc -debug -out:app.exe test.vb

Vea también
Compilador de línea de comandos de Visual Basic
-bugreport
Líneas de comandos de compilación de ejemplo
-define (Visual Basic)
10/01/2020 • 2 minutes to read • Edit Online

Permite definir constantes condicionales para el compilador.

Sintaxis
-define:["]symbol[=value][,symbol[=value]]["]

-d:["]symbol[=value][,symbol[=value]]["]

Argumentos
T ÉRM IN O DE ESQ UEM A JSO N

symbol Obligatoria. Símbolo que se va a definir.

value Opcional. Valor que se va a asignar a symbol . Si value es


una cadena, debe estar rodeada por secuencias de barras
diagonales inversas (\") en lugar de Comillas. Si no se
especifica ningún valor, se considera como verdadero.

Notas
La opción -define tiene un efecto similar al uso de una directiva de preprocesador de #Const en el archivo de
código fuente, con la excepción de que las constantes definidas con -define son públicas y se aplican a todos los
archivos del proyecto.
Los símbolos creados por esta opción se pueden usar con la directiva #If ... Then ... #Else para compilar archivos
de origen condicionalmente.
-d es la forma abreviada de -define .
Se pueden definir varios símbolos con -define ; use una coma para separar las definiciones de símbolos.

PA RA ESTA B L EC ER- DEF IN IR EN EL EN TO RN O DE DESA RRO L LO IN T EGRA DO DE VISUA L ST UDIO

1. tener un proyecto seleccionado en Explorador de soluciones . En el menú Proyecto , haga clic en Propiedades .
2. Haga clic en la pestaña compilar .
3. Haga clic en avanzadas .
4. modifique el valor en el cuadro constantes personalizadas .

Ejemplo
En el siguiente código se definen y usan dos constantes de compilador condicionales.
' 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

Vea también
Compilador de línea de comandos de Visual Basic
#If...Then...#Else (directivas)
#Const (directiva)
Líneas de comandos de compilación de ejemplo
-delaysign
23/10/2019 • 2 minutes to read • Edit Online

Especifica si el ensamblado estará firmado total o parcialmente.

Sintaxis
-delaysign[+ | -]

Argumentos
+ | -
Opcional. Use -delaysign- para firmar completamente un ensamblado. Use -delaysign+ si desea colocar la clave
pública en el ensamblado y reservar espacio para el hash firmado. De manera predeterminada, es -delaysign- .

Comentarios
La opción -delaysign no tiene ningún efecto a menos que se use con -keyfile o -keycontainer.
Cuando se solicita un ensamblado totalmente firmado, el compilador genera un valor hash para el archivo que
contiene el manifiesto (metadatos del ensamblado) y firma dicho valor mediante la clave privada. La firma digital
resultante se almacena en el archivo que contiene el manifiesto. Cuando se retrasa la firma de un ensamblado, el
compilador no calcula ni almacena la firma, sino que reserva espacio en el archivo para que la firma se pueda
agregar más tarde.
Por ejemplo, mediante el uso de -delaysign+ , un desarrollador de una organización puede distribuir versiones de
prueba sin firmar de un ensamblado que los evaluadores pueden registrar con la caché global de ensamblados y
usar. Cuando se completa el trabajo en el ensamblado, la persona responsable de la clave privada de la
organización puede firmar completamente el ensamblado. Esta compartimentación protege la clave privada de la
organización contra la divulgación, a la vez que permite que todos los desarrolladores trabajen en los
ensamblados.
Vea crear y utilizar ensamblados con nombre seguro para obtener más información sobre la firma de un
ensamblado.
Para establecer-delaysign en el entorno de desarrollo integrado de Visual Studio
1. Seleccione un proyecto en el Explorador de soluciones . En el menú Proyecto , haga clic en
Propiedades .
2. Haga clic en la pestaña Firma .
3. Establezca el valor en el cuadro retrasar solo firmar .

Vea también
Compilador de línea de comandos de Visual Basic
-keyfile
-keycontainer
Líneas de comandos de compilación de ejemplo
-deterministic
10/01/2020 • 3 minutes to read • Edit Online

Hace que el compilador genere un ensamblado cuya salida byte a byte es idéntica en todas las compilaciones para
las entradas idénticas.

Sintaxis
-deterministic

Notas
De forma predeterminada, la salida del compilador para un conjunto determinado de entradas es única, ya que el
compilador agrega una marca de tiempo y un GUID que se genera a partir de números aleatorios. Use la opción
-deterministic para generar un ensamblado determinista, cuyo contenido binario es idéntico en todas las
compilaciones, siempre y cuando la entrada siga siendo la misma.
El compilador tiene en cuenta las entradas siguientes con el fin de garantizar el determinismo:
La secuencia de parámetros de la línea de comandos.
El contenido del archivo de respuesta .rsp del compilador.
La versión exacta del compilador que se usa y los ensamblados a los que se hace referencia.
La ruta de acceso del directorio actual.
El contenido binario de todos los archivos pasados explícitamente al compilador, ya sea de manera directa o
indirecta, incluidos los siguientes:
Archivos de código fuente
Ensamblados a los que se hace referencia
Módulos a los que se hace referencia
Recursos
Archivo de clave de nombre seguro
Archivos de respuesta @
Analizadores
Conjuntos de reglas
Archivos adicionales que podrían usar los analizadores
La referencia cultural actual (para el idioma en el que se producen los diagnósticos y los mensajes de
excepción).
La codificación predeterminada (o página de códigos actual) si no se especifica la codificación.
La existencia (o la inexistencia) de archivos y su contenido en las rutas de búsqueda del compilador
(especificada, por ejemplo, mediante -lib o -recurse ).
La plataforma CLR en la que se ejecuta el compilador.
El valor de %LIBPATH% , que pueden afectar a la carga de dependencias del analizador.
Cuando los orígenes están disponibles públicamente, se puede usar la compilación determinista para establecer si
un archivo binario se compila a partir de una fuente de confianza. También puede ser útil en un sistema de
compilación continua para determinar si es necesario ejecutar pasos de compilación que dependen de los cambios
realizados en un archivo binario.
Vea también
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-doc
10/01/2020 • 4 minutes to read • Edit Online

Procesa los comentarios de documentación generando un archivo XML.

Sintaxis
-doc[+ | -]

-doc:file

Argumentos
T ÉRM IN O DE ESQ UEM A JSO N

+ | - Opcional. Si se especifica + o solo -doc , el compilador


genera información de documentación y la coloca en un
archivo XML. Especificar - es el equivalente a no
especificar -doc , lo que causa que no se cree ninguna
información de documentación.

file Es necesario si se usa -doc: . Especifica el archivo XML


de salida, que se rellena con los comentarios de los
archivos de código fuente de la compilación. Si el nombre
de archivo contiene un espacio, escríbalo entre comillas ("
").

Notas
La opción -doc controla si el compilador genera un archivo XML que contiene los comentarios de
documentación. Si usa la sintaxis -doc:file , el parámetro file especifica el nombre del archivo XML. Si
usa -doc o -doc+ , el compilador toma el nombre del archivo XML desde el archivo ejecutable o la
biblioteca que el compilador va a crear. Si usa -doc- o no especifica la opción -doc , el compilador no
crea un archivo XML.
En los archivos de código fuente, los comentarios de documentación pueden preceder a las siguientes
definiciones:
Tipos definidos por el usuario como una clase o una interfaz
Miembros, como un campo, un evento, una propiedad, una función o una subrutina.
Para usar el archivo XML generado con la característica IntelliSense de Visual Studio, deje que el nombre
del archivo XML sea igual que el del ensamblado que quiere admitir. Asegúrese de que el archivo XML se
encuentra en el mismo directorio que el ensamblado, para que cuando se haga referencia al ensamblado
en el proyecto de Visual Studio, también se encuentre el archivo .xml. Los archivos de documentación XML
no son necesarios para que IntelliSense funcione para el código dentro de un proyecto o de los proyectos
a los que el proyecto hace referencia.
A menos que compile con -target:module , el archivo XML contiene las etiquetas <assembly></assembly> .
Estas etiquetas especifican el nombre del archivo que contiene el manifiesto del ensamblado para el
archivo de salida de la compilación.
Vea Etiquetas XML para comentarios para conocer las maneras de generar documentación a partir de
comentarios en el código.

PA RA DEF IN IR - DO C EN EL EN TO RN O DE DESA RRO L LO IN T EGRA DO DE VISUA L ST UDIO

1. tener un proyecto seleccionado en Explorador de soluciones . En el menú Proyecto , haga clic en Propiedades .
2. Haga clic en la pestaña compilar .
3. establezca el valor en el cuadro generar archivo de documentación XML .

Ejemplo
Vea Documentar el código con XML (Visual Basic) para obtener un ejemplo.

Vea también
Compilador de línea de comandos de Visual Basic
Documentar el código con XML
-errorreport
24/10/2019 • 4 minutes to read • Edit Online

Especifica cómo el compilador de Visual Basic debe informar de los errores internos del compilador.

Sintaxis
-errorreport:{ prompt | queue | send | none }

Comentarios
Esta opción proporciona una manera cómoda de notificar un Visual Basic error interno del compilador (ICE) al
equipo de Visual Basic en Microsoft. De forma predeterminada, el compilador no envía información a Microsoft.
Sin embargo, si se produce un error interno del compilador, esta opción le permite notificar el error a Microsoft.
Esa información ayudará a los ingenieros de Microsoft a identificar la causa y puede ayudar a mejorar la próxima
versión de Visual Basic.
La capacidad de un usuario para enviar informes depende de los permisos de directiva de usuario y equipo.
En la tabla siguiente se resume el efecto de la opción -errorreport .

O P C IÓ N C O M P O RTA M IEN TO

prompt Si se produce un error interno del compilador, se abre un


cuadro de diálogo para que pueda ver los datos exactos
recopilados por el compilador. Puede determinar si hay
información confidencial en el informe de errores y tomar una
decisión sobre si se debe enviar a Microsoft. Si decide enviarlo,
y el equipo y la configuración de la Directiva de usuario lo
permiten, el compilador envía los datos a Microsoft.

queue Pone en cola el informe de error. Cuando inicie sesión con


privilegios de administrador, puede informar de los errores
desde la última vez que inició sesión (no se le pedirá que envíe
informes de errores más de una vez cada tres días). Éste es el
comportamiento predeterminado cuando no se especifica la
opción -errorreport .

send Si se produce un error interno del compilador y el equipo y la


configuración de la Directiva de usuario lo permiten, el
compilador envía los datos a Microsoft.

La opción -errorreport:send intenta enviar


automáticamente información de errores a Microsoft si los
informes están habilitados por la configuración del sistema
Informe de errores de Windows .

none Si se produce un error interno del compilador, no se recopilará


ni se enviará a Microsoft.

El compilador envía datos que incluyen la pila en el momento del error, que normalmente incluye algún código
fuente. Si -errorreport se usa con la opción -bugreport ( , se envía el archivo de código fuente completo.
Esta opción se utiliza mejor con la opción -bugreport ( , ya que permite a los ingenieros de Microsoft reproducir el
error más fácilmente.

NOTE
La opción -errorreport no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar
desde la línea de comandos.

Ejemplo
El código siguiente intenta compilar T2.vb y, si el compilador encuentra un error interno del compilador, le pedirá
que envíe el informe de errores a Microsoft.

vbc -errorreport:prompt t2.vb

Vea también
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-bugreport
-filealign
23/10/2019 • 2 minutes to read • Edit Online

Especifica dónde se alinean las secciones del archivo de salida.

Sintaxis
-filealign:number

Argumentos
number
Obligatorio. Valor que especifica la alineación de las secciones del archivo de salida. Los valores válidos son 512,
1024, 2048, 4096 y 8192. Estos valores están en bytes.

Comentarios
Puede usar la opción -filealign para especificar la alineación de las secciones en el archivo de salida. Las
secciones son bloques de memoria contigua en un archivo portable ejecutable (PE) que contiene código o datos. La
opción -filealign le permite compilar la aplicación con una alineación no estándar. la mayoría de los
desarrolladores no necesitan usar esta opción.
Cada sección está alineada en un límite que es un múltiplo del valor -filealign . No hay ningún valor
predeterminado fijo. Si no se especifica -filealign , el compilador elige un valor predeterminado en tiempo de
compilación.
Al especificar el tamaño de la sección, puede cambiar el tamaño del archivo de salida. Modificar el tamaño de la
sección puede ser útil para los programas que se ejecutan en dispositivos más pequeños.

NOTE
La opción -filealign no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar
desde la línea de comandos.

Vea también
Compilador de línea de comandos de Visual Basic
-help, -? (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Muestra las opciones del compilador.

Sintaxis
-help

-?

Comentarios
Si incluye esta opción en una compilación, no se crea ningún archivo de salida y no se realiza ninguna
compilación.

NOTE
La opción -help no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar desde la
línea de comandos.

Ejemplo
En el código siguiente se muestra la ayuda desde la línea de comandos.

vbc -help

Vea también
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-highentropyva (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Indica si un archivo ejecutable de 64 bits o un archivo ejecutable que está marcado con la opción del compilador -
Platform: AnyCPU admite la selección aleatoria del diseño del espacio de direcciones (ASLR) de alta entropía.

Sintaxis
-highentropyva[+ | -]

Argumentos
+ | -
Opcional. La opción está desactivada de forma predeterminada o si se especifica -highentropyva- . La opción está
activada si se especifica -highentropyva o -highentropyva+ .

Comentarios
Si especifica esta opción, las versiones compatibles del kernel de Windows pueden usar los mayores grados de
entropía cuando el kernel Aleatoriza el diseño del espacio de direcciones de un proceso como parte de ASLR. Si el
kernel usa mayores grados de entropía, se puede asignar un número mayor de direcciones a las regiones de
memoria, como pilas y montones. Como resultado, la ubicación de un área de memoria específica es más difícil de
adivinar.
Cuando la opción está activada, el archivo ejecutable de destino y todos los módulos de los que depende deben ser
capaces de controlar los valores de puntero que son superiores a 4 gigabytes (GB) cuando dichos módulos se
ejecutan como procesos de 64 bits.

Vea también
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-Imports (Visual Basic)
10/01/2020 • 2 minutes to read • Edit Online

Importa los espacios de nombres de un ensamblado especificado.

Sintaxis
-imports:namespaceList

Argumentos
T ÉRM IN O DE ESQ UEM A JSO N

namespaceList Obligatoria. Lista delimitada por comas de los espacios de


nombres que se van a importar.

Notas
La opción -imports importa cualquier espacio de nombres definido en el conjunto actual de archivos de código
fuente o desde cualquier ensamblado al que se hace referencia.
Los miembros de un espacio de nombres especificado con -imports están disponibles para todos los archivos de
código fuente de la compilación. Use la instrucción Imports (espacio de nombres y tipo de .net) para usar un
espacio de nombres en un solo archivo de código fuente.

PA RA ESTA B L EC ER L A S IM P O RTA C IO N ES EN EL EN TO RN O DE DESA RRO L LO IN T EGRA DO DE VISUA L ST UDIO

1. tener un proyecto seleccionado en Explorador de soluciones . En el menú Proyecto , haga clic en Propiedades .
2. Haga clic en la pestaña referencias .
3. Escriba el nombre del espacio de nombres en el cuadro situado junto al botón Agregar impor tación de usuario .
4. Haga clic en el botón Agregar impor tación de usuario .

Ejemplo
El siguiente código se compila cuando se especifica -imports:system.globalization . Sin él, la compilación correcta
requiere que una instrucción Imports System.Globalization esté incluida al principio del archivo de código fuente,
o que la propiedad esté completa como System.Globalization.CultureInfo.CurrentCulture.Name .

Module Example
Public Sub Main()
Console.WriteLine($"The current culture is {CultureInfo.CurrentCulture.Name}")
End Sub
End Module

Vea también
Compilador de línea de comandos de Visual Basic
Referencias y la instrucción Imports
Líneas de comandos de compilación de ejemplo
-keycontainer
23/10/2019 • 2 minutes to read • Edit Online

Especifica un nombre de contenedor de claves para un par de claves que asigna un nombre seguro al
ensamblado.

Sintaxis
-keycontainer:container

Argumentos
T ÉRM IN O DEF IN IC IÓ N

container Obligatorio. Archivo contenedor que contiene la clave. Escriba


el nombre de archivo entre comillas ("") si el nombre contiene
un espacio.

Comentarios
El compilador crea el componente compartible insertando una clave pública en el manifiesto del ensamblado y
firma el ensamblado final con la clave privada. Para generar un archivo de claves, escriba sn -k file en la línea
de comandos. La opción -i instala el par de claves en un contenedor. Para obtener más información, consulte
SN. exe (herramienta de nombre seguro)).
Si compila con -target:module , el nombre del archivo de clave se mantiene en el módulo y se incorpora en el
ensamblado que se crea al compilar un ensamblado con -AddModule.
También se puede especificar esta opción como un atributo personalizado (AssemblyKeyNameAttribute) en el
código fuente de cualquier módulo del Lenguaje Intermedio de Microsoft (MSIL).
También se puede pasar la información de cifrado al compilador con -keyfile. Use -delaysign para firmar el
ensamblado de forma parcial.
Vea crear y utilizar ensamblados con nombre seguro para obtener más información sobre la firma de un
ensamblado.

NOTE
La opción -keycontainer no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar
desde la línea de comandos.

Ejemplo
En el código siguiente se compila el archivo de código fuente Input.vb y se especifica un contenedor de claves.

vbc -keycontainer:key1 input.vb


Vea también
Ensamblados de .NET
Compilador de línea de comandos de Visual Basic
-keyfile
Líneas de comandos de compilación de ejemplo
-keyfile
21/03/2020 • 3 minutes to read • Edit Online

Especifica un archivo que contiene una clave o un par de claves que asigna un nombre seguro al ensamblado.

Sintaxis
-keyfile:file

Argumentos
file
Necesario. Archivo que contiene la clave. Si el nombre de archivo contiene un espacio, escriba el nombre entre
comillas (" ").

Observaciones
El compilador inserta la clave pública en el manifiesto del ensamblado y, a continuación, firma el ensamblado
final con la clave privada. Para generar un archivo de claves, escriba sn -k file en la línea de comandos. Para
obtener más información, vea Sn.exe (Strong Name Tool)).
Si compila -target:module con , el nombre del archivo de claves se mantiene en el módulo y se incorpora al
ensamblado que se crea al compilar un ensamblado con -addmodule.
También puede pasar la información de cifrado al compilador con -keycontainer. Use -delaysign para firmar el
ensamblado de forma parcial.
También puede especificar esta opción comoAssemblyKeyFileAttributeun atributo personalizado ( ) en el código
fuente para cualquier módulo de lenguaje intermedio de Microsoft.
En caso -keyfile de que se especifiquen ambos y -keycontainer (ya sea por opción de línea de comandos o por
atributo personalizado) en la misma compilación, el compilador primero intenta el contenedor de claves. Si lo
consigue, el ensamblado se firma con la información del contenedor de claves. Si el compilador no encuentra el
contenedor de claves, intenta el archivo especificado con -keyfile . Si esto se realiza correctamente, el
ensamblado se firma con la información del archivo de sn -i claves y la información de clave se instala en el
contenedor de claves (similar a ) para que en la siguiente compilación, el contenedor de claves será válido.
Tenga en cuenta que un archivo de clave puede contener solo la clave pública.
Consulte Creación y uso de ensamblados con nombre seguro para obtener más información sobre la firma de un
ensamblado.

NOTE
La -keyfile opción no está disponible en el entorno de desarrollo de Visual Studio; sólo está disponible cuando se
compila desde la línea de comandos.

Ejemplo
El código siguiente compila Input.vb el archivo de código fuente y especifica un archivo de clave.
vbc -keyfile:myfile.sn input.vb

Consulte también
Ensamblados de .NET
Compilador de línea de comandos de Visual Basic
-referencia (Visual Basic)
Líneas de comandos de compilación de ejemplo
-langversion (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Hace que el compilador acepte solo la sintaxis que se incluye en la versión de idioma de Visual Basic especificada.

Sintaxis
-langversion:version

Argumentos
version
Obligatorio. Versión de idioma que se va a usar durante la compilación. Los valores aceptados son 9 , 10 , 11 ,
12 , 14 , 15 , 15.3 , 15.5 , default y latest .

También se puede especificar cualquiera de los números enteros mediante .0 como la versión secundaria, por
ejemplo, 11.0 .
Puede ver la lista de todos los valores posibles si especifica -langversion:? en la línea de comandos.

Comentarios
La opción -langversion especifica qué sintaxis acepta el compilador. Por ejemplo, si especifica que la versión de
lenguaje es 9,0, el compilador genera errores para la sintaxis que solo es válida en la versión 10,0 y posteriores.
Puede usar esta opción cuando desarrolle aplicaciones destinadas a versiones diferentes del .NET Framework. Por
ejemplo, si tiene como destino .NET Framework 3,5, puede usar esta opción para asegurarse de que no usa la
sintaxis de la versión 10,0 del lenguaje.
Solo puede establecer -langversion directamente mediante la línea de comandos. Para más información, vea
Elegir una versión específica de .NET Framework.

Ejemplo
El código siguiente compila sample.vb para Visual Basic 9,0.

vbc -langversion:9.0 sample.vb

Vea también
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
Elegir una versión específica de .NET Framework
-libpath
10/01/2020 • 2 minutes to read • Edit Online

Especifica la ubicación de los ensamblados a los que se hace referencia.

Sintaxis
-libpath:dirList

Argumentos
T ÉRM IN O DE ESQ UEM A JSO N

dirList Obligatoria. Lista de directorios delimitados por punto y coma


para que el compilador busque si un ensamblado al que se
hace referencia no se encuentra en el directorio de trabajo
actual (el directorio desde el que se invoca al compilador) o en
el directorio del sistema del Common Language Runtime. Si el
nombre del directorio contiene un espacio, incluya el nombre
entre comillas ("").

Notas
La opción -libpath especifica la ubicación de los ensamblados a los que hace referencia la opción -Reference .
El compilador busca referencias a ensamblados que no presentan la ruta completa en el siguiente orden:
1. Directorio de trabajo actual. Es el directorio desde donde se invoca al compilador.
2. El directorio del sistema de Common Language Runtime.
3. Directorios especificados por -libpath .
4. Directorios especificados por la variable de entorno LIB.
La opción -libpath es aditiva; Si se especifica más de una vez, se anexa a los valores anteriores.
Use -reference para especificar una referencia de ensamblado.

PA RA SET - L IB PAT H EN EL EN TO RN O DE DESA RRO L LO IN T EGRA DO DE VISUA L ST UDIO

1. tener un proyecto seleccionado en Explorador de soluciones . En el menú Proyecto , haga clic en Propiedades .
2. Haga clic en la pestaña referencias .
3. Haga clic en el botón rutas de acceso de referencia ....
4. en el cuadro de diálogo rutas de acceso de referencia , escriba el nombre del directorio en el cuadro carpeta: .
5. Haga clic en Agregar carpeta .

Ejemplo
El código siguiente compila T2.vb para crear un archivo. exe. El compilador busca en el directorio de trabajo, en el
directorio raíz de la unidad C:, y en el directorio New assemblies de la unidad C: para las referencias de
ensamblado.
vbc -libpath:c:\;"c:\New Assemblies" -reference:t2.dll t2.vb

Vea también
Ensamblados de .NET
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-Link (Visual Basic)
10/01/2020 • 7 minutes to read • Edit Online

Hace que el compilador facilite al proyecto que se está compilando información de tipos COM en los ensamblados
especificados.

Sintaxis
-link:fileList

-l:fileList

Argumentos
T ÉRM IN O DE ESQ UEM A JSO N

fileList Obligatoria. Lista delimitada por comas de nombres de


archivos de ensamblado. Si el nombre de archivo contiene un
espacio, escríbalo entre comillas.

Notas
La opción -link permite implementar una aplicación que tiene información de tipo incrustada. La aplicación
puede usar los tipos de un ensamblado en tiempo de ejecución que implementan la información de tipo
incrustada sin necesidad de una referencia al ensamblado en tiempo de ejecución. Si hay varias versiones del
ensamblado en tiempo de ejecución publicadas, la aplicación que contiene la información de tipo incrustada puede
trabajar con las distintas versiones sin tener que volver a compilar. Para obtener un ejemplo, vea Tutorial: Incrustar
los tipos de los ensamblados administrados.
La opción -link resulta de especial utilidad cuando se trabaja con la interoperabilidad COM. Puede incrustar
tipos COM para que la aplicación ya no necesite un ensamblado de interoperabilidad primario (PIA) en el equipo
de destino. La opción -link indica al compilador que incruste la información de tipo COM del ensamblado de
interoperabilidad al que se hace referencia en el código compilado resultante. El tipo COM se identifica mediante
el valor de CLSID (GUID). Como resultado, la aplicación se puede ejecutar en un equipo de destino que tenga
instalados los mismos tipos COM con los mismos valores de CLSID. Las aplicaciones que automatizan Microsoft
Office son un buen ejemplo. Dado que las aplicaciones como Office suelen mantener el mismo valor de CLSID en
las distintas versiones, la aplicación puede usar los tipos COM a los que se hace referencia siempre que .NET
Framework 4 o posterior esté instalado en el equipo de destino y la aplicación emplee métodos, propiedades o
eventos que estén incluidos en los tipos COM a los que se hace referencia.
La opción -link incrusta únicamente interfaces, estructuras y delegados. No se admite la incrustación de clases
COM.
NOTE
Cuando se crea una instancia de un tipo COM incrustado en el código, hay que crear la instancia mediante la interfaz
adecuada. Si se intenta crear una instancia de un tipo COM incrustado mediante la coclase, se produce un error.

Para establecer la opción -link en Visual Studio, agregue una referencia de ensamblado y establezca la
propiedad Embed Interop Types en true . El valor predeterminado de la propiedad Embed Interop Types es false .
Si vincula a un ensamblado COM (ensamblado A) que a su vez hace referencia a otro ensamblado COM
(ensamblado B), también debe vincular al ensamblado B si se cumple alguna de las siguientes condiciones:
Un tipo del ensamblado A hereda de un tipo o implementa una interfaz del ensamblado B.
Se invoca a un campo, una propiedad, un evento o un método que tiene un tipo de parámetro o un tipo de
valor devuelto del ensamblado B.
Use -LIBPATH para especificar el directorio en el que se encuentran una o varias de las referencias de ensamblado.
Al igual que la opción del compilador -Reference , la opción del compilador -link usa el archivo de respuesta
VBC. RSP, que hace referencia a los ensamblados .NET Framework utilizados con frecuencia. Use la opción del
compilador -noconfig si no desea que el compilador use el archivo Vbc. rsp.
La forma abreviada de -link es -l .

Tipos incrustados y genéricos


En las secciones siguientes se describen las limitaciones sobre el uso de tipos genéricos en aplicaciones que
incrustan tipos de interoperabilidad.
Interfaces genéricas
No se puede usar interfaces genéricas que se incrusten desde un ensamblado de interoperabilidad. Esta
implementación se muestra en el ejemplo siguiente.

' The following code causes an error if ISampleInterface is an embedded interop type.
Dim sample As ISampleInterface(Of SampleType)

Tipos que tienen parámetros genéricos


Los tipos que tienen un parámetro genérico cuyo tipo se ha incrustado desde un ensamblado de interoperabilidad
no se pueden usar si ese tipo pertenece a un ensamblado externo. Esta restricción no se aplica a las interfaces. Por
ejemplo, considere la interfaz Range que se define en el ensamblado Microsoft.Office.Interop.Excel. Si una
biblioteca inserta tipos de interoperabilidad desde el ensamblado Microsoft.Office.Interop.Excel y expone un
método que devuelve un tipo genérico que tiene un parámetro cuyo tipo es la interfaz Range, ese método debe
devolver una interfaz genérica, como se muestra en el ejemplo de código siguiente.

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)
End Function

' The following code is valid for calls from a client assembly.
Public Function GetRange2() As IList(Of Range)

End Function
End Class

En el ejemplo siguiente, el código de cliente puede llamar al método que devuelve la interfaz genérica IList sin
errores.

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

Ejemplo
La línea de comandos siguiente compila los ensamblados de referencia y OfficeApp.vb de archivos de origen de
COMData1.dll y COMData2.dll para generar OfficeApp.exe .

vbc -link:COMData1.dll,COMData2.dll -out:OfficeApp.exe OfficeApp.vb

Vea también
Compilador de línea de comandos de Visual Basic
Tutorial: Incrustación de los tipos de los ensamblados administrados
-Reference (Visual Basic)
-noconfig
-libpath
Líneas de comandos de compilación de ejemplo
Introducción a la interoperabilidad COM
-linkresource ((Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Crea un vínculo a un recurso administrado.

Sintaxis
-linkresource:filename[,identifier[,public|private]]

-linkres:filename[,identifier[,public|private]]

Argumentos
filename
Obligatorio. Archivo de recursos que se va a vincular al ensamblado. Si el nombre de archivo contiene un espacio,
incluya el nombre entre comillas ("").
identifier
Opcional. Nombre lógico del recurso. Nombre que se usa para cargar el recurso. El valor predeterminado es el
nombre del archivo. Opcionalmente, puede especificar si el archivo es público o privado en el manifiesto del
ensamblado, por ejemplo: -linkres:filename.res,myname.res,public . De forma predeterminada, filename es
público en el ensamblado.

Comentarios
La opción -linkresource no incrusta el archivo de recursos en el archivo de salida; Use la opción -resource para
hacerlo.
La opción -linkresource requiere una de las opciones de -target distintas de -target:module .
Si filename es un archivo de recursos .NET Framework creado, por ejemplo, mediante Resgen. exe (generador de
archivos de recursos) o en el entorno de desarrollo, se puede tener acceso al mismo con miembros del espacio de
nombres System.Resources. (Para obtener más información, vea ResourceManager). Para tener acceso a todos los
demás recursos en tiempo de ejecución, use los métodos que comienzan por GetManifestResource en la clase
Assembly.
El nombre de archivo puede tener cualquier formato de archivo. Por ejemplo, se puede hacer que una DLL nativa
forme parte de un ensamblado para que se pueda instalar en la caché global de ensamblados y sea accesible
desde código administrado del ensamblado.
La forma abreviada de -linkresource es -linkres .

NOTE
La opción -linkresource no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible cuando se
compila desde la línea de comandos.
Ejemplo
En el código siguiente se compilan in.vb y vínculos a rf.resource de archivos de recursos.

vbc -linkresource:rf.resource in.vb

Vea también
Compilador de línea de comandos de Visual Basic
-Target (Visual Basic)
-Resource (Visual Basic)
Líneas de comandos de compilación de ejemplo
-main
23/11/2019 • 2 minutes to read • Edit Online

Especifica la clase o el módulo que contiene el procedimiento Sub Main .

Sintaxis
-main:location

Argumentos
location
Obligatorio. Nombre de la clase o módulo que contiene el Sub Main procedimiento al que se va a llamar cuando
se inicie el programa. Puede tener el formato -Main: module o -Main: Namespace. Module .

Comentarios
Utilice esta opción cuando cree un archivo ejecutable o un programa ejecutable de Windows. Si se omite la opción
-Main , el compilador busca una Sub Main compartida válida en todas las clases y módulos públicos.
Vea el procedimiento Main en Visual Basic para obtener una explicación de las distintas formas del procedimiento
de Main .
Cuando location es una clase que hereda de Form, el compilador proporciona un procedimiento de Main
predeterminado que inicia la aplicación si la clase no tiene Main procedimiento. Esto le permite compilar código
en la línea de comandos que se creó en el entorno de desarrollo.

' Compile with /r:System.dll,SYSTEM.WINDOWS.FORMS.DLL /main:MyC


Public Class MyC
Inherits System.Windows.Forms.Form
End Class

Para establecer-Main en el entorno de desarrollo integrado de Visual Studio


1. Seleccione un proyecto en el Explorador de soluciones . En el menú Proyecto , haga clic en
Propiedades .
2. Haga clic en la pestaña Aplicación .
3. Asegúrese de que la casilla Habilitar marco de aplicación no esté activada.
4. Modifique el valor en el cuadro objeto de inicio .

Ejemplo
En el código siguiente se compilan T2.vb y T3.vb , especificando que el procedimiento Sub Main se encontrará
en la clase Test2 .

vbc t2.vb t3.vb -main:Test2


Vea también
Compilador de línea de comandos de Visual Basic
-Target (Visual Basic)
Líneas de comandos de compilación de ejemplo
Procedimiento Main en Visual Basic
-moduleassemblyname
24/10/2019 • 2 minutes to read • Edit Online

Especifica el nombre del ensamblado del que este módulo formará parte.

Sintaxis
-moduleassemblyname:assembly_name

Argumentos
T ÉRM IN O DE ESQ UEM A JSO N

assembly_name Nombre del ensamblado del que formará parte este módulo.

Comentarios
El compilador procesa la opción -moduleassemblyname solo si se ha especificado la opción -target:module . Esto
hace que el compilador cree un módulo. El módulo creado por el compilador solo es válido para el ensamblado
especificado con la opción -moduleassemblyname . Si coloca el módulo en otro ensamblado, se producirán errores en
tiempo de ejecución.
La opción -moduleassemblyname solo es necesaria cuando se cumplen las condiciones siguientes:
Un tipo de datos del módulo necesita acceso a un Friend tipo de un ensamblado al que se hace referencia.
El ensamblado al que se hace referencia ha concedido acceso de ensamblado de confianza al ensamblado
en el que se va a compilar el módulo.
Para obtener más información sobre cómo crear un módulo, vea -target (Visual Basic). Para obtener más
información sobre los ensamblados de confianza, vea ensamblados de confianza.

NOTE
La opción -moduleassemblyname no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible
cuando se compila desde un símbolo del sistema.

Vea también
Compilar un ensamblado de varios archivos
Compilador de línea de comandos de Visual Basic
-Target (Visual Basic)
-main
-Reference (Visual Basic)
-addmodule
Ensamblados de .NET
Líneas de comandos de compilación de ejemplo
Ensamblados de confianza
-netcf
10/01/2020 • 4 minutes to read • Edit Online

Establece el compilador para que tenga como destino el .NET Compact Framework.

Sintaxis
-netcf

Notas
La opción -netcf hace que el compilador de Visual Basic tenga como destino la .NET Compact Framework en
lugar de la .NET Framework completa. La funcionalidad del lenguaje que solo está presente en el .NET Framework
completo está deshabilitada.
La opción -netcf está diseñada para usarse con -sdkpath. Las características de lenguaje deshabilitadas por
-netcf son las mismas características de lenguaje que no están presentes en los archivos de destino de -sdkpath
.

NOTE
La opción -netcf no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar desde la
línea de comandos. La opción -netcf se establece cuando se carga un proyecto de dispositivo Visual Basic.

La opción -netcf cambia las siguientes características del lenguaje:


La palabra clave End <palabra clave > instrucción , que finaliza la ejecución de un programa, está
deshabilitada. El siguiente programa se compila y se ejecuta sin -netcf pero produce un error en tiempo
de compilación con -netcf .

Module Module1
Sub Main()
End ' not valid to terminate execution with /netcf
End Sub
End Module

El enlace en tiempo de ejecución, en todos los formularios, está deshabilitado. Se generan errores en
tiempo de compilación cuando se encuentran escenarios de enlace en tiempo de ejecución reconocidos. El
siguiente programa se compila y se ejecuta sin -netcf pero produce un error en tiempo de compilación
con -netcf .
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

Los modificadores automático, ANSIy Unicode están deshabilitados. La sintaxis de la instrucción Declare
también se modifica para Declare Sub|Function name Lib "library" [Alias "alias"] [([arglist])] . En el
código siguiente se muestra el efecto de -netcf en una compilación.

' 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

El uso de Visual Basic palabras clave 6,0 que se quitaron de Visual Basic genera un error diferente cuando
se usa -netcf . Esto afecta a los mensajes de error de las palabras clave siguientes:
Open
Close

Put

Print

Write

Input

Lock

Unlock

Seek

Width

Name

FreeFile

EOF

Loc

LOF

Line

Ejemplo
El código siguiente compila Myfile.vb con el .NET Compact Framework, con las versiones de mscorlib. dll y
Microsoft. VisualBasic. dll que se encuentran en el directorio de instalación predeterminado de la .NET Compact
Framework en la unidad C. Normalmente, se usaría la versión más reciente de la .NET Compact Framework.

vbc -netcf -sdkpath:"c:\Program Files\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\Windows


CE " myfile.vb

Vea también
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-sdkpath
-noconfig
23/10/2019 • 2 minutes to read • Edit Online

Especifica que el compilador no debe hacer referencia automáticamente a los ensamblados de .NET Framework
usados normalmente o importar los espacios de nombres System y Microsoft.VisualBasic .

Sintaxis
-noconfig

Comentarios
La opción -noconfig indica al compilador que no compile con el archivo Vbc. RSP, que se encuentra en el mismo
directorio que el archivo Vbc. exe. El archivo Vbc. rsp hace referencia a los ensamblados de .NET Framework
usados comúnmente e importa los espacios de nombres System y Microsoft.VisualBasic . El compilador hace
referencia implícitamente al ensamblado System. dll a menos que se especifique la opción -nostdlib . La opción
-nostdlib indica al compilador que no compile con VBC. rsp ni haga referencia automáticamente al ensamblado
System. dll.

NOTE
Siempre se hace referencia a los ensamblados mscorlib. dll y Microsoft. VisualBasic. dll.

Puede modificar el archivo Vbc. RSP para especificar opciones de compilador adicionales que deben incluirse en
todas las compilaciones de VBC. exe (excepto cuando se especifica la opción -noconfig ). Para obtener más
información, consulte @ (especificar archivo de respuesta).
El compilador procesa las opciones que se pasan al comando vbc en último lugar. Por lo tanto, cualquier opción
de la línea de comandos invalida el valor de la misma opción en el archivo Vbc. rsp.

NOTE
La opción -noconfig no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar
desde la línea de comandos.

Vea también
-nostdlib (Visual Basic)
Compilador de línea de comandos de Visual Basic
@ (especificar archivo de respuesta)
-Reference (Visual Basic)
-nologo (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Suprime la presentación de la pancarta de copyright y los mensajes informativos durante la compilación.

Sintaxis
-nologo

Comentarios
Si especifica -nologo , el compilador no mostrará un titular de copyright. De forma predeterminada, -nologo no
está en vigor.

NOTE
La opción -nologo no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar desde la
línea de comandos.

Ejemplo
En el código siguiente se compila T2.vb y no se muestra un banner de copyright.

vbc -nologo t2.vb

Vea también
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-nostdlib (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Hace que el compilador no haga referencia automáticamente a las bibliotecas estándar.

Sintaxis
-nostdlib

Comentarios
La opción -nostdlib quita la referencia automática al ensamblado System. dll y evita que el compilador Lea el
archivo Vbc. rsp. El archivo Vbc. RSP, que se encuentra en el mismo directorio que el archivo Vbc. exe, hace
referencia a los ensamblados .NET Framework utilizados habitualmente e importa los espacios de nombres
System y Microsoft.VisualBasic .

NOTE
Siempre se hace referencia a los ensamblados mscorlib. dll y Microsoft. VisualBasic. dll.

NOTE
La opción -nostdlib no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar desde
la línea de comandos.

Ejemplo
El código siguiente compila T2.vb sin hacer referencia a las bibliotecas estándar. Debe establecer el _MYTYPE
constante de compilación condicional en la cadena "Empty" para quitar el objeto My .

vbc -nostdlib -define:_MYTYPE=\"Empty\" T2.vb

Vea también
-noconfig
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
Personalización de los objetos que están disponibles en My
-nowarn
23/10/2019 • 2 minutes to read • Edit Online

Suprime la capacidad del compilador para generar advertencias.

Sintaxis
-nowarn[:numberList]

Argumentos
T ÉRM IN O DEF IN IC IÓ N

numberList Opcional. Lista delimitada por comas de los números de ID. de


advertencia que el compilador debe suprimir. Si no se
especifican los identificadores de advertencia, se suprimen
todas las advertencias.

Comentarios
La opción -nowarn hace que el compilador no genere advertencias. Para suprimir una advertencia individual,
proporcione el identificador de advertencia a la opción -nowarn que va detrás del signo de dos puntos. Separe
varios números de advertencia con comas.
Solo tiene que especificar la parte numérica del identificador de advertencia. Por ejemplo, si desea suprimir
BC42024, la advertencia para las variables locales no utilizadas, especifique -nowarn:42024 .
Para obtener más información sobre los números de identificador de advertencia, vea configurar advertencias en
Visual Basic.

PA RA ESTA B L EC ER- N O WA RN EN EL EN TO RN O DE DESA RRO L LO IN T EGRA DO DE VISUA L ST UDIO

1. Seleccione un proyecto en el Explorador de soluciones . En el menú Proyecto , haga clic en Propiedades .


2. Haga clic en la pestaña Compilar .
3. Active la casilla deshabilitar todas las adver tencias para deshabilitar todas las advertencias.
o bien
Para deshabilitar una advertencia concreta, haga clic en ninguno en la lista desplegable que se muestra junto a la advertencia.

Ejemplo
El siguiente código compila T2.vb y no muestra ninguna advertencia.

vbc -nowarn t2.vb

Ejemplo
En el código siguiente se compila T2.vb y no se muestran las advertencias de las variables locales no utilizadas
(42024).
vbc -nowarn:42024 t2.vb

Vea también
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
Configuring Warnings in Visual Basic
-nowin32manifest (Visual Basic)
25/11/2019 • 2 minutes to read • Edit Online

Indica al compilador que no inserte ningún manifiesto de la aplicación en el archivo ejecutable.

Sintaxis
-nowin32manifest

Comentarios
Cuando se use esta opción, la aplicación estará sujeta a la virtualización en Windows Vista a menos que
proporcione un manifiesto de aplicación en un archivo de recursos Win32 o durante un paso de compilación
posterior. Para más información sobre la virtualización, vea Implementación de ClickOnce en Windows Vista.
Para más información sobre la creación de manifiestos, vea -win32manifest (Visual Basic).

Vea también
Compilador de línea de comandos de Visual Basic
Página de aplicación, Diseñador de proyectos (Visual Basic)
-optimize
23/10/2019 • 2 minutes to read • Edit Online

Habilita o deshabilita las optimizaciones del compilador.

Sintaxis
-optimize[ + | - ]

Argumentos
T ÉRM IN O DEF IN IC IÓ N

+ | - Opcional. La opción -optimize- deshabilita las


optimizaciones del compilador. La opción -optimize+ habilita
las optimizaciones. De forma predeterminada, las
optimizaciones están deshabilitadas.

Comentarios
Gracias a las optimizaciones del compilador, el archivo de salida será más pequeño, más rápido y más eficaz. Sin
embargo, dado que las optimizaciones provocan la reorganización del código en el archivo de salida, -optimize+
puede dificultar la depuración.
Todos los módulos generados con -target:module para un ensamblado deben usar la misma configuración
-optimize que el ensamblado. Para obtener más información, vea -target (Visual Basic).

Puede combinar las opciones -optimize y -debug .

PA RA SET - O P T IM IZ E EN EL EN TO RN O DE DESA RRO L LO IN T EGRA DO DE VISUA L ST UDIO

1. Seleccione un proyecto en el Explorador de soluciones . En el menú Proyecto , haga clic en Propiedades .

2. Haga clic en la pestaña Compilar .


3. Haga clic en el botón Avanzada .
4. Modifique la casilla Habilitar optimizaciones .

Ejemplo
El código siguiente compila T2.vb y habilita las optimizaciones del compilador.

vbc t2.vb -optimize

Vea también
Compilador de línea de comandos de Visual Basic
-debug (Visual Basic)
Líneas de comandos de compilación de ejemplo
-Target (Visual Basic)
-optioncompare
23/10/2019 • 2 minutes to read • Edit Online

Especifica la forma en que se realizan las comparaciones de cadenas.

Sintaxis
-optioncompare:{binary | text}

Comentarios
Puede especificar -optioncompare de una de estas dos formas: -optioncompare:binary para usar comparaciones
de cadenas binarias y -optioncompare:text para usar comparaciones de cadenas de texto. De forma
predeterminada, el compilador utiliza -optioncompare:binary .
En Microsoft Windows, la página de códigos actual determina el criterio de ordenación binario. Un criterio de
ordenación binario típico es el siguiente:
A < B < E < Z < a < b < e < z < À < Ê < Ø < à < ê < ø

Las comparaciones de cadenas basadas en texto se basan en un criterio de ordenación de texto sin distinción
entre mayúsculas y minúsculas determinado por la configuración regional del sistema. Un criterio de ordenación
de texto típico es el siguiente:
(A = a) < (À = à) < (B=b) < (E=e) < (Ê = ê) < (Z=z) < (Ø = ø)

Para Set-optioncompare (en el IDE de Visual Studio


1. Seleccione un proyecto en el Explorador de soluciones . En el menú Proyecto , haga clic en
Propiedades .
2. Haga clic en la pestaña Compilar .
3. Modifique el valor en el cuadro Option Compare .
Para establecer optioncompare (mediante programación
Consulte instrucción Option Compare.

Ejemplo
El código siguiente compila ProjFile.vb y utiliza comparaciones de cadenas binarias.

vbc -optioncompare:binary projFile.vb

Vea también
Compilador de línea de comandos de Visual Basic
-optionexplicit
-optionstrict
-optioninfer
Líneas de comandos de compilación de ejemplo
Option Compare (instrucción)
Valores predeterminados de Visual Basic, Proyectos, Cuadro de diálogo Opciones
-optionexplicit
21/03/2020 • 2 minutes to read • Edit Online

Hace que el compilador notifique errores si las variables no se declaran antes de que se utilicen.

Sintaxis
-optionexplicit[+ | -]

Argumentos
+ | -
Opcional. Especifique -optionexplicit+ para requerir una declaración explícita de variables. La -optionexplicit+
opción es la predeterminada -optionexplicit y es la misma que . La -optionexplicit- opción habilita la
declaración implícita de variables.

Observaciones
Si el archivo de código fuente contiene una -optionexplicit instrucción Option Explicit, la instrucción reemplaza
la configuración del compilador de línea de comandos.
Para establecer -optionexplicit en el IDE de Visual Studio
1. Seleccione un proyecto en el Explorador de soluciones . En el menú Proyecto , haga clic en
Propiedades .
2. Haga clic en la pestaña Compilar .
3. Modifique el valor en el cuadro Option Explicit.

Ejemplo
El código siguiente -optionexplicit- se compila cuando se usa.

Module Module1
Sub Main()
i = 99
System.Console.WriteLine(i)
End Sub
End Module

Consulte también
Compilador de línea de comandos de Visual Basic
-optioncompare
-optionstrict
-optioninfer
Líneas de comandos de compilación de ejemplo
Option Explicit (instrucción)
Valores predeterminados de Visual Basic, Proyectos, Cuadro de diálogo Opciones
-optioninfer
24/10/2019 • 2 minutes to read • Edit Online

Permite el uso de la inferencia de tipo de variable local en declaraciones de variables.

Sintaxis
-optioninfer[+ | -]

Argumentos
T ÉRM IN O DE ESQ UEM A JSO N

+ | - Opcional. Especifique -optioninfer+ para habilitar la


inferencia de tipo de variable local o -optioninfer- para
bloquearla. La opción -optioninfer , sin ningún valor
especificado, es igual a -optioninfer+ . El valor
predeterminado cuando el modificador -optioninfer no
está presente también es -optioninfer+ . El valor
predeterminado se establece en el archivo de respuesta
vbc.rsp.

NOTE
Puede utilizar la opción -noconfig para conservar los valores predeterminados internos del compilador en lugar de los
especificados en vbc.rsp. El valor predeterminado del compilador para esta opción es -optioninfer- .

Comentarios
Si el archivo de código fuente contiene una instrucción Option Infer, la instrucción reemplaza la -optioninfer
configuración del compilador de línea de comandos.
Para Set-optioninfer (en el IDE de Visual Studio
1. Seleccione un proyecto en Explorador de soluciones . En el menú Proyecto , haga clic en Propiedades .
2. En la pestaña compilar , modifique el valor del cuadro Option Infer .

Ejemplo
El siguiente código compila test.vb con la inferencia de tipo de variable local habilitada.

vbc -optioninfer+ test.vb

Vea también
Compilador de línea de comandos de Visual Basic
-optioncompare
-optionexplicit
-optionstrict
Líneas de comandos de compilación de ejemplo
Option Infer (instrucción)
Inferencia de tipo de variable local
Valores predeterminados de Visual Basic, Proyectos, Cuadro de diálogo Opciones
Página Compilación, Diseñador de proyectos (Visual Basic)
-noconfig
Compilación desde la línea de comandos
-optionstrict
23/10/2019 • 2 minutes to read • Edit Online

Aplica la semántica estricta de tipos para restringir las conversiones de tipos implícitas.

Sintaxis
-optionstrict[+ | -]
-optionstrict[:custom]

Argumentos
+ | -
Opcional. La opción -optionstrict+ restringe la conversión implícita de tipos. El valor predeterminado para esta
opción es -optionstrict- . La opción -optionstrict+ es la misma que la -optionstrict . Puede usar ambos para
la semántica de tipos permisiva.
custom
Requerido. Advertir cuando no se respete la semántica estricta del lenguaje.

Comentarios
Cuando -optionstrict+ está en vigor, solo se pueden realizar implícitamente conversiones de tipos de
ampliación. Las conversiones de tipos de restricción implícitas, como la asignación de un objeto de tipo Decimal
a un objeto de tipo entero, se muestran como errores.
Para generar advertencias para las conversiones de tipos de restricción implícitas, use -optionstrict:custom .
Use -nowarn:numberlist para omitir advertencias concretas y -warnaserror:numberlist para tratar advertencias
concretas como errores.
Para Set-OptionStrict en el IDE de Visual Studio
1. Seleccione un proyecto en el Explorador de soluciones . En el menú proyecto , haga clic en
propiedades.
2. Haga clic en la pestaña Compilar .
3. Modifique el valor en el cuadro Option Strict .
Para establecer-OptionStrict mediante programación
Consulte Option Strict (instrucción).

Ejemplo
El código siguiente compila Test.vb mediante la semántica estricta de tipos.

vbc -optionstrict+ test.vb

Vea también
Compilador de línea de comandos de Visual Basic
-optioncompare
-optionexplicit
-optioninfer
-nowarn
-warnaserror (Visual Basic)
Líneas de comandos de compilación de ejemplo
Option Strict (instrucción)
Valores predeterminados de Visual Basic, Proyectos, Cuadro de diálogo Opciones
-out (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Especifica el nombre del archivo de salida.

Sintaxis
-out:filename

Argumentos
T ÉRM IN O DEF IN IC IÓ N

filename Obligatorio. Nombre del archivo de salida que crea el


compilador. Si el nombre de archivo contiene un espacio,
incluya el nombre entre comillas ("").

Comentarios
Especifique el nombre completo y la extensión del archivo que se va a crear. Si no lo hace, el archivo. exe toma su
nombre del archivo de código fuente que contiene el procedimiento Sub Main y el archivo. dll toma su nombre del
primer archivo de código fuente.
Si especifica un nombre de archivo sin la extensión. exe o. dll, el compilador agrega automáticamente la extensión,
en función del valor especificado para la opción del compilador -target .

PA RA ESTA B L EC ER EN EL EN TO RN O DE DESA RRO L LO IN T EGRA DO DE VISUA L ST UDIO

1. tener un proyecto seleccionado en Explorador de soluciones . En el menú Proyecto , haga clic en Propiedades .
2. Haga clic en la pestaña aplicación .
3. modifique el valor en el cuadro nombre de ensamblado .

Ejemplo
El código siguiente compila T2.vb y crea T2.exe de archivo de salida.

vbc t2.vb -out:t3.exe

Vea también
Compilador de línea de comandos de Visual Basic
-Target (Visual Basic)
Líneas de comandos de compilación de ejemplo
-Platform (Visual Basic)
27/11/2019 • 5 minutes to read • Edit Online

Especifica qué versión de la plataforma de Common Language Runtime (CLR) puede ejecutar el archivo de salida.

Sintaxis
-platform:{ x86 | x64 | Itanium | arm | anycpu | anycpu32bitpreferred }

Argumentos
T ÉRM IN O DEF IN IC IÓ N

x86 Compila el ensamblado de forma que el CLR de 32 bits


compatible con x86 pueda ejecutarlo.

x64 Compila el ensamblado de forma que el CLR de 64 bits pueda


ejecutarlo en equipos compatibles con el conjunto de
instrucciones AMD64 o EM64T.

Itanium Compila el ensamblado de forma que el CLR de 64 bits pueda


ejecutarlo en un equipo con un procesador Itanium.

arm Compila el ensamblado de forma que pueda ejecutarse en un


equipo con un procesador ARM (Advanced RISC Machine).

anycpu Compila el ensamblado de forma que pueda ejecutarse en


cualquier plataforma. La aplicación se ejecutará como una
aplicación de 32 bits en versiones de 32 bits de Windows, y
como una aplicación de 64 bits en versiones de 64 bits de
Windows. Esta marca es el valor predeterminado.

anycpu32bitpreferred Compila el ensamblado de forma que pueda ejecutarse en


cualquier plataforma. La aplicación se ejecutará como una
aplicación de 32 bits en versiones de 32 bits y de 64 bits de
Windows. Esta marca solo es válida para los ejecutables (. EXE)
y requiere .NET Framework 4,5.

Comentarios
Use la opción -platform para especificar el tipo de procesador de destino del archivo de salida.
En general, los ensamblados de .NET Framework escritos en Visual Basic se ejecutarán de la misma manera
independientemente de la plataforma. Sin embargo, en algunos casos se comportan de forma diferente en
distintas plataformas. Estos casos comunes son:
Estructuras que contengan miembros cuyo tamaño varía según la plataforma, como cualquier tipo de
puntero.
Aritmética de punteros que incluya tamaños constantes.
Invocación incorrecta de la plataforma o declaraciones COM que utilicen Integer para los controladores
en lugar de IntPtr.
Conversión de IntPtr a Integer .
Uso de invocación de plataforma o interoperabilidad COM con componentes que no existen en todas las
plataformas.
La opción -Platform solucionará algunos problemas si sabe que ha realizado suposiciones sobre la arquitectura
en la que se ejecutará el código. De manera específica:
Si decide que el destino sea una plataforma de 64 bits pero la aplicación se ejecuta en un equipo de 32 bits,
el mensaje de error aparece mucho antes y se centra más bien en el problema que en el error que aparece
sin utilizar este modificador.
Si establece la marca x86 en la opción y posteriormente la aplicación se ejecuta en un equipo de 64 bits, la
aplicación se ejecutará en el subsistema WOW, en lugar de ejecutarse de forma nativa.
En un sistema operativo de Windows de 64 bits:
Los ensamblados compilados con -platform:x86 se ejecutarán en el CLR de 32 bits que se ejecuta en
WOW64.
Los ejecutables compilados con -platform:anycpu se ejecutarán en el CLR de 64 bits.
Un archivo DLL compilado con -platform:anycpu se ejecutará en el mismo CLR que el proceso en el que se
cargó.
Los archivos ejecutables que se compilan con -platform:anycpu32bitpreferred se ejecutarán en el CLR de
32 bits.
Para obtener más información sobre cómo desarrollar una aplicación para que se ejecute en una versión de 64
bits de Windows, vea aplicaciones de 64 bits.
Para establecer-Platform en el IDE de Visual Studio
1. En Explorador de soluciones , elija el proyecto, abra el menú proyecto y, a continuación, haga clic en
propiedades .
2. En la pestaña compilar , Active o desactive la casilla preferir 32 bits, o bien, en la lista CPU de destino ,
elija un valor.
Para obtener más información, vea compilar (página, diseñador de proyectos) (Visual Basic).

Ejemplo
En el ejemplo siguiente se muestra cómo utilizar la opción -platform del compilador.

vbc -platform:x86 myFile.vb

Vea también
-Target (Visual Basic)
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-quiet
23/10/2019 • 2 minutes to read • Edit Online

Evita que el compilador muestre código de errores y advertencias relacionados con la sintaxis.

Sintaxis
-quiet

Comentarios
De forma predeterminada, -quiet no está en vigor. Cuando el compilador informa de un error o una advertencia
relacionados con la sintaxis, también genera la línea del código fuente. En el caso de las aplicaciones que analizan
los resultados del compilador, puede ser más conveniente que el compilador solo genere el texto del diagnóstico.
En el ejemplo siguiente, Module1 genera un error que incluye el código fuente cuando se compila sin -quiet .

Module Module1
Sub Main()
x()
End Sub
End Module

Resultado:

C:\projects\vb2.vb(3) : error BC30451: 'x' is not declared. It may be inaccessible due to its protection
level.

x()
~

Compilada con -quiet , el compilador solo genera lo siguiente:

E:\test\t2.vb(3) : error BC30451: Name 'x' is not declared.

NOTE
La opción -quiet no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar desde la
línea de comandos.

Ejemplo
En el código siguiente se compila T2.vb y no se muestra el código para el diagnóstico del compilador relacionado
con la sintaxis:

vbc -quiet t2.vb


Vea también
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-recurse
23/10/2019 • 2 minutes to read • Edit Online

Compila los archivos de código fuente en todos los directorios secundarios del directorio especificado o del
directorio del proyecto.

Sintaxis
-recurse:[dir\]file

Argumentos
dir
Opcional. El directorio en el que quiere que comience la búsqueda. Si no se especifica, la búsqueda comienza en el
directorio del proyecto.
file
Obligatorio. Los archivos que buscará. Se admiten los caracteres comodín.

Comentarios
Puede usar caracteres comodín en un nombre de archivo para compilar todos los archivos coincidentes en el
directorio del proyecto sin usar -recurse . Si no se especifica ningún nombre de archivo de salida, el compilador
basa el nombre del archivo de salida en el primer archivo de entrada procesado. Normalmente es el primer archivo
de la lista de archivos compilados cuando se ve en orden alfabético. Por esta razón, es mejor especificar un archivo
de salida mediante la opción -out .

NOTE
La opción -recurse no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar desde
la línea de comandos.

Ejemplo
El comando siguiente compila todos los archivos de Visual Basic en el directorio actual.

vbc *.vb

El comando siguiente compila todos los archivos de Visual Basic en el directorio Test\ABC y en los directorios
situados por debajo de él y, a continuación, genera Test.ABC.dll .

vbc -target:library -out:Test.ABC.dll -recurse:Test\ABC\*.vb

Vea también
Compilador de línea de comandos de Visual Basic
-out (Visual Basic)
Líneas de comandos de compilación de ejemplo
-Reference (Visual Basic)
10/01/2020 • 3 minutes to read • Edit Online

Hace que el compilador haga que la información de tipo de los ensamblados especificados esté disponible para
el proyecto que se está compilando actualmente.

Sintaxis
-reference:fileList

-r:fileList

Argumentos
T ÉRM IN O DE ESQ UEM A JSO N

fileList Obligatoria. Lista delimitada por comas de nombres de


archivos de ensamblado. Si el nombre de archivo contiene
un espacio, escríbalo entre comillas.

Notas
Los archivos que importe deben contener metadatos de ensamblado. Solo los tipos públicos son visibles fuera
del ensamblado. La opción -AddModule importa los metadatos de un módulo.
Si hace referencia a un ensamblado (ensamblado A) que a su vez hace referencia a otro ensamblado
(ensamblado B), debe hacer referencia al ensamblado B si:
Un tipo del ensamblado A hereda de un tipo o implementa una interfaz del ensamblado B.
Se invoca a un campo, una propiedad, un evento o un método que tiene un tipo de parámetro o un tipo
de valor devuelto del ensamblado B.
Use -LIBPATH para especificar el directorio en el que se encuentran una o varias de las referencias de
ensamblado.
Para que el compilador reconozca un tipo de un ensamblado (no de un módulo), se debe forzar la resolución
del tipo. Un ejemplo de cómo puede hacerlo es definir una instancia del tipo. Existen otras formas de resolver
nombres de tipos en un ensamblado para el compilador. Por ejemplo, si se hereda de un tipo de un
ensamblado, el compilador hace que el nombre del tipo sea conocido.
De forma predeterminada, se utiliza el archivo de respuesta VBC. RSP, que hace referencia a los ensamblados
.NET Framework utilizados habitualmente. Use -noconfig si no desea que el compilador use VBC. rsp.
La forma abreviada de -reference es -r .

Ejemplo
El comando siguiente compila los ensamblados de referencia y Input.vb del archivo de código fuente desde
Metad1.dll y Metad2.dll para generar Out.exe .

vbc -reference:metad1.dll,metad2.dll -out:out.exe input.vb

Vea también
Compilador de línea de comandos de Visual Basic
-noconfig
-Target (Visual Basic)
Public
Líneas de comandos de compilación de ejemplo
-refonly (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

La opción -refonly indica que la salida principal de la compilación debe ser un ensamblado de referencia en lugar
de un ensamblado de implementación. El parámetro -refonly deshabilita de forma automática la generación de
archivos PDB, ya que los ensamblados de referencia no pueden ejecutarse.
Cada opción del compilador está disponible en dos formatos: -option y /option . En la documentación solo se
muestra el formato -option.

Sintaxis
-refonly

Comentarios
Visual Basic admite el modificador de -refonly a partir de la versión 15,3.
Los ensamblados de referencia son un tipo especial de ensamblado que contiene solo la cantidad mínima de
metadatos necesarios para representar la superficie de la API pública de la biblioteca. Incluyen declaraciones para
todos los miembros que son significativos al hacer referencia a un ensamblado en las herramientas de
compilación, pero excluyen todas las implementaciones de miembros y las declaraciones de miembros privados
que no tienen ningún impacto observable en su contrato de API. Para obtener más información, consulte
Ensamblados de referencia en la Guía de .NET.
Las opciones -refonly y -refout son mutuamente excluyentes.

Vea también
/refout
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-refout (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

La opción -refout especifica una ruta de archivo donde el ensamblado de referencia debe mostrarse.
Cada opción del compilador está disponible en dos formatos: -option y /option . En la documentación solo se
muestra el formato -option.

Sintaxis
-refout:filepath

Argumentos
filepath
Ruta de acceso y nombre de archivo del ensamblado de referencia. Por lo general, debe estar en una subcarpeta
del ensamblado principal. La convención recomendada (que se usa por MSBuild) es colocar el ensamblado de
referencia en una subcarpeta "ref/" con relación al ensamblado principal. Todas las carpetas de filepath deben
existir; el compilador no los crea.

Comentarios
Visual Basic admite el modificador de -refout a partir de la versión 15,3.
Los ensamblados de referencia son un tipo especial de ensamblado que contiene solo la cantidad mínima de
metadatos necesarios para representar la superficie de la API pública de la biblioteca. Incluyen declaraciones para
todos los miembros que son significativos al hacer referencia a un ensamblado en las herramientas de
compilación, pero excluyen todas las implementaciones de miembros y las declaraciones de miembros privados
que no tienen ningún impacto observable en su contrato de API. Para obtener más información, consulte
Ensamblados de referencia en la Guía de .NET.
Las opciones -refout y -refonly son mutuamente excluyentes.

Vea también
/refonly
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-removeintchecks
23/10/2019 • 2 minutes to read • Edit Online

Activa o desactiva la comprobación de errores de desbordamiento para operaciones de enteros.

Sintaxis
-removeintchecks[+ | -]

Argumentos
T ÉRM IN O DEF IN IC IÓ N

+ | - Opcional. La opción -removeintchecks- hace que el


compilador Compruebe todos los cálculos de enteros en busca
de errores de desbordamiento. De manera predeterminada, es
-removeintchecks- .

Si se especifica -removeintchecks o -removeintchecks+ ,


se impide la comprobación de errores y se pueden realizar
cálculos de enteros con mayor rapidez. Sin embargo, sin la
comprobación de errores y si las capacidades del tipo de datos
se desbordan, los resultados incorrectos pueden almacenarse
sin producir un error.

PA RA SET - REM O VEIN TC H EC K S ( EN EL EN TO RN O DE DESA RRO L LO IN T EGRA DO DE VISUA L ST UDIO

1. Seleccione un proyecto en el Explorador de soluciones . En el menú Proyecto , haga clic en Propiedades .


2. Haga clic en la pestaña Compilar .
3. Haga clic en el botón Avanzada .
4. Modifique el valor de la casilla quitar comprobaciones de desbordamiento de enteros .

Ejemplo
En el código siguiente se compila Test.vb y se desactiva la comprobación de errores de desbordamiento de
enteros.

vbc -removeintchecks+ test.vb

Vea también
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-Resource (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Inserta un recurso administrado en un ensamblado.

Sintaxis
-resource:filename[,identifier[,public|private]]

-res:filename[,identifier[,public|private]]

Argumentos
T ÉRM IN O DEF IN IC IÓ N

filename Obligatorio. Nombre del archivo de recursos que se va a


insertar en el archivo de salida. De forma predeterminada,
filename es público en el ensamblado. Escriba el nombre de
archivo entre comillas ("") si contiene un espacio.

identifier Opcional. Nombre lógico del recurso; nombre usado para


cargarlo. El valor predeterminado es el nombre del archivo.
Opcionalmente, puede especificar si el recurso es público o
privado en el manifiesto del ensamblado, como en el
siguiente: -res:filename.res, myname.res, public

Comentarios
Utilice -linkresource para vincular un recurso a un ensamblado sin colocar el archivo de recursos en el archivo
de salida.
Si filename es un archivo de recursos .NET Framework creado, por ejemplo, mediante Resgen. exe (generador de
archivos de recursos) o en el entorno de desarrollo, se puede tener acceso a él con miembros del espacio de
nombres System.Resources (vea ResourceManager para obtener más información). Para tener acceso a todos los
demás recursos en tiempo de ejecución, use uno de los métodos siguientes: GetManifestResourceInfo,
GetManifestResourceNameso GetManifestResourceStream.
La forma abreviada de -resource es -res .
Para obtener información sobre cómo establecer -resource en el IDE de Visual Studio, vea administrar recursos
de la aplicación (.net).

Ejemplo
El siguiente código compila In.vb y adjunta Rf.resource de archivos de recursos.
vbc -res:rf.resource in.vb

Vea también
Compilador de línea de comandos de Visual Basic
-win32resource
-linkresource ((Visual Basic)
-Target (Visual Basic)
Líneas de comandos de compilación de ejemplo
-rootnamespace
23/10/2019 • 2 minutes to read • Edit Online

Especifica un espacio de nombres para todas las declaraciones de tipos.

Sintaxis
-rootnamespace:namespace

Argumentos
T ÉRM IN O DEF IN IC IÓ N

namespace Nombre del espacio de nombres en el que se deben incluir


todas las declaraciones de tipos para el proyecto actual.

Comentarios
Si usa el archivo ejecutable de Visual Studio (devenv. exe) para compilar un proyecto creado en el entorno de
desarrollo integrado de Visual Studio, use -rootnamespace para especificar el valor de la propiedad
RootNamespace. Para obtener más información, vea Modificadores de la línea de comandos de devenv.
Use el Common Language Runtime desensamblador de MSIL ( Ildasm.exe ) para ver los nombres de los espacios
de nombres en el archivo de salida.

PA RA ESTA B L EC ER- RO OT N A M ESPA C E EN EL EN TO RN O DE DESA RRO L LO IN T EGRA DO DE VISUA L ST UDIO

1. Seleccione un proyecto en el Explorador de soluciones . En el menú Proyecto , haga clic en Propiedades .


2. Haga clic en la pestaña Aplicación .
3. Modifique el valor en el cuadro espacio de nombres raíz .

Ejemplo
En el código siguiente se compila In.vb y se encierran todas las declaraciones de tipos en el espacio de nombres
mynamespace .

vbc -rootnamespace:mynamespace in.vb

Vea también
Compilador de línea de comandos de Visual Basic
Ildasm.exe (Desensamblador de IL)
Líneas de comandos de compilación de ejemplo
-sdkpath
23/10/2019 • 2 minutes to read • Edit Online

Especifica la ubicación de mscorlib. dll y Microsoft. VisualBasic. dll.

Sintaxis
-sdkpath:path

Argumentos
path
Directorio que contiene las versiones de mscorlib. dll y Microsoft. VisualBasic. dll que se van a usar para la
compilación. Esta ruta de acceso no se comprueba hasta que se carga. Escriba el nombre del directorio entre
comillas ("") si contiene un espacio.

Comentarios
Esta opción indica al compilador de Visual Basic que cargue los archivos mscorlib. dll y Microsoft. VisualBasic. dll
desde una ubicación no predeterminada. La opción -sdkpath se diseñó para usarse con -netcf. El .NET Compact
Framework usa versiones diferentes de estas bibliotecas de compatibilidad para evitar el uso de tipos y
características de lenguaje que no se encuentran en los dispositivos.

NOTE
La opción -sdkpath no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar desde
la línea de comandos. La opción -sdkpath se establece cuando se carga un proyecto de dispositivo Visual Basic.

Puede especificar que el compilador debe compilar sin una referencia a la biblioteca en tiempo de ejecución de
Visual Basic mediante la opción del compilador -vbruntime . Para obtener más información, vea -vbruntime (.

Ejemplo
El código siguiente compila Myfile.vb con el .NET Compact Framework, con las versiones de mscorlib. dll y
Microsoft. VisualBasic. dll que se encuentran en el directorio de instalación predeterminado de la .NET Compact
Framework en la unidad C. Normalmente, se usaría la versión más reciente de la .NET Compact Framework.

vbc -netcf -sdkpath:"c:\Program Files\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000\Windows


CE " myfile.vb

Vea también
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-netcf
-vbruntime
-Target (Visual Basic)
10/01/2020 • 8 minutes to read • Edit Online

Especifica el formato de los resultados del compilador.

Sintaxis
-target:{exe | library | module | winexe | appcontainerexe | winmdobj}

Notas
En la tabla siguiente se resume el efecto de la opción -target .

O P C IÓ N B EH AVIO R

-target:exe Hace que el compilador cree una aplicación de consola


ejecutable.

Esta es la opción predeterminada cuando no se especifica


ninguna opción de -target . El archivo ejecutable se crea
con una extensión. exe.

A menos que se especifique lo contrario con la opción


-out , el nombre del archivo de salida toma el nombre del
archivo de entrada que contiene el procedimiento
Sub Main .

Solo se requiere un procedimiento Sub Main en los


archivos de código fuente que se compilan en un archivo.
exe. Use la opción del compilador -main para especificar
qué clase contiene el procedimiento de Sub Main .

-target:library Hace que el compilador cree una biblioteca de vínculos


dinámicos (DLL).

El archivo de biblioteca de vínculos dinámicos se crea con


una extensión. dll.

A menos que se especifique lo contrario con la opción


-out , el nombre del archivo de salida toma el nombre del
primer archivo de entrada.

Al compilar un archivo DLL, no es necesario un


procedimiento Sub Main .
O P C IÓ N B EH AVIO R

-target:module Hace que el compilador genere un módulo que se puede


Agregar a un ensamblado.

El archivo de salida se crea con una extensión de.


netmodule.

.NET Common Language Runtime no puede cargar un


archivo que no tiene un ensamblado. Sin embargo, puede
incorporar este tipo de archivo en el manifiesto del
ensamblado de un ensamblado mediante -reference .

Cuando el código de un módulo hace referencia a tipos


internos en otro módulo, ambos módulos deben
incorporarse en un manifiesto de ensamblado mediante
-reference .

La opción -AddModule importa los metadatos de un


módulo.

-target:winexe Hace que el compilador cree una aplicación ejecutable


basada en Windows.

El archivo ejecutable se crea con una extensión. exe. Una


aplicación basada en Windows es aquella que proporciona
una interfaz de usuario de la biblioteca de clases de .NET
Framework o con las API de Windows.

A menos que se especifique lo contrario con la opción


-out , el nombre del archivo de salida toma el nombre del
archivo de entrada que contiene el procedimiento
Sub Main .

Solo se requiere un procedimiento Sub Main en los


archivos de código fuente que se compilan en un archivo.
exe. En los casos en los que el código tenga más de una
clase que tenga un procedimiento Sub Main , use la
opción del compilador -main para especificar qué clase
contiene el procedimiento Sub Main
O P C IÓ N B EH AVIO R

-target:appcontainerexe Hace que el compilador cree una aplicación ejecutable


basada en Windows que se debe ejecutar en un
contenedor de la aplicación. Esta opción está diseñada para
usarse con aplicaciones de la tienda Windows 8. x.

El valor appcontainerexe establece un bit en el campo


características del archivo ejecutable portable . Este bit
indica que la aplicación se debe ejecutar en un contenedor
de la aplicación. Cuando se establece este bit, se produce
un error si el método CreateProcess intenta iniciar la
aplicación fuera de un contenedor de la aplicación. Además
de esta configuración de bits, -target: appcontainerexe
es equivalente a -target: winexe .

El archivo ejecutable se crea con una extensión. exe.

A menos que especifique lo contrario con la opción -out ,


el nombre del archivo de salida toma el nombre del archivo
de entrada que contiene el procedimiento Sub Main .

Solo se requiere un procedimiento Sub Main en los


archivos de código fuente que se compilan en un archivo.
exe. Si el código contiene más de una clase que tiene un
procedimiento Sub Main , use la opción del compilador
-main para especificar qué clase contiene el
procedimiento Sub Main

-target:winmdobj Hace que el compilador cree un archivo intermedio que se


puede convertir en un archivo binario de Windows Runtime
(. winmd). El archivo. winmd lo pueden usar JavaScript y
C++ programas, además de los programas de lenguaje
administrados.

El archivo intermedio se crea con una extensión. winmdobj.

A menos que especifique lo contrario con la opción -out ,


el nombre del archivo de salida toma el nombre del primer
archivo de entrada. No es necesario un procedimiento
Sub Main .

El archivo. winmdobj está diseñado para usarse como


entrada de la herramienta de exportación de WinMDExp
para generar un archivo de metadatos de Windows
(WinMD). El archivo WinMD tiene una extensión. WinMD y
contiene el código de la biblioteca original y las definiciones
de WinMD que usan JavaScript C++, y el Windows
Runtime usar.

A menos que especifique -target:module , -target hace que se agregue un manifiesto de ensamblado .NET
Framework a un archivo de salida.
Cada instancia de VBC. exe genera, como máximo, un archivo de salida. Si especifica una opción del
compilador como -out o -target más de una vez, se aplicará la última que procese el compilador. La
información sobre todos los archivos de una compilación se agrega al manifiesto. Todos los archivos de
salida, excepto los creados con -target:module , contienen metadatos de ensamblado en el manifiesto. Use
Ildasm. exe (desensamblador de IL) para ver los metadatos de un archivo de salida.
La forma abreviada de -target es -t .
Para establecer-target en el IDE de Visual Studio
1. Seleccione un proyecto en el Explorador de soluciones . En el menú Proyecto , haga clic en
Propiedades .
2. Haga clic en la pestaña Aplicación .
3. Modifique el valor en el cuadro tipo de aplicación .

Ejemplo
El código siguiente compila in.vb , creando in.dll :

vbc -target:library in.vb

Vea también
Compilador de línea de comandos de Visual Basic
-main
-out (Visual Basic)
-Reference (Visual Basic)
-addmodule
-moduleassemblyname
Ensamblados de .NET
Líneas de comandos de compilación de ejemplo
-subsystemversion (Visual Basic)
04/12/2019 • 3 minutes to read • Edit Online

Especifica la versión mínima del subsistema en la que se puede ejecutar el archivo ejecutable generado, lo que
determina las versiones de Windows en las que se puede ejecutar el archivo ejecutable. Normalmente, esta opción
garantiza que el archivo ejecutable pueda aprovechar las características de seguridad concretas que no están
disponibles en versiones anteriores de Windows.

NOTE
Para especificar el subsistema en sí mismo, use la opción del compilador -target.

Sintaxis
-subsystemversion:major.minor

Parameters
major.minor

La versión mínima requerida del subsistema, expresada en una notación de puntos para las versiones principales y
secundarias. Por ejemplo, puede especificar que una aplicación no se puede ejecutar en un sistema operativo que
sea anterior a Windows 7 si establece el valor de esta opción en 6.01, como se describe en la tabla que aparece
más adelante en este tema. Debe especificar los valores de major y minor como números enteros.
Los ceros a la izquierda en la versión minor no cambian la versión, pero los ceros a la derecha sí. Por ejemplo, 6.1
y 6.01 hacen referencia a la misma versión, pero 6.10 hace referencia a una versión diferente. Se recomienda
expresar la versión secundaria como dos dígitos para evitar confusiones.

Notas
En la tabla siguiente se enumeran las versiones de subsistema habituales de Windows.

VERSIÓ N DE W IN DO W S VERSIÓ N DE SUB SIST EM A

Windows 2000 5.00

Windows XP 5.01

Windows Server 2003 5.02

Windows Vista 6.00

Windows 7 6.01

Windows Server 2008 6.01

Windows 8 6.02
Valores predeterminados
El valor predeterminado de la opción del compilador -subsystemversion depende de las condiciones de esta
lista:
El valor predeterminado es 6.02 si se establece cualquier opción del compilador en la siguiente lista:
/target:appcontainerexe
/target:winmdobj
-platform:arm
El valor predeterminado es 6,00 si usa MSBuild, tiene como destino .NET Framework 4.5 y no ha
configurado ninguna de las opciones del compilador que se han especificado anteriormente en esta lista.
El valor predeterminado es 4.00 si no se cumple ninguna de las condiciones anteriores.

Establecer esta opción


Para establecer la opción del compilador -subsystemversion en Visual Studio, debe abrir el archivo. vbproj y
especificar un valor para la propiedad SubsystemVersion en el XML de MSBuild. No se puede establecer esta opción
en el IDE de Visual Studio. Para obtener más información, consulte la sección "Valores predeterminados" que
aparece más arriba en este tema o Propiedades comunes de proyectos de MSBuild.

Vea también
Compilador de línea de comandos de Visual Basic
Propiedades de MSBuild
-utf8output (Visual Basic)
27/11/2019 • 2 minutes to read • Edit Online

Muestra los resultados del compilador en codificación UTF-8.

Sintaxis
-utf8output[+ | -]

Argumentos
+ | -
Opcional. El valor predeterminado para esta opción es -utf8output- , lo que significa que la salida del compilador
no utiliza la codificación UTF-8. Especificar -utf8output es lo mismo que especificar -utf8output+ .

Comentarios
En algunas configuraciones internacionales, los resultados del compilador no se pueden mostrar correctamente en
la consola. En tales situaciones, use -utf8output y redirigir la salida del compilador a un archivo.

NOTE
La opción -utf8output no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar
desde la línea de comandos.

Ejemplo
En el código siguiente se compila In.vb y se indica al compilador que muestre la salida mediante la codificación
UTF-8.

vbc -utf8output in.vb

Vea también
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-vbruntime
23/10/2019 • 5 minutes to read • Edit Online

Especifica que el compilador debe compilar sin una referencia a la biblioteca de tiempo de ejecución de Visual
Basic o con una referencia a una biblioteca de tiempo de ejecución específica.

Sintaxis
-vbruntime:{ - | + | * | path }

Argumentos
-
Compile sin una referencia a la biblioteca en tiempo de ejecución de Visual Basic.
+
Compilar con una referencia a la biblioteca en tiempo de ejecución de Visual Basic predeterminada.
*
Compile sin una referencia a la biblioteca en tiempo de ejecución de Visual Basic e inserte la funcionalidad básica
de la biblioteca en tiempo de ejecución de Visual Basic en el ensamblado.
path
Compilar con una referencia a la biblioteca especificada (DLL).

Comentarios
La opción del compilador -vbruntime le permite especificar que el compilador debe compilar sin una referencia a
la biblioteca en tiempo de ejecución de Visual Basic. Si compila sin una referencia a la biblioteca en tiempo de
ejecución de Visual Basic, se registran errores o advertencias en construcciones de código o de lenguaje que
generan una llamada a una aplicación auxiliar de Visual Basic en tiempo de ejecución. (Una aplicación auxiliar en
tiempo de ejecución de Visual Basic es una función definida en Microsoft. VisualBasic. dll a la que se llama en
tiempo de ejecución para ejecutar una semántica específica del lenguaje).
La opción -vbruntime+ produce el mismo comportamiento que se produce si no se especifica ningún
modificador -vbruntime . Puede usar la opción -vbruntime+ para invalidar los conmutadores -vbruntime
anteriores.
La mayoría de los objetos del tipo My no están disponibles cuando se usan las opciones -vbruntime- o
-vbruntime:path .

Incrustar Visual Basic funcionalidad básica en tiempo de ejecución


La opción -vbruntime* le permite compilar sin una referencia a una biblioteca en tiempo de ejecución. En su
lugar, la funcionalidad básica de la biblioteca en tiempo de ejecución de Visual Basic se incrusta en el ensamblado
del usuario. Puede usar esta opción si la aplicación se ejecuta en plataformas que no contienen el tiempo de
ejecución de Visual Basic.
Los siguientes miembros en tiempo de ejecución están incrustados:
Clase Conversions
Método AscW(Char)
Método AscW(String)
Método ChrW(Int32)
vbBack (constante)
vbCr (constante)
vbCrLf (constante)
vbFormFeed (constante)
vbLf (constante)
vbNewLine (constante)
vbNullChar (constante)
vbNullString (constante)
vbTab (constante)
vbVerticalTab (constante)
Algunos objetos del tipo My

Si se compila con la opción -vbruntime* y el código hace referencia a un miembro de la biblioteca en tiempo de
ejecución de Visual Basic que no está incrustada con la funcionalidad básica, el compilador devuelve un error que
indica que el miembro no está disponible.

Hacer referencia a una biblioteca especificada


Puede usar el argumento path para compilar con una referencia a una biblioteca en tiempo de ejecución
personalizada en lugar de la biblioteca en tiempo de ejecución de Visual Basic predeterminada.
Si el valor del argumento path es una ruta de acceso completa a un archivo DLL, el compilador usará ese archivo
como la biblioteca en tiempo de ejecución. Si el valor del argumento path no es una ruta de acceso completa a
un archivo DLL, el compilador de Visual Basic buscará primero el archivo DLL identificado en la carpeta actual. A
continuación, buscará en la ruta de acceso que ha especificado mediante la opción del compilador -sdkpath . Si no
se utiliza la opción del compilador -sdkpath , el compilador buscará el archivo DLL identificado en la carpeta de
.NET Framework ( %systemroot%\Microsoft.NET\Framework\versionNumber ).

Ejemplo
En el ejemplo siguiente se muestra cómo usar la opción -vbruntime para compilar con una referencia a una
biblioteca personalizada.

vbc -vbruntime:C:\VBLibraries\CustomVBLibrary.dll

Vea también
Visual Basic Core: nuevo modo de compilación en Visual Studio 2010 SP1
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-sdkpath
-verbose
23/10/2019 • 2 minutes to read • Edit Online

Hace que el compilador genere mensajes de estado y de error detallados.

Sintaxis
-verbose[+ | -]

Argumentos
+ | -
Opcional. Especificar -verbose es igual que especificar -verbose+ , lo que hace que el compilador emita mensajes
detallados. El valor predeterminado para esta opción es -verbose- .

Comentarios
La opción -verbose muestra información sobre el número total de errores emitidos por el compilador, notifica qué
ensamblados está cargando un módulo y muestra los archivos que se están compilando actualmente.

NOTE
La opción -verbose no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar desde
la línea de comandos.

Ejemplo
En el código siguiente se compila In.vb y se indica al compilador que muestre información de estado detallada.

vbc -verbose in.vb

Vea también
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-warnaserror (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Causa que el compilador trate como un error la primera ocurrencia de una advertencia.

Sintaxis
-warnaserror[+ | -][:numberList]

Argumentos
T ÉRM IN O DEF IN IC IÓ N

+|- Opcional. De forma predeterminada, se aplica


-warnaserror- ; las advertencias no impiden que el
compilador genere un archivo de salida. La opción
-warnaserror , que es la misma que -warnaserror+ , causa
que las advertencias se traten como errores.

numberList Opcional. Lista delimitada por comas de los números de


identificadores de advertencia a los que se aplica la opción
-warnaserror . Si no se especifica ningún identificador de
advertencia, la opción -warnaserror se aplica a todas las
advertencias.

Comentarios
La opción -warnaserror trata todas las advertencias como errores. Todos los mensajes que, por norma general,
deberían notificarse como advertencias, en su lugar se registran como errores. El compilador notifica como
advertencias las ocurrencias posteriores de la misma advertencia.
De forma predeterminada, se aplica -warnaserror- , que da lugar a que las advertencias tengan solo carácter
informativo. La opción -warnaserror , que es la misma que -warnaserror+ , causa que las advertencias se traten
como errores.
Si desea que solo algunas advertencias específicas se traten como errores, puede especificar una lista separada
por comas de números de advertencias que se deben tratar como errores.

NOTE
La opción -warnaserror no controla cómo se muestran las advertencias. Use la opción -nowarn para deshabilitar las
advertencias.

PA RA ESTA B L EC ER - WA RN A SERRO R A F IN DE T RATA R TO DA S L A S A DVERT EN C IA S C O M O ERRO RES EN EL IDE DE VISUA L ST UDIO

1. tener un proyecto seleccionado en Explorador de soluciones . En el menú Proyecto , haga clic en Propiedades .
2. Haga clic en la pestaña compilar .
3. Asegúrese de que la casilla deshabilitar todas las adver tencias esté desactivada.
4. Active la casilla tratar todas las adver tencias como errores .
PA RA ESTA B L EC ER - WA RN A SERRO R A F IN DE T RATA R A DVERT EN C IA S ESP EC ÍF IC A S C O M O ERRO RES EN EL IDE DE VISUA L
ST UDIO

1. tener un proyecto seleccionado en Explorador de soluciones . En el menú Proyecto , haga clic en Propiedades .
2. Haga clic en la pestaña compilar .
3. Asegúrese de que la casilla deshabilitar todas las adver tencias esté desactivada.
4. Asegúrese de que la casilla tratar todas las adver tencias como errores esté desactivada.
5. Seleccione error en la columna notificación adyacente a la advertencia que se debe tratar como un error.

Ejemplo
El siguiente código compila In.vb y ordena al compilador que muestre un error para la primera ocurrencia de
cada advertencia que encuentra.

vbc -warnaserror in.vb

Ejemplo
El siguiente código compila T2.vb y trata como un error solo la advertencia para las variables locales no utilizadas
(42024).

vbc -warnaserror:42024 t2.vb

Vea también
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
Configuring Warnings in Visual Basic
-win32icon
23/10/2019 • 2 minutes to read • Edit Online

Inserta un archivo. ico en el archivo de salida. Este archivo. ico representa el archivo de salida en el Explorador de
archivos .

Sintaxis
-win32icon:filename

Argumentos
T ÉRM IN O DEF IN IC IÓ N

filename Archivo. ico que se va a agregar al archivo de salida. Escriba el


nombre de archivo entre comillas ("") si contiene un espacio.

Comentarios
Puede crear un archivo. ico con el compilador de recursos de Microsoft Windows (RC). El compilador de recursos
se invoca al compilar un programa visual C++ ; se crea un archivo. ICO a partir del archivo. rc. Las opciones
-win32icon y -win32resource son mutuamente excluyentes.

Vea -linkresource ((Visual Basic) para hacer referencia a un archivo de recursos .NET Framework, o -Resource
(Visual Basic) para adjuntar un archivo de recursos de .NET Framework. Vea -Win32Resource para importar un
archivo. res.

PA RA SET - W IN 32IC O N EN EL IDE DE VISUA L ST UDIO

1. Seleccione un proyecto en el Explorador de soluciones . En el menú Proyecto , haga clic en Propiedades .


2. Haga clic en la pestaña Aplicación .
3. Modifique el valor en el cuadro icono .

Ejemplo
El código siguiente compila In.vb y adjunta un archivo. ico, Rf.ico .

vbc -win32icon:rf.ico in.vb

Vea también
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
-win32manifest (Visual Basic)
27/11/2019 • 4 minutes to read • Edit Online

Identifica un archivo de manifiesto de la aplicación Win32 definido por el usuario que se va a insertar en un
archivo ejecutable portable (PE) del proyecto.

Sintaxis
-win32manifest: fileName

Argumentos
T ÉRM IN O DEF IN IC IÓ N

fileName Ruta de acceso del archivo de manifiesto personalizado.

Comentarios
De forma predeterminada, el compilador Visual Basic inserta un manifiesto de aplicación que especifica un nivel
de ejecución solicitado de AsInvoker. Crea el manifiesto en la misma carpeta en la que se compila el archivo
ejecutable, normalmente la carpeta bin\Debug o bin\Release cuando se usa Visual Studio. Si desea proporcionar
un manifiesto personalizado, por ejemplo, para especificar un nivel de ejecución solicitado de highestAvailable o
requireAdministrator, use esta opción para especificar el nombre del archivo.

NOTE
Esta opción y la opción -Win32Resource son mutuamente excluyentes. Si intenta usar ambas opciones en la misma línea de
comandos, obtendrá un error de compilación.

Una aplicación sin manifiesto de aplicación que especifique un nivel de ejecución solicitado estará sujeta a
virtualización de archivos y Registro conforme a la característica Control de cuentas de usuario de Windows Vista.
Para más información sobre la virtualización, vea Implementación de ClickOnce en Windows Vista.
La aplicación estará sujeta a la virtualización si se cumple alguna de las siguientes condiciones:
1. Use la opción -nowin32manifest y no proporcione un manifiesto en un paso de compilación posterior o
como parte de un archivo de recursos de Windows (. res) mediante la opción -win32resource .
2. Se proporciona un manifiesto personalizado que no especifica un nivel de ejecución solicitado.
Visual Studio crea un archivo de manifiesto predeterminado y lo almacena en los directorios de depuración y
versión junto con el archivo ejecutable. Para ver o editar el archivo app. manifest predeterminado, haga clic en Ver
configuración de UAC en la pestaña aplicación del diseñador de proyectos. Para obtener más información,
consulta Application Page, Project Designer (Visual Basic).
Puede proporcionar el manifiesto de aplicación como un paso personalizado posterior a la compilación o como
parte de un archivo de recursos de Win32 mediante la opción -nowin32manifest . Use esa misma opción si quiere
que la aplicación esté sujeta a virtualización de archivos y Registro en Windows Vista. Esto impedirá que el
compilador cree e inserte un manifiesto predeterminado en el archivo PE.
Ejemplo
En el ejemplo siguiente se muestra el manifiesto predeterminado que el compilador Visual Basic inserta en un PE.

NOTE
El compilador inserta un nombre de aplicación estándar, la aplicación en el XML de manifiesto. Se trata de una solución
alternativa para permitir que las aplicaciones se ejecuten en Windows Server 2003 Service Pack 3.

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

Vea también
Compilador de línea de comandos de Visual Basic
-nowin32manifest (Visual Basic)
-win32resource
23/10/2019 • 2 minutes to read • Edit Online

Inserta un archivo de recursos de Win32 en el archivo de salida.

Sintaxis
-win32resource:filename

Argumentos
filename
Nombre del archivo de recursos que se va a agregar al archivo de salida. Escriba el nombre de archivo entre
comillas ("") si contiene un espacio.

Comentarios
Puede crear un archivo de recursos de Win32 con el compilador de recursos de Microsoft Windows (RC).
Un recurso de Win32 puede contener información de versión o de mapa de bits (icono) que ayuda a identificar la
aplicación en el Explorador de archivos . Si no especifica -win32resource , el compilador genera información de
versión basada en la versión del ensamblado. Las opciones -win32resource y -win32icon son mutuamente
excluyentes.
Vea -linkresource ((Visual Basic) para hacer referencia a un archivo de recursos .NET Framework, o -Resource
(Visual Basic) para adjuntar un archivo de recursos de .NET Framework.

NOTE
La opción -win32resource no está disponible en el entorno de desarrollo de Visual Studio; solo está disponible al compilar
desde la línea de comandos.

Ejemplo
El código siguiente compila In.vb y adjunta un archivo de recursos de Win32, Rf.res :

vbc -win32resource:rf.res in.vb

Vea también
Compilador de línea de comandos de Visual Basic
Líneas de comandos de compilación de ejemplo
Visual Basic opciones del compilador por categoría
27/11/2019 • 8 minutes to read • Edit Online

El compilador de línea de comandos de Visual Basic se proporciona como una alternativa a la compilación de
programas desde el entorno de desarrollo integrado (IDE) de Visual Studio. A continuación se muestra una lista de
las opciones del compilador de línea de comandos de Visual Basic ordenadas por categoría funcional.
Cada opción del compilador está disponible en dos formatos: -option y /option . En la documentación solo se
muestra el formato -option.

Salida del compilador


O P C IÓ N P RO P Ó SITO

-nologo Suprime la información de titular del compilador.

-utf8output Muestra los resultados del compilador en codificación UTF-8.

-verbose Muestra información adicional durante la compilación.

-modulename:<string> Especifica el nombre del módulo de origen.

/preferreduilang Especifica un idioma para los resultados del compilador.

Optimización
O P C IÓ N P RO P Ó SITO

-filealign Especifica dónde se alinean las secciones del archivo de salida.

-optimize Habilita o deshabilita las optimizaciones.

archivos de salida
O P C IÓ N P RO P Ó SITO

-doc Procesa los comentarios de documentación generando un


archivo XML.

-deterministic Hace que el compilador genere un ensamblado cuyo


contenido binario es idéntico en todas las compilaciones si las
entradas son idénticas.

-netcf Establece el compilador para que tenga como destino el .NET


Compact Framework.

-out Especifica un directorio de salida.


O P C IÓ N P RO P Ó SITO

/refonly Genera solo un ensamblado de referencia.

/refout Especifica la ruta de acceso de salida de un ensamblado de


referencia.

-target Especifica el formato de la salida.

Ensamblados .NET
O P C IÓ N P RO P Ó SITO

-addmodule Hace que el compilador facilite al proyecto que se está


compilando toda la información de tipos presente en los
archivos especificados.

-delaysign Especifica si el ensamblado estará firmado total o


parcialmente.

-imports Importa un espacio de nombres desde un ensamblado


especificado.

-keycontainer Especifica un nombre de contenedor de claves para un par de


claves que asigna un nombre seguro al ensamblado.

-keyfile Especifica un archivo que contiene una clave o un par de


claves que asigna un nombre seguro al ensamblado.

-libpath Especifica la ubicación de los ensamblados a los que hace


referencia la opción -Reference .

-reference Importa metadatos de un ensamblado.

-moduleassemblyname Especifica el nombre del ensamblado del que un módulo


formará parte.

-analyzer Ejecuta los analizadores de este ensamblado (forma abreviada:


-a).

-additionalfile Asigna nombre a otros archivos que no afectan directamente


a la generación de código, pero que los analizadores pueden
usar para generar errores o advertencias.

Depuración/comprobación de errores
O P C IÓ N P RO P Ó SITO

-bugreport Crea un archivo que contiene información que permite


notificar un error fácilmente.

-debug Crea información de depuración.


O P C IÓ N P RO P Ó SITO

-nowarn Suprime la capacidad del compilador para generar


advertencias.

-quiet Evita que el compilador muestre código de errores y


advertencias relacionados con la sintaxis.

-removeintchecks Deshabilita las comprobaciones de desbordamiento con


enteros.

-warnaserror Promueve las advertencias a errores.

-ruleset:<file> Especifica un archivo de conjunto de reglas que deshabilita


diagnósticos específicos.

Ayuda
O P C IÓ N P RO P Ó SITO

-? Muestra las opciones del compilador. Este comando equivale a


especificar la opción -help . No se produce ninguna
compilación.

-help Muestra las opciones del compilador. Este comando equivale a


especificar la opción -? . No se produce ninguna compilación.

Idioma
O P C IÓ N P RO P Ó SITO

-langversion Especifique la versión de idioma|:|9|9,0|10|10,0 11 11,0.

-optionexplicit Exige la declaración explícita de variables.

-optionstrict Exige la semántica de tipos estricta.

-optioncompare Especifica si las comparaciones de cadenas deben ser binarias


o usar la semántica de texto específica de la configuración
regional.

-optioninfer Permite el uso de la inferencia de tipo de variable local en


declaraciones de variables.

Preprocesador
O P C IÓ N P RO P Ó SITO

-define Define símbolos de compilación condicional.

Recursos
O P C IÓ N P RO P Ó SITO

-linkresource Crea un vínculo a un recurso administrado.

-resource Inserta un recurso administrado en un ensamblado.

-win32icon Inserta un archivo .ico en el archivo de salida.

-win32resource Inserta un recurso Win32 en el archivo de salida.

Varios
O P C IÓ N P RO P Ó SITO

@ (especificar archivo de respuesta) Especifica un archivo de respuesta.

-baseaddress Especifica la dirección base de un archivo DLL.

-codepage Especifica la página de códigos que se va a usar para todos los


archivos de código fuente de la compilación.

-errorreport Especifica cómo el compilador de Visual Basic debe informar


de los errores internos del compilador.

-highentropyva Indica al kernel de Windows si un archivo ejecutable


determinado admite selección aleatoria del diseño del espacio
de direcciones (ASLR) de alta entropía.

-main Especifica la clase que contiene el procedimiento Sub Main


que se va a utilizar en el inicio.

-noconfig No compila con Vbc.rsp.

-nostdlib Hace que el compilador no haga referencia a las bibliotecas


estándar.

-nowin32manifest Indica al compilador que no inserte ningún manifiesto de la


aplicación en el archivo ejecutable.

-platform Especifica la plataforma del procesador que el compilador


destina para el archivo de salida.

-recurse Busca en los subdirectorios los archivos de código fuente que


se deben compilar.

-rootnamespace Especifica un espacio de nombres para todas las declaraciones


de tipos.

-sdkpath Especifica la ubicación de Mscorlib.dll y


Microsoft.VisualBasic.dll.
O P C IÓ N P RO P Ó SITO

-vbruntime Especifica que el compilador debe compilar sin una referencia


a la biblioteca de tiempo de ejecución de Visual Basic o con
una referencia a una biblioteca de tiempo de ejecución
específica.

-win32manifest Identifica un archivo de manifiesto de la aplicación Win32


definido por el usuario que se va a insertar en un archivo
ejecutable portable (PE) del proyecto.

-parallel[+&#124;-] Especifica si hay que usar la compilación simultánea (+).

-checksumalgorithm:<alg> Especifique el algoritmo para calcular la suma de


comprobación del archivo de origen almacenada en el archivo
PDB. Los valores admitidos son: SHA1 (predeterminado) o
SHA256.
Debido a problemas de colisión con SHA1, Microsoft
recomienda SHA256 o superior.

Vea también
Opciones del compilador de Visual Basic, por orden alfabético
Administración de propiedades de soluciones y proyectos
Información de referencia de .NET Framework (Visual
Basic)
27/11/2019 • 2 minutes to read • Edit Online

En este tema se proporcionan vínculos a información sobre cómo trabajar con la biblioteca de clases de .NET
Framework.

Secciones relacionadas
Introducción
Proporciona información general completa de .NET Framework y vínculos a recursos adicionales.
Información general de la biblioteca de clases
Presenta las clases, las interfaces y los tipos de valor que ayudan a acelerar y optimizar el proceso de desarrollo y
proporcionan acceso a la funcionalidad del sistema.
Guía de desarrollo
Proporciona una guía para todas las áreas y tareas tecnológicas clave para el desarrollo de aplicaciones, incluida la
creación, configuración, depuración, protección e implementación de la aplicación. En este tema también se
proporciona información sobre programación dinámica, interoperabilidad, extensibilidad, administración de
memoria y subprocesamiento.
Herramientas
Describe las herramientas que puede usar para desarrollar, configurar e implementar aplicaciones mediante el uso
de tecnologías de .NET Framework.
Explorador de API de .NET
Proporciona ejemplos de código y de sintaxis, así como información relacionada para cada clase de los espacios de
nombres .NET Framework.
Especificación del lenguaje Visual Basic
08/01/2020 • 2 minutes to read • Edit Online

La especificación del lenguaje Visual Basic es el origen de autoridad para obtener respuestas a todas las preguntas
sobre la gramática y la sintaxis de Visual Basic. Contiene información detallada sobre el lenguaje, incluidos
muchos puntos que no se describen en la documentación de referencia de Visual Basic.
La especificación está disponible en el Centro de descarga de Microsoft.
Este sitio contiene la especificación de Visual Basic 11. Se crea a partir de los archivos Markdown del repositorio
de GitHub dotnet/vblang.
Los problemas de la especificación deben crearse en el repositorio dotnet/vblang. O bien, si está interesado en
corregir los errores que encuentre, puede enviar una solicitud de incorporación de cambios al mismo repositorio.

Vea también
Referencia del lenguaje Visual Basic

S IG U IE N TE
2 minutes to read
Tutoriales del lenguaje Visual Basic
18/03/2020 • 5 minutes to read • Edit Online

Los tutoriales proporcionan instrucciones paso a paso para escenarios comunes, lo que hace que un buen lugar
para empezar a conocer el producto o una característica en particular.
Escribir un programa asincrónico
Muestra cómo crear una solución asincrónica mediante el uso de Async y Await.
Declarar y generar eventos
Muestra cómo se declaran y generan eventos en Visual Basic.
Controlar eventos
Muestra cómo controlar eventos mediante la palabra clave WithEvents estándar o las nuevas palabras clave
AddHandler / RemoveHandler .

Crear e implementar interfaces


Muestra cómo se declaran e implementan interfaces en Visual Basic.
Definir clases
Describe cómo declarar una clase y sus campos, propiedades, métodos y eventos.
Escribir consultas en Visual Basic
Muestra cómo se pueden usar características del lenguaje Visual Basic para escribir expresiones de consulta
en Language Integrated Query (LINQ).
Implementar IEnumerable(Of T) en Visual Basic
Muestra cómo crear una clase que implemente la interfaz IEnumerable(Of String) y una clase que
implemente la interfaz IEnumerator(Of String) para leer línea a línea un archivo de texto.
Llamar a las API de Windows
Explica cómo usar instrucciones Declare y llamar a las API de Windows. Incluye información sobre cómo
usar atributos para controlar el cálculo de referencias para la llamada API y cómo exponer una llamada API
como método de una clase.
Crear objetos COM con Visual Basic
Muestra cómo crear objetos COM en Visual Basic, con y sin la plantilla de clase COM.
Implementar la herencia mediante objetos COM
Muestra cómo usar Visual Basic 6.0 para crear un objeto COM que contenga una clase y luego usarlo como
clase base en Visual Basic.
Determinar el lugar en el que My.Application.Log escribe la información
Describe la configuración predeterminada de My.Application.Log y cómo determinar la configuración de la
aplicación.
Cambiar el lugar en el que My.Application.Log escribe la información
Muestra cómo reemplazar la configuración predeterminada de My.Application.Log y My.Log para registrar
información de eventos y hacer que el objeto Log escriba en otros agentes de escucha de registro.
Filtrar el resultado de My.Application.Log
Muestra cómo cambiar el filtrado del registro predeterminado para el objeto My.Application.Log .
Crear agentes de escucha de registro personalizados
Muestra cómo crear un agente de escucha de registro personalizado y configurarlo para escuchar la salida
del objeto My.Application.Log .
Insertar los tipos de los ensamblados administrados
Describe cómo crear un ensamblado y un programa cliente que inserte tipos desde el mismo.
Validar la complejidad de las contraseñas (Visual Basic)
Muestra cómo comprobar las características de contraseña segura y actualizar un parámetro de cadena con
información sobre las comprobaciones en las que se produce un error de contraseña.
Cifrar y descifrar cadenas en Visual Basic
Muestra cómo usar la clase DESCryptoServiceProvider para cifrar y descifrar cadenas.
Manipular archivos y directorios en Visual Basic
Muestra cómo usar funciones de Visual Basic para determinar información sobre un archivo, buscar una
cadena en un archivo y escribir en un archivo.
Manipulating Files Using .NET Framework Methods (Manipular archivos usando métodos de .NET
Framework)
Muestra cómo usar métodos de .NET Framework para determinar información sobre un archivo, buscar una
cadena en un archivo y escribir en un archivo.
Conservar un objeto en Visual Basic
Muestra cómo crear un objeto simple y conservar sus datos en un archivo.
Tutorial: Compatibilidad del desarrollo de pruebas en primer lugar con la característica de generación a
partir del uso
Muestra cómo realizar el desarrollo de prueba previa, en donde primero se escriben las pruebas unitarias y
luego se escribe el código fuente para que las pruebas se realicen correctamente.

También podría gustarte