Está en la página 1de 396

Caractersticas del lenguaje Visual Basic

En los siguientes temas se presentan y se describen los componentes bsicos de Visual Basic, un lenguaje de programacin orientado a objetos. Tras crear la interfaz de usuario de su aplicacin utilizando formularios y controles, debe escribir el cdigo que define el comportamiento de la aplicacin. Al igual que cualquier otro lenguaje de programacin moderno, Visual Basic admite varios elementos de lenguaje y construcciones de programacin comunes. Si ha programado en otros lenguajes, gran parte del material que se trata en esta seccin le resultar familiar. Aunque la mayora de las construcciones son similares a las de otros lenguajes, el modelo orientado a eventos de Visual Basic presenta algunas diferencias sutiles. Si es un programador principiante, el material tratado en esta seccin le servir como introduccin a las unidades de generacin bsicas para escribir cdigo. Una vez que comprenda los conceptos bsicos, podr crear aplicaciones eficaces mediante Visual Basic.

Visual Studio y .NET Framework


Visual Basic se disea en torno a .NET Framework, que sirve de ayuda para proporcionar seguridad, administracin de memoria, control de versiones y compatibilidad de implementacin. Asimismo, .NET Framework permite la interoperabilidad entre objetos creados con cualquier lenguaje de programacin de .NET Framework. Esto indica que se pueden crear objetos con Visual Basic que despus podrn usarse fcilmente en otros lenguajes de .NET Framework, y que se pueden usar objetos de otros lenguajes de .NET Framework de la misma forma en que se usan los objetos creados con Visual Basic.

Ensamblados
Los ensamblados componen la unidad fundamental de implementacin, control de versiones, reutilizacin, mbito de activacin y permisos de seguridad en una aplicacin basada en .NET. Los ensamblados adoptan la forma de un archivo ejecutable (.exe) o un archivo de biblioteca de vnculos dinmicos (.dll), y constituyen unidades de creacin de .NET Framework. Proporcionan a Common Language Runtime la informacin que necesita para estar al corriente de las implementaciones de tipos. Un ensamblado puede entenderse como una coleccin de tipos y recursos que forman una unidad lgica de funcionalidad y que se generan para trabajar conjuntamente. En Visual Basic, se utiliza el contenido de los ensamblados y se agregan referencias a dichos ensamblados, de forma muy parecida a como se utilizaban las bibliotecas de tipos en versiones anteriores de Visual Basic. No obstante, lo que distingue a los ensamblados de los archivos .exe o .dll de versiones anteriores de Windows es que pueden contener toda la informacin que antes se encontraba en una biblioteca de tipos, adems de informacin de todo aquello que sea necesario para utilizar la aplicacin o el componente. Manifiesto del ensamblado Todos los ensamblados contienen un manifiesto del ensamblado. ste es similar a una tabla de contenido, y contiene la siguiente informacin:

La identidad del ensamblado (nombre y versin). Una tabla de archivos que describe el resto de archivos que componen el ensamblado, por ejemplo, otros ensamblados creados por el usuario de los que dependa el archivo .exe o .dll, e incluso archivos de mapa de bits o archivos Lame.

Una lista de referencias de ensamblado, es decir, una lista de todas las dependencias externas, archivos .dll u otros archivos necesarios para la aplicacin que otros usuarios hayan podido crear. Las referencias de ensamblado contienen referencias a objetos globales

y privados. Los objetos globales residen en la cach de ensamblados global, un rea disponible para otras aplicaciones, parecida al directorio System32. El espacio de nombres Microsoft.VisualBasic es un ejemplo de un ensamblado en la cach de ensamblados global. Los objetos privados deben encontrarse en un directorio del mismo nivel o inferior al directorio de instalacin de la aplicacin. Dado que los ensamblados contienen informacin del contenido, la versin y las dependencias, las aplicaciones que se crean con Visual Basic no dependen de los valores del Registro para que funcionen correctamente. Los ensamblados reducen los conflictos de los archivos DLL y hacen que las aplicaciones sean ms seguras y ms fciles de implementar. En muchos casos es posible instalar una aplicacin basada en .NET simplemente copiando los archivos de la aplicacin en el equipo de destino. Referencias Para utilizar un ensamblado, debe agregar una referencia a l, tal como se describe en Cmo: Agregar o quitar referencias en Visual Studio (Visual Basic). Luego, utiliza la instruccin Imports para elegir el espacio de nombres de los elementos que desea utilizar, tal como se describe en Referencias y la instruccin Imports. Una vez que se haya hecho referencia a un ensamblado y se haya importado, todas las clases, propiedades, mtodos y otros miembros accesibles de su espacio de nombres estn disponibles para la aplicacin como si su cdigo formara parte del archivo de cdigo fuente. Un ensamblado individual puede contener varios espacios de nombres, y cada espacio de nombres puede contener una agrupacin de elementos distinta, incluidos otros espacios de nombres. Para obtener informacin sobre cmo crear ensamblados, vea Cmo: Crear y utilizar ensamblados.

Cmo: Crear y utilizar ensamblados


Un ensamblado est formado por uno o ms archivos .exe o .dll que componen una aplicacin de Visual Studio. Los ensamblados se crean de forma automtica cuando se compilan archivos de cdigo fuente de Visual Basic.

Nota: Los cuadros de dilogo y comandos de men que se ven pueden diferir de los descritos en la Ayuda, dependiendo de los valores de configuracin o de edicin activos. Para cambiar la configuracin, elija la opcin Importar y exportar configuraciones en el men Herramientas. Para obtener ms informacin, vea Valores de configuracin de Visual Studio.

Para crear un ensamblado

Para compilar la aplicacin, haga clic en Generar en el men Generar o bien genrela desde la lnea de comandos, mediante el compilador de la lnea de comandos. Para obtener informacin detallada sobre la generacin de ensamblados desde la lnea de comandos, vea Generar desde la lnea de comandos (Visual Basic).

Para agregar una referencia a otro ensamblado

Haga clic en el comando Agregar referencia del men Proyecto y seleccione el ensamblado que desee usar. Para obtener informacin detallada, vea Cmo: Agregar o quitar referencias en Visual Studio (Visual Basic).

Para utilizar objetos en otro ensamblado

Especifique el nombre completo del objeto o utilice un alias que se haya definido para el objeto por medio de una instruccin Imports. Para obtener informacin detallada acerca de los nombres completos, vea Espacios de nombres en Visual Basic. Para obtener informacin detallada sobre la adicin de referencias y la utilizacin de la instruccin Imports, vea Referencias y la instruccin Imports.

Referencias y la instruccin Imports


Para que el proyecto pueda disponer de objetos externos, seleccione el comando Agregar referencia del men Proyecto. Las referencias en Visual Basic pueden apuntar a ensamblados, que son similares a las bibliotecas de tipos, pero contienen ms informacin que stas.

Instruccin Imports Los ensamblados incluyen uno o varios espacios de nombres. Cuando se agrega una referencia a un ensamblado, tambin puede agregarse una instruccin Imports a un mdulo para controlar la visibilidad de los espacios de nombres del ensamblado dentro del mdulo. La instruccin Imports proporciona un contexto de control de mbito que permite utilizar solamente la parte del espacio de nombres necesaria para suministrar una referencia nica.

La instruccin Imports tiene la siguiente sintaxis: Imports [| Aliasname =] Namespace Aliasname hace referencia a un nombre corto que se puede utilizar dentro del cdigo para referirse a un espacio de nombres importado. Namespace es un espacio de nombres disponible mediante una referencia de proyecto, una definicin dentro del proyecto o una instruccin Imports anterior.

Un mdulo puede contener cualquier nmero de instrucciones Imports. stas deben aparecer detrs de las instrucciones Option, si hay alguna, pero antes de cualquier otro cdigo.

Nota: No hay que confundir las referencias de proyecto con las instrucciones Imports o Declare. Las referencias de proyecto ponen los objetos externos, como los objetos de ensamblados, a disposicin de los proyectos de Visual Basic. La instruccin Imports se utiliza para simplificar el acceso a las referencias de proyecto, pero no facilita el acceso a dichos objetos. La instruccin Declare se utiliza para declarar una referencia a un procedimiento externo de una biblioteca de vnculos dinmicos (DLL).

Utilizar alias con la instruccin Imports La instruccin Imports facilita el acceso a los mtodos de clases porque elimina la necesidad de escribir explcitamente los nombres completos de las referencias. Los alias permiten asignar un nombre ms descriptivo a una sola parte de un espacio de nombres. Por ejemplo, la secuencia retorno de carro y avance de lnea, que permite mostrar un texto en varias lneas, forma parte del mdulo Mdulo ControlChars (Visual Basic) del espacio de nombres Microsoft.VisualBasic. Para utilizar esta constante en un programa que no tenga un alias, debe escribir el siguiente fragmento de cdigo:

Visual Basic Copiar cdigo

MsgBox("Some text" & Microsoft.VisualBasic.ControlChars.CrLf _ & "Some more text")

Las instrucciones Imports deben aparecer siempre en las primeras lneas, inmediatamente despus de cualquier instruccin Option de un mdulo. El fragmento de cdigo siguiente muestra cmo se importa y se asigna un alias al mdulo Microsoft.VisualBasic..::.ControlChars:

Visual Basic Copiar cdigo

Imports CtrlChrs = Microsoft.VisualBasic.ControlChars

Las referencias que despus se hagan a este espacio de nombres pueden ser mucho ms breves:

Visual Basic Copiar cdigo

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

Si una instruccin Imports no incluye un nombre de alias, los elementos definidos en el espacio de nombres importado pueden utilizarse en el mdulo sin calificacin. Si se especifica el nombre del alias, debe utilizarse como calificador de los nombres contenidos en dicho espacio de nombres.

Espacios de nombres en Visual Basic


Los espacios de nombres organizan los objetos definidos en un ensamblado. Un ensamblado puede contener varios espacios de nombres; stos, a su vez, pueden contener otros espacios de nombres. Los espacios de nombres evitan las ambigedades y simplifican las referencias cuando se utilizan grupos grandes de objetos, como bibliotecas de clases.

Por ejemplo, .NET Framework define la clase ListBox en el espacio de nombres System.Windows.Forms. El fragmento de cdigo siguiente muestra cmo se puede declarar una variable utilizando el nombre completo de esta clase:

Visual Basic Copiar cdigo

Dim LBox As System.Windows.Forms.ListBox

Evitar los conflictos de nombres Los espacios de nombres de .NET Framework resuelven un problema que a veces se denomina contaminacin de espacios de nombres y que hace referencia a los obstculos con los que tropieza el desarrollador de una biblioteca de clases debido al uso de nombres similares en otra biblioteca. Estos conflictos con componentes existentes a veces se denominan conflictos de nombres.

Por ejemplo, si crea una nueva clase denominada ListBox, podr utilizarla en el propio proyecto sin necesidad de calificacin. No obstante, si desea usar la clase ListBox de .NET Framework en el mismo proyecto, deber usar una referencia completa para que sea nica. Si la referencia no es nica, Visual Basic genera un error que indica que el nombre es ambiguo. En el ejemplo de cdigo siguiente se muestra cmo declarar objetos de este tipo:

Visual Basic Copiar cdigo

' 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

La siguiente ilustracin muestra dos jerarquas de espacios de nombres; ambas contienen un objeto denominado ListBox.

De forma predeterminada, todos los archivos ejecutables creados con Visual Basic contienen un espacio de nombres cuyo nombre es igual que el del proyecto. Por ejemplo, si se define un objeto en un proyecto denominado ListBoxProject, el archivo ejecutable, ListBoxProject.exe, contendr un espacio de nombres denominado ListBoxProject.

Varios ensamblados pueden usar el mismo espacio de nombres. Visual Basic los trata como un solo conjunto de nombres. Por ejemplo, pueden definirse clases para un espacio de nombres denominado SomeNameSpace en un ensamblado denominado Assemb1, y definirse 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 est definido el objeto. Si se crea una referencia a la clase (por medio del comando Agregar referencia del men Proyecto) se pueden utilizar objetos definidos en otros proyectos y, despus, utilizar el nombre completo del objeto en el cdigo. En el fragmento de cdigo siguiente se muestra cmo utilizar el nombre completo para un objeto del espacio de nombres de otro proyecto:

Visual Basic Copiar cdigo

Dim LBC As New ListBoxProject.Form1.ListBox

Los nombres completos evitan los conflictos de nombres porque permiten al compilador determinar qu objeto se utiliza. No obstante, los nombres pueden llegar a ser largos y complicados. Para solucionar este problema, puede utilizar la instruccin Imports para definir un alias, es decir, un nombre abreviado que sustituya al nombre completo. Por ejemplo, en el cdigo siguiente se crean alias para dos nombres completos y se utilizan para definir dos objetos.

Visual Basic Copiar cdigo

Imports LBControl = System.Windows.Forms.ListBox Imports MyListBox = ListBoxProject.Form1.ListBox


Visual Basic Copiar cdigo

Dim LBC As LBControl Dim MyLB As MyListBox

Si utiliza la instruccin Imports sin un alias, puede utilizar todos los nombres del espacio de nombres sin calificacin, a condicin de que sean nicos en el proyecto. Si el proyecto contiene instrucciones Imports para espacios de nombres que contienen elementos con el

mismo nombre, deber usar nombres completos. Supongamos, por ejemplo, que el proyecto contiene estas instrucciones Imports: Visual Basic Copiar cdigo

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

Si intenta usar Class1 sin que su nombre sea completo, Visual Basic genera un error para indicar que el nombre de Class1 es ambiguo. Instrucciones en el nivel de espacio de nombres Dentro de un espacio de nombres pueden definirse elementos como los mdulos, interfaces, clases, delegados, enumeraciones, estructuras y otros espacios de nombres. Los elementos no se pueden definir como propiedades, procedimientos, variables y eventos en el nivel de espacio de nombres. Estos elementos se deben declarar dentro de los contenedores como mdulos, estructuras o clases.

Nota: Si ha definido una jerarqua anidada de espacios de nombres, el cdigo de esta jerarqua puede tener el acceso bloqueado a las clases de otros espacios de nombres con el mismo nombre. Por ejemplo, si define un espacio de nombres denominado System dentro de un espacio de nombres denominado SpecialSpace, los miembros del espacio de nombres System de .NET Framework no estarn accesibles a menos que asigne nombres completos a los miembros utilizando la palabra clave Global. Para obtener ms informacin, vea Global.

Atributos en Visual Basic


Los atributos son etiquetas de tipo palabra clave en las que puede especificar informacin adicional sobre entidades definidas en aplicaciones de Visual Basic. Los atributos, que se guardan con metadatos de ensamblados, anotan elementos de programacin como tipos, campos, mtodos y propiedades. Otras aplicaciones, como los compiladores de Visual Basic o ASP.NET, pueden hacer referencia a la informacin en atributos para determinar cmo deberan utilizarse los objetos. Las secciones siguientes proporcionan ms informacin sobre los atributos y sobre cmo se definen, se aplican y se recuperan.

Informacin general sobre los atributos de Visual Basic


Los atributos son etiquetas descriptivas que proporcionan informacin adicional sobre elementos de programacin como tipos, campos, mtodos y propiedades. Otras aplicaciones, como el compilador de Visual Basic, pueden hacer referencia a la informacin adicional en atributos para determinar cmo pueden utilizarse estos elementos. Atributos y metadatos Los atributos se guardan con los metadatos de ensamblados de Visual Basic. Los metadatos son informacin que describe todos los elementos administrados por el motor en tiempo de ejecucin. Esto incluye informacin necesaria para depurar y recolectar elementos no utilizados, as como atributos de seguridad, datos de clculo de referencias, clases extendidas y definiciones de miembros, enlace de versiones y cualquier otra informacin que requiere el motor en tiempo de ejecucin.

Con los atributos, puede especificar los metadatos casi del mismo modo en que utiliza palabras clave como Public y Private para proporcionar informacin sobre niveles de acceso. No obstante, a diferencia de las palabras clave, la mayora de los atributos no son especficos del lenguaje. Mediante los atributos, puede ampliar las capacidades del lenguaje Visual Basic sin necesidad de cambios en el compilador. Los lenguajes .NET Framework y Visual Basic definen muchos atributos tiles y puede definir sus propios atributos personalizados que sean significativos para su aplicacin. Los atributos personalizados se basan en la clase System..::.Attribute y utilizan el atributo AttributeUsageAttribute para proporcionar informacin adicional sobre cmo se puede utilizar el atributo. Funcionalidad y capacidades de los atributos Algunos puntos clave sobre atributos incluyen:

Se puede aplicar uno o ms atributos a todos los ensamblados, mdulos o elementos de programa ms pequeos, como las clases y las propiedades. Los atributos pueden aceptar argumentos del mismo modo que los mtodos y las propiedades. El proceso de recuperar metadatos de los atributos se denomina reflexin. La reflexin implica el uso de herramientas que permite a los objetos recuperar y examinar metadatos acerca de sus propios miembros. Para obtener ms informacin, vea Ejemplo de reflexin.

Atributos utilizados en Visual Basic


En la tabla siguiente se muestran algunos de los atributos ms comunes de Visual Basic. Para obtener informacin sobre un atributo especfico, escriba el nombre del atributo en el cuadro ndice o Buscar del sistema de ayuda.

Atributo ComClassAttribute (Clase)

Finalidad Indica al compilador que la clase debe exponerse como un objeto COM. Especfico de Visual Basic. Permite tener acceso a los miembros de mdulo utilizando slo la calificacin necesaria para el mdulo. Especifica el tamao de una cadena de longitud fija en una estructura para utilizarla con funciones de entrada y salida de archivos. Especfico de Visual Basic. Especifica el tamao de una matriz de tamao fijo en una estructura para utilizarla con funciones de entrada y salida de archivos. Especfico de Visual Basic. Hace que se pueda llamar a un mtodo mediante el protocolo SOAP. Se utiliza en servicios Web XML Indica que se puede serializar una clase Determina cmo debe calcularse la referencia de un parmetro entre cdigo administrado de Visual Basic y cdigo no administrado, como una API de Windows. Se utiliza en Common Language Runtime. Especifica cmo se puede utilizar un atributo

HideModuleNameAttribute (Clase) VBFixedStringAttribute (Clase)

VBFixedArrayAttribute (Clase)

WebMethodAttribute

SerializableAttribute MarshalAsAttribute

AttributeUsageAttribute

DllImportAttribute

Indica que el mtodo con atributos se implementa como una exportacin de un archivo DLL no administrado.

Atributos especficos de Visual Basic Tres atributos son especficos de Visual Basic: COMClassAttribute, VBFixedStringAttribute y VBFixedArray. COMClassAttribute Use COMClassAttribute para simplificar el proceso de creacin de componentes COM desde Visual Basic. Los objetos COM son considerablemente distintos de los ensamblados de .NET Framework y, sin COMClassAttribute, debe seguir varios pasos para generar un objeto COM de Visual Basic. Para las clases marcadas con COMClassAttribute, el compilador ejecuta muchos de estos pasos automticamente.

HideModuleNameAttribute Utilice HideModuleNameAttribute para permitir el acceso a los miembros de mdulo utilizando slo la calificacin necesaria para el mdulo. VBFixedStringAttribute Utilice VBFixedStringAttribute para obligar a Visual Basic a crear una cadena de longitud fija. Las cadenas son de longitud variable de forma predeterminada y este atributo resulta til cuando se almacenan cadenas en archivos. El cdigo siguiente describe esto:

Visual Basic Copiar cdigo

Structure Worker ' The runtime uses VBFixedString to determine ' if the field should be written out as a fixed size. <VBFixedString(10)> Public LastName As String <VBFixedString(7)> Public Title As String <VBFixedString(2)> Public Rank As String End Structure

VBFixedArrayAttribute Utilice VBFixedArrayAttribute para declarar matrices de tamao fijo. Igual que las cadenas de Visual Basic, las matrices son de longitud variable de forma predeterminada. Este atributo resulta de utilidad cuando se serializan o se escriben datos a archivos.

Usos comunes de los atributos


Al utilizar la biblioteca Common Language Runtime (CLR) y las bibliotecas de clases, es probable que tenga que utilizar atributos en algn momento. La lista siguiente incluye algunos usos comunes de los atributos en el cdigo:

Marcar mtodos con el atributo WebMethod en los servicios Web XML para indicar que se podrn llamar con el protocolo SOAP. Para obtener ms informacin, consulte WebMethodAttribute.

Describir cmo calcular referencias de parmetros a mtodo cuando se interopera con cdigo nativo. Para obtener ms informacin, consulte MarshalAsAttribute. Describir las propiedades COM para clases, mtodos e interfaces. Marcar componentes como COM para que el compilador de Visual Basic genere el cdigo adicional necesario para crear un componente COM. Para obtener ms informacin, consulte ComClassAttribute.

Llamar a cdigo no administrado mediante la clase DllImportAttribute. Describir los ensamblados en cuanto a ttulo, versin, descripcin o marca. Describir qu miembros de una clase hay que serializar para la persistencia. Describir cmo realizar asignaciones entre miembros de clases y nodos XML para la serializacin de XML. Describir los requisitos de seguridad para mtodos. Especificar las caractersticas utilizadas para reforzar la seguridad. Controlar optimizaciones mediante el compilador just-in-time (JIT) para que el cdigo se conserve sencillo para depurar.

Puede utilizar atributos de muchas formas adicionales, adems de crear atributos personalizados.

Aplicacin de los atributos


Puede aplicar atributos agregando bloques de atributos a elementos de programa como propiedades, mtodos, eventos, clases y ensamblados. Un bloque de atributos consta de una lista de declaraciones de atributos separados por comas escrita entre corchetes angulares ("< >"). Una declaracin de atributo consta de un modificador de atributo opcional, como Module o Assembly, un nombre de atributo, una lista (posiblemente sobrecargada) de parmetros por posicin necesarios y una lista de argumentos con nombre opcionales. Debe colocar atributos con modificadores en una seccin de atributos, al principio de un archivo de cdigo fuente. En el siguiente ejemplo el cdigo establece un atributo de ensamblado que define un ttulo para el ensamblado y un atributo de mdulo que indica que el mdulo es compatible con CLS (especificacin de lenguaje comn): Visual Basic Copiar cdigo

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


Los atributos de ensamblado tambin se pueden aplicar mediante el archivo AssemblyInfo.vb, que se agrega automticamente a los proyectos mediante la interfaz de usuario de Visual Studio. Este archivo contiene atributos de ensamblado con valores predeterminados o vacos. Cuando se aplican a elementos de programa como las propiedades, los atributos preceden al elemento. Por ejemplo, el cdigo siguiente aplica atributos a una definicin de clase: Visual Basic Copiar cdigo

<CustomAttr(Update:=True)> Class Class1


Por convencin, todos los nombres de atributo finalizan con la palabra "Attribute" para distinguirlos de otros elementos de .NET Framework. No obstante, no tiene que especificar el sufijo de atributo cuando utiliza atributos. Por ejemplo, si tiene un atributo denominado CustomAttrAttribute, la especificacin de <CustomAttr(Update:=True)> equivale a especificar <CustomAttrAttribute(Update:=True)>. Argumentos de atributos Los atributos utilizan argumentos opcionales, necesarios, por posicin y por nombre casi del mismo modo en que los objetos utilizan estos tipos de argumentos. Los argumentos por posicin son aquellos que se especifican en el orden en que se declararon para el constructor de un atributo. Por ejemplo, el cdigo siguiente llama al constructor Sub New de un atributo con dos valores: Visual Basic

Copiar cdigo

<CustomAttr(True, False)> Class Class1


Los argumentos que se pasan a Sub New en clases de atributos se suelen usar para inicializar los valores de campos y propiedades. Puede utilizar argumentos con nombre para establecer directamente los valores de propiedades y campos. Para especificar los argumentos con nombre se anexa ":=" al nombre del argumento, seguido del valor que se est especificando. A diferencia de los argumentos por posicin, es posible especificar argumentos con nombre en cualquier orden. Por ejemplo, el cdigo siguiente establece el valor True para el campo Update y False para el campo Keep: Visual Basic Copiar cdigo

<CustomAttr(Update:=True, Keep:=False)> Class Class1


Nota: Existe una importante diferencia entre los argumentos de atributo y los argumentos utilizados con las llamadas a mtodos estndar. Debe utilizar argumentos por posicin para los argumentos que se utilizan con el constructor Sub New de clases de atributos. Slo es posible utilizar argumentos con nombre para establecer los valores de los campos y propiedades de las clases de atributos. Los argumentos necesarios son los que siempre se deben especificar. Los argumentos opcionales son los que se pueden omitir utilizando una coma como marcador de posicin cuando se utilizan argumentos por posicin o simplemente omitirse cuando se utilizan argumentos con nombre. Los argumentos de los atributos deben ser expresiones constantes. Ejemplos de atributos Los siguientes procedimientos proporcionan ejemplos de declaraciones de atributos:

Para utilizar el atributo MarshalAs para controlar cmo se calcula la referencia de los parmetros
1. Agregue una instruccin Imports para el espacio de nombres System.Runtime.InteropServices al principio del cdigo fuente: Visual Basic Copiar cdigo

Imports System.Runtime.InteropServices
2. Indique como prefijo de los parmetros el atributo MarshalAsAttribute y especifique el tipo de datos que requiere el destino. Por ejemplo, el cdigo siguiente calcula referencias de dos parmetros como un puntero long de tipo de datos a una cadena (LPStr) de una funcin de la API de Windows: Visual Basic Copiar cdigo

Declare Auto Sub CopyFile Lib "Kernel32.Lib" ( _ <MarshalAs(UnmanagedType.LPStr)> ByVal existingfile As String, _ <MarshalAs(UnmanagedType.LPStr)> ByVal newfile As String, _ ByVal failifexists As Boolean _ )
Common Language Runtime usa el atributo MarshalAsAttribute para determinar cmo debe calcularse la referencia de un parmetro entre el cdigo administrado de Visual Basic y el cdigo no administrado de una llamada a la API de Windows.

Para exponer un mtodo a clientes Web remotos


1. En el men Archivo, haga clic en Proyecto, seleccione la plantilla Servicio Web ASP.NET y agregue una instruccin Imports para el espacio de nombres System.Web: Visual Basic Copiar cdigo

Imports System.Web.Services
2. Defina un mtodo y utilice el atributo WebMethodAttribute para que el mtodo pueda invocarse desde clientes Web remotos: Visual Basic Copiar cdigo

<WebMethod()> Public Function HelloWorld() As String HelloWorld = "Hello World..." End Function
No es suficiente que un mtodo de un servicio Web XML sea Public para exponerlo a clientes Web. Debe aplicar explcitamente el atributo WebMethodAttribute a un mtodo antes de poder llamarlo mediante un cliente Web remoto.

Atributos globales de Visual Basic


La mayora de atributos se anexan a elementos especficos del lenguaje, como las clases o los mtodos. Sin embargo, algunos atributos son globales, es decir, se pueden aplicar a un ensamblado o un mdulo completos. Puede establecer muchos de los atributos del entorno de desarrollo integrado (IDE) de Visual Studio mediante el Informacin de ensamblado (Cuadro de dilogo). Para obtener ms informacin, vea Administrar las propiedades de la aplicacin y Administrar la firma de ensamblados y manifiestos. Atributos de ensamblado Para especificar atributos de nivel de ensamblado debe utilizar la siguiente sintaxis: Copiar cdigo

<Assembly: Attribute1, Assembly: Attribute2..., Assembly: AttributeN>


Para especificar atributos de nivel de mdulo debe utilizar una sintaxis similar: Copiar cdigo

<Module: Attribute1, Module: Attribute2..., Module: AttributeN>


Puede agregar los atributos globales en el cdigo fuente a continuacin de las directivas de nivel superior, como las instrucciones Option Explicit e Imports, pero delante de cualquier declaracin de tipo o de espacio de nombres. Los atributos globales pueden aparecer en varios archivos de cdigo fuente de un proyecto, pero se suelen colocar en el archivo AssemblyInfo.vb creado automticamente en los proyectos de Visual Basic. Los atributos de ensamblado son valores que proporcionan informacin sobre un ensamblado. Se incluyen en las siguientes categoras:

Atributos de identidad de ensamblado Atributos de informacin Atributos del manifiesto de ensamblado Atributos del nombre seguro

Atributos de identidad del ensamblado Tres atributos (con un nombre seguro, si es aplicable) determinan la identidad de un ensamblado: nombre, versin y referencia cultural. Estos atributos forman el nombre completo del ensamblado y son necesarios para hacer referencia al ensamblado en el cdigo. Puede establecerse una referencia cultural y una versin de ensamblado utilizando atributos. Sin embargo, el valor del nombre lo establece el compilador, el IDE de Visual Studio en el Informacin de ensamblado (Cuadro de dilogo) o la herramienta Assembly Linker (Al.exe) cuando se crea el ensamblado, tomando como base el archivo que contiene el manifiesto del ensamblado. El atributo AssemblyFlagsAttribute especifica si pueden coexistir varias copias del ensamblado. La tabla siguiente muestra los atributos de identidad: Atributo AssemblyName AssemblyVersionAttribute AssemblyCultureAttribute AssemblyFlagsAttribute Finalidad Describe completamente la identidad del ensamblado. Especifica la versin del ensamblado. Especifica la referencia cultural admitida por el ensamblado. Especifica si un ensamblado admite ejecucin conjunta en el mismo equipo, en el mismo proceso o en el mismo dominio de aplicacin.

El cdigo siguiente aplica los atributos de versin y referencia cultural a un ensamblado: Visual Basic Copiar cdigo

'Set version number for assembly. <Assembly: Reflection.AssemblyVersionAttribute("4.3.2.1")> 'Set culture as German. <Assembly: Reflection.AssemblyCultureAttribute("de")>
Atributos informativos Los atributos informativos se pueden usar para proporcionar informacin adicional del producto o de la compaa sobre un ensamblado. La tabla siguiente muestra los atributos de informacin definidos en el espacio de nombres System.Reflection. Atributo AssemblyProductAttribute Finalidad Define un atributo personalizado que especifica un nombre de producto para un manifiesto de ensamblado. Define un atributo personalizado que especifica una marca comercial para un manifiesto de ensamblado. Define un atributo personalizado que especifica una versin informativa para un manifiesto de ensamblado. Define un atributo personalizado que especifica un nombre de compaa para un manifiesto de ensamblado. Define un atributo personalizado que especifica un copyright para un manifiesto de ensamblado. Indica al compilador que debe utilizar un nmero de versin especfico para el recurso de versin de archivo Win32.

AssemblyTrademarkAttribute

AssemblyInformationalVersionAttribute

AssemblyCompanyAttribute

AssemblyCopyrightAttribute

AssemblyFileVersionAttribute

CLSCompliantAttribute

Indica si el ensamblado cumple los requisitos de Common Language Specification (CLS).

Atributos de manifiesto del ensamblado Puede usar los atributos del manifiesto del ensamblado para proporcionar informacin en el manifiesto del ensamblado. Esto incluye ttulo, descripcin, alias predeterminado y configuracin. La tabla siguiente muestra los atributos del manifiesto de ensamblado definidos en el espacio de nombres System.Reflection. Atributo AssemblyTitleAttribute Finalidad Define un atributo personalizado que especifica un ttulo de ensamblado para un manifiesto de ensamblado. Define un atributo personalizado que especifica una descripcin de ensamblado para un manifiesto de ensamblado. Define un atributo personalizado que especifica una configuracin de ensamblado (como versin comercial o de depuracin) para un manifiesto de ensamblado. Define un alias predeterminado descriptivo para un manifiesto de ensamblado

AssemblyDescriptionAttribute

AssemblyConfigurationAttribute

AssemblyDefaultAliasAttribute

Atributos del nombre seguro Los nombres seguros son identificadores nicos que protegen la identidad y la integridad de un ensamblado. Puede firmar un ensamblado desde el IDE de Visual Studio a travs de la Pgina Firma, Diseador de proyectos. Para obtener ms informacin, vea Administrar la firma de ensamblados y manifiestos. Tambin tiene la posibilidad de utilizar atributos de nombre seguro para establecer nombres seguros para ensamblados. La tabla siguiente muestra los atributos de nombre seguro definidos en el espacio de nombres System.Reflection. Atributo AssemblyDelaySignAttribute Finalidad Valor booleano que indica si se desea reservar espacio en el archivo ejecutable para la firma de nombre seguro y aplazar la firma real a una fase posterior. Para obtener ms informacin, consulte Retrasar la firma de un ensamblado. Indica el archivo que contiene una clave. La ubicacin del archivo de clave (KeyFile) debe ser relativa al directorio de resultados del proyecto, que es %Directorio del proyecto%\obj\<configuracin>. Por ejemplo, si el archivo de clave se encuentra en el directorio del proyecto, debe especificar el atributo AssemblyKeyFile de la manera siguiente: [ensamblado: AssemblyKeyFile (".. \\.. \\mykey.snk")] AssemblyKeyNameAttribute Hace referencia a una clave instalada en el Proveedor de servicios de criptografa (CSP, Crypto Service Provider) en su equipo. Debe especificar una clave para poder firmar el archivo.

AssemblyKeyFileAttribute

Si se han especificado los valores de KeyFile y KeyName, se realiza el siguiente procesamiento:

Si se puede encontrar el valor de KeyName en el CSP, se usa esa clave. Si el valor de KeyName no existe y el archivo de clave existe, se instala en el CSP la clave de KeyFile y se utiliza.

Para obtener ms informacin, consulte Consideraciones de seguridad sobre ensamblados.

Firmar ensamblados Un ensamblado se puede firmar de dos formas diferentes pero complementarias: con un nombre seguro o con firma. Puede firmar mediante la Pgina Firma, Diseador de proyectos del IDE de Visual Studio o mediante la Herramienta Firma de archivos (Signcode.exe). Al firmar un ensamblado con un nombre seguro, se agrega un cifrado mediante clave pblica al archivo que contiene el manifiesto del ensamblado. La firma mediante nombres seguros ayuda a comprobar la exclusividad del nombre, impide la simulacin de nombres y proporciona identidad a los llamadores cuando se resuelve una referencia. Para obtener ms informacin, vea Administrar la firma de ensamblados y manifiestos y Cmo: Firmar un ensamblado con un nombre seguro.

Para firmar un ensamblado con un nombre seguro


1. Utilice la Herramienta de nombre seguro (Sn.exe) para generar un archivo de claves que contiene un par de claves. 2. Agregue atributos de nombre seguro al archivo AssemblyInfo.vb creado automticamente en los proyectos de Visual Basic. Para editar este archivo, haga doble clic en el nombre del archivo en el Explorador de soluciones. En el ejemplo siguiente se usa la firma de retardo para crear un ensamblado con nombre seguro mediante un archivo de clave pblica denominado myKey.snk. Visual Basic Copiar cdigo

<Assembly: Reflection.AssemblyKeyFile("myKey.snk")> <Assembly: Reflection.AssemblyDelaySign(True)>


Nota: Los atributos de ensamblado se omiten si no est creando un ensamblado, por ejemplo cuando compila desde la lnea de comandos mediante la opcin /target:module.

Atributos personalizados en Visual Basic


Los atributos personalizados son aquellos definidos por el usuario que proporcionan informacin adicional sobre elementos de programa. Por ejemplo, podra definir un atributo de seguridad personalizado que especifique los permisos necesarios del proceso que llama para ejecutar un procedimiento. Puede definir atributos personalizados en clases de atributos basndose en la clase System..::.Attribute. Las clases de atributos propiamente dichas utilizan un atributo denominado AttributeUsageAttribute para proporcionar informacin adicional sobre cmo se pueden utilizar los atributos. Si especifica Inherited

= True, indica que se puede propagar un atributo a clases derivadas. Si establece la propiedad
AllowMultiple en True, podr aplicar ms de una instancia del atributo al elemento de programa. La enumeracin AttributeTargets permite definir qu tipos de elementos de programa se pueden aplicar a sus atributos. En el cdigo siguiente, el atributo AttributeUsageAttribute especifica un atributo que se puede aplicar a cualquier tipo de elemento, heredado y slo se aplica una vez: Visual Basic Copiar cdigo

<AttributeUsage(AttributeTargets.All, Inherited:=True, AllowMultiple:=False)> _

Class TestAttribute1 Inherits Attribute End Class


Puede utilizar el operador Or para combinar varios elementos de la enumeracin AttributeTargets, como en el cdigo siguiente: Visual Basic Copiar cdigo

<AttributeUsage(AttributeTargets.Class Or AttributeTargets.Method)> _ Class TestAttribute2 Inherits Attribute End Class

Cmo: Definir atributos propios


Con las clases de atributo puede crear sus propios atributos personalizados y utilizarlos con los atributos .NET Framework a fin de proporcionar informacin adicional sobre los elementos del programa.

Para definir un atributo personalizado


1. Declare una clase y aplique el atributo AttributeUsageAttribute a la nueva clase. El nombre de la clase es el nombre del nuevo atributo, como se indica en la siguiente lnea de cdigo: Visual Basic Copiar cdigo

<AttributeUsage(AttributeTargets.All)> Class TestAttribute


2. Declare que la clase se hereda de System..::.Attribute:

Visual Basic Copiar cdigo

Inherits System.Attribute
3. Defina campos Private para almacenar los valores de las propiedades:

Visual Basic Copiar cdigo

Private m_SomeValue As String


4. Si fuera apropiado, cree un constructor para el atributo:

Visual Basic Copiar cdigo

Public Sub New(ByVal Value As String) m_SomeValue = Value End Sub


5. Defina mtodos, campos y propiedades para el atributo:

Visual Basic Copiar cdigo

Public Sub Attr(ByVal AttrValue As String) 'Add method code here. End Sub Public Property SomeValue() As String ' A named parameter. Get Return m_SomeValue End Get

Set(ByVal Value As String) m_SomeValue = Value End Set End Property


6. Finalice la clase con la instruccin End Class:

Cmo: Recuperar atributos personalizados


Puede recuperar atributos personalizados mediante los mtodos GetCustomAttribute o GetCustomAttributes de la clase Attribute.

Para recuperar una sola instancia de un atributo personalizado de una clase


1. Agregue una instruccin Imports al principio del cdigo fuente para importar la clase Attribute del espacio de nombres System: Visual Basic Copiar cdigo

Imports System.Attribute
2. Cree un procedimiento para recuperar el atributo:

Visual Basic Copiar cdigo

Sub RetrieveAttribute() End Sub


3. Dentro del procedimiento, declare una variable de tipo Attribute y otra del mismo tipo que el atributo que desea recuperar: Visual Basic Copiar cdigo

Dim Attr As Attribute Dim CustAttr As CustomAttribute


4. Utilice el operador GetType para pasar el tipo de la clase y el atributo a una llamada al mtodo GetCustomAttribute, y despus asigne el valor devuelto a la variable declarada como Attribute: Visual Basic Copiar cdigo

Attr = GetCustomAttribute(Me.GetType, _ GetType(CustomAttribute), False)


5. Utilice la funcin CType para convertir el tipo de datos del atributo de atributo genrico al especfico del tipo que ha recuperado. Asigne el resultado a la variable declarada como el tipo de atributo personalizado: Visual Basic Copiar cdigo

CustAttr = CType(Attr, CustomAttribute)


6. Compruebe si se ha recuperado el atributo; si es as, utilice los campos, las propiedades y los mtodos del atributo. Visual Basic Copiar cdigo

If CustAttr Is Nothing Then

MsgBox("The attribute was not found.") Else 'Get the label and value from the custom attribute. MsgBox("The attribute label is: " & CustAttr.Label) MsgBox("The attribute value is: " & CustAttr.Value) End If
7. En el ejemplo anterior, el procedimiento RetrieveAttribute llama al mtodo GetCustomAttribute de la clase System..::.Attribute para obtener el atributo personalizado aplicado a la clase ThisClass. GetCustomAttribute es un mtodo compartido, por lo que no necesita crear primero una instancia de System..::.Attribute. La funcin CType convierte el atributo devuelto del tipo System..::.Attribute al tipo de atributo personalizado

CustomAttribute.

8. Ejemplos sobre el uso de atributos personalizados


9. 10. El ejemplo siguiente define un atributo personalizado que se puede aplicar slo a clases: Ejemplo

Visual Basic Copiar cdigo

<AttributeUsage(AttributeTargets.Class)> Public Class CustomAttribute Inherits System.Attribute 'Declare two private fields to store the property values. Private m_LlabelValue As String Private m_VValueValue As Integer 'The Sub New constructor is the only way to set the properties. Public Sub New(ByVal _Label As String, ByVal _Value As Integer) m_LlabelValue = _Label m_VValueValue = _Value End Sub Public ReadOnly Property Label() As String Get Return m_LlabelValue End Get End Property Public ReadOnly Property Value() As Integer Get Return m_VValueValue End Get End Property End Class

11. Slo el constructor de la clase de atributos puede establecer las propiedades definidas en este atributo. El cdigo siguiente muestra cmo se podra utilizar el atributo. Visual Basic Copiar cdigo

' Apply the custom attribute to this class. <Custom("Some metadata", 66)> Class ThisClass ' Add class members here. End Class

Ensamblados Friend (Visual Basic)


Un ensamblado de confianza es un ensamblado que puede tener acceso a los tipos y miembros Friend de otro ensamblado. (Para obtener ms informacin, vea Friend (Visual Basic)). Si identifica un ensamblado como ensamblado de confianza, ya no tiene que marcar los tipos y miembros como pblicos para que otros ensamblados tengan acceso a ellos. Esto es especialmente adecuado en los escenarios siguientes:

Durante la prueba unitaria, cuando se ejecuta el cdigo de prueba en un ensamblado independiente pero se requiere el acceso a los miembros del ensamblado que se prueba que se marcan como Friend.

Al desarrollar una biblioteca de clases y las adiciones a la biblioteca las contienen ensamblados independientes pero se requiere el acceso a los miembros de los ensamblados existentes que se marcan como Friend.

Comentarios Puede usar el atributo InternalsVisibleToAttribute para identificar uno o ms ensamblados de confianza para un ensamblado especificado. Por ejemplo, si incluye el atributo InternalsVisibleToAttribute en el ensamblado A y especifica el ensamblado B como ensamblado de confianza, el ensamblado B tendr acceso a todos los tipos y miembros del ensamblado A marcados como Friend, como se muestra en el siguiente ejemplo. Visual Basic Copiar cdigo

Imports System.Runtime.CompilerServices <Assembly: InternalsVisibleTo("FriendAssembliesB")> ' Friend class. Friend Class FriendAssembliesA Public Sub Test() MsgBox("Friend Assemblies Sample Class") End Sub End Class ' Public class with a Friend method. Public Class FriendAssembliesClassA Friend Sub Test() MsgBox("Friend Assemblies Sample Method") End Sub End Class
Slo los ensamblados que especifique explcitamente como de confianza pueden tener acceso a los tipos y miembros Friend. Por ejemplo, si el ensamblado B es de confianza para el ensamblado A y el ensamblado C hace referencia al ensamblado B, C no tiene acceso a los tipos Friend de A. El compilador realiza parte de la validacin bsica del nombre del ensamblado de confianza pasado al atributo InternalsVisibleToAttribute. Si el ensamblado A declara B como ensamblado de confianza, las reglas de validacin son las siguientes:

Si el ensamblado A tiene un nombre seguro, el ensamblado B tambin debe tener un nombre seguro. El nombre del ensamblado de confianza que se pasa al atributo debe estar formado por el nombre del ensamblado y la clave pblica de la clave de nombre seguro que se utiliza para firmar el ensamblado B. El nombre del ensamblado de confianza que se pasa al atributo InternalsVisibleToAttribute no puede tener el nombre seguro del ensamblado B: no incluya la versin del ensamblado, la referencia cultural, la arquitectura ni el token de clave pblica.

Si el ensamblado A no tiene un nombre seguro, el nombre del ensamblado de confianza debe estar formado slo por el nombre del ensamblado. Para obtener ms informacin, consulte Cmo: Crear ensamblados de confianza no firmados.

Si el ensamblado B tiene un nombre seguro, debe especificar la clave de nombre seguro del ensamblado B utilizando el valor del proyecto o la lnea de comandos de la opcin del compilador /keyfile. Para obtener ms informacin, consulte Cmo: Crear ensamblados de confianza firmados.

Para obtener informacin sobre cmo tener acceso a los tipos y mtodos Friend de un ensamblado desde un archivo de mdulo (un archivo con la extensin .netmodule), vea /moduleassemblyname.

Nota de seguridad: Hay similitudes entre el atributo InternalsVisibleToAttribute y la clase StrongNameIdentityPermission. La diferencia principal es que StrongNameIdentityPermission puede exigir los permisos de seguridad para ejecutar una seccin de cdigo determinada, mientras que el atributo InternalsVisibleToAttribute controla la visibilidad de los miembros y tipos Friend.

Elementos declarados en Visual Basic


Un elemento declarado es un elemento de programacin definido en una instruccin de declaracin. Los elementos declarados incluyen variables, constantes, enumeraciones, clases, estructuras, mdulos, interfaces, procedimientos, parmetros de procedimientos, valores devueltos de funciones, referencias a procedimientos externos, operadores, propiedades, eventos y delegados. Las instrucciones de declaracin incluyen lo siguiente:

Instruccin Dim (Visual Basic) Instruccin Const (Visual Basic) Instruccin Enum (Visual Basic) Instruccin Class (Visual Basic) Structure (Instruccin) Module (Instruccin) Instruccin Interface (Visual Basic) Instruccin Function (Visual Basic) Instruccin Sub (Visual Basic) Declare (Instruccin) Operator (Instruccin) Property (Instruccin) Event (Instruccin) Delegate (Instruccin)

Instruccin Dim (Visual Basic)


Declara y asigna espacio para almacenar una o ms variables.

[ <attributelist> ] [ accessmodifier ]

[[ Shared ] [ Shadows ] | [ Static ]] [ ReadOnly ] Dim [ WithEvents ] variablelist


Partes attributelist Opcional. Vea Lista de atributos. accessmodifier Opcional. Puede ser una de las siguientes:

Public Protected Friend Private Protected Friend

Vea Niveles de acceso en Visual Basic. Shared Opcional. Vea Shared. Shadows Opcional. Vea Shadows. Static Opcional. Vea Static. ReadOnly Opcional. Vea ReadOnly. WithEvents Opcional. Especifica que stas son variables de objeto que hacen referencia a instancias de una clase que puede provocar eventos. Vea WithEvents. variablelist Obligatorio. Lista de variables que se declara en esta instruccin.

variable [ , variable ... ]


Cada variable tiene la sintaxis y las partes siguientes:

variablename [ ( [ boundslist ] ) ] [ As [ New ] datatype [ With { [ .propertyname = propinitializer [ , ... ] ] } ] ] [ = initializer ]


Parte variablename boundslist New datatype With Descripcin Obligatorio. Nombre de la variable. Vea Nombres de elementos declarados. Opcional. Lista de lmites de cada dimensin de una variable de matriz. Opcional. Crea una nueva instancia de la clase cuando se ejecuta la instruccin Dim. Obligatorio si Option Strict es On. Tipo de datos de la variable. Opcional. Incluye la lista de inicializadores de objeto.

propertyname

Opcional. Nombre de una propiedad en la clase de la que se est creando una instancia. Se requiere despus de propertyname =. Expresin que se evala y se asigna al nombre de propiedad. Opcional si no se especifica New. Expresin que se evala y se asigna a la variable cuando se crea.

propinitializer initializer

Comentarios Se deben declarar todas las variables que se utilizan en un programa para indicar al compilador de Visual Basic el tipo de datos de la variable y otra informacin, por ejemplo qu cdigo puede tener acceso a la misma. En el ejemplo siguiente se declara una variable que contiene un valor Integer. Copiar cdigo

Dim numberOfStudents As Integer


Slo se puede utilizar Dim en el nivel de mdulo o procedimiento. Esto significa que el contexto de declaracin de una variable tiene que ser una clase, estructura, mdulo, procedimiento o bloque, y no puede ser un archivo de cdigo fuente, espacio de nombres o interfaz. Para obtener ms informacin, vea Contextos de declaracin y niveles de acceso predeterminados. Si Option Explicit es On (el valor predeterminado), el compilador requiere una declaracin para cada variable que se utiliza. Si se activa Option Explicit Off, el valor predeterminado de las variables no declaradas es Object (Tipo de datos), que podra no ser el que se desea. Puede especificar el tipo de datos de cada variable en la instruccin Dim. Tambin puede especificar un valor inicial. Si no lo hace, Visual Basic utiliza la configuracin predeterminada. Para obtener ms informacin, vea "Reglas de tipos de datos" y "Valores predeterminados" en la seccin "Informacin detallada" de esta pgina de Ayuda. En el ejemplo siguiente se declara e inicializa una variable String. Copiar cdigo

Dim summary As String = "Summary of results"


Puede especificar qu cdigo puede tener acceso a una variable proporcionando accessmodifier en la instruccin Dim. Para obtener ms informacin, vea "Modificadores" y "Nivel de acceso" en la seccin "Informacin detallada" de esta pgina de Ayuda. Puede declarar una variable para contener una matriz, que puede almacenar varios valores. Para obtener ms informacin, vea "Reglas de matrices" en la seccin "Informacin detallada" de esta pgina de Ayuda. Para obtener ms informacin sobre las matrices, vea Matrices en Visual Basic. En el ejemplo siguiente se declara una variable de matriz Integer. Copiar cdigo

Dim days() As Integer


En general, debe colocar todas las instrucciones Dim al inicio del rea de cdigo donde usa las variables. Para obtener ms informacin, vea "Solucin de problemas" en la seccin "Informacin detallada" de esta pgina de Ayuda. Visual Basic 2008 incluye inicializadores de objeto, que se usan para declarar instancias de tipos con nombre y annimos, e inferencia de tipo de variable local. Para obtener ms informacin, vea Tipos annimos, Inicializadores de objeto: Tipos con nombre y annimos y Inferencia de tipo de variable local. Informacin detallada En esta seccin se tratan detalladamente las reas siguientes:

Declaracin Tipos de datos Matrices

Comportamiento Solucin de problemas

Reglas de declaracin Contexto de declaracin. Una variable declarada en el nivel de mdulo, fuera de cualquier procedimiento, es una variable miembro o un campo; es miembro de la clase, estructura, mdulo o interfaz que la declara. Una variable declarada en el nivel de procedimiento es una variable local; es local al procedimiento o bloque que la declara.

Atributos. Slo se pueden aplicar atributos a las variables miembro, no a las variables locales. Un atributo proporciona informacin a los metadatos del ensamblado, que no son significativos para el almacenamiento temporal como las variables locales.

Uso implcito de Dim. Si se especifica uno de los modificadores Public, Protected, Friend, Protected Friend, Private, Shared, Shadows, Static, ReadOnly o WithEvents, se puede omitir opcionalmente la palabra clave Dim. Copiar cdigo

Public maximumAllowed As Double Protected Friend currentUserName As String Private salary As Decimal Static runningTotal As Integer
En el nivel de mdulo, no se puede utilizar el modificador Static para declarar variables miembro. En el nivel de procedimiento, no se puede utilizar Shared, Shadows, ReadOnly, WithEvents ni un modificador de acceso para declarar variables locales.

Variables WithEvents. Slo se puede especificar WithEvents en variables miembro, no en variables locales dentro de un procedimiento. Si especifica WithEvents, el tipo de datos de las variables debe ser un tipo de clase concreto que no sea Object. No se puede declarar una matriz con WithEvents. Para obtener ms informacin sobre los eventos, vea Eventos y controladores de eventos.

Varias variables. Se pueden declarar varias variables en la misma instruccin de declaracin si se especifica la parte variablename para cada uno y se sigue cada nombre de matriz con parntesis. Las variables mltiples se separan con comas. Copiar cdigo

Dim lastTime, nextTime, allTimes() As Date


Reglas de tipos de datos

Tipos de datos. La instruccin Dim puede declarar el tipo de datos de una variable. Se puede especificar cualquier tipo de datos o el nombre de una enumeracin, estructura, clase o interfaz. Copiar cdigo

Dim finished As Boolean Dim monitorBox As System.Windows.Forms.Form


Tipo predeterminado. Si no se especifica datatype, la variable toma el tipo de datos de initializer. Si ni datatype ni initializer estn presentes, el tipo de datos es Object (Tipo de datos) de forma predeterminada. Si se especifica datatype e initializer, el tipo de datos de initializer debe ser convertible a datatype.

Tipos diferentes. Se pueden especificar tipos de datos diferentes para variables diferentes utilizando una clusula As independiente para cada variable declarada. Opcionalmente, es posible declarar varias variables que sean del mismo tipo utilizando una clusula As comn.

Todas las variables toman el tipo de datos especificado en la primera clusula As que se encuentre despus de su parte variablename correspondiente. Copiar cdigo

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
Inicializacin. La instruccin Dim puede inicializar el contenido de las variables seleccionadas en variablelist. En un tipo de valor, initializer se utiliza para proporcionar una expresin que se va a asignar a la variable. La expresin se debe evaluar como una constante que se puede calcular en tiempo de compilacin. Copiar cdigo

Dim quantity As Integer = 10 Dim message As String = "Just started"


En un tipo de referencia, la palabra clave New se utiliza para crear una nueva instancia de la clase o estructura especificada por datatype. Si utiliza New, no utilice una expresin initializer. En su lugar, si son necesarios, proporcione argumentos al constructor de la clase a partir de la que est creando la variable. Copiar cdigo

Dim bottomLabel As New System.Windows.Forms.Label


Si declara ms de una variable con la misma clusula As, no puede proporcionar un initializer para ese grupo de variables. Reglas de matrices

Variables de matriz. Para especificar que una variable en variablelist es una matriz, siga inmediatamente su variablename con parntesis. Si la matriz tiene ms de una dimensin, debe incluir comas entre los parntesis para indicar el nmero de dimensiones. Copiar cdigo

Dim oneDimension(), twoDimensions(,), threeDimensions(,,) As Byte


Una matriz puede tener de 1 a 32 dimensiones. Para obtener ms informacin, vea Matrices en Visual Basic. Lmites de matrices. Se puede especificar el lmite inferior y superior de cada dimensin. Para ello, incluya boundslist dentro de los parntesis. En cada dimensin, boundslist especifica el lmite superior y, opcionalmente, el lmite inferior. El lmite inferior siempre es cero, tanto si se especifica como si no. Cada ndice puede variar de cero hasta el valor de su lmite superior. Las dos instrucciones siguientes son equivalentes. Cada instruccin declara una matriz de 21 elementos Integer. Cuando se tiene acceso a la matriz, el ndice puede variar de 0 a 20. Copiar cdigo

Dim totals(20) As Integer Dim totals(0 To 20) As Integer


La instruccin siguiente declara una matriz bidimensional de tipo Double. La matriz tiene 4 filas (3 + 1) de 6 columnas (5 + 1) cada una. Copiar cdigo

Dim matrix2(3, 5) As Double


Observe que el lmite superior representa el valor ms alto posible del ndice, no la longitud de la dimensin, que es el lmite superior ms uno.

Lmites de matrices en blanco. Todos los lmites de una declaracin de matriz se pueden dejar en blanco. En este caso, la matriz tiene el nmero de dimensiones que especifica, pero se no se inicializa. Por consiguiente, tiene el valor Nothing hasta que se inicialicen por

lo menos algunos de sus elementos. La instruccin Dim debe especificar los lmites para todas las dimensiones o para ninguna de ellas. Copiar cdigo

Dim messages() As String


Matrices vacas. Es posible utilizar 1 para declarar el lmite superior de una dimensin de matriz. Esto significa que la matriz est vaca, pero no es Nothing, una distincin que requieren algunas funciones del Common Language Runtime. Sin embargo, el cdigo de Visual Basic no puede obtener acceso a este tipo de matriz. Si se intenta, se produce un error IndexOutOfRangeException durante la ejecucin. Para obtener ms informacin, vea Cmo: Crear una matriz sin elementos.

Inicializacin de matrices. Los valores de una matriz se pueden inicializar rodeando los valores de inicializacin con llaves ({}). Copiar cdigo

Dim longArray() As Long = {0, 1, 2, 3}


En las matrices multidimensionales, la inicializacin de cada dimensin est entre llaves en la dimensin exterior. Los elementos se especifican en orden de importancia de filas. Copiar cdigo

Dim twoDimensions(,) As Integer = {{0, 1, 2}, {10, 11, 12}}


Comportamiento

Valores predeterminados. Si no se especifica initializer en una variable, Visual Basic la inicializa con el valor predeterminado del tipo de datos. En la tabla siguiente se muestran los valores de inicializacin predeterminados. Tipo de datos Todos los tipos numricos (incluso Byte y SByte) Char Todas las referencias de tipo (incluidas Object, String y todas las matrices). Boolean Date Valor predeterminado 0 Binario 0 Nothing

False 12:00 a.m. del 1 de enero del ao 1 (01/01/0001 12:00:00 a.m.)

Cada elemento de una estructura se inicializa como si fuera una variable independiente. Si se declara la longitud de una matriz pero no se inicializan sus elementos, stos se inicializan como si fueran una variable independiente.

Nivel de acceso.Las variables miembro de clase y mdulo (fuera de cualquier procedimiento) tienen como valor predeterminado el acceso privado y las variables miembro de estructura tienen como valor predeterminado el acceso pblico. Sus niveles de acceso se pueden ajustar con los modificadores de acceso. No puede utilizar modificadores de acceso en variables locales (dentro de un procedimiento).

mbito. Las variables locales slo estn en mbito dentro de su procedimiento o bloque. Las variables miembro estn en mbito a lo largo de su clase, estructura o mdulo. Calificacin. El cdigo externo a una clase, estructura o mdulo debe calificar el nombre de una variable miembro con el nombre de esa clase, estructura o mdulo. El cdigo externo a

un procedimiento o bloque no puede hacer referencia a ninguna variable local dentro de ese procedimiento o bloque.

Perodo de duracin. Una variable local Static tiene un perodo de duracin ms largo que el del procedimiento en el que se declara. Los lmites de la duracin de la variable dependen de dnde se declare el procedimiento y si es Shared. Declaracin de procedimiento En un mdulo

La variable se inicializa La primera vez que se llama al procedimiento La primera vez que se llama al procedimiento en una instancia especfica o en la propia clase o estructura La primera vez que se llama al procedimiento en una instancia especfica

La variable deja de existir Cuando el programa detiene la ejecucin Cuando el programa detiene la ejecucin

En una clase o estructura, Shared

En una clase o estructura, no Shared

Cuando la instancia se libera para la recoleccin de elementos no utilizados

Solucin de problemas

Orden de ejecucin. La instruccin Dim no es propiamente una instruccin ejecutable. Sin embargo, si inicializa una o ms variables, las inicializaciones se tratan como instrucciones de asignacin. Esto significa que el valor de una variable atraviesa los pasos siguientes: 1. En la primera entrada en el elemento de cdigo que declara la variable, Visual Basic la inicializa con el valor predeterminado para su tipo de datos. 2. Cuando la ejecucin llega a la instruccin Dim de la variable, Visual Basic la inicializa con el valor proporcionado en la instruccin Dim. 3. Cada vez que la ejecucin vuelve a la instruccin Dim de la variable, Visual Basic la establece una vez ms en el valor proporcionado en la instruccin Dim. Esto tiene las implicaciones siguientes cuando se utiliza una instruccin Dim para inicializar una variable:

Si se utiliza la variable antes de ejecutar la instruccin Dim, su valor es el predeterminado para el tipo de datos, no el valor proporcionado en la instruccin Dim. Si la ejecucin nunca llega a la instruccin Dim, la variable nunca se inicializa con el valor proporcionado en la instruccin Dim. Si se cambia el valor pero despus se vuelve a la instruccin Dim, el valor modificado se reemplaza por el valor proporcionado en la instruccin Dim. Si se colocan todas las instrucciones Dim al inicio del rea de cdigo en la que aparecen, por ejemplo un mdulo o procedimiento, el cdigo las inicializa tal como se desea.

Ejemplo En el ejemplo siguiente se declaran variables mediante la instruccin Dim con diversas opciones. Visual Basic Copiar cdigo

' The following statement declares and initializes a Long variable. Dim startingAmount As Long = 500
Visual Basic Copiar cdigo

' The following statement declares a variable that refers to a Button ' object, creates a new Button object, and assigns it to the variable. Dim switchButton As New System.Windows.Forms.Button
Visual Basic Copiar cdigo

' The following statement declares a variable that can only be ' accessed by code in the same class, structure, or module. Private homeTelephone As String = ""
Visual Basic Copiar cdigo

' The following statement declares a local variable that always retains ' its value, even after its procedure returns to the calling code. Static totalSales As Double
Visual Basic Copiar cdigo

' The following statement declares a variable that refers to an array. Dim highTemperature(31) As Integer

Instruccin Const (Visual Basic)


Declara y define una o ms constantes.

[ <attributelist> ] [ accessmodifier ] [ Shadows ] Const constantlist


Partes attributelist Opcional. Lista de atributos que se aplican a todas las constantes declaradas en esta instruccin. Vea la Lista de atributos en corchetes angulares ("<" y ">"). accessmodifier Opcional. Utilcelo para especificar qu cdigo puede tener acceso a estas constantes. Puede ser Public (Visual Basic), Protected (Visual Basic), Friend (Visual Basic), Protected Friend o Private (Visual Basic). Shadows Opcional. Utilcelo para volver a declarar y ocultar un elemento de programacin de una clase base. Vea Shadows. constantlist Obligatorio. Lista de constantes de miembros que se declaran en esta instruccin. constant [ , constant ... ] Cada constant tiene la sintaxis y las partes siguientes: constantname [ As datatype ] = initializer Parte constantname datatype Descripcin Obligatorio. Nombre de la constante. Vea Nombres de elementos declarados. Obligatorio si Option Strict es On. Tipo de datos de la constante.

initializer

Obligatorio. Expresin que se evala en tiempo de compilacin y se asigna a la constante.

Comentarios Si en su aplicacin tiene un valor que nunca cambia, puede definir una constante con nombre y usarla en lugar de un valor literal. Un nombre es ms fcil de recordar que un valor. Puede definir la constante slo una vez y utilizarla en muchos lugares de su cdigo. Si en una versin posterior necesita volver a definir el valor, la instruccin Const es el nico lugar donde es necesario realizar el cambio. Slo puede utilizar Const en el nivel de mdulo o de procedimiento. Esto significa que el contexto de declaracin de una propiedad debe ser una clase, estructura, mdulo, procedimiento o bloque, y no un archivo de cdigo fuente, un espacio de nombres o una interfaz. Para obtener ms informacin, vea Contextos de declaracin y niveles de acceso predeterminados. Las constantes locales (contenidas en un procedimiento) tienen un valor predeterminado de acceso pblico y no puede utilizar ningn modificador de acceso en ellas. Las constantes de clases y miembros de mdulo (externas a cualquier procedimiento) tienen como valor predeterminado el acceso privado, y las constantes de miembro de estructura tienen como valor predeterminado el acceso pblico. Puede ajustar sus niveles de acceso con los modificadores de acceso. Reglas

Contexto de la declaracin. Una constante declarada en el nivel de mdulo, fuera de cualquier procedimiento, es una constante de miembros; es un miembro de la clase, estructura o mdulo que la declara. Una constante declarada en el nivel de procedimiento es una constante local; es local al procedimiento o bloque que la declara.

Atributos. Slo puede aplicar los atributos a las constantes de miembro, no a las constantes locales. Un atributo aporta informacin a los metadatos del ensamblado, que no son significativos para el almacenamiento temporal como constantes locales.

Modificadores. De manera predeterminada, todas las constantes son Shared, Static y ReadOnly. No puede utilizar ninguna de estas palabras clave al declarar una constante. En el nivel de procedimiento, no puede utilizar Shadows ni ningn modificador de acceso para declarar constantes locales.

Varias constantes. Puede declarar varias constantes en la misma instruccin de declaracin, especificando la parte constantname para cada una. Las constantes mltiples se separan por comas.

Reglas de tipos de datos

Tipos de datos. La instruccin Const puede declarar el tipo de datos de una variable. Puede especificar cualquier tipo de datos o el nombre de una enumeracin. Tipo predeterminado. Si no especifica datatype, la constante toma el tipo de datos de initializer. Si especifica datatype e initializer, el tipo de datos de initializer debe ser convertible al datatype. Si ni datatype ni initializer estn presentes, el tipo de datos utiliza Object de manera predeterminada.

Distintos tipos. Puede especificar distintos tipos de datos para las diferentes constantes utilizando una clusula As independiente para cada variable que declare. Sin embargo, no puede declarar varias constantes para que sean del mismo tipo utilizando una clusula As comn.

Inicializacin. Debe inicializar el valor de cada constante en constantlist. Utilice initializer para proporcionar una expresin que se va a asignar a la constante. La expresin puede ser

cualquier combinacin de literales, otras constantes que ya estn definidas y miembros de enumeracin que ya se hayan definido. Puede utilizar operadores aritmticos y lgicos para combinar estos elementos. No puede utilizar variables ni funciones en initializer. No obstante, pueden utilizarse palabras clave de conversin como CByte y CShort. Tambin puede utilizar AscW si lo llama con un argumento constante String o Char, puesto que puede evaluarse en tiempo de compilacin. Comportamiento

mbito. A las constantes locales slo se puede tener acceso desde dentro de sus procedimientos o bloques. Se puede tener acceso a las constantes de miembro desde cualquier lugar del interior de sus clases, estructuras o mdulos.

Calificacin. El cdigo fuera de una clase, estructura o mdulo debe calificar el nombre de una constante de miembro con el nombre de esa clase, estructura o mdulo. El cdigo situado fuera de un procedimiento o bloque no puede hacer referencia a ninguna constante local incluida dentro de ese procedimiento o bloque.

Ejemplo En el ejemplo siguiente se utiliza la instruccin Const para declarar constantes que se utilicen en lugar de valores literales. Visual Basic Copiar cdigo

' The following statements declare constants. Const maximum As Long = 459 Public Const helpString As String = "HELP" Private Const startValue As Integer = 5
Si define una constante con el tipo de datos Object, el compilador de Visual Basic le asigna el tipo de initializer, en lugar de Object. En el ejemplo siguiente, la naturalLogBase constante tiene el tipo Decimal en tiempo de ejecucin. Visual Basic Copiar cdigo

Const naturalLogBase As Object = CDec(2.7182818284) MsgBox("Run-time type of constant naturalLogBase is " & _ naturalLogBase.GetType.ToString())
El ejemplo anterior utiliza el mtodo ToString del objeto Type devuelto por el GetType (Operador), porque Type no se puede convertir a String utilizando CStr.

Instruccin Enum (Visual Basic)


Declara una enumeracin y define los valores de sus miembros.

[ <attribute list> ] [ access modifier ] Enum enumeration name [ As data type ] member list End Enum
Partes attribute list

[ Shadows ]

Opcional. Lista de atributos que se aplican a esta enumeracin. Debe incluir la Lista de atributos entre corchetes angulares ("<" y ">"). access modifier Opcional. Especifica qu cdigo puede tener acceso a esta enumeracin. Puede ser una de las siguientes:

Public Protected Friend Private

Puede especificar Protected Friend para permitir el acceso desde el cdigo dentro de la clase de la enumeracin o desde el mismo ensamblado. Shadows Opcional. Especifica que esta enumeracin vuelve a declarar y ocultar un elemento de programacin denominado de forma idntica, o un conjunto de elementos sobrecargados, en una clase base. Slo puede especificar Shadows en la propia enumeracin y no en ninguno de sus miembros. enumeration name Requerido. Nombre de la enumeracin. Para obtener ms informacin sobre qu nombres son vlidos, vea Nombres de elementos declarados. data type Requerido si Option Strict es On. Tipos de datos de la enumeracin y de todos sus miembros. member list Requerido. Lista de constantes de miembros que se declara en esta instruccin. Varios miembros aparecen en lneas de cdigo fuente individuales. Cada member tiene la sintaxis y las partes siguientes: [<attribute list>] member

name [ = initializer ]
Parte member name initializer Description Requerido. Nombre de este miembro. Opcional. Expresin que se evala en tiempo de compilacin y se asigna a este miembro.

End Enum Termina el bloque Enum. Comentarios Si tiene un conjunto de valores inalterables que se relacionan lgicamente entre s, puede definirlos juntos en una enumeracin. Esto proporciona nombres descriptivos para la enumeracin y sus miembros que son ms fciles de recordar que sus valores. Puede utilizar los miembros de la enumeracin en muchos lugares de su cdigo. Mejora asimismo la legibilidad de su cdigo porque todos los valores relacionados utilizan el mismo nombre de enumeracin. Slo se puede utilizar Enum en el nivel de espacio de nombres o de mdulo. Esto significa que el contexto de la declaracin de una enumeracin debe ser un archivo de cdigo fuente, espacio de nombres, clase, estructura, mdulo o interfaz, y no un procedimiento. Para obtener ms informacin, vea Contextos de declaracin y niveles de acceso predeterminados. La instruccin Enum puede declarar el tipo de datos de una enumeracin. Cada miembro toma el tipo de datos de la enumeracin. Puede especificar Byte, Integer, Long, SByte, Short, UInteger, ULong o UShort.

Si no especifica un initializer para un miembro, Visual Basic lo inicializa a cero (si es el primer member de una member list) o a un valor superior en uno al del member inmediatamente anterior. Las enumeraciones de clases, estructuras, mdulos y miembros de interfaz tienen como valor predeterminado el acceso pblico. Puede ajustar sus niveles de acceso con los modificadores de acceso. Las enumeraciones de miembros de espacio de nombres tienen como valor predeterminado el acceso de amigo. Puede ajustar sus niveles de acceso a pblico, pero no a privado o protegido. Para obtener ms informacin, vea las reglas incluidas en Niveles de acceso en Visual Basic.

Contexto de la declaracin. Una enumeracin declarada en el nivel de mdulo, fuera de cualquier procedimiento, es una enumeracin de miembros; se trata de un miembro de la clase, estructura, mdulo o interfaz que la declara. Una enumeracin declarada en el nivel de espacio de nombres, fuera de cualquier clase, estructura, mdulo o interfaz, es un miembro slo del espacio de nombres en el que aparece.

Atributos. Puede aplicar los atributos a una enumeracin en conjunto, pero no a sus miembros individualmente. Un atributo proporciona informacin a los metadatos del ensamblado.

Modificadores. De forma predeterminada, todas las enumeraciones son tipos y sus campos, constantes. Por consiguiente no se pueden utilizar las palabras clave Shared, Static y ReadOnly al declarar una enumeracin o sus miembros.

Reglas de tipos de datos

Tipo predeterminado. Si no especifica data type para la enumeracin, cada miembro toma el tipo de datos de initializer. Si se especifica data type e initializer, el tipo de datos de initializer debe ser convertible a data type. Si ni data type ni initializer estn presentes, el tipo de datos utiliza Integer de manera predeterminada.

Inicializacin. La instruccin Enum puede inicializar el contenido de los miembros seleccionados en member list. Utilice initializer para proporcionar una expresin que se va a asignar al miembro. La expresin proporcionada en initializer puede ser cualquier combinacin de literal, otras constantes ya definidas, y miembros de la enumeracin ya definidos, incluso un miembro anterior de esta enumeracin. Puede utilizar operadores aritmticos y lgicos para combinar estos elementos. No puede utilizar variables ni funciones en initializer. No obstante, pueden utilizarse palabras clave de conversin como CByte y CShort. Tambin puede utilizar AscW si lo llama con un argumento constante String o Char, puesto que puede evaluarse en tiempo de compilacin.

Comportamiento

Nivel de acceso. Todos los miembros de la enumeracin tienen acceso pblico y no pueden utilizar ningn modificador de acceso. Sin embargo, si la propia enumeracin tiene un nivel de acceso ms restringido, tiene prioridad el nivel de acceso a la enumeracin especificado.

mbito. Se puede tener acceso a las enumeraciones de miembros desde cualquier lugar dentro de su clase, estructura, mdulo o interfaz. Las enumeraciones de miembros de espacio de nombres son accesibles desde cualquier cdigo dentro de ese espacio de nombres.

Calificacin. El cdigo fuera de una clase, estructura o mdulo debe calificar el nombre de una enumeracin de miembros con el nombre de esa clase, estructura o mdulo.

Valores no vlidos.Si el valor de un miembro rebasa el intervalo permitido para el tipo de datos subyacente o si se inicializa un miembro al valor mximo permitido por dicho tipo, el compilador notifica un error.

Las variables de enumeracin son variables declaradas para ser del tipo Enum. Declarar una variable de este modo le ayudar a controlar los valores que le asigne. Sin embargo, todava puede asignar un valor que no sea un miembro de la enumeracin, siempre que su tipo de datos pueda convertirse en el tipo de datos de la enumeracin. Esto es til cuando la enumeracin es un campo de indicador y se asigna una combinacin de indicadores a la variable de enumeracin. El ejemplo siguiente muestra una asignacin de varios indicadores a una variable de enumeracin. Visual Basic Copiar cdigo

Enum filePermissions create = 1 read = 2 write = 4 delete = 8 End Enum


Visual Basic Copiar cdigo

Dim file1Perm As filePermissions file1Perm = filePermissions.create Or filePermissions.read


Deben calificarse todas las referencias a un miembro de enumeracin, ya sea con el nombre de una variable de enumeracin o con el nombre de la propia enumeracin. Por ejemplo, en el ejemplo anterior, puede hacer referencia al primer miembro como filePermissions.create, pero no como create. Ejemplo El ejemplo siguiente utiliza la instruccin Enum para definir un conjunto relacionado de valores constantes con nombre. En este caso, los valores son colores que se pueden elegir a fin de disear formularios de entrada de datos para una base de datos. Visual Basic Copiar cdigo

Public Enum InterfaceColors MistyRose = &HE1E4FF& SlateGray = &H908070& DodgerBlue = &HFF901E& DeepSkyBlue = &HFFBF00& SpringGreen = &H7FFF00& ForestGreen = &H228B22& Goldenrod = &H20A5DA& Firebrick = &H2222B2& End Enum
El ejemplo siguiente muestra valores que incluyen nmeros positivos y negativos. Visual Basic Copiar cdigo

Enum SecurityLevel IllegalEntry = -1 MinimumSecurity = 0 MaximumSecurity = 1 End Enum

Instruccin Class (Visual Basic)

Declara el nombre de una clase e introduce la definicin de las variables, propiedades, eventos y procedimientos que la clase comprende.

[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ MustInherit | NotInheritable ] [ Partial ] _ Class name [ ( Of typelist ) ] [ Inherits classname ] [ Implements interfacenames ] [ statements ] End Class
Partes attributelist Opcional. Vea Lista de atributos. accessmodifier Opcional. Puede ser una de las siguientes:

Public Protected Friend Private Protected Friend

Vea Niveles de acceso en Visual Basic. Shadows Opcional. Vea Shadows. MustInherit Opcional. Vea MustInherit. NotInheritable Opcional. Vea NotInheritable. Partial Opcional. Indica una definicin parcial de la clase. Vea Partial (Visual Basic). name Obligatorio. Nombre de la clase. Vea Nombres de elementos declarados. Of Opcional. Especifica que sta es una clase genrica. typelist Es obligatorio si se utiliza la palabra clave Of. Lista de parmetros de tipo de la clase. Vea Lista de tipos. Inherits Opcional. Indica que esta clase hereda los miembros de otra clase. Vea Inherits (Instruccin). classname Es obligatorio si se utiliza la instruccin Inherits. Nombre de la clase de la que se deriva esta clase. Implements

Opcional. Indica que la clase implementa los miembros de una o ms interfaces. Vea Implements (Instruccin). interfacenames Es obligatorio si se utiliza la instruccin Implements. Nombres de las interfaces implementadas por esta clase. statements Opcional. Instrucciones que definen los miembros de la clase. End Class Obligatorio. Finaliza la definicin de Class. Comentarios Una instruccin Class define un nuevo tipo de datos. Una clase es una unidad de creacin fundamental de la programacin orientada a objetos (OOP). Para obtener ms informacin, vea Programacin orientada a objetos en Visual Basic y Clases: como planos para objetos. Slo se puede utilizar Class en el nivel de espacio de nombres o de mdulo. Esto significa que el contexto de declaracin para una clase debe ser un archivo de cdigo fuente, espacio de nombres, clase, estructura, mdulo o interfaz, y no puede ser un procedimiento o bloque. Para obtener ms informacin, vea Contextos de declaracin y niveles de acceso predeterminados. Cada instancia de una clase tiene un perodo de duracin independiente de todas las dems instancias. Este perodo de duracin comienza cuando una clusula New (Visual Basic) o una funcin como CreateObject (Funcin, Visual Basic) crean la instancia. Finaliza cuando todas las variables que sealan a la instancia se han establecido como Nothing (Visual Basic) o como instancias de otras clases. Las clases tienen el acceso Friend (Visual Basic) de forma predeterminada. Los niveles de acceso se pueden ajustar con los modificadores de acceso. Para obtener ms informacin, vea Niveles de acceso en Visual Basic. Reglas

Anidacin. Se puede definir una clase dentro de otra. La clase exterior se denomina clase contenedora y la clase interna se denomina clase anidada. Herencia. Si la clase utiliza Inherits (Instruccin), slo se puede especificar una clase base o interfaz. Una clase no puede heredar de ms de un elemento. Una clase no puede heredar de otra clase que tenga un nivel de acceso ms 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.

Implementacin. Si la clase utiliza la instruccin Implements (Instruccin), se debe implementar cada miembro definido por cada interfaz que se especifique en interfacenames. Una excepcin a esto es la reimplementacin de un miembro de clase base. Para obtener ms informacin, vea "Reimplementacin" en Implements (Visual Basic).

Propiedad predeterminada. Una clase puede especificar a lo sumo una propiedad como su propiedad predeterminada. Para obtener ms informacin, vea Propiedades predeterminadas.

Comportamiento

Nivel de acceso. Dentro de una clase, se puede declarar cada miembro con su propio nivel de acceso. De forma predeterminada, los miembros de la clase tienen el acceso Public (Visual Basic), pero las variables y constantes tienen el acceso Private (Visual Basic).

Cuando una clase tiene un acceso ms restringido que uno de sus miembros, el nivel de acceso de la clase tiene prioridad.

mbito. Una clase est en mbito a lo largo de todo el espacio de nombres, clase, estructura o mdulo que la contiene. El mbito de todos los miembros de la clase es la clase completa. Perodo de duracin. Visual Basic no admite las clases estticas. Un mdulo proporciona el equivalente funcional de una clase esttica. Para obtener ms informacin, vea Module (Instruccin). Los miembros de clase tienen duraciones que dependen de cmo y dnde se declaran. Para obtener ms informacin, vea Perodo de duracin en Visual Basic.

Calificacin. El cdigo que se encuentra fuera de una clase debe calificar el nombre de un miembro con el nombre de la clase. Si el cdigo de una clase anidada hace una referencia no calificada a un elemento de programacin, Visual Basic busca el primer elemento en la clase anidada, despus en su clase contenedora y as sucesivamente hasta llegar al elemento contenedor ms externo. Para obtener ms informacin, vea Resolver una referencia cuando muchas variables tienen el mismo nombre.

Clases y mdulos Estos elementos tienen muchas similitudes, pero hay tambin algunas diferencias importantes.

Terminologa. Las versiones anteriores de Visual Basic reconocen dos tipos de mdulos: mdulos de clase (archivos .cls) y mdulos estndar (archivos .bas). En la versin actual se denominan clases y mdulos, respectivamente.

Miembros compartidos. Se puede controlar si un miembro de una clase es un miembro compartido o de instancia. Orientacin a objetos. Las clases son orientadas a objetos, pero los mdulos no lo son. Se puede crear una o ms instancias de una clase. Para obtener ms informacin, vea Clases y mdulos.

Ejemplo En el ejemplo siguiente se utiliza una instruccin Class para definir una clase y varios miembros. Visual Basic Copiar cdigo

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

Structure (Instruccin)
Declara el nombre de una estructura e introduce la definicin de las variables, propiedades, eventos y procedimientos que incluye la estructura.

[ <attributelist> ] [ accessmodifier ] [ Shadows ] [ Partial ] _ Structure name [ ( Of typelist ) ] [ Implements interfacenames ] datamemberdeclarations [ methodmemberdeclarations ] End Structure
Partes attributelist Opcional. Vea la Lista de atributos. accessmodifier Opcional. Puede ser una de las siguientes:

Public Protected Friend Private Protected Friend

Vea Niveles de acceso en Visual Basic. Shadows Opcional. Vea Shadows. Partial Opcional. Indica una definicin parcial de la estructura. Vea Partial (Visual Basic). name Obligatorio. Nombre de esta estructura. Vea Nombres de elementos declarados. Of Opcional. Especifica que se trata de una estructura genrica. typelist Es obligatorio si se utiliza la palabra clave Of. Lista de parmetros de tipo de esta estructura. Vea la Lista de tipos. Implements Opcional. Indica que esta estructura implementa los miembros de una o ms interfaces. Vea Implements (Instruccin). interfacenames

Es obligatorio si se utiliza la instruccin Implements. Nombres de las interfaces implementadas por esta estructura. datamemberdeclarations Obligatorio. Una o varias instrucciones Const, Dim, Enum o Event que declaran miembros de datos de la estructura. methodmemberdeclarations Opcional. Cero o ms declaraciones de los procedimientos Function, Operator, Property o Sub que sirven como miembros del mtodo de la estructura. End Structure Obligatorio. Termina la definicin Structure. Comentarios La instruccin Structure define un tipo de valor compuesto que se puede personalizar. Una estructura es una generalizacin de un tipo definido por el usuario de versiones anteriores de Visual Basic. Para obtener ms informacin, vea Estructuras: tipos de datos propios. Las estructuras admiten muchas de las mismas caractersticas como clases. Por ejemplo, las estructuras pueden tener propiedades y procedimientos, pueden implementar interfaces y pueden tener constructores con parmetros. No obstante, existen diferencias de consideracin entre las estructuras y las clases en materias como la herencia, las declaraciones y la utilizacin. Adems, las clases son tipos de referencia y las estructuras son tipos de valor. Para obtener ms informacin, vea Estructuras y clases. Slo puede utilizar Structure en un espacio de nombres o un nivel de mdulo. Esto significa que el contexto de la declaracin para una enumeracin debe ser un archivo de cdigo fuente, espacio de nombres, clase, estructura, mdulo o interfaz y no puede ser un procedimiento o bloque. Para obtener ms informacin, vea Contextos de declaracin y niveles de acceso predeterminados. De manera predeterminada, el acceso a las estructuras es de tipo Friend (Visual Basic). Puede ajustar sus niveles de acceso con los modificadores de acceso. Para obtener ms informacin, vea Niveles de acceso en Visual Basic. Reglas

Anidado. Puede definir una estructura dentro de otra. La estructura exterior se denomina estructura contenedora y la interna estructura anidada. Sin embargo, no puede tener acceso a los miembros de una estructura anidada a travs de la estructura contenedora. En lugar de ello, debe declarar una variable del tipo de datos de la estructura anidada.

Declaracin de miembros Debe declarar cada miembro de una estructura. Los miembros de una estructura no pueden ser de tipo Protected ni Protected Friend ya que no se puede heredar de una estructura. La propia estructura, sin embargo, puede ser de tipo Protected o Protected Friend. Debe declarar al menos una variable no compartida o un evento no compartido y no personalizado en una estructura. No pueden utilizarse nicamente constantes, propiedades y procedimientos, aunque algunos sean no compartidos.

Inicializacin. No se puede inicializar el valor de ningn miembro de datos no compartido de una estructura como parte de su declaracin. Dicho miembro de datos se debe inicializar mediante un constructor con parmetros en la estructura o bien mediante la asignacin de un valor al miembro despus de crear una instancia de la estructura.

Herencia. Una estructura no puede heredar de ningn tipo distinto de ValueType, del que todas las estructuras heredan. En particular, una estructura no puede heredar de otra. No puede utilizar Inherits (Instruccin) en una definicin de estructura, incluso si es para especificar ValueType.

Implementacin. Si la estructura utiliza Implements (Instruccin), debe implementar cada miembro definido por cada interfaz que especifica en interfacenames. Propiedad Default. Una estructura puede especificar a lo sumo una propiedad como su propiedad predeterminada, con el modificador Default (Visual Basic) Para obtener ms informacin, vea Propiedades predeterminadas.

Comportamiento

Nivel de acceso. En una estructura, puede declarar cada miembro con su propio nivel de acceso. El acceso predeterminado de todos los miembros de la estructura es de tipo Public (Visual Basic). Si la propia estructura utiliza un nivel de acceso ms limitado, se restringe automticamente el acceso a sus miembros, aunque ajuste sus niveles de acceso con los modificadores.

mbito. Una estructura est en mbito en su espacio de nombres contenedor, clase, estructura o mdulo. El mbito de todos los miembros de la estructura es la estructura completa.

Perodo de duracin. Una estructura no dispone por s misma de perodo de duracin. Ms bien, cada instancia de esa estructura tiene un perodo de duracin independiente de todas las dems instancias. El perodo de duracin de una instancia comienza cuando se crea con una clusula New (Visual Basic). Finaliza cuando finaliza el perodo de duracin de la variable que la contiene. No puede extender el perodo de duracin de una instancia de estructura. Los mdulos proporcionan una aproximacin a la funcionalidad de estructura esttica. Para obtener ms informacin, vea Module (Instruccin). Los miembros de estructura disponen de perodo de duracin en funcin de cmo y donde se declaran. Para obtener ms informacin, vea el apartado sobre perodos de duracin en Instruccin Class (Visual Basic).

Calificacin. El cdigo que se incluye fuera de una estructura debe calificar el nombre de un miembro con el nombre de dicha estructura. Si el cdigo incluido en una estructura anidada realiza una referencia sin calificar a un elemento de programacin, Visual Basic busca este elemento en la estructura anidada en primer lugar, a continuacin en la estructura contenedora y as sucesivamente hasta el elemento contenedor principal. Para obtener ms informacin, vea Resolver una referencia cuando muchas variables tienen el mismo nombre.

Consumo de memoria. Como en los dems 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 ms, no puede suponerse que el orden de almacenamiento en la memoria sea el mismo que el orden de la declaracin. Si necesita controlar el diseo de almacenamiento de una estructura, puede aplicar el atributo StructLayoutAttribute a la instruccin Structure.

Ejemplo

En el siguiente ejemplo se utiliza la instruccin 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. Tambin se muestran los miembros de evento, propiedad y procedimiento. Visual Basic Copiar cdigo

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

Module (Instruccin)
Declara el nombre de un mdulo e introduce la definicin de las variables, propiedades, eventos y procedimientos que incluye el mdulo.

[ <attributelist> ] [ accessmodifier ] [ statements ] End Module


Partes attributelist Opcional. Vea Lista de atributos. accessmodifier Opcional. Puede ser una de las siguientes:

Module name

Public Friend

Vea Niveles de acceso en Visual Basic. name Obligatorio. Nombre de este mdulo. Vea Nombres de elementos declarados.

statements Opcional. Instrucciones que definen las variables, propiedades, eventos, procedimientos y tipos anidados de este mdulo. End Module Termina la definicin Module. Comentarios Una instruccin Module define un tipo de referencia disponible en su espacio de nombres. Un mdulo (a veces denominado mdulo estndar) es similar a una clase pero con algunas distinciones importantes. Cada mdulo tiene exactamente una instancia y no necesita ser creado ni asignado a una variable. Los mdulos no admiten la herencia ni implementan interfaces. Tenga en cuenta que un mdulo no es un tipo en el sentido en que lo son una clase o una estructura; es decir, no puede declarar que un elemento de programacin tenga el tipo de datos de un mdulo. Slo puede utilizar Module en el nivel de espacio de nombres. Esto significa que el contexto de la declaracin de un mdulo debe ser un archivo de cdigo fuente o espacio de nombres y no puede ser una clase, estructura, mdulo, interfaz, procedimiento o bloque. No puede anidar un mdulo dentro de otro mdulo ni dentro de cualquier tipo. Para obtener ms informacin, vea Contextos de declaracin y niveles de acceso predeterminados. Un mdulo tiene el mismo perodo de duracin que el programa. Dado que sus miembros son todos de tipo Shared, tambin tienen los perodos de duracin iguales al del programa. De manera predeterminada, el acceso a los mdulos es de tipo Friend (Visual Basic). Puede ajustar sus niveles de acceso con los modificadores de acceso. Para obtener ms informacin, vea Niveles de acceso en Visual Basic. Todos los miembros de un mdulo son de forma implcita de tipo Shared. Clases y mdulos Estos elementos tienen muchas similitudes, pero hay tambin algunas diferencias importantes.

Terminologa. Las versiones anteriores de Visual Basic reconocen dos tipos de mdulos: mdulos de clase (archivos .cls) y mdulos estndar (archivos .bas). La versin actual les llama clases y mdulos, respectivamente.

Miembros compartidos. Puede controlar si un miembro de una clase es un miembro compartido o un miembro de instancia. Orientacin a objetos. Las clases estn orientadas a los objetos, pero los mdulos no. Por tanto, slo se pueden crear instancias como objetos de las clases. Para obtener ms informacin, vea Clases y mdulos.

Reglas

Modificadores. Todos los miembros de mdulo son implcitamente de tipo Shared (Visual Basic). No puede utilizar la palabra clave Shared al declarar un miembro y no puede modificar el estado compartido de ningn miembro.

Herencia. Un mdulo no puede heredar de ningn tipo distinto de Object, del que heredan todos los mdulos. En particular, un mdulo no puede heredar de otro. No puede utilizar Inherits (Instruccin) en una definicin de mdulo, incluso si es para especificar Object.

Propiedad Default. No puede definir Propiedades predeterminadas en un mdulo.

Comportamiento

Nivel de acceso. En un mdulo, puede declarar cada miembro con su propio nivel de acceso. Los miembros de mdulo tienen como valor predeterminado acceso de tipo Public (Visual Basic), excepto las variables y constantes, que tienen como valor predeterminado acceso de tipo Private (Visual Basic). Cuando un mdulo tiene un acceso ms restringido que uno de sus miembros, tiene prioridad el nivel de acceso del mdulo especificado.

mbito. Los mdulos se incluyen en el mbito de sus espacios de nombre. El mbito de todos los miembros del mdulo es el mdulo completo. Observe que en todos los miembros se realiza la promocin de tipos, que provoca que su mbito sea el espacio de nombres que contiene el mdulo. Para obtener ms informacin, vea Promocin de tipos.

Calificacin. Puede tener varios mdulos en un proyecto y puede declarar miembros con el mismo nombre en dos o ms mdulos. Sin embargo, si la referencia procede del exterior del mdulo debe calificar cualquier referencia a dichos miembros con el nombre del mdulo adecuado. Para obtener ms informacin, vea Resolver una referencia cuando muchas variables tienen el mismo nombre.

Ejemplo Visual Basic Copiar cdigo

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

Instruccin Interface (Visual Basic)


Declara el nombre de una interfaz e introduce las definiciones de los miembros que incluye la interfaz.

[ <attributelist> ] [ accessmodifier ] [ Shadows ] _ Interface name [ ( Of typelist ) ] [ Inherits interfacenames ] [ [ modifiers ] Property membername ] [ [ modifiers ] Function memberame ] [ [ modifiers ] Sub memberame ] [ [ modifiers ] Event memberame ] [ [ modifiers ] Interface memberame ] [ [ modifiers ] Class memberame ] [ [ modifiers ] Structure memberame ] End Interface
Partes attributelist Opcional. Vea Lista de atributos. accessmodifier Opcional. Puede ser una de las siguientes:

Public Protected Friend Private

Protected Friend

Vea Niveles de acceso en Visual Basic. Shadows Opcional. Vea Shadows. name Obligatorio. Nombre de esta interfaz. Vea Nombres de elementos declarados. Of Opcional. Especifica que sta es una interfaz genrica. typelist Es obligatoria si se utiliza la palabra clave Of. Lista de parmetros de tipo de esta interfaz. Vea Lista de tipos. Inherits Opcional. Indica que esta interfaz hereda los atributos y miembros de otra interfaz o interfaces. Vea Inherits (Instruccin). interfacenames Es obligatoria si se utiliza la instruccin Inherits. Nombres de las interfaces de las que deriva esta interfaz. modifiers Opcional. Modificadores adecuados para el miembro de interfaz que se est definiendo. Property Opcional. Define una propiedad que es un miembro de la interfaz. Function Opcional. Define un procedimiento Function que es un miembro de la interfaz. Sub Opcional. Define un procedimiento Sub que es un miembro de la interfaz. Event Opcional. Define un evento que es un miembro de la interfaz. Interface Opcional. Define una interfaz que est anidada dentro de esta interfaz. La definicin de interfaz anidada debe finalizar con una instruccin End Interface. Class Opcional. Define una clase que es un miembro de la interfaz. La definicin de clase miembro debe finalizar con una instruccin End Class. Structure Opcional. Define una estructura que es un miembro de la interfaz. La definicin de estructura miembro debe finalizar con una instruccin End Structure. membername Obligatorio para cada propiedad, procedimiento, evento, interfaz, clase o estructura definidos como miembro de la interfaz. Nombre del miembro. End Interface Termina la definicin de Interface.

Comentarios Una interfaz define un conjunto de miembros, como las propiedades y procedimientos, que pueden implementar las clases y estructuras. La interfaz slo define las firmas de los miembros y no sus mecanismos internos. Una clase o estructura implementa la interfaz proporcionando cdigo para cada miembro definido por la interfaz. Finalmente, cuando la aplicacin crea una instancia a partir de esa clase o estructura, existe un objeto y se ejecuta en memoria. Para obtener ms informacin, vea Programacin orientada a objetos en Visual Basic y Interfaces en Visual Basic. Para consultar una comparacin de interfaces y clases, vea Informacin general sobre interfaces. Slo puede utilizar Interface en un espacio de nombres o al nivel de mdulo. Esto significa que el contexto de la declaracin de una interfaz debe ser un archivo de cdigo fuente, espacio de nombres, clase, estructura, mdulo o interfaz y no puede ser un procedimiento ni un bloque. Para obtener ms informacin, vea Contextos de declaracin y niveles de acceso predeterminados. Las interfaces tienen Friend (Visual Basic) como acceso predeterminado. Puede ajustar sus niveles de acceso con los modificadores de acceso. Para obtener ms informacin, vea Niveles de acceso en Visual Basic. Reglas

Anidar interfaces. Puede definir una interfaz dentro de otra. La interfaz exterior se denomina la interfaz contenedora y la interfaz interior se denomina interfaz anidada. Declaracin de miembro. Cuando declara una propiedad o procedimiento como un miembro de una interfaz, est definiendo slo la firma de esa propiedad o procedimiento. Esto incluye el tipo de elemento (propiedad o procedimiento), sus parmetros y tipos de parmetro y su tipo de valor devuelto. Por esta razn, la definicin de miembro slo utiliza una lnea de cdigo y las instrucciones de terminacin como End Function o End Property no son vlidas en las interfaces. En cambio, cuando define una enumeracin o estructura, o una clase o interfaz anidada, es necesario incluir sus miembros de datos.

Modificadores de miembros. No puede utilizar ningn modificador de acceso al definir miembros de mdulo de definicin, ni se puede especificar Shared (Visual Basic) ni ningn modificador de procedimiento excepto Overloads. Puede declarar cualquier miembro con Shadows y puede utilizar Default (Visual Basic) al definir una propiedad, as como ReadOnly (Visual Basic) o WriteOnly.

Herencia. Si la interfaz utiliza la Inherits (Instruccin), puede especificar una o ms interfaces base. Puede heredar de dos interfaces aun cuando cada una de ellas defina un miembro con el mismo nombre. De hacerlo as, el cdigo que implementa debe utilizar la calificacin de nombres para especificar qu miembro est implementando. Una interfaz no puede heredar de otra interfaz con un nivel de acceso ms restrictivo. Por ejemplo, una interfaz Public no puede heredar una interfaz de tipo Friend. Una interfaz no puede heredar de una interfaz anidada dentro de ella.

Implementacin. Cuando una clase utiliza la instruccin Implements (Visual Basic) para implementar esta interfaz, debe implementar todos los miembros definidos dentro de la interfaz. Adems, cada firma incluida el cdigo que implementa debe coincidir exactamente con la firma correspondiente definida en esta interfaz. Sin embargo, el nombre del miembro

del cdigo que implementa no tiene por qu coincidir con el nombre de miembro definido en la interfaz. Cuando una clase est implementando un procedimiento, no puede designar el procedimiento como Shared.

Propiedad predeterminada. Una interfaz puede especificar a lo sumo una propiedad como su propiedad predeterminada, a la que se puede hacer referencia sin utilizar el nombre de propiedad. Esta propiedad se especifica declarndola con el modificador Default (Visual Basic). Para obtener ms informacin, vea Propiedades predeterminadas. Observe que esto significa que una interfaz slo puede definir una propiedad predeterminada si no hereda ninguna.

Comportamiento

Nivel de acceso. Todos los miembros de interfaz tienen implcitamente acceso Public (Visual Basic). No puede utilizar ningn 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 el de la interfaz subyacente o el de la clase implementadora. Esto se ilustra en el siguiente ejemplo: Visual Basic Copiar cdigo

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 travs de varAsInterface, todos ellos tienen acceso pblico. Sin embargo, si tiene acceso a los miembros a travs de varAsClass, el procedimiento Sub doSomething tiene acceso privado.

mbito. Una interfaz est en mbito a lo largo de su espacio de nombres, clase, estructura o mdulo. El mbito de cada uno de los miembros de la interfaz es la interfaz completa.

Perodo de duracin. Una interfaz no tiene en s misma un perodo de duracin, ni tampoco sus miembros. Cuando una clase implementa una interfaz y se crea un objeto como una instancia de esa clase, el objeto tiene un perodo de duracin dentro de la aplicacin en la que se est ejecutando. Para obtener ms informacin, vea "Perodo de duracin" en Instruccin Class (Visual Basic).

Ejemplo El ejemplo siguiente utiliza la instruccin Interface para definir una interfaz denominada

thisInterface, que se debe implementar con una instruccin Property y una instruccin Function.
Visual Basic Copiar cdigo

Public Interface thisInterface Property thisProp(ByVal thisStr As String) As Char Function thisFunc(ByVal thisInt As Integer) As Integer End Interface
Observe que las instrucciones Property y Function no introducen el bloques que terminan con End Property y End Function dentro de la interfaz. Una interfaz slo define las firmas de sus miembros. Los bloques Property y Function completos aparecen en las clases que implementan thisInterface.

Instruccin Function (Visual Basic)


Declara el nombre, los parmetros y el cdigo que definen un procedimiento Function.

[ <attributelist> ] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] Function name [ (Of typeparamlist) ] [ (parameterlist) ] [ As returntype ] [ Implements implementslist | Handles eventlist ] [ statements ] [ Exit Function ] [ statements ] End Function
Partes attributelist Opcional. Vea la Lista de atributos. accessmodifier Opcional. Puede ser una de las siguientes:

Public Protected Friend Private Protected Friend

Vea Niveles de acceso en Visual Basic. proceduremodifiers Opcional. Puede ser una de las siguientes:


Shared

Overloads Overrides Overridable NotOverridable MustOverride MustOverride Overrides NotOverridable Overrides

Opcional. Vea Shared. Shadows

Opcional. Vea Shadows. name Obligatorio. Nombre del procedimiento. Vea Nombres de elementos declarados. typeparamlist Opcional. Lista de parmetros de tipo para un procedimiento genrico. Vea la Lista de tipos. parameterlist Opcional. Lista de nombres de variables locales que representan los parmetros de este procedimiento. Vea la Lista de argumentos. returntype Obligatorio si Option Strict es On. Tipo de datos del valor devuelto por este procedimiento. Implements Opcional. Indica que este procedimiento implementa uno o ms procedimientos Function, cada uno de los cuales se define en una interfaz implementada por la clase contenedora o la estructura de este procedimiento. Vea Implements (Instruccin). implementslist Requerido si se suministra Implements. Lista de procedimientos Function que se implementan.

implementedprocedure [ , implementedprocedure ... ]


Cada implementedprocedure tiene la sintaxis y las partes siguientes:

interface.definedname
Parte interface Descripcin Obligatorio. Nombre de una interfaz implementada por la clase contenedora o la estructura de este procedimiento. Obligatorio. Nombre por el que se define el procedimiento en interface.

definedname Handles

Opcional. Indica que este procedimiento puede controlar uno o ms eventos especficos. Vea Handles. eventlist Requerido si se suministra Handles. Lista de eventos que controla este procedimiento.

eventspecifier [ , eventspecifier ... ]


Cada eventspecifier tiene la sintaxis y las partes siguientes:

eventvariable.event
Parte eventvariable Descripcin Obligatorio. Variable de objeto declarada con el tipo de datos de la clase o estructura que provoca el evento. Obligatorio. Nombre del evento que controla este procedimiento.

event statements

Opcional. Bloque de instrucciones que se ejecutan dentro de este procedimiento. End Function

Termina la definicin de este procedimiento. Comentarios El cdigo ejecutable debe estar en un procedimiento. Cada procedimiento se declara a su vez dentro de una clase, estructura o mdulo, que se denominan clase contenedora, estructura o mdulo. Utilice un procedimiento Function cuando necesita devolver un valor al cdigo de llamada. Utilice un procedimiento Sub cuando no necesita devolver un valor. Slo puede utilizar Function en el nivel de mdulo. Esto significa que el contexto de la declaracin para una funcin debe ser una clase, estructura, mdulo o interfaz y no puede ser un archivo de cdigo fuente, espacio de nombres, procedimiento o bloque. Para obtener ms informacin, vea Contextos de declaracin y niveles de acceso predeterminados. Los procedimientos Function tienen como valor predeterminado el acceso pblico. Puede ajustar sus niveles de acceso con los modificadores de acceso. Se puede utilizar un procedimiento Function en el lado derecho de una expresin cuando desee utilizar el valor devuelto por la funcin. El procedimiento Function se utiliza de la misma manera que utiliza cualquier funcin de la biblioteca como por ejemplo Sqrt, Cos o ChrW. Puede llamar a un procedimiento Function con el nombre del procedimiento, seguido por la lista de argumentos entre parntesis, en una expresin. Si no se proporcionan argumentos, se pueden omitir los parntesis. Sin embargo, el cdigo es ms legible si se incluyen siempre los parntesis. Se puede llamar una funcin tambin mediante la instruccin Call. En cualquier caso, el valor devuelto se pasar por alto.

Nota: Visual Basic 2008 introduce las expresiones lambda, que permiten definir funciones en lnea. Para obtener ms informacin, vea Expresiones lambda. Reglas

Tipo de valor devuelto. La instruccin Function puede declarar el tipo de datos del valor que devuelve. Puede especificar cualquier tipo de datos o el nombre de una enumeracin, estructura, clase o interfaz. Si no especifica returntype, el procedimiento devuelve un tipo Object.

Implementacin. Si este procedimiento utiliza la palabra clave Implements, la clase contenedora o la estructura tambin deben incluir una instruccin Implements inmediatamente despus de la instruccin Class o Structure. La instruccin Implements debe incluir cada interfaz especificada en implementslist. Sin embargo, el nombre con el que una interfaz define Function (en definedname) no tiene que ser el mismo que el nombre de este procedimiento (en name).

Comportamiento

Volver de un procedimiento. Cuando el procedimiento Function vuelva al cdigo de llamada, la ejecucin contina con la instruccin que sigue a la instruccin que lo llam. Las instrucciones Exit Function y Return provocan una salida inmediata de un procedimiento Function. Puede aparecer cualquier nmero de instrucciones Exit Function y Return en cualquier parte del procedimiento y puede combinar instrucciones Exit Function y Return.

Valor devuelto. Para devolver un valor de una funcin, se puede asignar el valor al nombre de funcin o incluirlo en una instruccin Return. El ejemplo siguiente asigna el valor

devuelto al nombre de funcin myFunction y, a continuacin, utiliza la instruccin Exit Function para volver: Visual Basic Copiar cdigo

Function myFunction(ByVal j As Integer) As Double myFunction = 3.87 * j Exit Function End Function
Si utiliza Exit Function sin asignar un valor a name, el procedimiento devuelve el valor predeterminado del tipo de datos especificado en returntype. Si no se especifica returntype, el procedimiento devuelve Nothing, el valor predeterminado de Object.

La instruccin Return asigna el valor devuelto y sale de la funcin. Esto se muestra en el siguiente ejemplo. Visual Basic Copiar cdigo

Function myFunction(ByVal j As Integer) As Double Return 3.87 * j End Function


Solucin de problemas

Orden de ejecucin. Visual Basic reorganiza a veces las expresiones aritmticas para aumentar la eficacia interna. Por esta razn, evite utilizar un procedimiento Function en una expresin aritmtica cuando la funcin cambie el valor de las variables en la misma expresin.

Ejemplo En el siguiente ejemplo se utiliza la instruccin Function para declarar el nombre, parmetros y cdigo que forman el cuerpo de un procedimiento Function. El modificador ParamArray permite a la funcin aceptar un nmero variable de argumentos. Visual Basic Copiar cdigo

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
En el ejemplo siguiente se invoca a la funcin declarada en el ejemplo anterior. Visual Basic Copiar cdigo

Dim returnedValue As Double = calcSum(4, 3, 2, 1) ' The function's local variables are assigned the following values: ' args(0) = 4, args(1) = 3, and so on.

Instruccin Sub (Visual Basic)


Declara el nombre, los parmetros y el cdigo que definen un procedimiento Sub.

[ <attributelist> ] [Partial] [ accessmodifier ] [ proceduremodifiers ] [ Shared ] [ Shadows ] Sub name [ (Of typeparamlist) ] [ (parameterlist) ] [ Implements implementslist | Handles eventlist ]

[ statements ] [ Exit Sub ] [ statements ] End Sub


Partes attributelist Opcional. Vea Lista de atributos. Partial Opcional. Indica la definicin de un mtodo parcial. Vea Mtodos Partial. accessmodifier Opcional. Puede ser una de las siguientes:

Public Protected Friend Private Protected Friend

Vea Niveles de acceso en Visual Basic. proceduremodifiers Opcional. Puede ser una de las siguientes:


Shared

Overloads Overrides Overridable NotOverridable MustOverride MustOverride Overrides NotOverridable Overrides

Opcional. Vea Shared. Shadows Opcional. Vea Shadows. name Obligatorio. Nombre del procedimiento. Vea Nombres de elementos declarados. typeparamlist Opcional. Lista de parmetros de tipo para un procedimiento genrico. Vea Lista de tipos. parameterlist Opcional. Lista de nombres de variable local que representan los parmetros de este procedimiento. Vea Lista de parmetros. Implements

Opcional. Indica que este procedimiento implementa uno o ms procedimientos Sub, cada uno definido en una interfaz implementada por la clase o estructura contenedora de este procedimiento. Vea Implements (Instruccin). implementslist Requerido si se suministra Implements. Lista de procedimientos Sub que se implementan.

implementedprocedure [ , implementedprocedure ... ]


Cada implementedprocedure tiene la sintaxis y las partes siguientes:

interface.definedname
Parte interface Descripcin Obligatorio. Nombre de una interfaz implementada por la clase o estructura contenedora de este procedimiento. Obligatorio. Nombre por el que est definido el procedimiento en interface.

definedname Handles

Opcional. Indica que este procedimiento puede controlar uno o ms eventos concretos. Vea Handles. eventlist Requerido si se suministra Handles. Lista de eventos que este procedimiento controla.

eventspecifier [ , eventspecifier ... ]


Cada eventspecifier tiene la sintaxis y las partes siguientes:

eventvariable.event
Parte eventvariable Descripcin Obligatorio. Variable de objeto declarada con el tipo de datos de la clase o estructura que provoca el evento. Obligatorio. Nombre del evento que este procedimiento controla.

event statements

Opcional. Bloque de instrucciones que se ejecuta dentro de este procedimiento. End Sub Termina la definicin de este procedimiento. Comentarios Todo el cdigo ejecutable debe estar dentro de un procedimiento. Utilice un procedimiento Sub cuando no necesite devolver un valor al cdigo de llamada. Utilice un procedimiento Function cuando necesite devolver un valor. Slo puede utilizar Sub en el nivel de mdulo. Esto significa que el contexto de declaracin de un procedimiento Sub tiene que ser una clase, estructura, mdulo o interfaz, y no puede ser un archivo de cdigo fuente, espacio de nombres, procedimiento o bloque. Para obtener ms informacin, vea Contextos de declaracin y niveles de acceso predeterminados. Los procedimientos Sub tienen como valor predeterminado el acceso pblico. Puede ajustar sus niveles de acceso con los modificadores de acceso. Reglas

Implementacin. Si este procedimiento utiliza la palabra clave Implements, la clase o estructura contenedora deben tener una instruccin Implements inmediatamente despus de la instruccin Class o Structure. La instruccin Implements debe incluir cada interfaz especificada en implementslist. Sin embargo, el nombre por el que una interfaz define el procedimiento Sub (en definedname) no tiene que ser igual que el nombre de este procedimiento (en name).

Comportamiento

Volver de un procedimiento. Cuando el procedimiento Sub regrese al cdigo que realiza la llamada, la ejecucin contina con la instruccin que sigue a la instruccin que lo llam. Las instrucciones Exit Sub y Return provoca una salida inmediata de un procedimiento Sub. Puede aparecer cualquier nmero de instrucciones Exit Sub y Return en cualquier parte del procedimiento y se pueden combinar instrucciones Exit Sub y Return. En el ejemplo siguiente se muestra cmo volver de un procedimiento Sub. Copiar cdigo

Sub mySub(ByVal q As String) Return End Sub


Llamar a un procedimiento. Un procedimiento Sub, al igual que un procedimiento Function, es un procedimiento independiente que puede tomar parmetros y ejecutar una serie de instrucciones. Sin embargo, a diferencia de un procedimiento Function, que devuelve un valor, un procedimiento Sub no se puede utilizar en una expresin. Puede llamar a un procedimiento Sub con el nombre del procedimiento, seguido por la lista de argumentos entre parntesis, en una instruccin. Si no se proporcionan argumentos, se pueden omitir los parntesis. Sin embargo, el cdigo es ms legible si siempre se incluyen parntesis. Opcionalmente puede utilizar la instruccin Call para llamar al procedimiento Sub. De este modo se puede mejorar la legibilidad del cdigo. Solucin de problemas Orden de ejecucin. Visual Basic reorganiza a veces las expresiones aritmticas para aumentar la eficacia interna. Por esa razn, si la lista de argumentos incluye expresiones que llaman a otros procedimientos, no puede confiar en que se les llame en un orden determinado. Ejemplo En este ejemplo se utiliza la instruccin Sub para definir el nombre, parmetros y cdigo que forman el cuerpo de un procedimiento Sub. Visual Basic Copiar cdigo

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

Declare (Instruccin)

Declara una referencia a un procedimiento implementado en un archivo externo.

[ <attributelist> ] [ accessmodifier ] [ Declare [ charsetmodifier ] [ Sub ] name [ Alias "aliasname" ] [ ([ parameterlist ' -or[ <attributelist> ] [ accessmodifier ] [ Declare [ charsetmodifier ] [ Function ] [ Alias "aliasname" ] [ ([ parameterlist
Partes attributelist Opcional. Vea Lista de atributos. accessmodifier Opcional. Puede ser una de las siguientes:

Shadows ] [ Overloads ] _ Lib "libname" _ ]) ] Shadows ] [ Overloads ] _ name Lib "libname" _ ]) ] [ As returntype ]

Public Protected Friend Private Protected Friend

Vea Niveles de acceso en Visual Basic. Shadows Opcional. Vea Shadows. charsetmodifier Opcional. Especifica informacin sobre el juego de caracteres y la bsqueda de archivos. Puede ser una de las siguientes:


Sub

Ansi (predeterminado) Unicode (Visual Basic) Auto

Opcional, pero debe aparecer Sub o Function. Indica que el procedimiento externo no devuelve ningn 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 ms informacin, vea Nombres de elementos declarados. Lib Obligatorio. Introduce una clusula Lib, que especifica el archivo que contiene el procedimiento que se declara. libname Obligatorio. Nombre del archivo que contiene el procedimiento declarado. Alias

Opcional. Indica que el procedimiento que se declara no se puede identificar dentro de su archivo mediante el nombre especificado en name. Su identificacin se especifica en aliasname. aliasname Es obligatorio si se utiliza la palabra clave Alias. Cadena que identifica el procedimiento en una de estas dos maneras: Nombre del punto de entrada del procedimiento dentro de su archivo, entre comillas ("") O bien, Signo de nmero (#) seguido de un entero que especifica el nmero ordinal del punto de entrada del procedimiento en su archivo parameterlist Es obligatorio si el procedimiento toma parmetros. Vea Lista de parmetros. returntype Es obligatorio si se especifica Function y Option Strict tiene el valor On. Tipo de datos del valor devuelto por el procedimiento. Comentarios A veces es necesario llamar a un procedimiento definido en un archivo (como un archivo DLL o un recurso de cdigo) fuera del proyecto. Cuando se hace esto, el compilador de Visual Basic no tiene acceso a la informacin necesaria para llamar correctamente al procedimiento, por ejemplo dnde est ubicado el procedimiento, cmo se identifica, la secuencia de llamada y el tipo de valor devuelto, y el juego de caracteres de cadena que utiliza. La instruccin Declare crea una referencia a un procedimiento externo y proporciona esta informacin necesaria. Declare slo se puede utilizar en el nivel de mdulo. Esto significa que el contexto de declaracin de una referencia externa debe ser una clase, estructura o mdulo, y no puede ser un archivo de cdigo fuente, espacio de nombres, interfaz, procedimiento o bloque. Para obtener ms informacin, vea Contextos de declaracin y niveles de acceso predeterminados. Las referencias externas tienen como valor predeterminado el acceso Public (Visual Basic). Los niveles de acceso se pueden ajustar con los modificadores de acceso. Reglas

Atributos. Los atributos se pueden aplicar a una referencia externa. Cualquier atributo que se aplique slo tiene efecto en su proyecto, no en el archivo externo. Modificadores. Los procedimientos externos son implcitamente Shared (Visual Basic). No se puede utilizar la palabra clave Shared al declarar una referencia externa y no se puede modificar su estado compartido. Un procedimiento externo no puede participar en operaciones de reemplazar, implementar miembros de interfaz o controlar eventos. En consecuencia, no se pueden utilizar las palabras clave Overrides, Overridable, NotOverridable, MustOverride, Implements o Handles en una instruccin Declare.

Nombre del procedimiento externo. No hay que asignar a esta referencia externa (en name) el mismo nombre que tiene el nombre del punto de entrada del procedimiento en su archivo externo (aliasname). Se puede utilizar una clusula Alias para especificar el nombre del punto de entrada. Esto puede ser til si el procedimiento externo tiene el mismo nombre que un modificador reservado de Visual Basic o una variable, procedimiento o cualquier otro elemento de programacin del mismo mbito.

Nota: En la mayora de los archivos DLL, los nombres de punto de entrada distinguen entre maysculas y minsculas.

Nmero de procedimiento externo. Alternativamente, se puede utilizar una clusula Alias para especificar el nmero ordinal del punto de entrada dentro de la tabla de exportacin del archivo externo. Para ello, comience aliasname con un signo de nmero (#). Esto puede ser til si un carcter del nombre de procedimiento externo no se permite en Visual Basic o si el archivo externo exporta el procedimiento sin un nombre.

Reglas de tipos de datos

Tipos de datos de parmetros. Si Option Strict tiene el valor On, se debe especificar el tipo de datos de cada parmetro en parameterlist. ste puede ser cualquier tipo de datos o el nombre de una enumeracin, estructura, clase o interfaz. En parameterlist, se utiliza una clusula As para especificar el tipo de datos del argumento que se va a pasar a cada parmetro.

Nota: Si el procedimiento externo no se ha escrito para .NET Framework, debe tener cuidado de que los tipos de datos se correspondan. Por ejemplo, si se declara una referencia externa a un procedimiento de Visual Basic 6.0 con un parmetro Integer (16 bits en Visual Basic 6.0), el argumento correspondiente debe identificarse como Short en la instruccin Declare, puesto que es un tipo entero de 16 bits en Visual Basic. Igualmente, en Visual Basic 6.0 Long tiene un ancho de datos diferente y Date se implementa de manera diferente.

Tipo de datos devuelto. Si el procedimiento externo es de tipo Function y Option Strict tiene el valor On, hay que especificar el tipo de datos del valor devuelto al cdigo de llamada. ste puede ser cualquier tipo de datos o el nombre de una enumeracin, estructura, clase o interfaz.

Nota: El compilador de Visual Basic no comprueba si los tipos de datos son compatibles con los del procedimiento externo. Si hay una desigualdad, Common Language Runtime genera una excepcin MarshalDirectiveException en tiempo de ejecucin.

Tipos de datos predeterminados. Si Option Strict tiene el valor Off y no se especifica el tipo de datos de un parmetro en parameterlist, el compilador de Visual Basic convierte el argumento correspondiente en Object (Tipo de datos). Igualmente, si no se especifica returntype, el compilador asume que el tipo de datos devuelto es Object.

Nota: Como se trata de un procedimiento externo que podra haberse escrito en una plataforma diferente, es peligroso asumir cul ser el tipo de datos o permitir que tomen los valores predeterminados. Es mucho ms seguro especificar el tipo de datos de cada parmetro y del valor devuelto, si se devuelve alguno. De este modo mejora la legibilidad del cdigo. Comportamiento

mbito. Una referencia externa est en mbito a lo largo de toda su clase, estructura o mdulo. Perodo de duracin. Una referencia externa tiene el mismo perodo de duracin que la clase, estructura o mdulo en las que se declara.

Llamar a un procedimiento externo. Se puede llamar a un procedimiento externo de la misma manera que se llama a un procedimiento Function o Sub si se utiliza en una expresin cuando devuelve un valor o si se especifica en una instruccin Instruccin Call (Visual Basic) cuando no devuelve un valor. Pasa los argumentos al procedimiento externo exactamente como especifica parameterlist en la instruccin Declare. No tenga en cuenta cmo se declararon originalmente los parmetros en el archivo externo. Igualmente, si se devuelve un valor, utilcelo exactamente como especifica returntype en la instruccin Declare.

Juegos de caracteres. En charsetmodifier se puede especificar cmo Visual Basic debe calcular referencias a cadenas cuando se llama al procedimiento externo. El modificador Ansi indica a Visual Basic que calcule las referencias a todas las cadenas como valores ANSI y el modificador Unicode le indica que calcule las referencias a todas las cadenas como valores Unicode. El modificador Auto indica a Visual Basic que calcule las referencias a las cadenas segn las reglas de .NET Framework basadas en el parmetro name de la referencia externa o en el parmetro aliasname si se ha especificado. El valor predeterminado es Ansi. charsetmodifier tambin especifica cmo Visual Basic debe buscar el procedimiento externo en su archivo externo. Ansi y Unicode indican a Visual Basic que busque sin modificar el nombre durante la bsqueda. Auto indica a Visual Basic que debe determinar el juego de caracteres base de la plataforma en tiempo de ejecucin y, posiblemente, modificar el nombre del procedimiento externo, de la manera siguiente:

En una plataforma ANSI, como Windows 95, Windows 98 o Windows Millennium Edition, busque primero el procedimiento externo sin modificar el nombre. Si no se encuentra, anexe "A" al final del nombre del procedimiento externo y bsquelo de nuevo.

En una plataforma Unicode, como Windows NT, Windows 2000 o Windows XP, busque primero el procedimiento externo sin modificar el nombre. Si no se encuentra, anexe "W" al final del nombre del procedimiento externo y bsquelo de nuevo.

Mecanismo. Visual Basic utiliza el mecanismo de invocacin de plataforma (PInvoke) de .NET Framework para resolver los procedimientos externos y tener acceso a ellos. La instruccin Declare y la clase DllImportAttribute utilizan automticamente este mecanismo y no es necesario tener conocimientos de PInvoke. Para obtener ms informacin, vea Tutorial: Llamar a las API de Windows.

Nota de seguridad: Si el procedimiento externo se ejecuta fuera de Common Language Runtime (CLR), es cdigo no administrado. Cuando se llama a este tipo de procedimiento, por ejemplo una funcin de la API Win32 o un mtodo COM, la aplicacin podra quedar expuesta a riesgos de seguridad. Para obtener ms informacin, vea Cdigo no administrado. Ejemplo En el ejemplo siguiente se declara una referencia externa a un procedimiento Function que devuelve el nombre de usuario actual. A continuacin se llama al procedimiento externo GetUserNameA como parte del procedimiento getUser. Visual Basic Copiar cdigo

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
El atributo DllImportAttribute proporciona otro modo de utilizar funciones en cdigo no administrado. En el ejemplo siguiente se declara una funcin importada sin utilizar una instruccin Declare. Visual Basic Copiar cdigo

' Add an Imports statement at the top of the class, structure, or ' module that uses the DllImport attribute. Imports System.Runtime.InteropServices
Visual Basic Copiar cdigo

<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

Operator (Instruccin)
Declara el smbolo de operador, los operandos y el cdigo que definen un procedimiento de operador en una clase o estructura.

[ <attrlist> ] Public [ Overloads ] Shared [ Shadows ] [ Widening | Narrowing ] Operator operatorsymbol ( operand1 [, operand2 ]) [ As [ <attrlist> ] type ] [ statements ] [ statements ] Return returnvalue [ statements ] End Operator
Partes attrlist Opcional. Vea la Lista de atributos. Public Obligatorio. Indica que este procedimiento de operador tiene acceso de tipo Public (Visual Basic). Overloads Opcional. Vea Overloads. Shared Obligatorio. Indica que este procedimiento de operador es de tipo Shared (Visual Basic). Shadows Opcional. Vea Shadows.

Widening Se requiere para un operador de conversin a menos que especifique Narrowing. Indica que este procedimiento de operador define una conversin de tipo Widening. Vea "Conversiones de ampliacin y restriccin" en esta pgina de Ayuda. Narrowing Se requiere para un operador de conversin a menos que especifique Widening. Indica que este procedimiento de operador define una conversin de tipo Narrowing. Vea "Conversiones de ampliacin y restriccin" en esta pgina de Ayuda. operatorsymbol Obligatorio. El smbolo o identificador del operador que define este procedimiento de operador. operand1 Obligatorio. El nombre y tipo del operando nico de un operador unario (incluido un operador de conversin) o el operando izquierdo de un operador binario. operand2 Obligatorio para los operadores binarios. El nombre y tipo del operando derecho de un operador binario. operand1 y operand2 tienen la sintaxis y las partes siguientes:

[ ByVal ] operandname [ As operandtype ]


Parte ByVal operandname Descripcin Opcional, pero el mecanismo para pasar argumentos debe ser ByVal. Obligatorio. Nombre de la variable que representa este operando. Vea Nombres de elementos declarados. Opcional a menos que Option Strict est establecido en On. Tipo de datos de este operando.

operandtype

type Opcional a menos que Option Strict est establecido en On. Tipos de datos del valor que devuelve el procedimiento de operador. statements Opcional. Bloquee de instrucciones que ejecuta el procedimiento de operador. returnvalue Obligatorio. El valor que el procedimiento de operador devuelve al cdigo de llamada. End Operator Obligatorio. Termina la definicin de este procedimiento de operador. Comentarios Slo puede utilizar Operator en una clase o una estructura. Esto significa que el contexto de declaracin de un operador no puede ser un archivo de cdigo fuente, espacio de nombres, mdulo, interfaz, procedimiento o bloque. Para obtener ms informacin, vea Contextos de declaracin y niveles de acceso predeterminados. Todos los operadores deben ser de tipo Public Shared. No puede especificar ByRef, Optional o ParamArray en ningn operando.

No puede utilizar el smbolo o identificador de operador para incluir un valor devuelto. Debe utilizar la instruccin Return y debe especificar un valor. Puede aparecer cualquier nmero de instrucciones Return en cualquier lugar de un procedimiento. La definicin de un operador de esta manera se denomina sobrecarga de operadores, independientemente de si utiliza la palabra clave Overloads. En la siguiente tabla se muestran los operadores que se pueden definir. Tipo Unario Binary Conversin (unario) Operadores +, -, IsFalse, IsTrue, Not +, -, *, /, \, &, ^, >>, <<, =, <>, >, >=, <, <=, And, Like, Mod, Or, Xor CType

Observe que el operador = en la lista binaria es el operador de comparacin, no el operador de asignacin. Cuando define CType, debe especificar Widening o Narrowing. Pares correspondientes Debe definir ciertos operadores como pares correspondientes. Si define un operador de este tipo, tambin debe definir el otro. Los pares correspondientes son los siguientes:

= y <> >y< >= y <= IsTrue y IsFalse

Restricciones de tipos de datos Cada operador que define debe implicar la clase o estructura donde lo define. Esto significa que la clase o estructura debe aparecer como tipo de datos de los elementos siguientes:

El 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 conversin.

Ciertos operadores tienen restricciones adicionales de tipo de datos, como las siguientes:

Si define los operadores IsTrue y IsFalse, ambos deben devolver el tipo Boolean. Si define los operadores << y >>, ambos deben especificar el tipo Integer en operandtype y operand2.

El tipo de valor devuelto no tiene que corresponder con el tipo de un operando. Por ejemplo, un operador de comparacin como = o <> puede devolver un valor de tipo Boolean aunque ninguno de los operandos sea de tipo Boolean. Operadores lgicos y bit a bit Los operadores And, Or, Not y Xor pueden realizar operaciones bit a bit o lgicas en Visual Basic. Sin embargo, si define uno de estos operadores en una clase o estructura, slo puede definir su operacin bit a bit.

No puede definir directamente el operador AndAlso con una instruccin Operator. Sin embargo, puede utilizar AndAlso si ha cumplido las condiciones siguientes:

Ha definido And en los mismos tipos de operando que desea utilizar para AndAlso. Su definicin de And devuelve el mismo tipo que la clase o estructura donde lo ha definido. Ha definido el operador IsFalse en la clase o estructura donde ha definido And.

De la misma forma, 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. Conversiones de ampliacin y de restriccin Una conversin de ampliacin siempre es correcta en tiempo de ejecucin, mientras que una conversin de restriccin puede generar un error en tiempo de ejecucin. Para obtener ms informacin, vea Conversiones de ampliacin y de restriccin. Si declara un procedimiento de conversin de tipo Widening, su cdigo de procedimiento no debe generar ningn error. Esto significa lo siguiente:

Siempre debe devolver un valor vlido de tipo type. Debe controlar todas las excepciones posibles y otras condiciones de error. Debe controlar cualquier retorno del error de cualquier procedimiento al que llama.

Si existe alguna posibilidad de que un procedimiento de conversin genere un error o una excepcin no controlada, debe declararlo de tipo Narrowing. Ejemplo En el ejemplo de cdigo siguiente se utiliza la instruccin Operator para definir el esquema de una estructura que incluye procedimientos de operador para los operadores And, Or, IsFalse e IsTrue. And y Or utilizan dos operandos de tipo abc y devuelven un valor de tipo abc. IsFalse e IsTrue utilizan un nico operando de tipo abc y devuelven un valor de tipo Boolean. Estas definiciones permiten al cdigo de llamada utilizar And, AndAlso, Or y OrElse con operandos de tipo abc. Visual Basic Copiar cdigo

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

Property (Instruccin)
Declara el nombre de una propiedad y los procedimientos de propiedades que se utilizan para almacenar y recuperar el valor de la propiedad.

[ <attributelist> ] [ Default ] [ accessmodifier ] [ propertymodifiers ] [ Shared ] [ Shadows ] [ ReadOnly | WriteOnly ] 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
Partes attributelist Opcional. Lista de atributos aplicables a esta propiedad o procedimiento Get o Set. Vea Lista de atributos. Default Opcional. Especifica que esta propiedad es la propiedad predeterminada para la clase o estructura en que est definida. Las propiedades predeterminadas deben aceptar parmetros y se pueden establecer y recuperar sin especificar el nombre de la propiedad. Si declara la propiedad como Default, no puede utilizar Private en la propiedad ni en ninguno de sus procedimientos de propiedad. accessmodifier Opcional en la instruccin Property y en a lo sumo una de las instrucciones Get y Set. Puede ser una de las siguientes:

Public Protected Friend Private Protected Friend

Vea Niveles de acceso en Visual Basic. propertymodifiers Opcional. Puede ser una de las siguientes:

Overloads Overrides Overridable NotOverridable MustOverride


Shared

MustOverride Overrides NotOverridable Overrides

Opcional. Vea Shared (Visual Basic). Shadows Opcional. Vea Shadows. ReadOnly Opcional. Vea ReadOnly (Visual Basic). WriteOnly Opcional. Vea WriteOnly. name Obligatorio. Nombre de la propiedad. Vea Nombres de elementos declarados. parameterlist Opcional. Lista de nombres de variable local que representan los parmetros de esta propiedad y posibles parmetros adicionales del procedimiento Set. Vea Lista de parmetros. returntype Obligatorio si Option Strict es On. Tipos de datos del valor devuelto por esta propiedad. Implements Opcional. Indica que esta propiedad implementa una o ms propiedades, cada una de ellas definida en una interfaz implementada por la clase o estructura contenedora de esta propiedad. Vea Implements (Instruccin). implementslist Requerido si se suministra Implements. Lista de las propiedades que se implementan.

implementedproperty [ , implementedproperty ... ]


Cada implementedproperty tiene la sintaxis y las partes siguientes:

interface.definedname
Parte interface Descripcin Obligatorio. Nombre de una interfaz implementada por la clase o estructura contenedora de esta propiedad. Obligatorio. Nombre por el que se define la propiedad en interface.

definedname Get

Obligatorio a menos que la propiedad est marcada como WriteOnly. Inicia un procedimiento de propiedad Get que se usa para devolver el valor de la propiedad. statements Opcional. Bloque de las instrucciones que se deben ejecutar dentro del procedimiento Get o Set. End Get Termina el procedimiento de propiedad Get. Set

Obligatorio a menos que la propiedad est marcada como ReadOnly. Inicia un procedimiento de propiedad Set que se usa para almacenar el valor de la propiedad. End Set Termina el procedimiento de propiedad Set. End Property Termina la definicin de esta propiedad. Comentarios La instruccin Property introduce la declaracin de una propiedad. Una propiedad puede tener un procedimiento Get (slo lectura), un procedimiento Set (slo escritura), o ambos (de lectura y escritura). Slo puede utilizar Property en el nivel de mdulo. Esto significa que el contexto de declaracin de una propiedad debe ser una clase, estructura, mdulo o interfaz, y no un archivo de cdigo fuente, un espacio de nombres, un procedimiento ni un bloque. Para obtener ms informacin, vea Contextos de declaracin y niveles de acceso predeterminados. De forma predeterminada, las propiedades usan acceso pblico. Puede ajustar el nivel de acceso de una propiedad mediante un modificador de acceso de la instruccin Property y, opcionalmente, ajustar uno de sus procedimientos de propiedad en un nivel de acceso ms restrictivo. Visual Basic pasa un parmetro al bloque Set durante las asignaciones de propiedades. Si no se especifica un parmetro para Set, el entorno de desarrollo integrado (IDE) utiliza un parmetro implcito denominado value. Este parmetro contiene el valor que se va a asignar a la propiedad. Normalmente, este valor se almacena en una variable local privada y lo devuelve cada vez que se llama al procedimiento Get. Reglas

Niveles de acceso mixto. Si est definiendo una propiedad de lectura y escritura, tiene la opcin de especificar un nivel de acceso distinto para el procedimiento Get o para el procedimiento Set, pero no para ambos. Si as lo hace, el nivel de acceso del procedimiento debe ser ms restrictivo que el nivel de acceso de la propiedad. Por ejemplo, si la propiedad se declara como Friend, puede declarar el procedimiento Set como Private, pero no como Public. Si est definiendo una propiedad ReadOnly o WriteOnly, el procedimiento de propiedad nico (Get o Set, respectivamente) representa toda la propiedad. No puede declarar un nivel de acceso diferente para este tipo de procedimiento, porque se estableceran dos niveles de acceso para la propiedad.

Tipo de valor devuelto. La instruccin Property puede declarar el tipo de datos del valor que devuelve. Puede especificar cualquier tipo de datos o el nombre de una enumeracin, estructura, clase o interfaz. Si no especifica returntype, la propiedad devuelve Object.

Implementacin. Si esta propiedad utiliza la palabra clave Implements, la clase o estructura contenedora deben tener una instruccin Implements que sigue inmediatamente a su instruccin Class o Structure. La instruccin Implements debe incluir cada interfaz especificada en implementslist. Sin embargo, el nombre con el que una interfaz define la Property (en definedname) no tiene por qu ser el mismo que el nombre de esta propiedad (en name).

Comportamiento

Volver de un procedimiento de propiedad. Cuando el procedimiento Get o Set vuelve al cdigo que realiza la llamada, la ejecucin contina con la instruccin siguiente a la instruccin que la llam. Las instrucciones Exit Property y Return provocan una salida inmediata de un procedimiento de propiedad. Puede aparecer cualquier cantidad de instrucciones Exit Property y Return en cualquier parte del procedimiento, y se puede combinar instrucciones Exit Property y Return.

Valor devuelto. Para devolver un valor desde un procedimiento Get, puede asignar el valor al nombre de propiedad o incluirlo en una instruccin Return. El ejemplo siguiente asigna el valor devuelto al nombre de propiedad quoteForTheDay y, a continuacin, utiliza la instruccin Exit Property para volver. Visual Basic Copiar cdigo

Private quoteValue As String = "No quote assigned yet."


Visual Basic Copiar cdigo

ReadOnly Property quoteForTheDay() As String Get quoteForTheDay = quoteValue Exit Property End Get End Property
Si utiliza Exit Property sin asignar un valor a name, el procedimiento Get devuelve el valor predeterminado para el tipo de datos de la propiedad. Al mismo tiempo, la instruccin Return asigna el valor devuelto por el procedimiento Get y sale del procedimiento. Esto se muestra en el siguiente ejemplo. Visual Basic Copiar cdigo

Private quoteValue As String = "No quote assigned yet."


Visual Basic Copiar cdigo

ReadOnly Property quoteForTheDay() As String Get Return quoteValue End Get End Property
Ejemplo El siguiente ejemplo declara una propiedad en una clase. Visual Basic Copiar cdigo

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

Event (Instruccin)
Declara un evento definido por el usuario.

[ [ [ ' [ [ [ '

<attrlist> ] [ accessmodifier ] _ Shared ] [ Shadows ] Event eventname[(parameterlist)] _ Implements implementslist ] -or<attrlist> ] [ accessmodifier ] _ Shared ] [ Shadows ] Event eventname As delegatename _ Implements implementslist ] -or[ <attrlist> ] [ accessmodifier ] _ [ Shared ] [ Shadows ] Custom Event eventname As delegatename _ [ Implements implementslist ] [ <attrlist> ] AddHandler(ByVal value As delegatename) [ statements ] End AddHandler [ <attrlist> ] RemoveHandler(ByVal value As delegatename) [ statements ] End RemoveHandler [ <attrlist> ] RaiseEvent(delegatesignature) [ statements ] End RaiseEvent End Event
Partes

Parte attrlist

Descripcin Opcional. Lista de atributos que se aplican a este evento. Los atributos mltiples se separan por comas. Debe incluir la lista Lista de atributos entre corchetes angulares ("<" y ">"). Opcional. Especifica qu cdigo puede tener acceso al evento. Puede ser una de las siguientes:

accessmodifier

Public: cualquier cdigo que tenga acceso al elemento que lo declara puede tener acceso a l. Protected: slo el cdigo que est dentro de su clase o de una clase derivada puede tener acceso a l. Friend: slo el cdigo que est en el mismo ensamblado puede tener acceso a l. Private: slo el cdigo que est en el elemento que lo declara puede tener acceso a l.

Puede especificar Protected Friend para habilitar el acceso desde el cdigo a la clase del evento, la clase derivada o el mismo ensamblado.

Shared

Opcional. Especifica que este evento no est asociado a una instancia especfica de una clase o una estructura. Opcional. Indica que este evento vuelve a declarar y ocultar un elemento de programacin con el mismo nombre, o un conjunto de elementos sobrecargados, en una clase base. Puede hacer que cualquier tipo de elemento declarado prevalezca sobre cualquier otro tipo. Un elemento sombreado no est disponible desde la clase derivada que lo sombrea, a menos que el elemento que produce el sombreado no est accesible. Por ejemplo, si un elemento Private sombrea un elemento de clase base, el cdigo que no tiene el permiso para obtener acceso al elemento Private obtiene acceso al elemento de clase base.

Shadows

eventname

Obligatorio. Nombre del evento. Sigue las convenciones de nomenclatura estndar de las variables. Opcional. Lista de variables locales que representan los parmetros de este evento. Debe incluir la lista Lista de parmetros entre parntesis. Opcional. Indica que este evento implementa un evento de una interfaz. Requerido si se suministra Implements. Lista de procedimientos Sub que se estn implementando. Los diversos procedimientos se separan con comas: procedimientoImplementado [ , procedimientoImplementado ... ] Cada implementedprocedure tiene la sintaxis y las partes siguientes: interface.definedname Parte interface Descripcin Obligatorio. Nombre de una interfaz que est implementando la clase contenedora o la estructura de este procedimiento. Obligatorio. Nombre por el que est definido el procedimiento en interface. No es necesario que su valor sea igual al de name, el nombre que est utilizando este procedimiento para implementar el procedimiento definido.

parameterlist

Implements implementslist

definedname

Custom

Obligatorio. Los eventos declarados como Custom deben definir descriptores de acceso AddHandler, RemoveHandler y RaiseEvent personalizados. Opcional. El nombre de un delegado que especifica la firma del controlador de eventos. Obligatorio. Declara un descriptor de acceso AddHandler, que especifica las instrucciones que se deben ejecutar cuando se agrega un controlador de eventos, ya sea explcitamente con la instruccin AddHandler o implcitamente con la clusula Handles. Obligatorio. Termina el bloque AddHandler. Obligatorio. Nombre de parmetro. Obligatorio. Declara un descriptor de acceso RemoveHandler, que especifica las instrucciones que se deben ejecutar cuando se quita un controlador de eventos utilizando la instruccin RemoveHandler. Obligatorio. Termina el bloque RemoveHandler.

delegatename

AddHandler

End AddHandler value RemoveHandler

End RemoveHandler

RaiseEvent

Obligatorio. Declara un descriptor de acceso RaiseEvent, que especifica las instrucciones que se deben ejecutar cuando se produce el evento utilizando la instruccin RaiseEvent. Normalmente, invoca una lista de delegados mantenida por los descriptores de acceso AddHandler y RemoveHandler. Obligatorio. Termina el bloque RaiseEvent. Obligatorio. Lista de parmetros que hace coincidir los parmetros requeridos por el delegado delegatename. Debe incluir la lista Lista de parmetros entre parntesis. Opcional. Instrucciones que contienen los cuerpos de los mtodos AddHandler, RemoveHandler y RaiseEvent. Obligatorio. Termina el bloque Event.

End RaiseEvent delegatesignature

statements

End Event Comentarios

Una vez declarado el evento, utilice la instruccin RaiseEvent para provocar el evento. Un evento tpico podra declararse y activarse como se muestra en los siguientes fragmentos de cdigo: Visual Basic Copiar cdigo

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
Nota: Los argumentos de eventos se pueden declarar como los argumentos de procedimientos, con las siguientes excepciones: los eventos no pueden tener argumentos con nombre, argumentos ParamArray ni argumentos Optional. Los eventos no tienen valores devueltos. Para controlar un evento, debe asociarlo a una subrutina del controlador de eventos utilizando la instruccin Handles o AddHandler. Las firmas de la subrutina y del evento deben coincidir. Para controlar un evento compartido, debe utilizar la instruccin AddHandler. Slo puede utilizar Event en el nivel de mdulo. Esto significa que el contexto de declaracin de un evento debe ser una clase, estructura, mdulo o interfaz, y no un archivo de cdigo fuente, un espacio de nombres o un bloque. Para obtener ms informacin, vea Contextos de declaracin y niveles de acceso predeterminados. En la mayora de las circunstancias, puede utilizar la primera sintaxis de la seccin Sintaxis de este tema para declarar los eventos. Sin embargo, algunos escenarios requieren que tenga mayor control sobre el comportamiento detallado del evento. La ltima sintaxis de la seccin Sintaxis de este tema, que usa la palabra clave Custom, proporciona ese control y le permite definir eventos personalizados. En un evento personalizado, especifica exactamente qu sucede cuando el cdigo agrega o quita un controlador del evento o cuando el cdigo provoca el evento. Para obtener ejemplos, vea Cmo: Declarar eventos que evitan que se pierda memoria y Cmo: Declarar eventos que evitan bloqueos. Ejemplo En el ejemplo siguiente se utilizan eventos para contar de 10 a 0 segundos. El cdigo muestra varios mtodos, propiedades e instrucciones relacionados con eventos. Esto incluye la instruccin RaiseEvent.

La clase que produce un evento es el origen de evento, y los mtodos que procesan el evento son los controladores de eventos. Un origen de evento puede tener mltiples controladores para los eventos que genera. Cuando una clase produce el evento, ese evento se genera en cada clase que ha elegido para controlar eventos para esa instancia del objeto. El ejemplo tambin utiliza un formulario (Form1) con un botn (Button1) y un cuadro de texto (TextBox1). Al hacer clic en el botn, el primer cuadro de texto muestra una cuenta atrs de 10 a 0 segundos. Cuando ha transcurrido todo el tiempo (10 segundos), el primer cuadro de texto muestra la palabra "Done" (terminado). El cdigo para Form1 especifica los estados inicial y terminal del formulario. Tambin contiene el cdigo que se ejecuta cuando se producen eventos. Para utilizar este ejemplo, abra un nuevo proyecto de formularios Windows Forms. A continuacin, agregue al formulario principal, llamado Form1, un botn denominado Button1 y un cuadro de texto con el nombre TextBox1. A continuacin, haga clic con el botn secundario del mouse en el formulario y haga clic en Ver cdigo para abrir el editor de cdigo. Agregue una variable WithEvents a la seccin de declaraciones de la clase Form1: Visual Basic Copiar cdigo

Private WithEvents mText As TimerState


Agregue el cdigo siguiente al cdigo de Form1. Sustituya los procedimientos que estn duplicados, como Form_Load o Button_Click. Visual Basic Copiar cdigo

Private Sub Form1_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) _ Handles MyBase.Load Button1.Text = "Start" mText = New TimerState End Sub Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) _ 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 botn que tiene la etiqueta Iniciar. El primer cuadro de texto empieza la cuenta atrs de los segundos. Cuando ha transcurrido todo el tiempo (10 segundos), el primer cuadro de texto muestra la palabra "Done" (terminado).

Nota: El mtodo My.Application.DoEvents no procesa los eventos de la misma manera que el formulario. Para permitir que el formulario controle directamente los eventos, puede utilizar el subprocesamiento mltiple. Para obtener ms informacin, vea Subprocesamiento mltiple en Visual Basic.

Delegate (Instruccin)
Se utiliza para declarar un delegado. Un delegado es un tipo de referencia que se establece para un mtodo Shared de un tipo o para un mtodo de instancia de un objeto. Se puede usar cualquier procedimiento con parmetro de coincidencia y tipos devueltos para crear una instancia de esta clase delegada. Se puede llamar al procedimiento por medio de la instancia de delegado.

[ <attrlist> ] [ accessmodifier ] _ [ Shadows ] Delegate [ Sub | Function ] name [( Of typeparamlist )] [([ parameterlist ])] [ As type ]
Partes attrlist Opcional. Lista de atributos que se aplican a este delegado. Los atributos mltiples se separan por comas. Debe incluir la lista Lista de atributos entre corchetes angulares ("<" y ">"). accessmodifier Opcional. Especifica qu cdigo puede tener acceso al delegado. Puede ser una de las siguientes:

Public Cualquier cdigo que puede tener acceso al elemento que declara el delegado. Protected Slo el cdigo de la clase del delegado o de una clase derivada. Friend Slo el cdigo incluido en el mismo ensamblado. Private Slo el cdigo incluido en el elemento que declara el delegado.

Puede especificar Protected Friend para habilitar el acceso desde el cdigo incluido en la clase delegada, en una clase derivada o en el mismo ensamblado. Shadows Opcional. Indica que este delegado vuelve a declarar y ocultar un elemento de programacin con el mismo nombre, o un conjunto de elementos sobrecargados, en una

clase base. Puede hacer que cualquier tipo de elemento declarado prevalezca sobre cualquier otro tipo. Un elemento sombreado no est disponible desde la clase derivada que lo sombrea, a menos que el elemento que produce el sombreado no est accesible. Por ejemplo, si un elemento Private sombrea un elemento de clase base, el cdigo que no tiene el permiso para obtener acceso al elemento Private obtiene acceso al elemento de clase base. Sub Opcional, pero debe aparecer Sub o Function. Declara este procedimiento como un procedimiento Sub delegado que no devuelve ningn valor. Function Opcional, pero debe aparecer Sub o Function. Declara este procedimiento como un procedimiento Function delegado que devuelve un valor. name Obligatorio. Nombre del tipo delegado. Sigue las convenciones de nomenclatura estndar de las variables. typeparamlist Opcional. Lista de parmetros de tipo de este delegado. Los parmetros de tipo estn separados por comas. Debe incluir la lista Lista de tipos entre parntesis y anteponer la palabra clave Of. parameterlist Opcional. Lista de parmetros que se transfieren al procedimiento cuando se llama. Debe incluir la lista Lista de parmetros entre parntesis. type Obligatorio si se especifica un procedimiento Function. Tipo de datos del valor devuelto. Comentarios La instruccin Delegate define el parmetro y los tipos devueltos de una clase delegada. Se puede usar cualquier procedimiento con tipos de parmetros de coincidencia y tipos de valor devuelto para crear una instancia de esta clase delegada. Se puede llamar al procedimiento mediante la instancia de delegado, llamando al mtodo Invoke del delegado. Los delegados se pueden declarar en el nivel de espacio de nombres, mdulo, clase o estructura, pero no en un procedimiento. Cada clase delegada define un constructor al cual se pasa la especificacin de un mtodo de objeto. Un argumento para un constructor delegado debe ser una referencia a un mtodo o una expresin lambda. Para especificar una referencia a un mtodo, utilice la sintaxis siguiente: AddressOf [expression.]methodname El tipo de tiempo de compilacin de expression debe ser el nombre de una clase o interfaz que contenga un mtodo del nombre especificado cuya firma coincida con la firma de la clase delegada. methodname puede ser un mtodo compartido o un mtodo de instancia. Aunque se cree un delegado para el mtodo predeterminado de la clase, methodname no es opcional. Para especificar una expresin lambda, utilice la sintaxis siguiente: Function ([parm como type, parm2 como type2, ...]) expression La firma de la funcin debe coincidir con la del tipo de delegado. Para obtener ms informacin sobre expresiones lambda, vea Expresiones lambda.

Ejemplo En el ejemplo siguiente se utiliza la instruccin Delegate para declarar un delegado que opere con dos nmeros y devuelva un nmero. El mtodo DelegateTest toma una instancia de un delegado de este tipo y la utiliza para ordenar los nmeros en pares. Visual Basic Copiar cdigo

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

Nombres de elementos declarados


Todo elemento declarado tiene un nombre, tambin denominado identificador, que utiliza el cdigo para hacer referencia a l. Reglas Un nombre de elemento en Visual Basic debe observar las reglas siguientes:

Debe comenzar por un carcter alfabtico o un signo de subrayado (_). Slo puede contener caracteres alfabticos, dgitos decimales y signos de subrayado. Debe contener por lo menos un carcter alfabtico o un dgito decimal, si empieza con un signo de subrayado. No puede superar los 1023 caracteres de longitud.

El lmite de longitud de 1023 caracteres tambin se aplica a la cadena completa de un nombre completo, como outerNamespace.middleNamespace.innerNamespace.thisClass.thisElement.

El ejemplo siguiente muestra algunos nombres de elementos vlidos.

aB123__45 _567
El ejemplo siguiente muestra algunos nombres de elementos no vlidos. El primero contiene slo un subrayado, el segundo comienza con un dgito decimal y el tercero contiene un carcter no vlido ($).

' Three INVALID element names _ 12ABC xyz$wv

Precaucin: Los nombres de elementos que empiezan por un carcter de subrayado (_) no forman parte de Common Language Specification (CLS); por tanto, el cdigo compatible con CLS no puede usar ningn componente que defina tales nombres. Sin embargo, un carcter de subrayado en cualquier otra posicin de un nombre de elemento es compatible con CLS. Directrices sobre longitud de nombres A efectos prcticos, su nombre debe ser tan corto como sea posible aunque tiene que identificar claramente la naturaleza del elemento. Esto mejora la legibilidad de su cdigo y reduce la longitud de lnea y el tamao del archivo de origen. Por otro lado, su nombre no debe ser tan corto que no describa lo que el elemento representa adecuadamente y cmo lo utiliza el cdigo. Esto es importante para la legibilidad del cdigo. Si alguien ms lo intenta entender o si el propio usuario lo examina despus de mucho tiempo de haberlo escrito, unos nombres de elementos adecuados pueden ahorrar mucho tiempo. Nombres con escape En general, el nombre de un elemento no puede coincidir con ninguna de las palabras clave reservadas para Visual Basic, como Case o Friend. No obstante, puede definir un nombre con escape que se especifica incluido entre corchetes ([ ]). Un nombre con escape puede coincidir con cualquier palabra clave de Visual Basic, puesto que los corchetes eliminan toda ambigedad posible. Tambin puede usar los corchetes en las referencias al nombre en el cdigo. En general, slo debe utilizar los nombres con escape cuando:

Su cdigo ha migrado de una versin anterior de Visual Basic que no reserv la palabra clave que est utilizando como nombre; o Est trabajando con cdigo escrito en otro lenguaje en el que la palabra clave determinada no est reservada.

De lo contrario, debe considerar cambiar el nombre del elemento si su nombre entra en conflicto con una palabra clave. El entorno de desarrollo integrado (IDE) proporciona una manera fcil de hacer esto. Para obtener ms informacin, consulte Cmo: Cambiar el nombre de un identificador. Distinguir maysculas de minsculas en los nombres Los nombres de elementos en Visual Basic no distinguen entre maysculas y minsculas. Es decir, cuando el compilador compara dos nombres cuya nica diferencia est en letras maysculas o minsculas, los interpreta como el mismo nombre. Por ejemplo, ABC y abc hacen referencia al mismo elemento declarado.

No obstante, Common Language Runtime (CLR) utiliza enlaces que s tienen en cuenta esta distincin. Por lo tanto, cuando genere un ensamblado o una DLL que pueda estar disponible para otros ensamblados, sus nombres s se distinguirn por sus maysculas o minsculas. Por ejemplo, si define una clase que tiene un elemento denominado ABC, y otros ensamblados utilizan la clase por medio de Common Language Runtime, debern hacer referencia al elemento como ABC. Si, posteriormente, vuelve a compilar la clase y cambia el nombre del elemento a abc, los otros ensamblados que utilicen la clase ya no tendrn acceso a este elemento. Por lo tanto, cuando se lance una versin actualizada de un ensamblado, no se deben cambiar las maysculas o minsculas de los elementos pblicos. Nombres y configuraciones regionales La comparacin de nombres es independiente de la configuracin regional. Si dos nombres coinciden en una configuracin regional, se garantiza que coincidirn en todas las configuraciones regionales.

Caractersticas de los elementos declarados


Una caracterstica de un elemento declarado es un aspecto del elemento que afecta a la forma de interactuar del cdigo con l. Cada elemento declarado tiene una o varias de las siguientes caractersticas asociadas a l:

Tipo de datos: valores que el elemento puede contener y cmo almacena esos valores. Para obtener ms informacin, consulte Resumen de tipos de datos (Visual Basic). Perodo de duracin: perodo en tiempo de ejecucin durante el cual el elemento est disponible para su uso. Para obtener ms informacin, consulte Cmo: Prolongar la duracin de una variable.

mbito: conjunto de cdigo que puede hacer referencia al elemento sin calificar su nombre. Para obtener ms informacin, consulte Cmo: Controlar el mbito de una variable. Nivel de acceso: permiso otorgado al cdigo para hacer uso del elemento. Para obtener ms informacin, consulte Cmo: Controlar la disponibilidad de una variable.

Caractersticas de los elementos La tabla siguiente muestra los elementos declarados y las caractersticas que se les aplican. Tipo de datos S S S No S No No Perodo de duracin S No No No S S S mbito
1

Elemento Variable Constante Enumeracin Estructura Propiedad Mtodo Procedimiento (Sub o Function) Parmetro de procedimiento

Nivel de acceso S S S S S S S

S S S S S S S

No

Valor devuelto de funcin Operador Interfaz Clase Evento Delegado


1

S S No No No No

S No No No No No

S S S S S S

No S S S S S

A veces, se hace referencia al mbito como visibilidad.

Perodo de duracin en Visual Basic


El perodo de duracin de un elemento declarado es el tiempo durante el cual est disponible para el uso. Las variables son los nicos elementos que tienen un perodo de duracin. Para este propsito, el compilador trata los parmetros de procedimiento y la funcin vuelve como un caso especial de variable. El perodo de duracin de una variable representa el tiempo durante el cual puede contener un valor. Su valor puede variar en su perodo de duracin, pero siempre contiene un valor. Perodos de duracin diferentes Una variable miembro (declarada en el nivel de mdulo, fuera de cualquier procedimiento) tiene el mismo perodo de duracin normalmente que el elemento en el que se declara. Una variable no compartida declarada en una clase o estructura existe como copia separada para cada instancia de la clase o estructura en la que se declara. Este tipo de variable tiene el mismo perodo de duracin que su instancia. No obstante, una variable Shared slo tiene un perodo de duracin, que es el tiempo completo de ejecucin de la aplicacin. Una variable local (declarada dentro de un procedimiento) slo existe mientras el procedimiento en el que se declara est en ejecucin. Esto tambin es aplicable a los parmetros del procedimiento y a cualquier valor devuelto de funcin. No obstante, si el procedimiento llama a otros procedimientos, las variables locales conservan su valor durante la ejecucin de los ltimos. Comienzo del perodo de duracin El perodo de duracin de una variable local empieza con el control del procedimiento en el que se declara. Las variables locales se inicializan con el valor predeterminado de su tipo de datos en el momento en que empieza la ejecucin del procedimiento. Cuando el procedimiento encuentra una instruccin Dim que especifica valores iniciales, establece esos valores para las variables aunque el cdigo ya les haya asignado otros valores. Los miembros de una variable de estructura se inicializan como si cada uno fuera una variable independiente. De forma similar, los elementos de una variable de matriz se inicializan de manera individual. Las variables declaradas dentro de un bloque en el interior de un procedimiento (como un bucle For ) se inicializan en la entrada al procedimiento. Estas inicializaciones tienen efecto independientemente de si el cdigo ejecuta o no el bloque. Final del perodo de duracin Cuando un procedimiento finaliza, no se conservan los valores de sus variables locales y Visual Basic recupera su memoria. La prxima vez que llame al procedimiento, se crean de nuevo y se reinicializan todas las variables locales.

Cuando finaliza una instancia de una clase o estructura, se pierde el valor y la memoria de sus variables no compartidas. Cada nueva instancia de la clase o estructura crea y reinicializa sus variables no compartidas. No obstante, las variables Shared se conservan hasta que finaliza la ejecucin de la aplicacin. Prolongar el perodo de duracin Si declara una variable local con la palabra clave Static, su perodo de duracin es ms largo que el tiempo de ejecucin de su procedimiento. La tabla siguiente muestra cmo determina la declaracin de procedimiento el tiempo de duracin de una variable Static. Finaliza el perodo de duracin de una variable esttica Cuando se detiene la aplicacin Cuando se detiene la aplicacin

Ubicacin de procedimiento y uso compartido En un mdulo (compartido de manera predeterminada) En una clase o estructura, Shared (el procedimiento no es un miembro de instancia)

Comienza el perodo de duracin de una variable esttica La primera vez que se llama al procedimiento. La primera vez que se llama al procedimiento en una instancia especfica, o en el mismo nombre de clase o estructura La primera vez que se llama al procedimiento en la instancia especfica

En una instancia de clase o estructura, no Shared (el procedimiento es un miembro de instancia)

Cuando la instancia se libera para la recoleccin de elementos no utilizados

Cmo: Prolongar la duracin de una variable


Normalmente, una variable deja de existir cuando el elemento de programacin en el que se declara deja de existir. Sin embargo, puede alargar su duracin ms que la de su elemento contenedor declarndola con la palabra clave Static (Visual Basic). Para obtener ms informacin, consulte Perodo de duracin en Visual Basic.

Para alargar la duracin de una variable ms que la de su elemento contenedor

Si la variable es una variable local (declarada dentro de un procedimiento), incluya la palabra clave Static en la instruccin Instruccin Dim (Visual Basic) que la declara. Una variable esttica existe mientras exista la clase o mdulo que contiene el procedimiento que declara la variable. Si una variable local est dentro de un procedimiento Shared (Visual Basic), el procedimiento y sus variables existen siempre que la aplicacin est en ejecucin. No utilice Static en este caso.

Si la variable es una variable miembro (declarada dentro de una clase o estructura, fuera de todo procedimiento), incluya la palabra clave Shared en la instruccin Dim que la declara. Una variable compartida no est asociada a ninguna instancia de su clase o estructura y existe siempre que la aplicacin est en ejecucin. No puede utilizar Static en una variable miembro. Si una variable miembro se declara en un mdulo, existe siempre que la aplicacin est en ejecucin. No utilice Shared en este caso.

Ejemplo

El ejemplo siguiente declara una variable con la palabra clave Static (Visual Basic). (Observe que no necesita la palabra clave Dim cuando Instruccin Dim (Visual Basic) utiliza un modificador como Static.) Copiar cdigo

Function runningTotal(ByVal num As Integer) As Integer Static applesSold As Integer applesSold = applesSold + num Return applesSold End Function
En el ejemplo anterior, la variable applesSold contina existiendo despus de que el procedimiento

runningTotal vuelve al cdigo de llamada. La siguiente vez que se llama a runningTotal, applesSold conserva el valor calculado anteriormente.
Si applesSold se hubiera declarado sin utilizar Static, los valores acumulados anteriores no se conservaran a travs de llamadas a runningTotal. La siguiente vez que se llamara a runningTotal,

applesSold se habra vuelto a crear y se habra inicializado a 0. runningTotal habra devuelto


simplemente el mismo valor que el que tena cuando fue llamado. Compilar el cdigo Puede inicializar el valor de una variable local esttica en la propia declaracin. Si declara una matriz como Static, puede inicializar su rango (nmero de dimensiones), la longitud de cada dimensin y los valores de los elementos individuales. Variables estticas del mismo nombre Puede declarar variables estticas con el mismo nombre en ms de un procedimiento. Si hace esto, el compilador de Visual Basic considera que cada variable es un elemento separado. La inicializacin de una de estas variables no afecta al valor de las dems. Lo mismo ocurre si se define un procedimiento con un conjunto de sobrecargas y se declara una variable esttica con el mismo nombre en cada una. Elementos contenedores para variables estticas Puede declarar una variable local esttica en una clase, es decir, dentro de un procedimiento de esa clase. Sin embargo, no puede declarar una variable local esttica dentro de una estructura, ya sea como miembro de una estructura o como una variable local de un procedimiento dentro de esa estructura. Seguridad En el ejemplo anterior, puede generar la misma duracin si declara applesSold en el nivel de mdulo. No obstante, si ha cambiado de esta forma el mbito de una variable, el procedimiento dejar de tener acceso exclusivo a l. Dado que otros procedimientos podran tener acceso a applesSold y cambiar su valor, el total acumulado no sera fiable, lo que podra dificultar el mantenimiento del cdigo.

mbito en Visual Basic


El mbito de un elemento declarado es el conjunto de todo el cdigo que puede hacer referencia a l sin calificar su nombre o marcarlo como disponible mediante Instruccin Imports (Tipo y espacio de nombres de .NET). Un elemento puede tener uno de los niveles de mbito siguientes: Nivel mbito de bloque Descripcin mbito disponible nicamente en el bloque de cdigo en el que se ha declarado Disponible para todo el cdigo dentro del procedimiento en el que se ha declarado Disponible para todo el cdigo dentro del mdulo, clase o estructura en

mbito de procedimiento

mbito de mdulo

el que se ha declarado mbito de espacio de nombres Disponible para todo el cdigo dentro del espacio de nombres en el que se ha declarado

Estos niveles de mbito progresan desde el ms restringido (bloque) al ms amplio (espacio de nombres), donde mbito ms restringido significa el conjunto de cdigo ms pequeo que puede hacer referencia al elemento sin calificacin. Para obtener ms informacin, consulte "Niveles de mbito" en esta pgina. Especificar mbito y definir variables El mbito de un elemento se especifica al declararlo y puede depender de los factores siguientes:

La regin (bloque, procedimiento, mdulo, clase o estructura) donde se declara el elemento. El espacio de nombres que contiene la declaracin del elemento. El nivel de acceso que se declara para el elemento.

Tenga cuidado cuando defina variables del mismo nombre pero con mbito diferente, puesto que ello podra causar resultados inesperados. Para obtener ms informacin, consulte Resolver una referencia cuando muchas variables tienen el mismo nombre. Niveles de mbito Un elemento de programacin est disponible en toda la regin en la que se declara. Todo el cdigo de la misma regin puede hacer referencia al elemento sin calificar su nombre. mbito de bloque Un bloque es un conjunto de instrucciones incluido dentro de las instrucciones de declaracin de inicio y fin, como lo siguiente:

Do y Loop For [Each] y Next If y End If Select y End Select SyncLock y End SyncLock Try y End Try While y End While With y End With

Si declara una variable dentro de un bloque, slo puede utilizarla dentro de ese bloque. En el ejemplo siguiente, el mbito de la variable de entero cube es el bloque entre If y End If, y las referencias a cube dejan de ser posibles cuando termina la ejecucin del bloque. Copiar cdigo

If n < 1291 Then Dim cube As Integer cube = n ^ 3 End If


Nota: Incluso si el mbito de una variable est limitado a un bloque, su perodo de duracin sigue siendo el del procedimiento completo. Si utiliza el bloque varias veces durante el procedimiento, todas las

variables de bloque conservan su valor anterior. Para evitar resultados inesperados en estos casos, es mejor inicializar las variables de bloque al principio del bloque. mbito de procedimiento Un elemento declarado en un procedimiento no est disponible fuera de l. Solamente el procedimiento que contiene su declaracin puede utilizarlo. Las variables en este nivel tambin se denominan variables locales. Se declaran con Instruccin Dim (Visual Basic), con o sin la palabra clave Static (Visual Basic). Los mbitos de procedimiento y de bloque estn estrechamente relacionados. Si se declara una variable dentro de un procedimiento, pero fuera de un bloque dentro del procedimiento, puede considerarse que la variable tiene mbito de bloque, donde el bloque es el procedimiento completo.

Nota: Todos los elementos locales, aunque sean variables Static, son privados para el procedimiento en el que aparecen. No se puede declarar un elemento mediante la palabra clave Public (Visual Basic) dentro de un procedimiento. mbito de mdulo Por comodidad, el trmino nivel de mdulo se aplica por igual a mdulos, clases y estructuras. Puede declarar elementos a este nivel si sita la instruccin de declaracin fuera de cualquier procedimiento o bloque pero dentro del mdulo, clase o estructura. Cuando se incluye una declaracin en el nivel de mdulo, el nivel de acceso seleccionado determina el mbito. El espacio de nombres que contiene el mdulo, la clase o la estructura tambin afecta al mbito. Los elementos para los que se declara el nivel de acceso Private (Visual Basic) estn disponibles para todos los procedimientos del mdulo, pero no para el cdigo de otros mdulos. La instruccin Dim en el nivel de mdulo toma Private como valor predeterminado si no utiliza ninguna palabra nivel de acceso. No obstante, el mbito y el nivel de acceso sern ms patentes si utiliza la palabra clave Private en la instruccin Dim. En el ejemplo siguiente, todos los procedimientos definidos en el mdulo pueden hacer referencia a la variable de cadena strMsg. Cuando se llama al segundo procedimiento, muestra el contenido de la variable de cadena strMsg en un cuadro de dilogo: Copiar cdigo

' Put the following declaration at module level (not in any procedure). Private strMsg As String ' Put the following Sub procedure in the same module. Sub initializePrivateVariable() strMsg = "This variable cannot be used outside this module." End Sub ' Put the following Sub procedure in the same module. Sub usePrivateVariable() MsgBox(strMsg) End Sub
mbito de espacio de nombres Si declara un elemento en el nivel de mdulo mediante la palabra claveFriend (Visual Basic) o Public (Visual Basic), dicho elemento quedar disponible para todos los procedimientos del espacio de nombres en los que se declare. La siguiente modificacin del ejemplo anterior permite que el cdigo haga referencia a la variable de cadena strMsg en cualquier parte del espacio de nombres de su declaracin. Copiar cdigo

' Include this declaration at module level (not inside any procedure). Public strMsg As String

El mbito de espacio de nombres incluye espacios de nombres anidados. Un elemento disponible de un espacio de nombres tambin est disponible en cualquier espacio de nombres anidado en su interior. Si un proyecto no contiene Namespace (Instruccin), todo lo que incluya el proyecto estar en el mismo espacio de nombres. En este caso, el mbito de espacio de nombres se puede considerar como el mbito del proyecto. Los elementos Public de un mdulo, clase o estructura tambin estn disponibles para cualquier proyecto que haga referencia a sus proyectos. Eleccin de mbito Cuando declara una variable, debe tener presente los puntos siguientes al elegir su mbito. Ventajas de variables locales Las variables locales son una buena eleccin para cualquier tipo de clculo temporal, por las razones siguientes:

Evitar conflictos de nombres. Los nombres de variables locales no son susceptibles de entrar en conflicto. Por ejemplo, es posible crear varios procedimientos distintos que contengan una variable denominada intTemp. En tanto que intTemp est declarado como una variable local, cada procedimiento reconocer nicamente su propia versin de

intTemp. Cualquier procedimiento puede cambiar el valor de su variable intTemp local sin que ello afecte a las variables intTemp del resto de los procedimientos.

Consumo de memoria. Las variables locales slo utilizan la memoria mientras su procedimiento est en ejecucin. Su memoria se libera cuando el procedimiento vuelve al cdigo de llamada. Por el contrario, las variables Shared (Visual Basic) y Static (Visual Basic) consumen recursos de memoria hasta que su aplicacin deja de ejecutarse, por lo que se deben utilizar slo cuando sea necesario. Las variables de instancia utilizan la memoria mientras su instancia sigue existiendo, lo que les resta eficacia frente a las variables locales pero son potencialmente ms eficaces que las variables Shared o Static.

Minimizar el mbito En general, cuando se declara una variable o una constante, es un buen hbito de programacin asignar un mbito lo ms restringido posible (el mbito de un bloque es el ms restringido). Esto permite que no se pierda memoria y reduce al mnimo la posibilidad de que el cdigo haga referencia por error a una variable incorrecta. Del mismo modo, slo debera declararse una variable como Static (Visual Basic) si es necesario que conserve su valor entre una llamada al procedimiento y otra.

Cmo: Controlar el mbito de una variable


Normalmente, una variable est en mbito, o visible para referencia, en toda la regin donde se declara. En algunos casos, el nivel de acceso de la variable puede influir en su mbito. Para obtener ms informacin, consulte mbito en Visual Basic. mbito en el nivel de bloque o procedimiento

Para hacer que una variable sea visible slo dentro de un bloque

Coloque Instruccin Dim (Visual Basic) para la variable entre las instrucciones de declaracin de inicio y fin de ese bloque, por ejemplo entre las instrucciones For y Next de un bucle For. Slo puede hacer referencia a la variable desde dentro del bloque.

Para hacer que una variable sea visible slo dentro de un procedimiento

Coloque la instruccin Dim para la variable dentro del procedimiento pero fuera de cualquier bloque (como un bloque With...End With). Slo puede hacer referencia a la variable desde dentro del procedimiento, incluyendo dentro de cualquier bloque contenido en el procedimiento.

mbito en el nivel de mdulo o espacio de nombres Por comodidad, el trmino nivel de mdulo se aplica por igual a mdulos, clases y estructuras. El nivel de acceso de una variable de nivel de mdulo determina su mbito. El espacio de nombres que contiene el mdulo, la clase o la estructura tambin influye en el mbito.

Para hacer que una variable sea visible en todo un mdulo, clase o estructura
1. Coloque la instruccin Dim para la variable dentro del mdulo, clase o estructura, pero fuera de cualquier procedimiento. 2. 3. Incluya la palabra clave Private (Visual Basic) en la instruccin Dim. Puede hacer referencia a la variable desde cualquier parte dentro del mdulo, clase o estructura, pero no desde fuera de l.

Para hacer que una variable sea visible en todo un espacio de nombres
1. Coloque la instruccin Dim para la variable dentro del mdulo, clase o estructura, pero fuera de cualquier procedimiento. 2. 3. Incluya la palabra clave Friend (Visual Basic) o Public (Visual Basic) en la instruccin Dim. Puede hacer referencia a la variable desde cualquier parte dentro del espacio de nombres que contiene el mdulo, clase o estructura. Ejemplo En el ejemplo siguiente se declara una variable en el nivel de mdulo y se limita su visibilidad al cdigo dentro del mdulo. Copiar cdigo

Module demonstrateScope Private strMsg As String Sub initializePrivateVariable() strMsg = "This variable cannot be used outside this module." End Sub Sub usePrivateVariable() MsgBox(strMsg) End Sub End Module
En el ejemplo anterior, todos los procedimientos definidos en el mdulo demonstrateScope pueden hacer referencia a la variable String strMsg. Cuando se llama al procedimiento usePrivateVariable, se muestra el contenido de la variable strMsg en un cuadro de dilogo. La siguiente modificacin del ejemplo anterior permite que el cdigo haga referencia a la variable de cadena strMsg en cualquier parte del espacio de nombres de su declaracin. Copiar cdigo

Public strMsg As String


Programacin eficaz

Cuanto ms estrecho sea el mbito de una variable, menos probabilidades tendr de hacer referencia accidentalmente a ella en lugar de a otra variable con el mismo nombre. Tambin puede minimizar los problemas de concordancia de referencias. Seguridad Cuanto ms estrecho sea el mbito de una variable, menos posibilidades habr de que un cdigo malintencionado puede hacer un uso indebido de ella.

Promocin de tipos
Cuando se declara un elemento de programacin en un mdulo, Visual Basic promociona su mbito al espacio de nombres que contiene el mdulo. Esto se conoce como promocin de tipos. El ejemplo siguiente muestra una definicin esquemtica de un mdulo y dos miembros de ese mdulo. Copiar cdigo

Namespace projNamespace Module projModule Public Enum basicEnum As Integer one = 1 two = 2 End Enum Public Class innerClass Public Sub numberSub(ByVal firstArg As Integer) End Sub End Class End Module End Namespace
Dentro de projModule, los elementos de programacin declarados en el nivel de mdulo se promueven a projNamespace. En el ejemplo anterior, basicEnum e innerClass se promueven, pero numberSub no, porque no est declarado en el nivel de mdulo. Efecto de promocin de tipos El efecto de promocin de tipos es que una cadena de calificacin no necesita incluir el nombre del mdulo. El ejemplo siguiente realiza dos llamadas al procedimiento del ejemplo anterior. Copiar cdigo

Sub usePromotion() projNamespace.projModule.innerClass.numberSub(projNamespace.projModule .basicEnum.one) projNamespace.innerClass.numberSub(projNamespace.basicEnum.two) End Sub


En el ejemplo anterior, la primera llamada utiliza las cadenas de calificacin completas. Sin embargo, esto no es necesario debido a la promocin de tipos. La segunda llamada tambin tiene acceso a los miembros del mdulo sin incluir projModule en las cadenas de calificacin. Rechazo de promocin de tipos Si el espacio de nombres ya tiene un miembro con el mismo nombre que un miembro del mdulo, se rechaza la promocin de tipos para ese miembro del mdulo. El ejemplo siguiente muestra una definicin esquemtica de una enumeracin y un mdulo dentro del mismo espacio de nombres. Copiar cdigo

Namespace thisNamespace Public Enum abc first = 1 second End Enum

Module thisModule Public Class abc Public Sub abcSub() End Sub End Class Public Class xyz Public Sub xyzSub() End Sub End Class End Module End Namespace
En el ejemplo anterior, Visual Basic no puede promocionar la clase abc a thisNameSpace porque ya hay una enumeracin con el mismo nombre en el nivel del espacio de nombres. Para tener acceso a abcSub, debe utilizar la cadena de calificacin completa thisNamespace.thisModule.abc.abcSub. Sin embargo, todava se promueve la clase xyz y puede tener acceso a xyzSub con la cadena de calificacin ms corta thisNamespace.xyz.xyzSub. Rechazo de promocin de tipos para tipos parciales Si una clase o estructura dentro de un mdulo utiliza la palabra clave Partial (Visual Basic), se rechaza automticamente la promocin de tipos para esa clase o estructura, ya tenga o no el espacio de nombres un miembro con el mismo nombre. Otros elementos en el mdulo renen todava los requisitos necesarios para la promocin de tipos. Consecuencias. El rechazo de la promocin de tipos de una definicin parcial puede provocar unos resultados inesperados e incluso errores del compilador. El ejemplo siguiente muestra definiciones esquemticas parciales de una clase, una de las cuales est dentro de un mdulo. Copiar cdigo

Namespace sampleNamespace Public Partial Class sampleClass Public Sub sub1() End Sub End Class Module sampleModule Public Partial Class sampleClass Public Sub sub2() End Sub End Class End Module End Namespace
En el ejemplo anterior, el desarrollador podra esperar que el compilador combinara las dos definiciones parciales de sampleClass. Sin embargo, el compilador no considera la promocin para la definicin parcial dentro de sampleModule. En consecuencia, intenta compilar dos clases separadas y distintas, ambas denominadas sampleClass pero con rutas de acceso de calificacin diferentes. El compilador slo combina las definiciones parciales cuando sus rutas de acceso completas son idnticas. Recomendaciones Las recomendaciones siguientes representan un buen hbito de programacin.

Nombres nicos. Si tiene el control completo sobre la denominacin de los elementos de programacin, suele ser una buena idea utilizar nombres nicos en todas partes. Unos nombres idnticos requieren calificacin adicional y pueden dificultar la lectura del cdigo. Tambin pueden llevar a errores poco claros y a unos resultados inesperados.

Calificacin completa. Si trabaja con mdulos y otros elementos en el mismo espacio de nombres, el enfoque ms seguro es utilizar siempre una calificacin completa para todos los

elementos de programacin. Si la promocin de tipos se rechaza para un miembro del mdulo y no califica ese miembro por completo, puede tener acceso por error a un elemento de programacin diferente.

Niveles de acceso en Visual Basic


El nivel de acceso de un elemento declarado es la extensin de la capacidad de acceso a l; es decir, qu cdigo tiene permiso para leer o escribir en l. Est determinado no solamente por cmo se declara el propio elemento, sino tambin por la nivel de acceso del contenedor del elemento. El cdigo que no puede tener acceso a un elemento contenedor no puede tener acceso a ninguno de sus elementos contenedores, incluso aqullos declarados como Public. Por ejemplo, se puede tener acceso a una variable Public de una estructura Private desde dentro de la clase que contiene la estructura, pero no desde fuera.

Public La palabra clave Public (Visual Basic) de la instruccin de declaracin especifica que se puede tener acceso a los elementos desde el cdigo en cualquier parte del mismo proyecto, desde otros proyectos que hagan referencia al proyecto y desde un ensamblado generado a partir del proyecto. El cdigo siguiente muestra un ejemplo de declaracin Public.

Copiar cdigo

Public Class classForEverybody


Puede utilizar Public solamente en el nivel de mdulo, interfaz o espacio de nombres. Es decir, puede declarar un elemento pblico en el nivel de archivo de cdigo fuente o espacio de nombres o dentro de una interfaz, mdulo, clase o estructura, pero no dentro de un procedimiento.

Protected La palabra clave Protected (Visual Basic) de la instruccin de declaracin especifica que slo se puede tener acceso a los elementos desde dentro de la misma clase o desde una clase derivada de ella. El cdigo siguiente muestra un ejemplo de declaracin Protected.

Copiar cdigo

Protected Class classForMyHeirs


Slo puede usar Protected en el nivel de clase y slo al declarar un miembro de una clase.Es decir, puede declarar un elemento protegido en una clase, pero no en el nivel de archivo de cdigo fuente o espacio de nombres, o dentro de una interfaz, mdulo, estructura o procedimiento.

Friend La palabra clave Friend (Visual Basic) en la instruccin de declaracin especifica que se puede tener acceso a los elementos desde dentro del mismo ensamblado, pero no desde fuera del ensamblado. El cdigo siguiente muestra un ejemplo de declaracin Friend.

Copiar cdigo

Friend stringForThisProject As String


Puede utilizar Friend solamente en el nivel de mdulo, interfaz o espacio de nombres. Es decir, puede declarar un elemento Friend en el nivel de archivo de cdigo fuente o espacio de nombres o dentro de una interfaz, mdulo, clase o estructura, pero no dentro de un procedimiento.

Protected Friend

Las palabras clave Protected y Friend juntas en la instruccin de declaracin especifican que se puede tener acceso a los elementos desde las clases derivadas, desde dentro del mismo ensamblado o ambos. El cdigo siguiente muestra un ejemplo de declaracin Protected Friend.

Copiar cdigo

Protected Friend stringForProjectAndHeirs As String


Slo puede usar Friend Protected en el nivel de clase y slo al declarar un miembro de una clase.Es decir, puede declarar un elemento de tipo Protected Friend en una clase, pero no en el nivel de archivo de cdigo fuente o espacio de nombres, o dentro de una interfaz, mdulo, estructura o procedimiento.

Private La palabra clave Private (Visual Basic) de la instruccin de declaracin especifica que slo se puede tener acceso a los elementos desde dentro del mismo mdulo, clase o estructura. El cdigo siguiente muestra un ejemplo de declaracin Private.

Copiar cdigo

Private numberForMeOnly As Integer


Slo puede utilizar Private en el nivel de mdulo. Es decir, puede declarar un elemento privado dentro de un mdulo, clase o estructura, pero no en el nivel de archivo de cdigo fuente o espacio de nombres, dentro de una interfaz o un procedimiento.

En el nivel de mdulo, la instruccin Dim sin ninguna palabra clave de nivel de acceso es equivalente a una declaracin Private. No obstante, podra convenirle usar la palabra clave Private para facilitar la lectura y la interpretacin del cdigo.

Modificadores de acceso Las palabras clave que especifican el nivel de acceso se llaman modificadores de acceso. La tabla siguiente compara los modificadores de acceso.

Modificador de acceso Public

Nivel de acceso concedido Sin restricciones: Cualquier cdigo que puede ver un elemento pblico puede tener acceso a l.

Elementos que puede declarar con este nivel de acceso Interfaces Mdulos Clases Estructuras Miembros de estructura Procedimientos Propiedades Variables miembros Constantes Enumeraciones Eventos Declaraciones

Contexto de declaracin dentro de cual puede utilizar este modificador Archivo de cdigo fuente Espacio de nombres Interfaz Mdulo Clase Estructura

externas Delegados Protected De derivacin: El cdigo de la clase que declara un elemento protegido, o una clase derivada de l, puede tener acceso al elemento. Interfaces Clases Estructuras Procedimientos Propiedades Variables miembros Constantes Enumeraciones Eventos Declaraciones externas Delegados Friend Ensamblado: El cdigo del ensamblado que declara un elemento de tipo Friend puede tener acceso a l. Interfaces Mdulos Clases Estructuras Miembros de estructura Procedimientos Propiedades Variables miembros Constantes Enumeraciones Eventos Declaraciones externas Delegados Protected Friend Unin de Protected y Friend: El cdigo de la misma clase o el mismo ensamblado que el elemento de tipo Protected Friend o aquel que est dentro de cualquier clase derivada de la clase del elemento, puede tener acceso a l. Interfaces Clases Estructuras Procedimientos Propiedades Variables miembros Constantes Enumeraciones Eventos Declaraciones externas Clase Archivo de cdigo fuente Espacio de nombres Interfaz Mdulo Clase Estructura Clase

Delegados Private Contexto de declaracin: El cdigo del tipo que declara un elemento privado, incluido el cdigo de los tipos contenidos, puede tener acceso al elemento. Interfaces Clases Estructuras Miembros de estructura Procedimientos Propiedades Variables miembros Constantes Enumeraciones Eventos Declaraciones externas Delegados Mdulo Clase Estructura

Cmo: Controlar la disponibilidad de una variable


La disponibilidad de una variable se controla especificando su nivel de acceso. El nivel de acceso determina qu cdigo tiene permiso de lectura o escritura en la variable.

Las variables miembros (definidas en el nivel de mdulo y fuera de cualquier procedimiento) tienen como valor predeterminado un acceso pblico que significa cualquier cdigo que puede verlas y tener acceso a ellas. Puede cambiar esto especificando un modificador de acceso.

Las variables locales (definidas dentro de un procedimiento) tienen nominalmente un acceso pblico, aunque slo el cdigo dentro de su procedimiento puede tener acceso a ellas. No puede cambiar el nivel de acceso de una variable local pero puede cambiar el nivel de acceso del procedimiento que la contiene.

Para obtener ms informacin, consulte Niveles de acceso en Visual Basic. Acceso privado y pblico

Para hacer que una variable sea accesible nicamente desde su mdulo, clase o estructura
1. Coloque la instruccin Instruccin Dim (Visual Basic) para la variable dentro del mdulo, clase o estructura, pero fuera de cualquier procedimiento. 2. Incluya la palabra clave Private (Visual Basic) en la instruccin Dim. Puede leer o escribir en la variable desde cualquier parte dentro del mdulo, clase o estructura, pero no desde fuera de l.

Para hacer que una variable sea accesible desde cualquier cdigo que puede verla
1. Para una variable miembro, coloque la instruccin Dim para la variable dentro del mdulo, clase o estructura pero fuera de cualquier procedimiento.

2.

Incluya la palabra clave Public (Visual Basic) en la instruccin Dim. Puede leer o escribir en la variable desde cualquier cdigo que interopere con su ensamblado.

o bien 1. 2. Para una variable local, coloque la instruccin Dim para la variable dentro de un procedimiento. No incluya la palabra clave Public en la instruccin Dim. Puede leer o escribir en la variable desde cualquier parte dentro del procedimiento pero no desde fuera de l. Acceso protegido y amigo Puede limitar el nivel de acceso de una variable a su clase y cualquier clase derivada o a su ensamblado. Tambin puede especificar la unin de estas limitaciones que permiten el acceso desde un cdigo de cualquier clase derivada o de cualquier otro lugar del mismo ensamblado. Especifica esta unin combinando las palabras clave Protected y Friend en la misma declaracin.

Para hacer que una variable sea accesible desde su clase y cualquier clase derivada
1. Coloque la instruccin Dim para la variable dentro de una clase, pero fuera de cualquier procedimiento. 2. Incluya la palabra clave Protected (Visual Basic) en la instruccin Dim. Puede leer o escribir en la variable desde cualquier parte dentro de la clase, as como desde dentro de cualquier clase derivada de ella pero no desde fuera de cualquier clase de la cadena de derivacin.

Para hacer que una variable sea accesible slo desde el mismo ensamblado
1. Coloque la instruccin Dim para la variable dentro de un mdulo, clase o estructura, pero fuera de cualquier procedimiento. 2. Incluya la palabra clave Friend (Visual Basic) en la instruccin Dim. Puede leer o escribir en la variable desde cualquier parte dentro del mdulo, clase o estructura, as como desde cualquier cdigo del mismo ensamblado pero no desde fuera del ensamblado. Ejemplo El ejemplo siguiente muestra declaraciones de variables con niveles de acceso Public, Protected, Friend, Protected Friend y Private. Tenga en cuenta que cuando la instruccin Dim especifica un nivel de acceso, no necesita incluir la palabra clave Dim. Copiar cdigo

Public Class classForEverybody Protected Class classForMyHeirs Friend stringForThisProject As String Protected Friend stringForProjectAndHeirs As String Private numberForMeOnly As Integer
Seguridad Cuanto ms restrictivo sea el nivel de acceso de una variable, menos posibilidades habr de que un cdigo malintencionado puede hacer un uso indebido de ella.

Referencias a elementos declarados

Si un cdigo hace referencia a un elemento declarado, el compilador Visual Basic debe hacer coincidir el nombre de la referencia con la declaracin pertinente del nombre. Si se han declarado varios elementos con el mismo nombre, es posible controlar a cul de ellos se hace referencia mediante la calificacin de su nombre.

Resolver una referencia cuando muchas variables tienen el mismo nombre


Cuando el compilador intenta hacer coincidir una referencia de nombre con una declaracin de nombre, busca la declaracin de coincidencia del mbito ms restringido. Esto significa que comienza con el cdigo que realiza la referencia y se mueve hacia afuera a travs de los sucesivos niveles de elementos contenedores. Si quiere omitir este proceso de bsqueda y especificar un nombre declarado en un mbito ms ancho, debe calificar el nombre con el elemento contenedor del mbito ms ancho. En algunos casos, podra tener que calificar tambin el elemento contenedor. Para obtener ms informacin sobre la calificacin de nombres, vea Cmo: Calificar el nombre de un elemento declarado. Tambin podra tener que calificar una referencia de nombre si la aplicacin tiene acceso a ms de un elemento de programacin con el mismo nombre. Para obtener ejemplos, vea "Clases con el mismo nombre" en esta pgina Ayuda y Cmo: Distinguir entre dos elementos con el mismo nombre. mbito ms restringido El ejemplo siguiente muestra las referencias a dos variables con el mismo nombre. Copiar cdigo

' Assume these two modules are both in the same assembly. Module container Public totalCount As Integer = 1 Public Sub showCount() Dim totalCount As Integer = 6000 ' The following statement displays the local totalCount (6000). MsgBox("Unqualified totalCount is " & CStr(totalCount)) ' The following statement displays the module's totalCount (1). MsgBox("container.totalCount is " & CStr(container.totalCount)) End Sub End Module Module callingModule Public Sub displayCount() container.showCount() ' The following statement displays the containing module's totalCount (1). MsgBox("container.totalCount is " & CStr(container.totalCount)) End Sub End Module
En el ejemplo anterior se declaran dos variables, cada una denominada totalCount, en los diferentes niveles de mbito en el mdulo container. Cuando el procedimiento showCount muestra totalCount sin la calificacin, el compilador de Visual Basic resuelve la referencia a la declaracin con el mbito ms restringido, concretamente la declaracin local dentro de showCount. Cuando califica totalCount con el mdulo contenedor container, el compilador resuelve la referencia en la declaracin con el mbito ms ancho. Miembros de otros elementos contenedores

Si se utiliza un miembro no compartido de otra clase o estructura, primero debe calificarse el nombre del miembro con una variable o una expresin que se refiera a una instancia de la clase o de la estructura. En el ejemplo siguiente, demoClass es una instancia de una clase denominada class1. Copiar cdigo

Dim demoClass As class1 = New class1() demoClass.someSub[(argumentlist)]


No puede utilizarse el propio nombre de la clase para calificar a un miembro que no es Shared (Visual Basic). Debe crear primero una instancia en una variable de objeto (en este caso demoClass) y, a continuacin, hacer referencia a ella por el nombre de variable. Si una clase o estructura tiene un miembro Shared, puede calificar ese miembro con el nombre de clase o estructura, o con una variable o expresin que seale a una instancia. Un mdulo no tiene ninguna instancia separada y todos sus miembros son de manera predeterminada Shared. Por consiguiente, califica un miembro de mdulo con el nombre del mdulo. Ejemplo de referencia calificada El ejemplo siguiente muestra referencias calificadas a procedimientos de miembros de mdulos. Copiar cdigo

' Assume these three modules are all in the same assembly. Module module1 Public Sub perform() MsgBox("module1.perform() now returning") End Sub End Module Module module2 Public Sub perform() MsgBox("module2.perform() now returning") End Sub Public Sub doSomething() ' The following statement calls perform in module2, the active module. perform() ' The following statement calls perform in module1. module1.perform() End Sub End Module Module module3 Public Sub callPerform() ' The following statement calls perform in module1. module1.perform() ' The following statement makes an unresolvable name reference ' and therefore generates a COMPILER ERROR. perform() ' INVALID statement End Sub End Module
En el ejemplo anterior se declaran dos procedimientos Sub, ambos denominados perform, en mdulos diferentes de un proyecto. Los dos pueden especificarse sin calificacin en su propio mdulo, pero deben ser calificados si se les hace referencia desde otra seccin. Como la referencia final en module3 no califica perform, el compilador no puede resolver esa referencia. Referencia a proyectos Para poder utilizar elementos Public (Visual Basic) definidos en otro proyecto, primero debe definirse una referencia al ensamblado o a la biblioteca de tipos del proyecto. Para establecer una referencia, haga clic en Agregar referencia en el men Proyecto o utilice la opcin del compilador de lnea de comandos /reference (Visual Basic).

Por ejemplo, puede utilizar el modelo de objetos XML de .NET Framework. Si establece una referencia en el espacio de nombres System.Xml, puede declarar y utilizar cualquiera de sus clases, como XmlDocument. El ejemplo siguiente utiliza XmlDocument. Copiar cdigo

' Assume this project has a reference to System.Xml ' The following statement creates xDoc as an XML document object. Dim xDoc As System.Xml.XmlDocument
Importar elementos contenedores Puede utilizar Instruccin Imports (Tipo y espacio de nombres de .NET) para importar los espacios de nombres que contienen los mdulos o clases que desea utilizar. Esto permite hacer referencia a los elementos definidos en un espacio de nombres importado sin calificar por completo sus nombres. En el ejemplo siguiente se escribe de nuevo el ejemplo anterior para importar el espacio de nombres System.Xml. Copiar cdigo

' Assume this project has a reference to System.Xml ' The following statement must precede all your declarations. Imports System.Xml ' The following statement creates xDoc as an XML document object. Dim xDoc As XmlDocument
Asimismo, la instruccin Imports puede definir un alias de importacin para cada espacio de nombres importado. De esta forma el cdigo fuente es ms corto y ms fcil de leer. En el ejemplo siguiente se escribe de nuevo el ejemplo anterior para utilizar xD como un alias para el espacio de nombres System.Xml. Copiar cdigo

' Assume this project has a reference to System.Xml ' The following statement must precede all your declarations. Imports xD = System.Xml ' The following statement creates xDoc as an XML document object. Dim xDoc As xD.XmlDocument
La instruccin Imports no hace que los elementos de otros proyectos estn disponibles para su aplicacin. Es decir, no sustituye a la configuracin de una referencia. La importacin de un espacio de nombres sencillamente evita la necesidad de calificar los nombres definidos en l. Tambin puede utilizar la instruccin Imports para importar mdulos, clases, estructuras y enumeraciones. Despus puede utilizar los miembros de estos elementos importados sin calificacin. No obstante, debe calificar siempre los miembros no compartidos de clases y estructuras con una variable o expresin que se evale en una instancia de la clase o estructura. Clases con el mismo nombre Cuando se crea una instancia nueva de un objeto, probablemente sea necesario calificar la clase con el espacio de nombres o el tipo de biblioteca al que pertenece. Por ejemplo, los espacios de nombres System.Windows.Forms y System.Web.UI.WebControls contienen los dos una clase Label (System.Windows.Forms..::.Label y System.Web.UI.WebControls..::.Label). Si una aplicacin utiliza los dos o si define su propia clase Label, debe distinguir los objetos Label diferentes. Incluya el espacio de nombres o un alias de importacin en la declaracin de variable. El ejemplo siguiente utiliza el alias de importacin. Copiar cdigo

' The following statement must precede all your declarations. Imports win = System.Windows.Forms, web = System.Web.UI.WebControls ' The following statement references the Windows.Forms.Label class. Dim winLabel As New win.Label()
Instrucciones de nomenclatura

Si se definen dos o ms elementos de programacin con el mismo nombre, puede producirse una ambigedad de nombres cuando el compilador intente resolver una referencia al nombre. Si hay ms de una definicin en el mbito, o no hay ninguna, la referencia es irresoluble. Para obtener un ejemplo, vea el "Ejemplo de referencia calificada" en esta pgina Ayuda. Puede evitar la ambigedad de nombres si asigna a todos los elementos nombres nicos. Puede hacer referencia a cualquier elemento sin necesidad de calificar su nombre con un espacio de nombres, mdulo o clase. Tambin reduce las posibilidades de hacer referencia accidentalmente a un elemento equivocado.

Cmo: Calificar el nombre de un elemento declarado


Si un cdigo hace referencia a un elemento declarado, el compilador Visual Basic debe hacer coincidir el nombre de la referencia con la declaracin pertinente del nombre. Si el elemento est definido fuera del cdigo o si hay ms de un elemento declarado con el mismo nombre, es posible que necesite calificar el nombre para permitir al compilador resolver cualquier posible ambigedad o buscar el elemento. Calificar un nombre significa que hay que hacerlo preceder en la instruccin de origen con informacin que identifique dnde se ha definido el elemento de destino. Esta informacin se denomina cadena de la calificacin. Puede incluir uno o ms espacios de nombres y un mdulo, clase o estructura. La cadena de la calificacin debe especificar de forma inequvoca el mdulo, clase o estructura que contiene el elemento de destino. Se puede buscar a su vez el contenedor en otro elemento contenedor, normalmente un espacio de nombres. Es posible que necesite incluir varios elementos contenedores en la cadena de la calificacin.

Para tener acceso a un elemento declarado mediante la calificacin de su nombre


1. Determine la ubicacin en la que se ha definido el elemento. Esto puede incluir un espacio de nombres o incluso una jerarqua de espacios de nombres. Dentro del espacio de nombres de nivel inferior, el elemento debe estar contenido en un mdulo, clase o estructura. Copiar cdigo

' Assume the following hierarchy exists outside your code. Namespace outerSpace Namespace innerSpace Module holdsTotals Public Structure totals Public thisTotal As Integer Public Shared grandTotal As Long End Structure End Module End Namespace End Namespace
2. Determine una ruta de acceso de calificacin basada en la ubicacin del elemento de destino. Comience con el espacio de nombres de nivel superior, contine con el espacio de nombres de nivel inferior y termine con el mdulo, clase o estructura que contiene el elemento de destino. Cada elemento en la ruta de acceso debe contener el elemento que le sigue.

outerSpace innerSpace holdsTotals totals


3. Prepare la cadena de la calificacin para el elemento de destino. Coloque un punto (.) despus de cada elemento en la ruta de acceso. Su aplicacin debe tener acceso a cada elemento en la cadena de la calificacin. Copiar cdigo

outerSpace.innerSpace.holdsTotals.totals.
4. Escriba la expresin o instruccin de asignacin que hace referencia al elemento de destino de la manera normal. Copiar cdigo

grandTotal = 9000
5. Preceda el nombre del elemento de destino con la cadena de la calificacin. El nombre debe ir inmediatamente despus del punto (.) que sigue al mdulo, clase o estructura que contiene el elemento. Copiar cdigo

' Assume the following module is part of your code. Module accessGrandTotal Public Sub setGrandTotal() outerSpace.innerSpace.holdsTotals.totals.grandTotal = 9000 End Sub End Module
6. El compilador utiliza la cadena de la calificacin para encontrar una declaracin clara e inequvoca con la que puede hacer coincidir la referencia del elemento de destino.

7. Cmo: Distinguir entre dos elementos con el mismo nombre


8. Si su aplicacin tiene acceso a varios elementos con el mismo nombre, puede calificar un nombre para permitir que el compilador de Visual Basic haga coincidir su referencia con el elemento determinado que desea utilizar. Para obtener ms informacin, consulte Cmo: Calificar el nombre de un elemento declarado. 9. Ejemplo contenedores diferentes con el mismo nombre. Las variables se declaran como Shared simplemente para acortar el cdigo en el ejemplo. Copiar cdigo 10. El ejemplo siguiente muestra dos variables con el mismo nombre en elementos

Namespace space1 Public Class innerClass ' String showMe is declared Shared to facilitate reference. Public Shared showMe As String = "Shared string 1" End Class End Namespace Namespace space2 Public Class innerClass ' String showMe is declared Shared to facilitate reference. Public Shared showMe As String = "Shared string 2" End Class End Namespace Public Module callShowMe Public Sub showStrings() MsgBox("From space1: " & space1.innerClass.showMe _ & vbCrLf & "From space2: " & space2.innerClass.showMe) End Sub End Module
11. El ejemplo anterior declara dos variables, las dos llamadas showMe y las dos dentro de una clase denominada innerClass. Dado que ambos elementos contenedores tienen el mismo nombre, el cdigo de llamada no slo debe calificar a la variable showMe con su contenedor

innerClass, sino tambin a innerClass con su contenedor space1 o space2. El

compilador de Visual Basic puede resolver las referencias porque las cadenas de calificacin proporcionan una ruta de acceso inequvoca a una declaracin nica. 12. Programacin eficaz de referirse accidentalmente a una en lugar de a otra. Tambin puede minimizar los problemas de concordancia de referencias. 14. Seguridad de que un cdigo malintencionado puede hacer un uso indebido de ellas. 15. Cuantas menos variables con el mismo nombre haya declarado, menos posibilidades habr 13. Cuantas menos variables con el mismo nombre haya declarado, menos posibilidades tendr

16.

Sombrear en Visual Basic

17. Si dos elementos de programacin comparten el mismo nombre, uno de ellos puede ocultar o sombrear al otro. En esta situacin, el elemento sombreado no est disponible como referencia; en vez de esto, cuando el cdigo utiliza el nombre del elemento, el compilador de Visual Basic resuelve en favor del elemento que sombrea. 18. Finalidad

19. La finalidad principal de sombrear es proteger la definicin de los miembros de la clase. La clase base puede sufrir un cambio que cree un elemento con el mismo nombre que otro ya definido. Si sucede esto, el modificador Shadows fuerza a referencias a travs de la clase para que se resuelvan en el miembro definido en lugar de hacerlo en el nuevo elemento de la clase base. 20. Tipos de sombreado

21. Un elemento puede sombrear a otro de dos formas. El elemento que sombrea puede declararse dentro de una subregin de la regin que contiene el elemento sombreado, en cuyo caso el sombreado se consigue por mbito. O bien, una clase derivada puede redefinir un miembro de una clase base, en cuyo caso el sombreado se consigue por herencia. 22. Sombreado por mbito 23. Es posible que los elementos de programacin del mismo mdulo, clase o estructura tengan un nombre idntico pero mbitos diferentes. Si dos elementos se declaran de esta manera y el cdigo hace referencia al nombre que comparten, el elemento de mbito ms restringido oculta al otro elemento (el mbito de bloque es el ms restringido). 24. Por ejemplo, un mdulo puede definir una variable Public denominada temp y un procedimiento contenido en el mdulo puede declarar una variable local con el mismo nombre temp. Las referencias al nombre temp desde dentro del procedimiento obtienen acceso a la variable local, mientras que las referencias a temp desde fuera del procedimiento obtienen acceso a la variable Public. En este caso, la variable de procedimiento temp ensombrece a la variable de mdulo temp. 25. La ilustracin siguiente muestra dos variables, los dos denominadas temp. La variable local

temp sombrea la variable miembro temp cuando se tiene acceso a ella desde su propio procedimiento p. Sin embargo, la palabra clave MyClass omite el sombreado y tiene acceso a la
variable miembro. 26. Sombreado por mbito

27.

28. Para obtener un ejemplo de sombreado por mbito, consulte Cmo: Ocultar una variable con el mismo nombre que su variable. 29. Sombreado por herencia 30. Si una clase derivada vuelve a definir un elemento de programacin heredado de una clase base, el elemento que redefine ensombrece al elemento original. Se puede sombrear cualquier tipo de elemento declarado o conjunto de elementos sobrecargados con cualquier otro tipo. Por ejemplo, una variable Integer puede sombrear un procedimiento Function. Si sombrea un procedimiento con otro, puede utilizar una lista de parmetros distinta y un tipo de devolucin distinto. 31. La ilustracin siguiente muestra una clase base b y una clase derivada d que hereda de b. La clase base define un procedimiento denominado proc y la clase derivada lo sombrea con otro procedimiento del mismo nombre. La primera instruccin Call tiene acceso al sombreado proc en la clase derivada. Sin embargo, la palabra clave MyBase omite el sombreado y tiene acceso al procedimiento sombreado en la clase base. 32. Sombreado por herencia 33.

34. Para obtener un ejemplo de sombreado por herencia, consulte Cmo: Ocultar una variable con el mismo nombre que su variable y Cmo: Ocultar una variable heredada.

35. Sombreado y nivel de acceso 36. El elemento de sombreado no siempre es accesible desde el cdigo que utiliza la clase derivada. Por ejemplo, se podra declarar Private. En este caso, se rechaza el sombreado y el compilador resuelve cualquier referencia en el mismo elemento que tendra si no hubiera habido sombreado. ste es el elemento accesible con menos pasos de derivacin en sentido inverso desde la clase que sombrea. Si el elemento sombreado es un procedimiento, la resolucin se concreta en la versin accesible ms prxima con el mismo nombre, lista de parmetros y tipo de valor devuelto. 37. El ejemplo siguiente muestra una jerarqua de herencia de tres clases. Cada clase define un procedimiento Sub display y cada clase derivada sombrea el procedimiento display en su clase base. Copiar cdigo

Public Class firstClass Public Sub display() MsgBox("This is firstClass") End Sub End Class Public Class secondClass Inherits firstClass Private Shadows Sub display() MsgBox("This is secondClass") End Sub End Class Public Class thirdClass Inherits secondClass Public Shadows Sub display() MsgBox("This is thirdClass") End Sub End Class Module callDisplay Dim first As New firstClass Dim second As New secondClass Dim third As New thirdClass Public Sub callDisplayProcedures() ' The following statement displays "This is firstClass". first.display() ' The following statement displays "This is firstClass". second.display() ' The following statement displays "This is thirdClass". third.display() End Sub End Module
38. En el ejemplo anterior, la clase derivada secondClass sombrea display con un procedimiento Private. Cuando el mdulo callDisplay llama a display en secondClass, el cdigo de llamada est fuera de secondClass y no puede tener acceso al procedimiento display privado. Se rechaza el sombreado y el compilador resuelve la referencia en el procedimiento

display de la clase base.


39. Sin embargo, la siguiente clase derivada thirdClass declara display como Public, por lo que el cdigo de callDisplay puede tener acceso a ella. 40. Sombreado y reemplazo

41. No debe confundirse sombrear con reemplazar. Ambos se utilizan cuando una clase derivada hereda de una clase base y ambos vuelven a definir un elemento declarado con otro. No

obstante, existen diferencias significativas entre ambos. Para ver una comparacin, consulte Diferencias entre sombrear y reemplazar. 42. Sombreado y sobrecarga

43. Si sombrea el mismo elemento de la clase base con ms de un elemento en la clase derivada, los elementos sombreados se convierten en versiones sobrecargadas de este elemento. Para obtener ms informacin, consulte Sobrecarga de procedimientos. 44. Tener acceso a un elemento sombreado

45. Cuando se obtiene acceso a un elemento de una clase derivada, normalmente se logra a travs de la instancia actual de dicha clase derivada, mediante la calificacin del nombre del elemento con la palabra clave Me. Si una clase derivada ensombrece al elemento de la clase base, puede obtenerse acceso al elemento de la clase base mediante su calificacin con la palabra clave MyBase. 46. Para obtener un ejemplo de tener acceso a un elemento sombreado, consulte Cmo: Obtener acceso a una variable que oculta una clase derivada. 47. Declaracin de la variable de objeto 48. La forma de crear la variable de objeto tambin puede afectar al hecho de que la clase derivada tenga acceso a un elemento de sombreado o al elemento sombreado. El ejemplo siguiente crea dos objetos a partir de una clase derivada, pero un objeto se declara como la clase base y el otro como la clase derivada. Copiar cdigo

Public Class baseCls ' The following statement declares the element that is to be shadowed. Public z As Integer = 100 End Class Public Class dervCls Inherits baseCls ' The following statement declares the shadowing element. Public Shadows z As String = "*" End Class Public Class useClasses ' The following statement creates the object declared as the base class. Dim basObj As baseCls = New dervCls() ' Note that dervCls widens to its base class baseCls. ' The following statement creates the object declared as the derived class. Dim derObj As dervCls = New dervCls() Public Sub showZ() ' The following statement outputs 100 (the shadowed element). MsgBox("Accessed through base class: " & basObj.z) ' The following statement outputs "*" (the shadowing element). MsgBox("Accessed through derived class: " & derObj.z) End Sub End Class
49. En el ejemplo anterior, la variable basObj se declara como clase base. La asignacin de un objeto dervCls a ella constituye una conversin de ampliacin y, por lo tanto, es vlida. Sin embargo, la clase base no puede obtener acceso a la versin de sombreado de la variable z en

la clase derivada, por lo tanto, el compilador resuelve basObj.z con el valor original de la clase base.

50.

Tipos de datos en Visual Basic

51. El tipo de datos de un elemento de programacin hace referencia al tipo de datos que puede contener y a cmo se almacenan dichos datos. Los tipos de datos se aplican a todos los valores que pueden almacenarse en la memoria del equipo o participar en la evaluacin de una expresin. Cada variable, literal, constante, enumeracin, propiedad, parmetro de procedimiento, argumento de procedimiento y valor devuelto por un procedimiento tiene un tipo de datos. 52. Tipos de datos declarados elementos de programacin. (Para obtener ms informacin, vea Programacin sin tipos en Visual Basic). 54. Un elemento de programacin se define con una instruccin de declaracin y su tipo de datos se especifica con la clusula As. La tabla siguiente muestra las instrucciones utilizadas para declarar diversos elementos. 53. A menos que utilice la programacin sin tipos, debe declarar los tipos de datos de todos los

Elemento de programacin Variable

Declaracin de tipos de datos En una Instruccin Dim (Visual Basic)

Dim amount As Double Static yourName As String Public billsPaid As Decimal = 0


Literal Con un carcter de tipo de literal; vea "Caracteres de tipo de literal" en Caracteres de tipo

Dim searchChar As Char = "." C


Constante En una Instruccin Const (Visual Basic)

Const modulus As Single = 4.17825F


Enumeracin En una Instruccin Enum (Visual Basic)

Public Enum colors


Propiedad En una Property (Instruccin)

Property region() As String


Parmetro de procedimiento En una Instruccin Sub (Visual Basic), Instruccin Function (Visual Basic) o Operator (Instruccin)

Sub addSale(ByVal amount As Double)


Argumento de procedimiento En el cdigo de llamada; cada argumento es un elemento de programacin que ya se ha declarado o una expresin que contiene los elementos declarados

subString = Left( inputString , 5 )


Valor devuelto por procedimiento En una Instruccin Function (Visual Basic) o Operator (Instruccin)

Function convert(ByVal b As Byte) As String

Caracteres de tipo
Adems de especificar un tipo de datos en una instruccin de declaracin, puede forzar el tipo de datos de algunos elementos de programacin con un carcter de tipo. El carcter de tipo debe ir justo despus del elemento, sin ningn tipo de carcter intermedio. El carcter de tipo no forma parte del nombre del elemento. Se puede hacer referencia a un elemento definido con un carcter de tipo sin el carcter de tipo. Caracteres de tipo de identificador Visual Basic proporciona un conjunto de caracteres de tipo de identificador que se pueden utilizar en una declaracin para especificar el tipo de datos de una variable o constante. La tabla siguiente muestra los caracteres de tipo de identificador disponibles, con ejemplos de su utilizacin. Carcter de tipo de identificador % & @ ! # $ Tipo de datos Integer Long Decimal Single Double String Ejemplo

Dim L% Dim M& Const W@ = 37.5 Dim Q! Dim X# Dim V$ = "Secret"

No existe ningn carcter de tipo de identificador para los tipos de datos Boolean, Byte, Char, Date, Object, SByte, Short, UInteger, ULong o UShort, ni para los tipos de datos compuestos como matrices o estructuras. En algunos casos, puede anexar el carcter $ a una funcin de Visual Basic, por ejemplo Left$ en lugar de Left, para obtener un valor devuelto de tipo String. En todos los casos, el carcter de tipo de identificador debe ir inmediatamente despus del nombre del identificador. Caracteres de tipo de literal Un literal es una representacin textual de un valor determinado de un tipo de datos. Tipos de literales predeterminados El formato de un literal tal como aparece en el cdigo suele determinar su tipo de datos. La siguiente tabla muestra estos tipos predeterminados. Tipo de datos predeterminado Integer Long

Formato textual de literal Numrico, ninguna parte fraccionaria Numrico, ningn parte fraccionaria, demasiado grande para Integer

Ejemplo

2147483647 2147483648

Numrico, parte fraccionaria Entre comillas dobles Incluido con signos de nmero

Double String Date

1.2 "A" #5/17/1993 9:32 AM#

Tipo de literales forzados Visual Basic proporciona un conjunto de caracteres de tipo de literal, que puede utilizar para forzar que un literal adopte un tipo de datos distinto del que indica su formato. Para hacerlo, anexe el carcter al final del literal. La tabla siguiente muestra los caracteres de tipo de literal disponibles, con ejemplos de su utilizacin. Caracteres de tipo de literal S I L D F R US UI UL C Tipo de datos Short Integer Long Decimal Single Double UShort UInteger ULong Char Ejemplo

I = 347S J = 347I K = 347L X = 347D Y = 347F Z = 347R L = 347US M = 347UI N = 347UL Q = "."C

No existe ningn carcter de tipo de literal para los tipos de datos Boolean, Byte, Date, Object, SByte o String, ni para los tipos de datos compuestos como matrices o estructuras. Los literales tambin pueden utilizar los caracteres de tipo de identificador (%, &, @, !, #, $), tal y como lo hacen las variables, constantes y expresiones. Sin embargo, los caracteres de tipo de literal (S, I, L, D, F, R, C) slo se pueden utilizar con literales. En todos los casos, el carcter de tipo de literal debe ir inmediatamente despus del valor de literal. Literales hexadecimales y octales El compilador traduce normalmente un literal entero para que est en el sistema numrico decimal (base 10). Puede forzar un literal entero para que sea hexadecimal (base 16) con el prefijo &H y puede forzarle para que sea octal (base 8) con el prefijo &O. Los dgitos que van a continuacin del prefijo deben ser adecuados para el sistema numrico. Esto se muestra en la tabla siguiente: Base numrica Hexadecimal (base 16) Prefijo &H Valores de dgitos vlidos 0-9 y A-F Ejemplo

&HFFFF

Octal (base 8)

&O

0-7

&O77

Puede agregar a un literal prefijado un carcter de tipo de literal. Esto se muestra en el siguiente ejemplo. Copiar cdigo

Dim counter As Short = &H8000S Dim flags As UShort = &H8000US


En el ejemplo anterior, counter tiene el valor decimal de -32768 y flags, el valor decimal de +32768.

Tipos de datos elementales


Visual Basic proporciona un conjunto de tipos de datos predefinidos que puede usar en numerosos elementos de programacin. Esta seccin describe estos tipos y la forma de utilizarlos.

Tipos de datos numricos


Visual Basic proporciona diversos tipos de datos numricos para controlar nmeros en varias representaciones. Los tipos integrales representan slo nmeros enteros (positivos, negativos y cero) y los tipos no integrales representan nmeros con partes enteras y fraccionarias. Para ver una tabla que muestra una comparacin punto por punto de los tipos de datos de Visual Basic, consulte Resumen de tipos de datos (Visual Basic). Tipos numricos integrales Los tipos de datos integrales son aquellos que slo representan nmeros sin partes fraccionarias. Los tipos de datos integrales con signo son SByte (Tipo de datos, Visual Basic) (de 8 bits), Short (Tipo de datos, Visual Basic) (de 16 bits), Integer (Tipo de datos, Visual Basic) (de 32 bits) y Long (Tipo de datos, Visual Basic) (de 64 bits). Si una variable almacena siempre enteros en lugar de nmeros fraccionarios, declrela como uno de estos tipos. Los tipos integrales sin signo son Byte (Tipo de datos, Visual Basic) (de 8 bits), UShort (Tipo de datos, Visual Basic) (de 16 bits), UInteger (Tipo de datos) (de 32 bits) y ULong (Tipo de datos, Visual Basic) (de 64 bits). Si una variable contiene datos binarios o datos de naturaleza desconocida, declrela como uno de estos tipos. Rendimiento Los operadores aritmticos son ms rpidos con los tipos integrales que con cualquier otro tipo de datos. Son ms rpidos con los tipos Integer y UInteger en Visual Basic. Enteros grandes Si necesita contener un entero ms grande que lo que el tipo de datos Integer puede contener, puede utilizar el tipo de datos Long en su lugar. Las variables Long pueden contener nmeros de 9.223.372.036.854.775,808 a travs de 9.223.372.036.854.775,808. Las operaciones con Long son ligeramente ms lentas que con Integer. Si necesita valores aun ms grandes, puede utilizar Decimal (Tipo de datos, Visual Basic). Puede contener nmeros de -79.228.162.514.264.337.593.543.950,335 a 79.228.162.514.264.337.593.543.950,335 en una variable Decimal si no utiliza ninguna posicin decimal. Sin embargo, las operaciones con nmeros Decimal son considerablemente ms lentas que con cualquier otro tipo de dato numrico. Enteros pequeos Si no necesita el intervalo completo del tipo de datos Integer, puede utilizar el tipo de datos Short que puede contener enteros de -32,768 a 32,767. Para el intervalo entero ms pequeo, el tipo de datos

SByte contiene enteros de -128 a 127. Si tiene un nmero muy grande de variables que contienen enteros pequeos, Common Language Runtime puede almacenar a veces las variables Short y SByte de un modo ms eficaz y ahorrar espacio de memoria. Sin embargo, las operaciones con Short y SByte son algo ms lentas que con Integer. Enteros sin signo Si sabe que la variable no va a necesitar contener nunca un nmero negativo, puede utilizar los tipos sin signo Byte, UShort, UInteger y ULong. Cada uno de estos tipos de datos puede contener un entero positivo dos veces ms grande que su tipo con signo correspondiente (SByte, Short, Integer y Long). En lo que se refiere a rendimiento, un tipo sin signo es exactamente tan eficaz como su tipo con signo correspondiente. En particular, UInteger comparte con Integer la distincin de ser el ms eficaz de todos los tipos de datos numrico bsicos. Tipos numricos no integrales Los tipos de datos no integrales son aquellos que representan nmeros que contienen tanto partes enteras como decimales. Los tipos de datos numricos no integrales son Decimal (punto fijo de 128 bits), String (Tipo de datos, Visual Basic) (punto flotante de 32 bits) y Double (Tipo de datos, Visual Basic) (punto flotante de 64 bits). Todos ellos son tipos con signo. Si una variable puede contener una fraccin, declrela como variable de uno de estos tipos. Decimal no es un tipo de datos en punto flotante. Los nmeros Decimal tienen un valor entero binario y un factor de escala entero que especifica qu parte del valor es una fraccin decimal. Los nmeros con punto flotante (Single y Double) tienen intervalos mayores que los nmeros Decimal pero pueden estar sujetos a errores de redondeo. Los tipos de punto flotante admiten menos dgitos significativos que Decimal pero pueden representar valores de mayor magnitud. Los valores de nmeros no integrales se pueden expresar como mmmEeee, donde mmm es la mantisa (dgitos significativos) y eee es el exponente (una potencia de 10). Los valores positivos superiores de los tipos no integrales son 7.9228162514264337593543950335E+28 para Decimal, 3.4028235E+38 para Single y 1.79769313486231570E+308 para Double. Rendimiento Double es el ms eficaz de los tipos de datos fraccionarios, porque los procesadores de las plataformas actuales realizan las operaciones de punto flotante en precisin doble. Sin embargo, las operaciones con Double no son tan rpidas como con los tipos integrales como Integer. Magnitudes pequeas Para los nmeros con la magnitud ms pequea posible (cercana a 0), las variables Double pueden contener nmeros tan pequeos como -4.94065645841246544E-324 para valores negativos y 4.94065645841246544E-324 para valores positivos. Nmeros fraccionarios pequeos Si no necesita el intervalo completo del tipo de datos Double, puede utilizar el tipo de datos Single que puede contener nmeros en punto flotante de -3.4028235E+38 a 3.4028235E+38. Las magnitudes ms pequeas para las variables Single son -1.401298E-45 para valores negativos y 1.401298E-45 para valores positivos. Si tiene un nmero muy grande de variables que contienen nmeros en punto flotante pequeos, Common Language Runtime puede almacenar a veces las variables Single de un modo ms eficaz y ahorrar espacio de memoria.

Cmo: Contener los nmeros enteros en una variable

Los enteros son nmeros enteros, incluidos positivos, cero y negativos. Una variable contiene enteros si la declara como tipo Integer. Integer (Tipo de datos, Visual Basic) puede contener enteros de 2.147.483,648 a 2.147.483,647. Tambin puede utilizar Long (Tipo de datos, Visual Basic), Short (Tipo de datos, Visual Basic) o SByte (Tipo de datos, Visual Basic) para contener enteros. Para obtener ms informacin, consulte Tipos de datos numricos.

Para contener nmeros enteros en una variable


1. 2. 3. Declare la variable con Instruccin Dim (Visual Basic). Agregue detrs del nombre de variable una clusula As. Agregue tras la palabra clave As la palabra clave Integer. Copiar cdigo

Dim students As Integer

Cmo: Contener el nmero mayor posible en una variable


Una variable contiene los mayores nmeros posibles con precisin si la declara como tipo de datos Decimal. La capacidad del entero mayor siguiente es el tipo de datos ULong. Si no necesita la precisin de tipos de datos enteros, puede utilizar los tipos de punto flotante para una magnitud an mayor. Dos significados diferentes para "mayor" Valor preciso mayor. Si necesita contener enteros grandes con una precisin completa en el dgito de las unidades, puede utilizar Decimal (Tipo de datos, Visual Basic). El tipo Decimal puede contener enteros de -79.228.162.514.264.337.593.543.950.335 a 79.228.162.514.264.337.593.543.950.335 (7.9...E+28). Magnitud mxima. Los tipos fraccionarios Single y Double pueden contener nmeros de magnitud mayor, pero no con una precisin exacta. String (Tipo de datos, Visual Basic) proporciona 8 dgitos de precisin y Double (Tipo de datos, Visual Basic), 18 dgitos de precisin.

Para contener los enteros mayores posibles en una variable


1. 2. Declare la variable con Instruccin Dim (Visual Basic). Agregue detrs del nombre de variable una clusula As que especifique la palabra clave Decimal. Copiar cdigo

Dim atomsInTheUniverse As Decimal


Tipos de datos eficaces El tipo Decimal tiene el rendimiento ms lento de todos los tipos de datos numricos elementales. Si los nmeros enteros no logran estos valores grandes y son siempre positivos o cero, considere la posibilidad de utilizar el tipo ULong. Una variable de ULong (Tipo de datos, Visual Basic) puede contener enteros de 0 a 18.446.744.073.709.551.615 (1.8...E+19). Las operaciones con nmeros del tipo de datos ULong son mucho ms rpidas que con el tipo de datos Decimal, aunque no son realmente tan eficaces como las realizadas con UInteger.

Para contener enteros no negativos grandes en una variable con un rendimiento eficaz

1. 2.

Declare la variable con una instruccin Dim. Agregue detrs del nombre de variable una clusula As que especifique la palabra clave ULong. Copiar cdigo

Dim atomsInTheEarth As ULong

Cmo: Optimizar el almacenamiento de enteros positivos con tipos sin signo


Si tiene una variable que contiene slo valores positivos (o 0) y estos valores nunca superan 4.294.967,295, puede declarar la variable como UInteger en lugar de Long. La ventaja de utilizar UInteger es que los tipos Integer y UInteger enteros de 32 bits son los tipos de datos ms eficaces en plataformas de 32 bits, y proporcionan un rendimiento ptimo para su aplicacin. Puede utilizar una variable Integer si sus valores positivos nunca superan 2.147.483,647.

Para declarar un entero con slo valores positivos

Declare la variable como As UInteger. Esto se ilustra en el siguiente ejemplo: Copiar cdigo

Public Function memoryRequired(ByVal m As UInteger) As UInteger Static r As UInteger = 0 Try r += m Catch eo As System.OverflowException r = 0 Catch ex As System.Exception MsgBox("Incrementing required memory causes """ & ex.Message & """") End Try Return r End Function
Puede probar la funcin memoryRequired con el cdigo siguiente: Copiar cdigo

Public Sub consumeMemoryRequired() Dim m1 As UInteger = UInteger.MaxValue - 100 Dim m2 As UInteger = 100 MsgBox("Max = " & CStr(UInteger.MaxValue) & vbCrLf & _ CStr(m1) & " -> " & CStr(memoryRequired(m1)) & vbCrLf & _ "+ " & CStr(m2) & " -> " & CStr(memoryRequired(m2)) _ & vbCrLf & "+ 1 -> " & CStr(memoryRequired(1))) End Sub
Precaucin: El tipo de datos UInteger no forma parte de Common Language Specification (CLS), por lo que el cdigo compatible con CLS no puede utilizar un componente que lo utiliza.

Cmo: Llamar a una funcin de Windows que adopta tipos sin signo
Si est utilizando una clase, mdulo o estructura que tiene miembros de tipos de enteros sin signo, puede tener acceso a estos miembros con Visual Basic.

Para llamar a una funcin Windows que adopta un tipo sin signo

1.

Utilice Declare (Instruccin) para indicar a Visual Basic qu biblioteca contiene la funcin, qu nombre tiene en esa biblioteca, cul es su secuencia de llamada y cmo convertir las cadenas al llamarla.

2.

En la instruccin Declare, utilice UInteger, ULong, UShort o Byte como corresponda a cada parmetro con un tipo sin signo.

3.

Consulte la documentacin de la funcin de Windows a la que est llamando para buscar los nombres y valores de las constantes que utiliza. Muchos de stas estn definidas en el archivo WinUser.h.

4.

Declare las constantes necesarias en su cdigo. Muchas constantes de Windows son valores sin signo de 32 bits y debe declararlas As UInteger.

5.

Llame a la funcin de la manera normal. En el ejemplo siguiente se llama a la funcin de Windows MessageBox que adopta un argumento de entero sin signo. Copiar cdigo

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
6. Puede probar la funcin messageThroughWindows con el cdigo siguiente. Copiar cdigo

Public Sub consumeWindowsMessage() Dim w As New windowsMessage w.messageThroughWindows() End Sub


Precaucin: Los tipos de datos UInteger, ULong, UShort y SByte no forman parte de Common Language Specification (CLS), por lo que el cdigo compatible con CLS no puede utilizar un componente que los utiliza. Nota de seguridad: Si realiza una llamada a un cdigo no administrado, como la interfaz de programacin de aplicaciones (API) de Windows, expone su cdigo a un posible riesgo de seguridad. Nota de seguridad:

Para llamar a la API de Windows, se requiere un permiso de cdigo no administrado que puede afectar a su ejecucin en situaciones de confianza parcial. Para obtener ms informacin, consulte SecurityPermission y Permisos de acceso a cdigo.

Cmo: Contener las fracciones en una variable


Una variable contiene nmeros con fracciones si la declara como tipo Double. Double (Tipo de datos, Visual Basic) puede contener nmeros de punto flotante de -1.79769313486231570E+308 a 1.79769313486231570E+308. Tambin puede utilizar String (Tipo de datos, Visual Basic) o Decimal (Tipo de datos, Visual Basic) para contener las fracciones. Para obtener ms informacin, consulte Tipos de datos numricos.

Para contener fracciones en una variable


1. 2. 3. Declare la variable con Instruccin Dim (Visual Basic). Agregue detrs del nombre de variable una clusula As. Agregue tras la palabra clave As la palabra clave Double.

Cmo: Contener los dgitos ms significativos de una variable


Una variable contiene nmeros con fracciones si la declara como tipo de datos Decimal. Una variable de Decimal (Tipo de datos, Visual Basic) puede contener nmeros con 29 dgitos significativos e incluir hasta 28 posiciones decimales. Rendimiento. Decimal es el tipo de datos numrico menos eficaz. Si no necesita la precisin completa del tipo de datos Decimal, puede utilizar el tipo de datos Double que puede contener hasta 18 dgitos significativos. Las operaciones con Double son ms rpidas que con Decimal y las variables Double ocupan menos espacio en la memoria. Para obtener ms informacin sobre Double, consulte Cmo: Contener las fracciones en una variable. Debe considerar la importancia de la precisin frente al rendimiento antes de elegir un tipo de datos. Magnitud ms grande. Si necesita la variable para que contenga nmeros de una magnitud ms grande que la que el tipo de datos Decimal puede contener, utilice el tipo de datos Double o Single, ya que tienen un intervalo mayor. Mientras las variables Decimal pueden contener valores de hasta 7.9228162514264337593543950335E+28, las variables Single pueden contener hasta 3.4028235E+38 y las variables Double hasta 1.79769313486231570E+308.

Para contener los dgitos ms significativos en una variable


1. 2. 3. Declare la variable con Instruccin Dim (Visual Basic). Agregue detrs del nombre de variable una clusula As. Agregue tras la palabra clave As la palabra clave Decimal.

Cmo: Mantener los valores de moneda de una variable


Una variable mantiene valores de moneda si se declara como el tipo de datos Decimal. Una variable de Decimal (Tipo de datos, Visual Basic) puede contener nmeros con 29 dgitos significativos e incluir hasta 28 posiciones decimales. Para los valores de moneda, normalmente necesita

slo 2 3 posiciones decimales. Pero para obtener resultados intermedios durante una transaccin, como multiplicar por una tasa de inters, puede ser conveniente utilizar posiciones decimales adicionales para mayor exactitud. La ventaja de utilizar las variables Decimal para los valores de moneda es la precisin de los valores. El tipo de datos Double es ms rpido y requiere menos memoria, pero est sujeto a errores de redondeo. El tipo de datos Decimal proporciona una exactitud total en 28 posiciones si es necesario. Caracteres 0 finales. Visual Basic no tiene una representacin interna de caracteres 0 finales en los tipos de datos de punto flotante como Double. No almacena los ceros finales en un literal Decimal, aunque una variable Decimal conserva cualquier cero final que se haya adquirido mediante clculos. Para obtener ms informacin y un ejemplo, vea Decimal (Tipo de datos, Visual Basic). Visual Basic suprime a menudo los caracteres 0 finales cuando los muestra o los imprime. Por ejemplo, un valor de 4,2000 se representa a menudo como 4,2. Puede controlar el formato de salida ms estrechamente si llama al mtodo Decimal..::.ToString o Double..::.ToString para el tipo de datos adecuado.

Para contener valores de moneda en una variable


1. 2. 3. Declare la variable con Instruccin Dim (Visual Basic). Agregue detrs del nombre de variable una clusula As. Agregue tras la palabra clave As la palabra clave Decimal.

4. Tipos de datos de caracteres


5. Visual Basic proporciona tipos de datos de caracteres para trabajar con caracteres que se pueden mostrar e imprimir. Aunque ambos tipos utilizan caracteres Unicode, Char contiene un nico carcter, mientras que String contiene un nmero indefinido de caracteres. 6. 7. 8. 9. 10. Para obtener una tabla que muestra una comparacin simultnea de los tipos de datos de Visual Basic, vea Resumen de tipos de datos (Visual Basic). Tipo Char El tipo de datos Char es un nico carcter Unicode de dos bytes (16 bits). Si una variable siempre almacena exactamente un carcter, declrela como Char. Para obtener ms informacin, consulte Char (Tipo de datos, Visual Basic). Tipo String bits). Si una variable puede contener un nmero de caracteres indefinido, declrela como String. 12. Para obtener ms informacin, consulte String (Tipo de datos, Visual Basic).

11. El tipo de datos String es una secuencia de cero o ms caracteres Unicode de dos bytes (16

Cmo: Contener caracteres en una variable


Una variable contiene caracteres individuales si se declara como del tipo de datos Char o String. Una variable de Char (Tipo de datos, Visual Basic) puede contener un carcter Unicode nico. Una variable de String (Tipo de datos, Visual Basic) puede contener una secuencia de cero o ms caracteres Unicode. Caracteres Unicode. Cada valor posible en una variable Char o String es un punto de cdigo o cdigo de carcter en el juego de caracteres Unicode. Los caracteres Unicode incluyen el juego de caracteres ASCII bsico, diversas letras del alfabeto, acentos, smbolos de moneda, fracciones, signos diacrticos y smbolos matemticos y tcnicos.

Si no necesita contener nunca ms que un carcter en una nica variable, utilice el tipo de datos Char. El tipo de datos String requiere ms memoria y tiene un rendimiento ms lento.

Nota: El juego de caracteres Unicode reserva los puntos de cdigo de D800 a DFFF (de 55296 a 55551 decimales) para pares suplentes que exigen dos valores de 16 bits que representen un punto de cdigo nico. Una variable Char no puede contener un par suplente y String utiliza dos posiciones para contener este tipo de par.

Para contener un carcter individual en una variable


1. 2. 3. Declare la variable con Instruccin Dim (Visual Basic). Agregue detrs del nombre de variable una clusula As. Agregue tras la palabra clave As la palabra clave Char.

Para contener una secuencia de caracteres en una variable


1. 2. 3. Declare la variable con una instruccin Dim. Agregue detrs del nombre de variable una clusula As. Agregue tras la palabra clave As la palabra clave String.

4. Tipos de datos varios


5. Visual Basic proporciona varios tipos de datos que no estn orientados a nmeros o caracteres. En lugar de ello, tratan con datos especializados como valores de tipo s/no, valores de fecha y hora, y direcciones de objetos. 6. 7. 8. Para ver una tabla que muestra una comparacin punto por punto de los tipos de datos de Visual Basic, consulte Resumen de tipos de datos (Visual Basic). Boolean (Tipo) Boolean (Tipo de datos, Visual Basic) es un valor sin signo interpretado como True o False. El ancho de sus datos depende de la plataforma de implementacin. Si una variable puede contener slo valores de dos estados como verdadero/falso, s/no, o activado/desactivado, declrela como Boolean. 9. Date (Tipo) y hora. Cada incremento representa 100 nanosegundos de tiempo transcurrido desde el principio (12:00 a.m.) del 1 de enero del ao 1 del calendario gregoriano. Si una variable puede contener un valor de fecha, un valor de hora o ambos, declrela como Date. 11. Object (Tipo) dentro de la aplicacin o en alguna otra aplicacin. Una variable Object puede hacer referencia a cualquier objeto que la aplicacin reconoce o a datos de cualquier tipo de datos. Si una variable almacena un puntero a una instancia de una clase que no conoce en tiempo de compilacin o si puede sealar a los datos de distintos tipos de datos, declrela como Object. 12. Object (Tipo de datos) es una direccin de 32 bits que apunta a una instancia de objeto 10. Date (Tipo de datos, Visual Basic) es un valor de 64 bits que contiene informacin de fecha

Cmo: Contener valores verdaderos y falsos en una variable


Una variable contiene valores verdaderos y falsos si la declara ser de tipo de datos Boolean. Una variable de Boolean (Tipo de datos, Visual Basic) puede contener valores lgicos de dos estados como verdadero/falso, activado/desactivado y s/no. Si necesita contener valores numricos, utilice un tipo de dato numrico como Integer o Double en lugar de Boolean. Nunca debe utilizar valores Boolean como nmeros y nunca debe confiar en valores numricos equivalentes. Para obtener ms informacin, consulte Solucionar problemas de tipos de datos.

Para contener valores verdaderos y falsos en una variable


1. 2. 3. Declare la variable con Instruccin Dim (Visual Basic). Agregue detrs del nombre de variable una clusula As. Agregue tras la palabra clave As la palabra clave Boolean.

Cmo: Mantener los valores de fecha y hora de una variable


Una variable mantiene valores de fecha y hora si se declara como el tipo de datos Date. Una variable de Date (Tipo de datos, Visual Basic) puede contener valores de fecha que van del 1 de enero del ao 0001 al 31 de diciembre del ao 9999 y valores de hora de 12:00:00 a.m. (medianoche) a 11:59:59 p.m. El tipo de datos Date siempre contiene un valor de fecha y un valor de hora. Si no asigna un valor de hora a una variable Date, tiene como valor predeterminado el inicio del da, es decir, medianoche. Si no asigna un valor de fecha a una variable Date, tiene como valor predeterminado el 1 de enero de 0001.

Para contener fechas en una variable


1. 2. 3. Declare la variable con Instruccin Dim (Visual Basic). Agregue detrs del nombre de variable una clusula As. Agregue tras la palabra clave As la palabra clave Date.

Cmo: Contener los datos de tipo desconocido en una variable


Una variable contiene punteros a datos si la declara ser de tipo de datos Object. Una variable de Object (Tipo de datos) puede contener un puntero a un valor de cualquier tipo de datos. Esto incluye tanto tipos de valor, como Integer, Boolean e instancias de estructura, como tipos de referencia que son instancias de objetos creados a partir de clases como String, Form e instancias de matriz. Rendimiento. La ventaja del tipo de datos Object es que puede utilizarlo para sealar a datos de cualquier tipo de datos. El inconveniente es que provoca operaciones adicionales que exigen ms tiempo de ejecucin y ralentizan su aplicacin. Si utiliza una variable Object para los tipos de valor, provoca una

conversin boxing y una conversin unboxing. Si lo utiliza para los tipos de referencia, provoca un enlace en tiempo de ejecucin. Debe utilizar el tipo de datos Object cuando sus necesidades variables contengan tipos de datos diferentes en distintos momentos o cuando no sabe en tiempo de compilacin qu tipo o tipos de datos puede contener su variable.

Para contener datos de tipo desconocido en una variable


1. 2. 3. Declare la variable con Instruccin Dim (Visual Basic). Agregue detrs del nombre de variable una clusula As. Agregue tras la palabra clave As la palabra clave Object.

Tipos de datos compuestos


Adems de los tipos de datos bsicos que proporciona Visual Basic, tambin es posible juntar elementos de distintos tipos para crear tipos de datos compuestos, como estructuras, matrices y clases. Pueden crearse 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. Un tipo de datos de matriz se representa normalmente mediante el tipo de elemento, parntesis y comas, tal como necesario. Por ejemplo, una matriz unidimensional de los elementos String se representa como String() y una matriz bidimensional de los elementos Boolean se representa como Boolean(,). Tipos de estructura No existe ningn tipo de datos que incluya todas las estructuras. En su lugar, una definicin de una estructura representa un tipo de datos nico, aunque dos estructuras definan elementos idnticos en el mismo orden. Sin embargo, si crea dos o ms instancias de la misma estructura, Visual Basic considera que son del mismo tipo de datos. Tipos de matriz No existe ningn tipo de datos que incluya todas las matrices. El tipo de datos de una instancia especfica de una matriz est determinada por lo siguiente:

El hecho de ser una matriz El rango (las dimensiones) de la matriz El tipo de elemento de la matriz

En particular, la longitud de una dimensin determinada no forma parte del tipo de datos de la instancia. Esto se ilustra en el siguiente ejemplo: Copiar cdigo

Dim Dim Dim Dim Dim

arrayA( arrayB( arrayC( arrayD( arrayE(

) ) ) , ,

As Byte = New Byte(12) {} As Byte = New Byte(100) {} As Short = New Short(100) {} ) As Short ) 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 con distintas longitudes. Las variables arrayB y arrayC no son del mismo tipo porque sus tipos de elementos 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 elementos son los mismos, incluso aunque arrayD no est an inicializado. Para obtener ms informacin sobre matrices, consulte Matrices en Visual Basic. Tipos de clase No existe ningn tipo de datos que incluya todas las clases. Aunque una clase puede heredar de otra clase, cada una es de un tipo de datos distinto. Varias instancias de la misma clase son del mismo tipo de datos. Si asigna una variable de instancia de clase a otra, no slo tienen el mismo tipo de datos, sino que sealan a la misma instancia de clase en memoria. Para obtener ms informacin sobre clases, consulte Descripcin de las clases.

Cmo: Contener ms de un valor en una variable


Una variable contiene ms de un valor si la declara como un tipo de datos compuesto. Tipos de datos compuestos incluye estructuras, matrices y clases. Una variable de un tipo de datos compuesto puede contener una combinacin de tipos de datos bsicos y otros tipos compuestos. Las estructuras y clases pueden contener cdigo as como datos.

Para contener varios valores en una variable


1. 2. Determine qu tipo de datos compuesto desea utilizar para la variable. Si el tipo de datos compuesto no est an definido, defnalo para que la variable pueda utilizarlo.


3. 4. 5.

Defina una estructura con Structure (Instruccin). Defina una matriz con Instruccin Dim (Visual Basic). Defina una clase con Instruccin Class (Visual Basic).

Declare la variable con una instruccin Dim. Agregue detrs del nombre de variable una clusula As. Agregue detrs de la palabra clave As el nombre del tipo de datos compuesto adecuado.

Tipos genricos en Visual Basic


Un tipo genrico es un elemento de programacin nico que se adapta para realizar la misma funcionalidad en una variedad de tipos de datos. Cuando defina una clase o procedimiento genrico, no es necesario que defina una versin independiente para cada tipo de datos para el que desee llevar a cabo esa funcionalidad. Un ejemplo anlogo sera un juego de destornilladores con puntas extrables. Primero se inspecciona el tornillo que se debe apretar o aflojar y despus se selecciona la punta adecuada para la cabeza del mismo (plana, en cruz o de estrella). Una vez insertada la punta correcta en el mango del destornillador, la accin realizada con el destornillador es exactamente la misma, es decir, girar el destornillador. El juego de destornilladores es una herramienta genrica

Cuando defina un tipo genrico, lo puede parametrizar con uno o ms tipos de datos. Esto permite al cdigo que los utiliza ajustar los tipos de datos a sus necesidades. Su cdigo puede declarar varios elementos de programacin diferentes a partir del elemento genrico y cada uno de ellos acta en un conjunto distinto de tipos de datos. Pero todos los elementos declarados funcionan con la misma lgica, independientemente de los tipos de datos que utilicen. Por ejemplo, puede que desee crear y utilizar una clase de cola que funcione en un tipo de datos concreto como String. Puede declarar esa clase a partir de System.Collections.Generic..::.Queue<(Of <(T>)>), como muestra el siguiente ejemplo. Visual Basic Copiar cdigo

Public stringQ As New System.Collections.Generic.Queue(Of String)


Ahora puede utilizar stringQ para trabajar exclusivamente con valores String. Dado que stringQ es especfico para String en lugar de generalizarse para los valores Object, no tiene enlace en tiempo de ejecucin ni conversin de tipos. As se ahorra tiempo de ejecucin y se reduce el nmero de errores en tiempo de ejecucin. Para obtener ms informacin sobre cmo utilizar un tipo genrico, vea Cmo: Utilizar una clase genrica. Ejemplo de una clase genrica El ejemplo siguiente muestra una estructura bsica de una clase genrica. Visual Basic Copiar cdigo

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 la estructura bsica anterior, t es un parmetro de tipo, es decir, un marcador de posicin para un tipo de datos que se proporcionar cuando declare la clase. En otra parte en su cdigo, puede declarar distintas versiones de classHolder proporcionando diversos tipos de datos para t. En el ejemplo siguiente se muestran dos declaraciones as. Visual Basic Copiar cdigo

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 especfico reemplaza el parmetro de tipo. Este reemplazo se propaga por todo el cdigo existente dentro de la clase construida. El ejemplo siguiente muestra el aspecto que tiene el procedimiento processNewItem en integerClass. Visual Basic Copiar cdigo

Public Sub processNewItem(ByVal newItem As Integer) Dim tempItem As Integer ' Inserted code now processes an Integer item. End Sub
Para obtener un ejemplo ms completo, vea Cmo: Definir una clase que pueda proporcionar la misma funcionalidad en tipos de datos diferentes. Elementos de programacin utilizables Puede definir y utilizar clases, estructuras, interfaces, procedimientos y delegados de tipo genrico. Tenga en cuenta que .NET Framework define varias clases genricas, estructuras e interfaces que normalmente representan los elementos genricos utilizados. El espacio de nombres System.Collections.Generic proporciona diccionarios, listas, colas y pilas. Antes de definir su propio elemento genrico, vea si ya est disponible en System.Collections.Generic. Los procedimientos no son tipos, pero puede definir y utilizar procedimientos genricos. Vea Procedimientos genricos en Visual Basic. Ventajas de los tipos genricos Un tipo genrico sirve como base para declarar varios elementos de programacin diferentes, cada uno de los cuales funciona en un tipo de datos concreto. Las alternativas a un tipo genrico son: 1. 2. Un tipo nico que funciona en el tipo de datos Object. Un conjunto de versiones especficas de tipo del tipo, con cada versin codificada por separado y funcionando en un tipo de datos especfico como String, Integer o un tipo definido por el usuario como, por ejemplo, customer. Un tipo genrico presenta las ventajas siguientes sobre estas alternativas:

Seguridad de tipos. Los tipos genricos fuerzan la comprobacin de tipo en tiempo de compilacin. Tipos basados en Object aceptan cualquier tipo de datos y debe escribir el cdigo para comprobar si un tipo de datos de entrada es aceptable. Con los tipos genricos, el compilador puede detectar los errores de coincidencia de tipos antes en tiempo de ejecucin.

Rendimiento. Los tipos genricos no tienen que aplicar la conversin boxing ni aplicar la conversin unboxing a los datos, porque cada uno de ellos est especializado para un tipo de datos. Las operaciones basadas en Object deben aplicar la conversin boxing para convertir los tipos de datos de entrada en Object y aplicar la conversin unboxing a los datos destinados para el resultado. Las conversiones boxing y unboxing reducen el rendimiento. Los tipos basados en Object tambin son enlazados en tiempo de ejecucin, lo que significa que para tener acceso a sus miembros se requiere cdigo adicional en tiempo de ejecucin. Esto tambin reduce el rendimiento.

Consolidacin del cdigo. El cdigo de un tipo genrico slo ha de definirse una vez. Un conjunto de versiones especficas de tipo de un tipo debe replicar el mismo cdigo en cada versin, con la nica diferencia de que se trata del tipo de datos especfico para esa versin.

Con tipos genricos, las versiones especficas de tipo se generan todas a partir del tipo genrico original.

Reutilizacin del cdigo. El cdigo que no depende de un tipo de datos determinado se puede reutilizar con distintos tipos de datos, si es genrico. Con frecuencia, se puede reutilizar incluso con un tipo de datos no previsto originalmente.

Compatibilidad con IDE. Cuando utilice un tipo construido a partir de un tipo genrico, Integrated Development Environment (IDE) puede proporcionarle ms apoyo mientras programa el cdigo. Por ejemplo, IntelliSense puede mostrarle las opciones especficas del tipo para un argumento a un constructor o mtodo.

Algoritmos genricos. Los algoritmos abstractos que son independientes del tipo son buenos candidatos para los tipos genricos. Por ejemplo, un procedimiento genrico que ordena elementos mediante la interfaz IComparable se puede utilizar con cualquier tipo de datos que implemente IComparable.

Restricciones Aunque el cdigo de una definicin de tipo genrico debe ser tan independiente del tipo como sea posible, puede que requiera una capacidad concreta de un tipo de datos proporcionado a su tipo genrico. Por ejemplo, si desea comparar dos elementos con el propsito de ordenar o intercalar, su tipo de datos debe implementar la interfaz IComparable. Puede forzar este requisito agregando una restriccin al parmetro de tipo. Ejemplo de una restriccin El ejemplo siguiente muestra una definicin esquema de una clase con una restriccin que exige al argumento de tipo que implemente IComparable. Visual Basic Copiar cdigo

Public Class itemManager(Of t As IComparable) ' Insert code that defines class members. End Class
Si el cdigo subsiguiente intenta construir una clase a partir de itemManager proporcionando un tipo que no implementa IComparable, el compilador seala un error. Tipos de restricciones Su restriccin puede especificar los siguientes requisitos en cualquier combinacin:

El argumento de tipo debe implementar una o ms interfaces El argumento de tipo debe ser, como mximo, del tipo de una clase o heredar de ella El argumento de tipo debe exponer un constructor sin parmetros accesible al cdigo que crea los objetos a partir del mismo El argumento de tipo debe ser un tipo de referencia o un tipo de valor

Si necesita imponer ms que un requisito, utilice una lista de restricciones separada por comas dentro de llaves ({ }). Para requerir un constructor accesible, incluya la palabra clave New (Visual Basic) en la lista. Para requerir un tipo de referencia, se debe incluir la palabra clave Class (Visual Basic); para requerir un valor, incluya la palabra clave Structure (Visual Basic). Para obtener ms informacin sobre restricciones, vea Lista de tipos. Ejemplo de varias restricciones

El ejemplo siguiente muestra una definicin bsica de una clase genrica con una lista de restricciones para el parmetro de tipo. En el cdigo que crea una instancia de esta clase, el argumento de tipo debe implementar las interfaces IComparable y IDisposable, ser un tipo de referencia y exponer un constructor sin parmetros accesible. Visual Basic Copiar cdigo

Public Class thisClass(Of t As {IComparable, IDisposable, Class, New}) ' Insert code that defines class members. End Class
Condiciones importantes Los tipos genricos introducen y utilizan las condiciones siguientes:

Tipo genrico. Una definicin de una clase, estructura, interfaz, procedimiento o delegado para las que proporciona al menos un tipo de datos cuando lo declara. Parmetro de tipo. En una definicin de tipo genrico, un marcador de posicin para un tipo de datos proporcionado al declarar el tipo. Argumento de tipo. Un tipo de datos concreto que reemplaza un parmetro de tipo cuando declara un tipo construido a partir de un tipo genrico. Restriccin. Una condicin en un parmetro de tipo que restringe el argumento de tipo que se puede proporcionar. Una restriccin puede requerir que el argumento de tipo debe implementar una interfaz concreta, ser una clase concreta o heredar de ella, tener un constructor sin parmetros accesible o ser un tipo de referencia o un tipo de valor. Puede combinar estas restricciones, pero puede especificar como mximo una clase.

Tipo construido. Una clase, estructura, interfaz, procedimiento o delegado declarado a partir de un tipo genrico proporcionando argumentos de tipo para sus parmetros de tipo.

Cmo: Definir una clase que pueda proporcionar la misma funcionalidad en tipos de datos diferentes
Puede definir una clase a partir de la cual crear objetos que proporcionen funcionalidad idntica en tipos de datos diferentes. Para ello, especifica uno o ms parmetros de tipo en la definicin. La clase puede actuar a continuacin como una plantilla para objetos que utilizan distintos tipos de datos. Una clase definida de esta manera se denomina una clase genrica. La ventaja de definir una clase genrica es que la define una sola vez y el cdigo puede utilizarla para crear diferentes objetos que utilizan una amplia variedad de tipos de datos. De esta manera consigue mayor rendimiento que si define la clase con el tipo Object. Adems de clases, tambin puede definir y utilizar estructuras genricas, interfaces, procedimientos y delegados.

Para definir una clase con un parmetro de tipo


1. 2. Defina la clase de la manera normal. Agregue (Of parmetroDeTipo) inmediatamente despus del nombre de clase para especificar un parmetro de tipo. 3. Si tiene ms de un parmetro de tipo, incluya una lista separada por comas entre parntesis. No repita la palabra clave Of.

4.

Si el cdigo realiza operaciones en un parmetro de tipo distintas de la asignacin, incluya una clusula As despus del parmetro de tipo para agregar una o ms restricciones. Una restriccin garantiza que el tipo proporcionado para ese parmetro de tipo satisface un requisito como el siguiente:

Admite una operacin, como >, que realiza el cdigo Admite un miembro, como un mtodo, al que tiene acceso el cdigo Expone un constructor sin parmetros

Si no especifica ninguna restriccin, las nicas operaciones y miembros que puede utilizar el cdigo son las que admite Object (Tipo de datos). Para obtener ms informacin, vea Lista de tipos. 5. Identifique cada miembro de clase que se va a declarar con un tipo proporcionado y declrelo As typeparameter. Esto se aplica al almacenamiento interno, parmetros de procedimiento y valores devueltos. 6. Asegrese de que el cdigo slo utiliza operaciones y mtodos admitidos por cualquier tipo de datos que puede proporcionar a itemType. El ejemplo siguiente define una clase que administra una lista muy simple. Mantiene la lista en la matriz interna items y el cdigo puede declarar el tipo de datos de los elementos de la lista. Un constructor con parmetros permite que el cdigo establezca el lmite superior de items y el constructor predeterminado lo establece en 9 (para un total de 10 elementos). Visual Basic Copiar cdigo

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 a partir de simpleList para que incluya una lista de valores de tipo Integer, otra clase para que incluya una lista de valores de tipo String y otra para que incluya valores de tipo Date. Los objetos creados a partir de estas clases se comportan de forma idntica, excepto en el tipo de datos de los miembros de lista. El argumento de tipo que el cdigo proporciona a itemType puede ser un tipo intrnseco como Boolean o Double, una estructura, una enumeracin o cualquier clase de tipo, incluida una definida por la aplicacin. Puede probar la clase simpleList con el cdigo siguiente. Visual Basic Copiar cdigo

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 As String = _ "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

Cmo: Utilizar una clase genrica


Una clase que toma parmetros de tipo se denomina clase genrica. Si est utilizando una clase genrica, puede generar una clase construida desde ella proporcionando un tipo de argumento para cada uno de estos parmetros. Entonces puede declarar una variable del tipo de clase construida, crear una instancia de clase construida y asignarla a esa variable. Adems de las clases, tambin puede definir y utilizar estructuras genricas, interfaces, procedimientos y delegados. El procedimiento siguiente toma una clase genrica definida en .NET Framework y crea una instancia a partir de ella.

Para utilizar una clase que toma un parmetro de tipo


1. Al principio de su archivo de cdigo fuente, incluya una Instruccin Imports (Tipo y espacio de nombres de .NET) para importar el espacio de nombres System.Collections.Generic. As podr hacer referencia a la clase System.Collections.Generic..::.Queue<(Of <(T>)>) sin necesidad de asignarle un nombre completo para diferenciarla de otras clases de cola como System.Collections..::.Queue. 2. Cree el objeto de la manera normal, pero agregue (Of type) inmediatamente despus del nombre de clase. El ejemplo siguiente utiliza la misma clase (System.Collections.Generic..::.Queue<(Of <(T>)>)) para crear dos objetos de cola que contienen elementos de distintos tipos de datos. As se agregan los elementos al final de cada cola y, a continuacin, se quitan y muestran los elementos del principio de cada cola. Visual Basic Copiar cdigo

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

Procedimientos genricos en Visual Basic


Un procedimiento genrico, tambin denominado mtodo genrico, es el que est definido con al menos un parmetro de tipo. Esto permite que el cdigo de llamada ajuste los tipos de datos a sus requisitos cada vez que llama al procedimiento. El simple hecho de estar definido dentro de una clase o estructura genrica no convierte en genrico al procedimiento. Para ser genrico, el procedimiento debe tomar por lo menos un parmetro de tipo, adems de cualquier otro parmetro normal que pueda a tomar. Una clase o estructura genrica puede contener procedimientos que no sean genricos; y las clases, estructuras o mdulos no genricos pueden contener procedimientos genricos. Un procedimiento genrico puede utilizar los parmetros de tipo en su lista de parmetros normales, en su tipo de valor devuelto, si existe, y en su cdigo de procedimiento. Inferencia de tipo Puede llamar a un procedimiento genrico sin proporcionar ningn argumento de tipo. Al llamar de este modo, el compilador intenta determinar los tipos de datos adecuados para pasar los argumentos de tipo del procedimiento. Esto se denomina inferencia de tipo. El cdigo siguiente muestra una llamada en la que el compilador deduce que debe pasar el tipo String al parmetro de tipo t. Visual Basic Copiar cdigo

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 deducir los argumentos de tipo del contexto de su llamada, crea un informe de error. Una posible causa de este tipo de error es la falta de coincidencia del rango de matriz. Por ejemplo, suponga que define un parmetro normal como matriz de un parmetro de tipo. Si se llama al procedimiento genrico proporcionando una matriz de distinto rango (nmero de dimensiones), la desigualdad provoca que se produzca un error en la inferencia de tipo. En el cdigo 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
Slo se puede invocar la inferencia de tipo omitiendo todos los argumentos de tipo. Si proporciona alguno, debe proporcionarlos todos. La inferencia de tipo slo se admite para los procedimientos genricos. No puede invocar la inferencia de tipo en las clases, estructuras, interfaces o delegados genricos. Ejemplo Descripcin En el ejemplo siguiente se define un procedimiento genrico Function para encontrar un elemento concreto en una matriz. Se define un parmetro de tipo, que se utiliza para construir los dos parmetros de la lista de parmetros. Cdigo Visual Basic Copiar cdigo

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 Para el ejemplo anterior es necesario poder comparar searchValue con cada elemento de

searchArray. Para garantizar esta capacidad, se restringe el parmetro de tipo T para implementar la
interfaz IComparable<(Of <(T>)>). El cdigo utiliza el mtodo CompareTo, en lugar del operador =, puesto que no existen garantas de que el tipo de argumento proporcionado para T admita el operador =. Puede probar el procedimiento findElement con el cdigo siguiente. Visual Basic Copiar cdigo

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 muestran respectivamente "0", "1" y "-1."

Tipos de valor que aceptan valores NULL


A veces trabaja con un tipo de valor que no tiene un valor definido en ciertas circunstancias. Por ejemplo, puede que un campo de una base de datos tenga que distinguir entre tener un valor asignado

que es significativo y no tener un valor asignado. Los tipos de valor se pueden extender para tomar sus valores normales o un valor nulo. Este tipo de extensin se denomina un tipo que acepta valores NULL. Los tipos que aceptan valores NULL se construyen a partir de la estructura genrica Nullable<(Of <(T>)>). Considere una base de datos que realiza el seguimiento de las actividades relacionadas con el trabajo. El ejemplo siguiente construye un tipo Boolean que acepta valores NULL y declara una variable de ese tipo. Puede escribir la declaracin de tres maneras: Visual Basic Copiar cdigo

Dim ridesBusToWork1? As Boolean Dim ridesBusToWork2 As Boolean? Dim ridesBusToWork3 As Nullable(Of Boolean)
La variable ridesBusToWork pueden contener un valor True, un valor False o ninguno de ellos. Su valor predeterminado inicial es ningn valor, lo que en este caso podra significar que todava no se ha obtenido la informacin correspondiente a esta persona. False, por su parte, podra significar que se ha obtenido la informacin y la persona no utiliza el autobs para ir al trabajo. Puede declarar variables y propiedades con tipos que aceptan valores NULL y puede declarar una matriz con elementos de un tipo que acepta valores NULL. Puede declarar procedimientos con tipos que aceptan valores NULL como parmetros y puede devolver un tipo que acepta valores NULL de un procedimiento Function. No puede construir un tipo que acepta valores NULL en un tipo de referencia como una matriz, un objeto String o una clase. El tipo subyacente debe ser un tipo de valor. Para obtener ms informacin, vea Tipos de valores y tipos de referencia. Utilizar una variable de tipo que acepta valores NULL Los miembros ms importantes de un tipo que acepta valores NULL son sus propiedades HasValue y Value. En una variable de un tipo que acepta valores NULL, HasValue indica si la variable contiene un valor definido. Si HasValue tiene el valor True, puede leer el valor de Value. Observe que HasValue y Value son propiedades de tipo ReadOnly. Valores predeterminados Cuando declara una variable con un tipo que acepta valores NULL, su propiedad HasValue tiene un valor predeterminado de False. Esto significa que la variable no tiene ningn valor definido de forma predeterminada, en lugar del valor predeterminado de su tipo de valor subyacente. En el ejemplo siguiente, la variable numberOfChildren no tiene inicialmente ningn valor definido, aunque el valor predeterminado del tipo Integer es 0. Visual Basic Copiar cdigo

Dim numberOfChildren? As Integer


Un valor nulo es til para indicar un valor indefinido o desconocido. Si numberOfChildren se hubiese declarado como Integer, no habra ningn valor que indicase que la informacin no est disponible actualmente. Almacenar valores El almacenamiento de un valor en una variable o una propiedad que acepta valores Null se realiza de la manera habitual. En el ejemplo siguiente se asigna un valor a la variable numberOfChildren declarada en el ejemplo anterior. Visual Basic Copiar cdigo

numberOfChildren = 2

Si una variable o una propiedad de un tipo que acepta valores NULL contiene un valor definido, puede determinar que vuelva a su estado inicial, es decir, sin ningn valor asignado. Para ello, establece la variable o la propiedad como Nothing, segn se muestra en el ejemplo siguiente. Visual Basic Copiar cdigo

numberOfChildren = Nothing
Nota: Aunque puede asignar Nothing a una variable que acepta valores Null, no puede probarla con Nothing usando el signo igual. La comparacin que usa el signo igual, someVar = Nothing, siempre se evala como Nothing. Puede probar la propiedad HasValue de la variable con False o probar mediante el operador Is o IsNot. Recuperar valores Para recuperar el valor de una variable de un tipo que acepta valores NULL, debe probar previamente su propiedad HasValue para confirmar que incluye un valor. Si intenta leer el valor cuando HasValue es False, Visual Basic produce una excepcin InvalidOperationException. En el ejemplo siguiente se muestra la manera recomendada de leer la variable numberOfChildren de los ejemplos anteriores. Visual Basic Copiar cdigo

If numberOfChildren.HasValue Then MsgBox("There are " & CStr(numberOfChildren) & " children.") Else MsgBox("It is not known how many children there are.") End If
Comparar tipos que aceptan valores Null Cuando se usan en expresiones booleanas variables Boolean que aceptan valores Null, el resultado puede ser True, False o Nothing. A continuacin, se muestra la tabla de valores de verdad para And y Or. Dado que b1 y b2 tienen ahora tres posibles valores, hay nueve combinaciones que se pueden evaluar. b1 Nothing Nothing Nothing True True True False False False b2 Nothing True False Nothing True False Nothing True False b1 Y b2 Nothing Nothing False Nothing True False False False False b1 O b2 Nothing True Nothing True True True Nothing True False

Cuando el valor de una variable o expresin booleana es Nothing, no es true ni false. Considere el ejemplo siguiente. Visual Basic Copiar cdigo

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 ejemplo, b1 And b2 se evala como Nothing. Como resultado, la clusula Else se ejecuta en cada instruccin If y el resultado es como sigue:

Expression is not true Expression is not false

Nota: AndAlso y OrElse, que usan la evaluacin de cortocircuito, deben evaluar sus segundos operandos cuando el primero se evala como Nothing. Propagacin Si uno de los operandos o ambos operandos de una operacin aritmtica, de comparacin, de desplazamiento o con tipos aceptan valores Null, el resultado de la operacin tambin acepta valores Null. Si ambos operandos tienen valores que no son Nothing, la operacin se realiza con los valores subyacentes de los operandos, como si ninguno fuera un tipo que acepta valores Null. En el ejemplo siguiente, las variables compare1 y sum1 son variables de tipo implcito. Si coloca el puntero del mouse sobre ellas, observar que el compilador deduce los tipos que aceptan valores Null para ambas variables. Visual Basic Copiar cdigo

' 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 tienen el valor Nothing, el resultado ser Nothing. Visual Basic Copiar cdigo

' 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 * * * Console.WriteLine(m & " * " & n & " * " & sum2 & " * " & compare2)
Utilizar tipos que aceptan valores NULL con datos Una base de datos es uno de los lugares ms importantes para utilizar tipos que aceptan valores NULL. No todos los objetos de base de datos son actualmente compatibles con los tipos que aceptan valores NULL, pero s lo son los adaptadores de tablas generadas por el diseador. Vea la seccin sobre compatibilidad de TableAdapter con tipos que aceptan valores NULL en Informacin general sobre TableAdapter.

Implementacin de tipos de datos


Los tipos de datos de Visual Basic se pueden clasificar en funcin de si una variable de un tipo especfico almacena sus propios datos o un puntero a los datos. Si almacena sus propios datos, se trata de un tipo de valor; si contiene un puntero a los datos guardados en cualquier otro lugar de la memoria, es un tipo de referencia. Esta clasificacin afecta a la forma en que se implementa un tipo de datos.

Tipos de valores y tipos de referencia


Un tipo de datos es un tipo de valores si almacena los datos en su propia asignacin de memoria. Un tipo de referencia contiene un puntero a otra ubicacin de memoria que almacena los datos. Tipos de valor Los tipos de valor incluyen lo siguiente:

Todos los tipos de datos numricos Boolean, Char y Date Todas las estructuras, incluso si sus miembros son tipos de referencia Las enumeraciones, ya que su tipo subyacente es siempre SByte, Short, Integer, Long, Byte, UShort, UInteger o ULong

Tipos de referencia Los tipos de referencia incluyen lo siguiente:

String Todas las matrices, incluso si sus elementos son tipos de valores Los tipos de clase, como Form Delegados

Elementos que no son tipos

Los elementos de programacin siguientes no se califican como tipos porque no es posible especificar ninguno de ellos como tipo de datos para un elemento declarado:

Espacios de nombres Mdulos Eventos Propiedades y procedimientos Variables, constantes y campos

Trabajar con el tipo de datos Object Puede asignar indistintamente un tipo de referencia o un tipo de valores a una variable del tipo de datos Object. Una variable Object siempre contiene un puntero a los datos, nunca los propios datos. Sin embargo, si se asigna un tipo de valor a una variable Object, sta se comporta como si contuviera sus propios datos. Para obtener ms informacin, consulte Object (Tipo de datos). Puede averiguar si una variable Object est actuando como un tipo de referencia o un tipo de valor pasndolo al mtodo IsReference en 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.

Los tipos de datos son tipos de .NET Framework


Las estructuras y clases del espacio de nombres System admiten los tipos de datos bsicos de Visual Basic. El compilador utiliza la palabra clave de cada tipo de datos como alias para la clase o estructura subyacente. Por ejemplo, declarar una variable con la palabra reservada Byte es igual que declararla con el nombre completo de estructura System..::.Byte. Hay clases y estructuras adicionales disponibles en .NET Framework. Common Language Runtime (CLR) tambin admite estructuras y clases que Visual Basic no proporciona. Por ejemplo, la estructura System..::.Guid proporciona un identificador nico global (GUID) y la clase System..::.TimeZone admite una zona horaria. Puede utilizar estos tipos para declarar variables y constantes y puede tener acceso a los mtodos que .NET Framework implementa en estos tipos. Sin embargo, Visual Basic no admite operaciones o conversiones de tipo que impliquen a tipos que no proporciona la aplicacin. Tipos de valores y tipos de referencia En .NET Framework, una estructura es un tipo de valor y una clase es un tipo de referencia. Por ello, las estructuras de .NET Framework implementan tipos de valor como Char e Integer, mientras que las clases de .NET Framework admiten tipos de referencia como Object y String. Observe que una matriz es un tipo de referencia, incluso cuando sus miembros son tipos de valor, y una estructura es un tipo de valor, incluso aunque tenga miembros de tipos de referencia. Como un tipo de referencia representa una clase subyacente de .NET Framework, es preciso usar la palabra clave New (Visual Basic) al inicializarlo. La instruccin siguiente inicializa una matriz. Copiar cdigo

Dim totals() As Single = New Single(8) {}


Tambin puede utilizar la palabra clave New para inicializar un tipo de valor. Esto es especialmente til si el tipo tiene un constructor que toma parmetros. Un ejemplo de esto es el constructor Decimal(Int32, Int32, Int32, Boolean, Byte) que genera un nuevo valor Decimal de las partes proporcionadas. Los tipos de datos tienen Miembros

Como los tipos de datos de Visual Basic tienen miembros, los admiten las estructuras y clases de .NET Framework. Estos miembros incluyen constructores, mtodos, propiedades y campos. Puede obtener acceso a los miembros (excepto los constructores) de una variable del mismo modo que a los mtodos y propiedades de un objeto. El ejemplo siguiente utiliza las propiedades Year, Month y Day, y el mtodo DaysInMonth de la estructura System..::.DateTime para determinar cuntos das quedan en el mes actual. Copiar cdigo

Dim current As Date = Now Dim daysRemaining As Integer daysRemaining = Date.DaysInMonth(current.Year, current.Month) current.Day
Conviene sealar que se debe calificar una referencia a un miembro de tipo de datos, bien con el nombre del tipo (Date) o bien con el nombre de una variable declarada de dicho tipo (current). Ejemplos de miembros de tipos de datos Los siguientes prototipos de cdigo ilustran algunos mtodos, propiedades y campos tiles con los tipos de datos.

<Char>.IsDigit() ' Returns True if character is a numeric digit. <Char>.IsLower() ' Returns True if character is a lowercase letter. <Date>.IsLeapYear() ' Returns True if current year is a leap year. <Date>.ToUniversalTime() ' Returns local date/time converted to UTC. <Double>.IsInfinity() ' Returns True if contents represent infinity. <Double>.IsNaN() ' Returns True if contents are not a number (0/0). <Long>.MaxValue ' Constant representing largest positive Int64 value. <Object>.GetType() ' Returns Type object representing type of <Object>. <Object>.GetType().GetTypeCode() ' Returns type code of <Object>. <String>.Chars(<index>) ' Character at position <index> of <String>. <String>.Length ' Number of characters currently in <String>.
Todos los tipos numricos, incluidos Byte y Char, exponen los campos pblicos MaxValue y MinValue que pueden ser muy tiles al trabajar con estos tipos. La equivalencia de miembros de tipos de datos no est asegurada .NET Framework proporciona tambin varios mtodos para los tipos de datos que podran resultar equivalentes a funciones y palabras clave de Visual Basic. Sin embargo, Visual Basic no siempre utiliza los mtodos de .NET Framework para realizar la conversin u otras operaciones y los resultados no siempre son idnticos. Por ejemplo, el mtodo ToSingle realiza el mismo tipo de accin que hace la palabra clave CSng en una expresin Decimal. Pero no se garantiza que CSng utilice System.tipoDeDatos.ToSingle y, por consiguiente, no se garantiza que los resultados sean los mismos en condiciones marginales o lmite. En general, debe utilizar los elementos de programacin de Visual Basic porque son ms sencillos de usar y facilitan la lectura del cdigo. En algunos casos, podra ser necesario que un mtodo .NET Framework aporte funcionalidad adicional. Para obtener un ejemplo, vea "Operador Mod no devuelve un resultado preciso" en Solucionar problemas de tipos de datos.

Conversiones de tipos en Visual Basic


El proceso de cambiar un valor de un tipo de datos a otro tipo se denomina conversin. Las conversiones son de ampliacin o de conversin, en funcin de las capacidades de datos de los tipos involucrados. Tambin pueden ser implcitas o explcitas, segn la sintaxis del cdigo fuente.

Conversiones de ampliacin y de restriccin


Una consideracin importante de una conversin de tipos es si el resultado de la conversin est dentro del intervalo del tipo de datos de destino. Una conversin de ampliacin cambia un valor a un tipo de datos que puede alojar cualquier valor posible de los datos originales. Una conversin de restriccin cambia un valor a un tipo de datos que quizs no pueda contener alguno de los valores posibles. Conversiones de ampliacin La tabla siguiente muestra las conversiones de ampliacin estndar. Tipo de datos SByte Byte Se ampla a los siguientes tipos de datos
1

SByte, Short, Integer, Long, Decimal, Single, Double Byte, Short, UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double Short, Integer, Long, Decimal, Single, Double UShort, Integer, UInteger, Long, ULong, Decimal, Single, Double Integer, Long, Decimal, Single, Double2 UInteger, Long, ULong, Decimal, Single, Double Long, Decimal, Single, Double
2 2

Short UShort Integer UInteger Long ULong Decimal Single Double Cualquier tipo enumerado (Enum) Char Char array Cualquier tipo Cualquier tipo derivado Cualquier tipo

ULong, Decimal, Single, Double Decimal, Single, Double Single, Double Double
2

Su tipo integral subyacente y cualquier tipo al que se ampla el tipo subyacente Char, String Char array, String Object Cualquier tipo bsico del que se deriva Cualquier interfaz que implemente
3

Nothing
1

Cualquier tipo de datos o tipo de objeto

Por definicin, cada tipo de datos se amplia a s mismo. Las conversiones de Integer, UInteger, Long, ULong o Decimal a Single o Double podran generar una

prdida de precisin pero nunca una prdida de magnitud. En este sentido, no provocan prdida de informacin.
3

Puede parecer sorprendente que una conversin de un tipo derivado en uno de sus tipos bsicos sea

una ampliacin. La justificacin est en el hecho de que el tipo derivado contiene todos los miembros del tipo bsico, por lo que se califica como una instancia del tipo bsico. A la inversa, el tipo bsico no contiene nuevos miembros definidos por el tipo derivado. Las conversiones de ampliacin son siempre satisfactorias en tiempo de ejecucin y no provocan nunca prdida de datos. Siempre puede realizarlas implcitamente, independientemente de si Option Strict (Instruccin) establece el modificador de comprobacin de tipos en On o en Off. Conversiones de restriccin Las conversiones de restriccin estndar incluyen:

Las direcciones inversas de las conversiones de ampliacin en la tabla anterior (slo que cada tipo se ampla a s mismo) Conversiones en ambas direcciones entre Boolean y cualquier tipo numrico Conversiones de cualquier tipo numrico a cualquier tipo enumerado (Enum) Conversiones en ambas direcciones entre String y cualquier tipo numrico, Boolean o Date Conversiones de un tipo de datos o tipo de objeto en un tipo derivado del mismo

Las conversiones de restriccin no son siempre satisfactorias en tiempo de ejecucin y pueden generar errores o provocar prdida 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 conversin numrica puede provocar un desbordamiento. El compilador no le permite realizar las conversiones de restriccin implcitamente a menos que Option Strict (Instruccin) establezca el modificador de comprobacin de tipos en Off. Cundo se utilizan las conversiones de restriccin Se utiliza una conversin de restriccin cuando se sabe que el valor de origen se puede convertir en el tipo de datos de destino sin error o prdida de datos. Por ejemplo, si tiene un tipo de datos String y sabe que contiene "True" o "False", puede utilizar la palabra clave CBool para convertirlo en Boolean. Excepciones durante la conversin Como las conversiones de ampliacin siempre son satisfactorias, no producen excepciones. Las conversiones de restriccin, cuando se produce un error, suelen producir las excepciones siguientes:

InvalidCastException: si no hay definida ninguna conversin entre los dos tipos OverflowException: (tipos integrales slo) si el valor convertido es demasiado grande para el tipo de destino

Si una clase o estructura define CType (Funcin) para que acte como un operador de conversin a esa clase o estructura o desde ellas, CType puede producir cualquier excepcin que considere apropiada. Adems, CType podra llamar a las funciones de Visual Basic o mtodos de .NET Framework que a su vez pueden producir una variedad de excepciones

Conversiones implcitas y explcitas

Una conversin implcita no requiere ninguna sintaxis especial en el cdigo fuente. En el ejemplo siguiente, Visual Basic convierte el valor de k implcitamente en un valor de punto flotante de precisin simple antes de asignarlo a q. Copiar cdigo

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 conversin explcita utiliza una palabra clave de conversin de tipos. Visual Basic proporciona varias de estas palabras clave que convierten una expresin entre parntesis en el tipo de datos deseado. Estas palabras clave actan como funciones, pero el compilador genera el cdigo en la misma lnea, de modo que la ejecucin es un poco ms rpida que con una llamada de funcin. En esta extensin del ejemplo anterior, la palabra clave CInt convierte el valor de q de nuevo en un entero antes de asignarlo a k. Copiar cdigo

' q k '

q = = k

had been assigned the value 432 from k. Math.Sqrt(q) CInt(q) now has the value 21 (rounded square root of 432).

Palabras clave para conversiones La tabla siguiente muestra las palabras clave de conversin disponibles. Convierte una expresin en el siguiente tipo de datos Boolean (Tipo de datos, Visual Basic) Byte (Tipo de datos, Visual Basic) Char (Tipo de datos, Visual Basic) Date (Tipo de datos, Visual Basic) Double (Tipo de datos, Visual Basic) Decimal (Tipo de datos, Visual Basic) Integer (Tipo de datos, Visual Basic) Long (Tipo de datos, Visual Basic) Object (Tipo de datos)

Palabra clave de conversin de tipos CBool

Tipos de datos permitidos para la expresin que se va a convertir Cualquier tipo numrico (incluidos Byte, SByte y los tipos enumerados), String, Object Cualquier tipo numrico (incluidos SByte y los tipos enumerados), Boolean, String, Object String, Object

CByte

CChar

CDate

String, Object

CDbl

Cualquier tipo numrico (incluidos Byte, SByte y los tipos enumerados), Boolean, String, Object Cualquier tipo numrico (incluidos Byte, SByte y los tipos enumerados), Boolean, String, Object Cualquier tipo numrico (incluidos Byte, SByte y los tipos enumerados), Boolean, String, Object Cualquier tipo numrico (incluidos Byte, SByte y los tipos enumerados), Boolean, String, Object Cualquier tipo

CDec

CInt

CLng

CObj

CSByte

SByte (Tipo de datos, Visual Basic) Short (Tipo de datos, Visual Basic) String (Tipo de datos, Visual Basic) String (Tipo de datos, Visual Basic)

Cualquier tipo numrico (incluidos Byte y los tipos enumerados), Boolean, String, Object Cualquier tipo numrico (incluidos Byte, SByte y los tipos enumerados), Boolean, String, Object Cualquier tipo numrico (incluidos Byte, SByte y los tipos enumerados), Boolean, String, Object Cualquier tipo numrico (incluidos Byte, SByte y los tipos enumerados), Boolean, Char, matriz Char, Date, Object Al convertir a un tipo de datos bsico (incluida una matriz de un tipo bsico), se permiten los mismos tipos para la palabra clave de conversin 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 que ha sobrecargado CType, esta clase o estructura

CShort

CSng

CStr

CType

Tipo especificado despus de la coma (,)

CUInt

UInteger (Tipo de datos) ULong (Tipo de datos, Visual Basic) UShort (Tipo de datos, Visual Basic)

Cualquier tipo numrico (incluidos Byte, SByte y los tipos enumerados), Boolean, String, Object Cualquier tipo numrico (incluidos Byte, SByte y los tipos enumerados), Boolean, String, Object Cualquier tipo numrico (incluidos Byte, SByte y los tipos enumerados), Boolean, String, Object

CULng

CUShort

La funcin CType CType (Funcin) acta sobre dos argumentos. El primero es la expresin que va a convertirse y el segundo es la clase de objeto o el tipo de datos de destino. Observe que el primer argumento debe ser una expresin, no un tipo. CType es una funcin en lnea, lo que significa que el cdigo compilado realiza la conversin, a menudo sin generar una llamada a la funcin. Esto mejora el rendimiento. Para una comparacin de CType con las otras palabras clave de conversin de tipos, consulte DirectCast y TryCast. Tipos bsicos El siguiente ejemplo muestra el uso de CType. Copiar cdigo

k = CType(q, Integer) ' The following statement coerces w to the specific object class Label. f = CType(w, Label)
Tipos compuestos Puede utilizar CType para convertir valores en tipos de datos compuestos as como en tipos bsicos. Tambin puede utilizarlo para convertir una clase de objeto en el tipo de una de sus interfaces, como en el ejemplo siguiente. Copiar cdigo

' 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 tambin puede convertir tipos de datos de matrices, como en el ejemplo siguiente. Copiar cdigo

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 ms informacin y un ejemplo, consulte Conversiones de matrices. Tipos que define CType Puede definir CType en una clase o estructura que haya definido. Esto le permite convertir los valores al tipo de su clase o estructura y desde l. Para obtener ms informacin y un ejemplo, consulte Cmo: Definir un operador de conversin.

Nota: Los valores utilizados con una palabra clave de conversin deben ser vlidos para el tipo de datos de destino; de lo contrario, se produce un error. Por ejemplo, si intenta convertir un tipo Long en Integer, el valor de Long debe estar dentro del intervalo vlido para el tipo de datos Integer. Precaucin: Especificar CType para convertir de un tipo de clase a otro produce un error en tiempo de ejecucin si el tipo de origen no deriva del tipo de destino. Este tipo de error produce una excepcin InvalidCastException. Sin embargo, si uno de los tipos es una estructura o clase que ha definido y si ha definido CType en esa estructura o clase, una conversin puede tener xito si satisface los requisitos de CType. Consulte Cmo: Definir un operador de conversin. La accin de realizar una conversin explcita se denomina tambin convertir una expresin en un determinado tipo de datos o clase de objeto.

Cambios de valores durante las conversiones


Una conversin de un tipo de valor almacena una copia del valor de origen en el destino de la conversin. Sin embargo, esta copia no es una imagen exacta del valor de origen. El tipo de datos de destino almacena valores de forma distinta, e incluso puede modificarse el valor que se est representando, en funcin del tipo de conversin que se est realizando. Cambios durante las conversiones de ampliacin y de restriccin Las conversiones de restriccin cambian la copia de destino del valor de origen con una prdida potencial de informacin. Por ejemplo, un valor fraccionario se redondea al convertirlo en un tipo integral y un tipo numrico que se est convirtiendo a Boolean se reduce a True o False. Las conversiones de ampliacin conservan el valor de origen pero pueden cambiar su representacin. Esto sucede si se convierte un tipo integral en Decimal o un tipo Char en String.

El valor de origen inicial no cambia como resultado de una conversin. Cambios durante las conversiones de tipos de referencia Una conversin de un tipo de referencia slo copia el puntero al valor. El valor en s mismo no se copia ni se cambia en modo alguno. 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 cambia de la clase derivada a su clase base, pero el objeto al que apuntan ahora ambas variables no se modifica. Copiar cdigo

' 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

Conversiones entre cadenas y otros tipos


Los valores numricos, Boolean o de fecha y hora pueden convertirse en un valor de tipo String. Tambin puede realizarse la conversin en la direccin inversa (de un valor de cadena a un valor numrico, Boolean o Date) siempre que el contenido de la cadena se pueda interpretar como un valor vlido del tipo de datos de destino. Si no es posible, se produce un error en tiempo de ejecucin. Las conversiones de todas estas asignaciones, en ambas direcciones, son conversiones de restriccin. Deben utilizarse las palabras clave de conversin de tipos (CBool, CByte, CDate, CDbl, CDec, CInt, CLng, CSByte, CShort, CSng, CStr, CUInt, CULng, CUShort y CType). Las funciones Format (Funcin) y Val (Funcin) proporcionan un control adicional sobre las conversiones entre cadenas y nmeros. Si ha definido una clase o estructura, puede definir operadores de conversin de tipos entre String y el tipo de su clase o estructura. Para obtener ms informacin, consulte Cmo: Definir un operador de conversin. Conversin de nmeros en cadenas Puede utilizar la funcin Format para convertir un nmero en una cadena con formato que puede incluir no slo los dgitos adecuados sino tambin los smbolos de formato como un smbolo de moneda (como $), separadores de miles o smbolos que agrupan dgitos (como ,) y un separador decimal (como .). Format utiliza automticamente los smbolos adecuados segn la Configuracin regional especificada en el Panel de control de Windows. Tenga en cuenta que el operador de concatenacin (&) puede convertir un nmero en una cadena de forma implcita, como se muestra en el ejemplo siguiente. Copiar cdigo

' The following statement converts count to a String value. Str = "The total count is " & count
Conversin de cadenas en nmeros Puede utilizar la funcin Val para convertir explcitamente los dgitos de una cadena en un nmero. Val lee la cadena hasta que encuentra un carcter distinto de un dgito, espacio, ficha, avance de lnea o punto. Las secuencias &O y &H alteran la base del sistema numrico y finalizan la exploracin. Hasta que finaliza la lectura, Val convierte todos los caracteres apropiados en un valor numrico. Por ejemplo, la instruccin siguiente devuelve el valor 141.825.

Val(" 14 1.825 miles")


Cuando Visual Basic convierte una cadena en un valor numrico, usa los valores especificados en la Configuracin regional del Panel de control de Windows para interpretar el separador de miles, el separador decimal y el smbolo de moneda. Esto significa que una conversin puede realizarse

correctamente bajo una configuracin, pero no bajo otra. Por ejemplo, "$14.20" es aceptable en la configuracin regional de ingls (Estados Unidos), pero no en la de francs.

Cmo: Convertir un objeto en otro tipo en Visual Basic


Convierte una variable Object en otro tipo de datos utilizando una palabra clave de conversin como CType (Funcin). Ejemplo En el ejemplo siguiente se convierte una variable de tipo Object en Integer y String. Copiar cdigo

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 en ese tipo de datos. Si sigue utilizando la variable Object, provoca una conversin boxing y una conversin unboxing (para un tipo de valor) o un enlace en tiempo de ejecucin (para un tipo de referencia). Estas operaciones exigen todas un tiempo de ejecucin adicional y ralentizan el rendimiento. Compilar el cdigo Este ejemplo necesita:

Una referencia al espacio de nombres System.

Conversiones de matrices
Puede convertir un tipo de matriz en otro tipo de matriz diferente, siempre que se cumplan las condiciones siguientes:

Rango igual. Los rangos de las dos matrices deben ser los mismos; es decir, deben tener las mismas dimensiones. Sin embargo, las longitudes de las dimensiones respectivas no tienen que ser necesariamente iguales.

Tipo de datos de elementos. Los tipos de datos de los elementos de ambas matrices deben ser tipos de referencia. No se puede convertir una matriz Integer en una matriz Long, ni siquiera en una matriz Object, ya que hay al menos un tipo de valor implicado. Para obtener ms informacin, consulte Tipos de valores y tipos de referencia.

Convertibilidad. Una conversin, ya sea de ampliacin o de restriccin, debe poder realizarse entre los tipos de elementos de las dos matrices. Un ejemplo en el que se incumple este requisito es una conversin intentada entre una matriz String y una matriz de una clase derivada de System..::.Attribute. Estos dos tipos no tienen nada en comn y no existe ningn tipo de conversin entre ellos.

Una conversin de un tipo de matriz en otro ser de ampliacin o de restriccin en funcin de si la conversin de los respectivos elementos es de ampliacin o de restriccin. Para obtener ms informacin, consulte Conversiones de ampliacin y de restriccin. Conversin en una matriz de objeto Al declarar una matriz Object sin inicializarla, su tipo de elemento es Object mientras permanezca sin inicializar. Cuando se establece una matriz de una clase especfica, adopta el tipo de la clase. Sin embargo, su tipo subyacente contina siendo Object y es posible establecerlo ms tarde en otra matriz

de una clase no relacionada. Dado que todas las clases derivan de Object, es posible cambiar el tipo de elemento de la matriz de una clase cualquiera a otra. En el ejemplo siguiente, no existe ninguna conversin entre los tipos student y String, pero ambos derivan de Object, as que todas las asignaciones son vlidas. Copiar cdigo

' 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 especfica, su tipo de elemento subyacente ser esa clase. Si ms tarde la establece en una matriz de otra clase, deber haber una conversin entre las dos clases. En el ejemplo siguiente, students es una matriz student. Puesto que no existe ninguna conversin entre String y student, en la ltima instruccin se producir un error. Copiar cdigo

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

Estructuras: tipos de datos propios


Una estructura es una generalizacin del tipo definido por el usuario (UDT) admitido por versiones anteriores de Visual Basic. Adems de campos, las estructuras pueden exponer propiedades, mtodos y eventos. Una estructura puede implementar una o ms interfaces, y se pueden declarar niveles de acceso individuales para cada campo. Para crear una estructura se pueden combinar elementos de datos de distintos tipos. Una estructura asocia uno o ms elementos entre ellos y con la propia estructura. Al declarar una estructura, sta se convierte en un tipo de datos compuesto y se pueden declarar variables de este tipo. Las estructuras son tiles si se desea que una nica variable contenga varios datos relacionados. Por ejemplo, quizs desee mantener juntos el nombre de un empleado, su extensin telefnica y su salario. Podra utilizar varias variables para esta informacin, o bien definir una estructura y utilizarla para una nica variable de empleado. La ventaja de la estructura se hace evidente si tiene muchos empleados y, por consiguiente, muchas instancias de la variable.

Cmo: Declarar una estructura


Una declaracin de estructuras empieza con la instruccin Structure (Instruccin) y finaliza con la instruccin End Structure. Entre estas dos instrucciones debe declararse por lo 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 compartido y no personalizado. No puede inicializar ninguno de los elementos de la estructura en la declaracin de la estructura. Al declarar una variable como un tipo de estructura, le asigna valores a los elementos al obtener acceso a los mismos mediante la variable.

Para obtener una descripcin de las diferencias entre estructuras y clases, consulte Estructuras y clases. Para efectos demostrativos, considere una situacin en la que desee mantener el seguimiento del nombre de un empleado, extensin de telfono y sueldo. Una estructura le permite hacer esto en una variable nica.

Para declarar una estructura


1. Cree las instrucciones de principio y fin para la estructura. Puede especificar el nivel de acceso de una estructura mediante la palabra clave Public (Visual Basic), Protected (Visual Basic), Friend (Visual Basic) o Private (Visual Basic), o puede dejar el valor predeterminado Public. Copiar cdigo

Private Structure employee End Structure


2. Agregar 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 el mismo. Si utiliza la instruccin Instruccin Dim (Visual Basic) sin palabras clave, la accesibilidad se establece de forma predeterminada en Public. Copiar cdigo

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, es decir que es inaccesible fuera de la estructura, incluso desde la clase contenedora. Sin embargo, el procedimiento giveRaise es Public, as que es posible llamarlo desde fuera de la estructura. De forma similar, puede provocar el evento salaryReviewTime desde fuera de la estructura. Adems de las variables, procedimientos Sub y eventos, tambin puede definir constantes, procedimientos Function y propiedades en una estructura. Puede designar como mximo una propiedad como propiedad predeterminada, siempre que admita al menos un argumento. Es posible controlar un evento con un procedimiento Shared (Visual Basic) Sub. Para obtener ms informacin, consulte Cmo: Declarar y llamar a una propiedad predeterminada en Visual Basic.

Variables de estructura
Una vez creada una estructura, se pueden declarar variables de procedimiento y de mdulo como del mismo tipo. Por ejemplo, puede crear una estructura que registra informacin sobre un sistema del equipo. En el siguiente ejemplo se muestra cmo. Copiar cdigo

Public Structure systemInfo Public cPU As String Public memory As Long Public purchaseDate As Date End Structure
Ahora puede declarar variables de ese tipo: Esto se muestra en la declaracin siguiente:

Copiar cdigo

Dim mySystem, yourSystem As systemInfo


Nota: En las clases y mdulos, las estructuras declaradas mediante Instruccin Dim (Visual Basic) se establecen de forma predeterminada como de acceso pblico. Si desea que una estructura sea privada, asegrese de declararla utilizando la palabra clave Private (Visual Basic). Acceso a valores de estructura Para asignar y recuperar valores de los elementos de una variable de estructura, utilice la misma sintaxis que para establecer y obtener propiedades de un objeto. Coloca al operador de acceso a miembros (.) entre el nombre de la variable de estructura y el nombre del elemento. El ejemplo siguiente tiene acceso a los elementos de las variables declaradas previamente como tipo systemInfo. Copiar cdigo

mySystem.cPU = "486" Dim tooOld As Boolean If yourSystem.purchaseDate < #1/1/1992# Then tooOld = True
Asignar variables de estructura Tambin puede asignar una variable a otra si ambas son del mismo tipo de estructura. Se copian todos los elementos de una estructura en los elementos correspondientes de la otra. Esto se muestra en la declaracin siguiente: Copiar cdigo

yourSystem = mySystem
Si un elemento de una estructura es de tipo referencia, como String, Object o matriz, se copia el puntero a los datos. Si systemInfo hubiera incluido una variable de objeto, en el ejemplo anterior se habra copiado el puntero de mySystem a yourSystem y los cambios realizados en los datos del objeto a travs de una estructura habran surtido efecto al tener acceso a ellos a travs de la otra estructura.

Estructuras y otros elementos de programacin


Se pueden utilizar estructuras conjuntamente con matrices, objetos y procedimientos, as como unos con otros. Las interacciones utilizan la misma sintaxis que utilizan estos elementos de forma individual.

Nota: No puede inicializar ninguno de los elementos de la estructura en la declaracin de la estructura. Slo se pueden asignar valores a los elementos de una variable que se ha declarado como del tipo estructura. Estructuras y matrices Una estructura puede contener una matriz como uno o ms de sus elementos. Esto se ilustra en el siguiente ejemplo: Copiar cdigo

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: Copiar cdigo

Dim mySystem As systemInfo

ReDim mySystem.diskDrives(3) mySystem.diskDrives(0) = "1.44 MB"


Tambin puede declarar una matriz de estructuras. Esto se ilustra en el siguiente ejemplo: Copiar cdigo

Dim allSystems(100) As systemInfo


Se siguen las mismas reglas para tener acceso a los componentes de esta arquitectura de datos. Esto se ilustra en el siguiente ejemplo: Copiar cdigo

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 ms de sus elementos. Esto se ilustra en el siguiente ejemplo: Copiar cdigo

Protected Structure userInput Public userName As String Public inputForm As System.Windows.Forms.Form Public userFileNumber As Integer End Structure
Se puede utilizar una clase de objeto especfica en este tipo de declaracin, en lugar de Object. Estructuras y procedimientos Puede pasar una estructura como un argumento de procedimiento. Esto se ilustra en el siguiente ejemplo: Copiar cdigo

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
El ejemplo anterior pasa la estructura por referencia, lo que permite al procedimiento modificar sus elementos de tal forma que los cambios se hacen efectivos en el cdigo de llamada. Si desea proteger una estructura frente a una modificacin de este tipo, psela por valor. Tambin puede devolver una estructura de un procedimiento Function. Esto se ilustra en el siguiente ejemplo: Copiar cdigo

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 estructuras Las estructuras pueden contener otras estructuras. Esto se ilustra en el siguiente ejemplo: Copiar cdigo

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"
Tambin puede utilizar esta tcnica para encapsular una estructura definida en un mdulo dentro de una estructura definida en un mdulo distinto. Las estructuras pueden contener otras estructuras hasta cualquier nivel.

Estructuras y clases
Visual Basic unifica la sintaxis para clases y estructuras, y el resultado es que ambas entidades admiten prcticamente las mismas caractersticas. No obstante, existen tambin importantes diferencias entre clases y estructuras. Las clases tienen la ventaja de ser tipos de referencia: pasar una referencia es ms eficiente que pasar una variable de estructura con todos sus datos. Por otra parte, las estructuras no necesitan asignacin de memoria en la pila global. Puesto que no es posible heredar de una estructura, las estructuras slo deben utilizarse para objetos que no necesiten extenderse. Utilice estructuras cuando el objeto que desee crear tenga un tamao de instancia pequeo; tenga en cuenta las caractersticas de rendimiento de las clases frente a las estructuras. Similitudes Las estructuras y las clases son similares en los siguientes aspectos:

Ambas son tipos container, lo que significa que contienen otros tipos como miembros. Ambas tienen miembros, que pueden incluir constructores, mtodos, 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 ambas pueden tener niveles de acceso individualizados. Por ejemplo, un miembro puede declararse como Public y otro como Private. Ambas pueden implementar interfaces. Ambas pueden tener constructores compartidos, con o sin parmetros. Ambas pueden exponer una propiedad predeterminada, siempre que esa propiedad acepte al menos un parmetro. Ambas pueden iniciar eventos y ambas pueden declarar delegados.

Diferencias Las estructuras y las clases difieren en los siguientes aspectos:

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 sucede con los tipos de clase.

Las estructuras utilizan asignacin de pila y las clases utilizan asignacin del montn. De forma predeterminada, todos los elementos de estructura son Public; las variables y constantes de clase son Private, mientras que otros miembros de clase son Public de forma predeterminada. Este comportamiento de los miembros de las clases proporcionan compatibilidad con el sistema de valores predeterminados de Visual Basic 6.0.

Una estructura debe tener al menos una variable no compartida o un elemento de evento no compartido y no personalizado; una clase puede estar completamente vaca. Los elementos de estructura no se pueden declarar como Protected, mientras que los miembros de clase s se pueden. Un procedimiento de estructura slo puede controlar eventos si es un procedimiento Shared (Visual Basic) Sub y slo mediante AddHandler (Instruccin); cualquier procedimiento de clase puede controlar eventos, ya sea utilizando la palabra clave Handles o la instruccin AddHandler. Para obtener ms informacin, consulte Eventos y controladores de eventos.

Las declaraciones de variables de estructura no pueden especificar inicializadores o tamaos iniciales para matrices; mientras que las declaraciones de variables de clase s pueden. Las estructuras heredan de forma implcita de la clase System..::.ValueType y no pueden heredar de ningn otro tipo de clase. Las clases pueden heredar de cualquier clase o clases que no sean del tipo System..::.ValueType.

Las estructuras no son heredables; las clases, s. Las estructuras no se terminan nunca, por lo tanto, Common Language Runtime (CLR) nunca llama al mtodo Finalize en una estructura; las clases las termina el recolector de elementos no utilizados, que llama al mtodo Finalize en una clase cuando detecta que no quedan referencias activas.

Una estructura no requiere un constructor, una clase s. Las estructuras slo pueden tener constructores no compartidos si pueden tomar parmetros; sin embargo las clases pueden tener constructores con o sin parmetros.

Cada estructura tiene un constructor pblico implcito sin parmetros. El constructor inicializa todos los elementos de datos de estructura con sus valores predeterminados. Este comportamiento no puede redefinirse. Instancias y variables Puesto que las estructuras son tipos de valor, cada variable de estructura est enlazada de forma permanente a una instancia de estructura individual. Por otro lado, las clases son tipos de referencia y una variable de objeto puede hacer referencia a varias instancias de clase en distintos momentos. Esta distincin afecta al uso de estructuras y clases de las siguientes formas:

Inicializacin. Una variable de estructura incluye implcitamente una inicializacin de los elementos mediante el constructor sin parmetros de la estructura. Por tanto, Dim s As

struct1 equivale a Dim s As struct1 = New struct1().

Asignar variables. Al asignar una variable de estructura a otra o pasar una instancia de estructura a un argumento de procedimiento, se copian los valores actuales de todos los elementos de variable en la nueva estructura. Al asignar una variable de objeto a otra o pasar una variable de objeto a un procedimiento, slo se copia el puntero de referencia.

No asignar nada. Puede asignar el valor Nothing (Visual Basic) a una variable de estructura, aunque la instancia sigue asociada con la variable. Puede seguir llamando a los

mtodos y obteniendo acceso a sus elementos de datos, aunque la asignacin inicializa de nuevo los elementos de variable. En contraposicin, si establece una variable de objeto en Nothing, elimina su asociacin con cualquier instancia de clase y no puede tener acceso a ningn miembro a travs de la variable hasta que le asigne otra instancia.

Varias instancias. Una variable de objeto puede tener asignadas distintas instancias de clase en momentos distintos y varias variables de objeto pueden hacer referencia a la misma instancia de clase al mismo tiempo. Los cambios que realice a los valores de los miembros de clase afectan a dichos miembros cuando se tiene acceso a estos mediante otra variable que apunta a la misma instancia. Los elementos de estructura, sin embargo, estn aislados dentro de su propia instancia. Los cambios a sus valores no se ven reflejados en ninguna otra variable de estructura, incluso en otras instancias de la misma declaracin Structure.

Igualdad. La comprobacin de igualdad de dos estructuras debe realizarse mediante una prueba elemento a elemento. Dos variables de objeto se pueden comparar utilizando el mtodo Equals. Equals indica si las dos variables sealan a la misma instancia.

Programacin sin tipos en Visual Basic


El compilador de Visual Basic es capaz de cumplir dos reglas que afectan a su cdigo fuente:

Cada variable local debe aparecer en una instruccin de declaracin antes de que se utilice en cualquier otro tipo de instruccin. Esta regla se cumple de manera predeterminada. Cada conversin de tipos de restriccin debe especificarse con una palabra clave de conversin de tipos. Esta regla no se cumple de manera predeterminada.

Opciones de compilador que cambian las reglas Puede cambiar cada una de estas reglas o ambas restableciendo las opciones del compilador correspondientes. Si se suaviza la regla de conversin de tipos, el compilador funcionar con una semntica de tipos permisiva, lo que le permite realizar conversiones de restriccin sin palabras clave de conversin. Para obtener ms informacin, consulte Comprobar tipos en Visual Basic. Si se suaviza la regla de declaracin de variable, podr utilizar la programacin sin tipos, lo que le permite hacer referencia a variables sin necesidad de declararlas primero. Para obtener ms informacin, consulte Declaracin implcita y explcita. Normalmente, no se recomienda la programacin sin tipos, ya que puede comportar errores de ejecucin poco claros que afecten a los tipos de datos. Sin embargo, puede que le resulte til en determinadas circunstancias, como al trasladar cdigo de una aplicacin antigua que no declaraba variables.

Solucionar problemas de tipos de datos


Esta pgina muestra algunos problemas comunes que pueden aparecer al realizar operaciones en tipos de datos intrnsecos. Las expresiones de punto flotante no se comparan como iguales Cuando trabaje con nmeros de punto flotante (String (Tipo de datos, Visual Basic) y Double (Tipo de datos, Visual Basic)), tenga en cuenta que se almacenan como fracciones binarias. Esto significa que no pueden contener una representacin exacta de ninguna cantidad que no sea una fraccin binaria (con el formato k / (2 ^ n) donde k y n son nmeros enteros). Por ejemplo, 0,5 (= 1/2) y 0,3125 (= 5/16) se

pueden almacenar como valores precisos, mientras que 0,2 (= 1/5) y 0,3 (= 3/10) slo pueden se aproximaciones. Debido a esta imprecisin, no puede confiar en resultados exactos cuando trabaje en valores de punto flotante. Concretamente, dos valores que son tericamente iguales podran tener representaciones ligeramente distintas.

Para comparar cantidades de punto flotante


1. Calcule el valor absoluto de su diferencia, utilizando el mtodo Abs de la clase Math contenida en el espacio de nombres System. 2. Determine una diferencia mxima aceptable, de manera que considere ambas cantidades como iguales a efectos prcticos si su diferencia es menor que la especificada. 3. Compare el valor absoluto de la diferencia con la diferencia aceptable.

En el ejemplo siguiente se muestran comparaciones incorrectas y correctas de dos valores Double. Visual Basic Copiar cdigo

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 mtodo ToString de la estructura Double para que pueda especificar una mayor precisin que la utilizada por la palabra clave CStr. El valor predeterminado es de 15 dgitos, pero el formato "G17" lo ampla a 17 dgitos. El operador Mod no devuelve un resultado preciso Debido al imprecisin de almacenamiento con punto flotante, el Mod (Operador, Visual Basic) puede devolver un resultado inesperado cuando al menos uno de los operandos es de punto flotante. El Decimal (Tipo de datos, Visual Basic) no utiliza la representacin en punto flotante. Muchos nmeros que son inexactos en formato Single y Double son exactos en el formato Decimal (por ejemplo 0,2 y 0,3). Aunque las operaciones aritmticas se realizan ms lentamente en formato Decimal que con punto flotante, podra merecer la pena perder rendimiento para conseguir una mayor precisin.

Para buscar el resto entero de cantidades de punto flotante


1. 2. Declare las variables como Decimal. Utilice el carcter de tipo de literal D para forzar que los valores literales sean Decimal, en caso de que sus valores sean demasiado grandes para el tipo de datos Long.

En el ejemplo siguiente se muestra la imprecisin potencial de los operandos de punto flotante. Visual Basic Copiar cdigo

Dim Dim Dim Dim

two As Double = 2.0 zeroPointTwo As Double = 0.2 quotient As Double = two / zeroPointTwo 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 mtodo ToString de la estructura Double para que pueda especificar una mayor precisin que la utilizada por la palabra clave CStr. El valor predeterminado es de 15 dgitos, pero el formato "G17" lo ampla a 17 dgitos. Dado que zeroPointTwo es Double, su valor para 0,2 es una fraccin binaria infinitamente repetitiva con un valor almacenado de 0,20000000000000001. Al dividir 2,0 por esta cantidad, se obtiene 9,9999999999999995 con un resto de 0,19999999999999991. En la expresin de decimalRemainder, el carcter de tipo de literal D obliga a que ambos operandos sean Decimal, y 0,2 tenga una representacin precisa. Por consiguiente el operador Mod produce el resto esperado de 0,0. Tenga en cuenta que no basta con declarar decimalRemainder como Decimal. Tambin debe forzar los valores literales a Decimal o a que su valor predeterminado sea Double y decimalRemainder reciba el mismo valor inexacto que doubleRemainder. El tipo booleano no convierte con precisin al tipo numrico Los valores Boolean (Tipo de datos, Visual Basic) no se almacenan como nmeros y los valores almacenados no se consideran equivalentes a nmeros. Para la compatibilidad con versiones anteriores, Visual Basic proporciona las palabras clave de conversin (CType (Funcin), CBool, CInt, etc.) para convertir entre Boolean y los tipos numricos. Sin embargo, en ocasiones otros lenguajes realizan de manera diferente estas conversiones, como ocurre con los mtodos de .NET Framework. No debe escribir cdigo que se base en los valores numricos equivalentes de True y False. Siempre que sea posible, debe restringir el uso de variables Boolean a los valores lgicos para los que se han diseado. Si debe mezclar valores Boolean y numricos, asegrese de que entiende el mtodo de conversin que selecciona. Conversin en Visual Basic Cuando utilice la conversin CType o CBool para convertir tipos de datos numricos en Boolean, 0 se convierte en False y todos los dems valores en True. Al convertir valores Boolean en tipos numricos usando las palabras clave de conversin, False se convierte en 0 y True en -1. Conversin en Framework El mtodo ToInt32 de la clase Convert del espacio de nombres System convierte True en +1. Si necesita convertir un valor Boolean en un tipo de datos numrico, tenga cuidado al elegir el mtodo de conversin usado.

El carcter literal genera un error del compilador En ausencia de caracteres de tipo, Visual Basic presupone los tipos de datos predeterminados para los valores literales. El tipo predeterminado para un literal de carcter, incluido entre comillas (" "), es String. El tipo de datos String no ampla al Char (Tipo de datos, Visual Basic). Esto significa que, si desea asignar un literal a una variable Char, debe realizar una conversin de restriccin para forzar a que el valor literal sea del tipo Char.

Para crear un literal Char para asignarlo a una variable o constante


1. 2. 3. Declare la variable o constante como Char. Incluya el valor de carcter entre comillas (" "). A continuacin de la comilla doble de cierre, coloque el carcter de tipo literal C para forzar que el valor literal sea de tipo Char. Esto es necesario si el modificador de comprobacin de tipo (Option Strict (Instruccin)) es On, y es deseable en cualquier caso. El ejemplo siguiente muestra asignaciones incorrectas y correctas de un valor literal a una variable Char. Visual Basic Copiar cdigo

Option Strict On
Visual Basic Copiar cdigo

Dim charVar As Char ' The following statement attempts to convert Char. ' Because Option Strict is On, it generates a charVar = "Z" ' The following statement succeeds because it literal. charVar = "Z"c ' The following statement succeeds because it Char. charVar = CChar("Z")

a String literal to compiler error. specifies a Char converts String to

Siempre existe un riesgo en la utilizacin de conversiones de restriccin, porque se pueden producir errores en tiempo de ejecucin. Por ejemplo, se puede producir un error en una conversin de String a Char si el valor String contiene ms de un carcter. Por consiguiente, es mejor programar para que se utilice el carcter de tipo C. La conversin de cadenas produce errores en tiempo de ejecucin El String (Tipo de datos, Visual Basic) toma parte en muy pocas conversiones de ampliacin. String slo se ampla a s mismo y a Object, y slo Char y Char() (una matriz de Char) amplan a String. Esto es as porque las variables y constantes String pueden contener valores que no pueden contener otros tipos de datos. Cuando el modificador de comprobacin del tipo (Option Strict (Instruccin)) est On, el compilador deniega todas las conversiones de restriccin implcitas. Esto incluye las que implican String. El cdigo todava puede usar palabras clave de conversin como CStr y la CType (Funcin), que indican a .NET Framework que intente realizar la conversin. Proteccin de conversin de restriccin El inconveniente de las conversiones de restriccin es que pueden producir errores en tiempo de ejecucin. Por ejemplo, si una variable String contiene un valor distinto de "True" o "False", no se puede

convertir a Boolean. Si contiene caracteres de puntuacin, se produce un error al convertir en cualquier tipo numrico. A menos que sepa que la variable String siempre contiene valores aceptados por el tipo de destino, no debera intentar la conversin. Si necesita convertir de String a otro tipo de datos, el procedimiento ms seguro consiste en incluir la conversin que intenta realizar en la Instruccin Try...Catch...Finally (Visual Basic). Esto le permite tratar los errores en tiempo de ejecucin. Matrices de caracteres Un nico carcter Char y una matriz de elementos Char se amplan a String. Sin embargo, String no amplia a Char(). Para convertir un valor String en una matriz Char, puede utilizar el mtodo ToCharArray de la clase System..::.String. Valores sin sentido En general, los valores String no tienen ningn sentido en otros tipos de datos y la conversin resulta muy artificial y peligrosa. Siempre que sea posible, debe restringir el uso de variables String a las secuencias de caracteres para las que estn diseadas. Nunca debera escribir cdigo basndose en los valores equivalentes en otros tipos.

Variables en Visual Basic


Al realizar clculos con Visual Basic, resulta frecuente tener que almacenar valores. Por ejemplo, puede que necesite calcular varios valores, compararlos y realizar distintas operaciones con ellos, en funcin del resultado de la comparacin. Si desea comparar los valores, tiene que conservarlos. Uso Visual Basic, al igual que la mayora de los lenguajes de programacin, usa variables para almacenar los valores. Una variable tiene un nombre (la palabra que se usa para referirse al valor que contiene la variable). Una variable tambin tiene un tipo de datos, que determina el tipo de datos que puede almacenar la variable. Una variable puede representar una matriz si tiene que almacenar un conjunto indizado de elementos de datos estrechamente relacionados entre s. Visual Basic 2008 proporciona inferencia de tipo local, que le permite declarar las variables sin tener que indicar de forma explcita un tipo de datos. En lugar de ello, el compilador deduce el tipo de la variable a partir del tipo de la expresin de inicializacin. Para obtener ms informacin, consulte Inferencia de tipo de variable local. Asignar valores Para efectuar clculos y asignar el resultado a una variable, se utilizan instrucciones de asignacin, como se muestra en el ejemplo siguiente. Visual Basic Copiar cdigo

' 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.
Nota: El signo igual (=) de este ejemplo es un operador de asignacin, no un operador de igualdad. El valor se asigna a la variable applesSold. Para obtener ms informacin, vea Cmo: 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 obtener acceso. Sin embargo, es ms complejo que una variable. Una propiedad utiliza bloques de cdigo que controlan cmo establecer y recuperar su valor. Para obtener ms informacin, vea Diferencias entre propiedades y variables en Visual Basic. Una variable se declara para especificar su nombre y sus caractersticas. La instruccin de declaracin para variables es Instruccin Dim (Visual Basic). Su ubicacin y contenido determinan las caractersticas de la variable. Para las reglas de denominacin de variables y consideraciones, consulte Nombres de elementos declarados. Niveles de declaracin Valor local y variables miembros Una variable local es aquella que se declara dentro de un procedimiento. Una variable miembro es un miembro de un tipo de Visual Basic; se declara en el nivel de mdulo, dentro de una clase, estructura o mdulo, pero no dentro de ningn procedimiento interno de esa clase, estructura o mdulo. Variables compartidas y de instancias La categora de una variable miembro, en una clase o estructura, depende de que la variable est o no compartida. Si una variable se declara con la palabra clave Shared, es una variable compartida, y existe en una nica copia compartida por todas las instancias de la clase o estructura. De lo contrario, es una variable de instancia, y se crea una copia independiente de ella para cada instancia de la clase o estructura. Una copia determinada de una variable de instancia slo est disponible en la instancia para la cual se cre. Es independiente de una copia en cualquier otra instancia. Declarar el tipo de datos La clusula As de la instruccin de declaracin permite definir el tipo de datos o de objetos de la variable que se est declarando. Se puede especificar cualquiera de los siguientes tipos para una variable:

Un tipo de datos bsico, como Boolean, Long o Decimal. Un tipo de datos compuesto, como una matriz o una estructura. Un tipo de objeto o clase, definido en su aplicacin o en otra aplicacin Clase de .NET Framework, como Label o TextBox Un tipo de interfaz, como IComparable o IDisposable

Se pueden declarar varias declarar distintas variables en la misma instruccin sin necesidad de repetir el tipo de datos. En las instrucciones siguientes, las variables i, jy k se declaran como tipo Integer, l y m como Long, y x e y como Single: Copiar cdigo

Dim i, j, k As Integer ' All three variables in the preceding statement are declared as Integer. Dim l, m As Long, x, y As Single ' In the preceding statement, l and m are Long, x and y are Single.
Para obtener ms informacin acerca de tipos de datos, consulte Tipos de datos en Visual Basic. Para obtener ms informacin sobre objetos, consulte Programacin orientada a objetos en Visual Basic y Programar con componentes. Inferencia de tipo de variable local Visual Basic 2008 introduce el uso de la inferencia de tipos para determinar los tipos de datos de las variables locales declarados sin ninguna clusula As. El compilador deduce el tipo de la variable a partir

del tipo de la expresin de inicializacin. Esto permite declarar variables sin especificar un tipo de forma explcita. En el ejemplo siguiente, num1 y num2 son con establecimiento inflexible de tipos como enteros. Visual Basic Copiar cdigo

Public Sub inferenceExample() ' Using explicit typing. Dim num1 As Integer = 3 ' Using local type inference. Dim num2 = 3 End Sub
Si desea utilizar la inferencia de tipo de variable local, Option Infer debe estar establecido en On. Para obtener ms informacin, vea Inferencia de tipo de variable local. Declarar caractersticas El perodo de duracin de una variable representa el tiempo durante el cual la variable est disponible para que pueda ser utilizada. En general, una variable existe mientras el elemento que lo declara (como un procedimiento o clase) siga existiendo. En algunos casos es posible extender la duracin de una variable. Para obtener ms informacin, consulte Perodo de duracin en Visual Basic. El mbito de una variable est formado por todo cdigo que puede hacer referencia a la variable sin tener que calificar su nombre. El mbito de una variable est determinado por la ubicacin en la que se haya declarado la variable. El cdigo de una regin determinada puede utilizar las variables definidas en dicha regin sin necesidad de especificar los nombres de las variables. Para obtener ms informacin, consulte mbito en Visual Basic. El nivel de acceso de una variable es la extensin de cdigo que tiene permiso para tener acceso a ella. El modificador de acceso (como Public (Visual Basic) o Private (Visual Basic)) que utiliza en la instruccin Dim es quien determina esto. Para obtener ms informacin, consulte Niveles de acceso en Visual Basic.

Cmo: Crear una variable nueva


Crea una variable con una instruccin Instruccin Dim (Visual Basic).

Para crear una nueva variable


1. Declare la variable con una instruccin Dim. Copiar cdigo

Dim newCustomer
2. Incluya las especificaciones para las caractersticas de la variable, como Private (Visual Basic), Static (Visual Basic), Shadows o WithEvents. Para obtener ms informacin, consulte Caractersticas de los elementos declarados. Copiar cdigo

Public Static newCustomer


3. 4. No necesita la palabra clave Dim si utiliza otras palabras clave en la declaracin. Agregue a las especificaciones el nombre de la variable que debe seguir las reglas y convenciones de Visual Basic. Para obtener ms informacin, consulte Nombres de elementos declarados. Copiar cdigo

Public Static newCustomer


5. Agregue al nombre la clusula As para especificar el tipo de datos de la variable. Copiar cdigo

Public Static newCustomer As Customer


6. 7. Si no especifica el tipo de datos, usar el valor predeterminado: Object. Agregue a la clusula As un signo igual (=) y agregue al signo igual el valor inicial de la variable. Visual Basic asigna el valor especificado a la variable cada vez que ejecuta la instruccin Dim. Si no especifica un valor inicial, Visual Basic asigna el valor inicial predeterminado para el tipo de datos de la variable cuando escribe por primer vez el cdigo que contiene la instruccin Dim. Si la variable es un tipo de referencia, puede crear una instancia de su clase incluyendo la palabra clave New (Visual Basic) en la clusula As. Si no utiliza New, el valor inicial de la variable es Nothing (Visual Basic). Copiar cdigo

Public Static newCustomer As New Customer

Decidir el tipo de variable que se va a definir


Cuando define una variable, debe decidir las caractersticas siguientes:

Su tipo de datos: qu tipo de datos debe contener Su perodo de duracin: cunto tiempo debe continuar existiendo Su mbito: qu cdigo debe poder hacer referencia a l sin calificar su nombre Su nivel de acceso: qu cdigo debe tener el permiso de lectura y escritura en ella.

Tipo de datos En la instruccin Instruccin Dim (Visual Basic) que declara la variable, incluya una clusula As que especifica el tipo de datos adecuado (como Integer o String). Las pginas siguientes pueden ayudarle a elegir el tipo de datos de una variable.

Cmo: Contener los nmeros enteros en una variable Cmo: Contener el nmero mayor posible en una variable Cmo: Optimizar el almacenamiento de enteros positivos con tipos sin signo Cmo: Contener las fracciones en una variable Cmo: Contener los dgitos ms significativos de una variable Cmo: Mantener los valores de moneda de una variable Cmo: Contener caracteres en una variable Cmo: Contener valores verdaderos y falsos en una variable Cmo: Mantener los valores de fecha y hora de una variable Cmo: Contener los datos de tipo desconocido en una variable Cmo: Declarar una estructura Crear y utilizar objetos

Para obtener ms informacin, consulte Resumen de tipos de datos (Visual Basic).

Perodo de duracin La decisin importante sobre el perodo de duracin es si es aceptable para la variable dejar de existir cuando el mdulo, clase o procedimiento que lo declara dejan de existir. Si la variable no necesita seguir existiendo ms all del perodo de duracin de su elemento contenedor, no necesita hacer nada ms. Si la variable debe seguir existiendo durante ms tiempo que su elemento contenedor, puede incluir la palabra clave Static o Shared en su instruccin Dim. Siga los pasos descritos en Cmo: Prolongar la duracin de una variable. Para obtener ms informacin, consulte Perodo de duracin en Visual Basic. mbito El mbito de una variable suele ser normalmente el mismo que su espacio de declaracin, es decir, el elemento contenedor en el que se declara. Debe decidir qu extensin debe tener el mbito de la variable. Asegrese de que la instruccin Dim aparece en el nivel adecuado, como bloque, procedimiento o nivel de mdulo. Siga los pasos descritos en Cmo: Controlar el mbito de una variable. Para obtener ms informacin, consulte mbito en Visual Basic. Nivel de acceso Cada variable tiene un nivel de acceso predeterminado que depende de dnde se declara, es decir, en qu tipo de elemento contenedor. Si necesita especificar un nivel de acceso distinto del valor predeterminado, puede incluir un modificador de acceso (como Protected o Private) en su instruccin Dim. Slo puede hacer esto para las variables miembros (concretamente, las variables declaradas fuera de un procedimiento). Siga los pasos descritos en Cmo: Controlar la disponibilidad de una variable. Para obtener ms informacin, consulte Niveles de acceso en Visual Basic.

Cmo: Crear una variable que no cambia de valor


La nocin de una variable que no cambia de valor podra parecer contradictoria. Pero hay situaciones en las que una constante no es factible y es til tener una variable con un valor fijo. En tal caso puede definir una variable miembro con la palabra clave ReadOnly (Visual Basic). No puede utilizar Instruccin Const (Visual Basic) para declarar y asignar un valor constante en las circunstancias siguientes:

La instruccin Const no acepta el tipo de datos que desea utilizar. No conoce el valor en tiempo de compilacin. No puede calcular el valor constante en tiempo de compilacin.

Para crear una variable que no cambia de valor


1. En el nivel de mdulo, declare una variable miembro con Instruccin Dim (Visual Basic) e incluya la palabra clave ReadOnly (Visual Basic) Copiar cdigo

Dim ReadOnly timeStarted


2. Slo puede especificar ReadOnly en una variable miembro. Esto significa que debe definir la variable en el nivel de mdulo, fuera de cualquier procedimiento.

3.

Si puede calcular el valor en una instruccin nica en el momento de la compilacin, utilice una clusula de inicializacin en la instruccin Dim. Agregue detrs de la clusula As un signo igual (=), seguido de una expresin. Asegrese de que el compilador puede evaluar esta expresin en un valor constante. Copiar cdigo

Dim ReadOnly timeStarted As Date = Now


4. Slo puede asignar una vez un valor a una variable ReadOnly. Una vez hecho esto, ningn cdigo podr cambiar nunca su valor. 5. Si no conoce el valor o no puede calcularlo en una instruccin nica en tiempo de compilacin, puede asignarlo durante el tiempo de ejecucin en un constructor. Para ello, debe declarar la variable ReadOnly en la clase o nivel de estructura. En el constructor para esa clase o estructura, calcule el valor fijo de la variable y asgnelo a la variable antes de que vuelva del constructor.

Cmo: Introducir y extraer los datos de una variable


Almacena un valor en una variable colocando el nombre de variable en el lado izquierdo de una instruccin de asignacin. Colocar datos en una variable

Para almacenar un valor en una variable

Utilice el nombre de variable en el lado izquierdo de una instruccin de asignacin. El ejemplo siguiente establece el valor de la variable alpha. Copiar cdigo

alpha = (beta * 6.27) / (gamma + 2.1)


El valor generado en el lado derecho de la instruccin de asignacin se almacena en la variable. Obtener datos de una variable Recupera el valor de una variable incluyendo el nombre de variable en una expresin.

Para recuperar un valor de una variable

Utilice el nombre de variable en una expresin. Puede utilizar una variable en cualquier parte donde se puede utilizar una constante o un literal, excepto en una expresin que define el valor de una constante. o bien

Utilice el nombre de variable que sigue al signo igual (=) en una instruccin de asignacin. El ejemplo siguiente lee el valor de la variable startValue y, a continuacin, utiliza el valor de la variable counter en una expresin. Copiar cdigo

counter = startValue cellValue = (counter + 5) ^ 2


El valor de la variable participa en la expresin del mismo modo que una constante y se almacena en la variable o propiedad en el lado izquierdo de la instruccin de asignacin.

Variables de objeto en Visual Basic


Una variable, adems de almacenar valores directamente, puede hacer referencia a un objeto. Puede asignar un objeto a una variable por los mismos motivos que asigna un valor a una variable:

Un nombre de variable suele ser ms corto y ms fcil de recordar que la ruta de acceso completa a los mtodos y propiedades necesarios para obtener acceso al propio objeto. El uso de una variable que hace referencia a un objeto es ms eficiente que el acceso reiterado al propio objeto mediante los mtodos o propiedades adecuados. Es posible cambiar una variable para que haga referencia a otros objetos durante la ejecucin del cdigo.

Acortar el cdigo Las variables de objeto permiten reducir la cantidad de cdigo que hay que escribir. El ejemplo siguiente utiliza la ruta de acceso completa de mtodos y propiedades para tener acceso a un objeto Control. Copiar cdigo

' Assume Me is a valid Form, or replace Me with a valid Form. Me.ActiveForm.ActiveControl.Text = "Test" Me.ActiveForm.ActiveControl.Location = New Point(100, 100) Me.ActiveForm.ActiveControl.Show()
Podra abreviar este segmento de cdigo utilizando una variable de objeto para el control, con lo que aumentara la rapidez de su ejecucin. Es conveniente que declare la variable de objeto con la clase especfica que desee asignarle (Control en este caso). Una vez que haya asignado un objeto a la variable, podr tratarla exactamente igual que el objeto al que hace referencia. Puede establecer o recuperar las propiedades del objeto o utilizar cualquiera de sus mtodos. El ejemplo siguiente utiliza una variable de objeto para simplificar el cdigo del ejemplo anterior. Copiar cdigo

Dim ctrlActv As System.Windows.Forms.Control = Me.ActiveForm.ActiveControl ctrlActv.Text = "Test" ctrlActv.Location = New Point(100, 100) ctrlActv.Show()

Cmo: Acelerar el acceso a un objeto con una ruta de acceso de calificacin larga
Si frecuentemente tiene acceso a un objeto que requiere una ruta de acceso de calificacin de varios mtodos y propiedades, puede acelerar su cdigo sin tener que repetir la ruta de acceso de calificacin. Hay dos maneras de evitar la repeticin de la ruta de acceso de calificacin. Puede asignar el objeto a una variable o puede utilizarlo en un bloque With...End With.

Para acelerar el acceso a un objeto muy calificado asignndolo a una variable


1. Declare una variable del tipo del objeto al que est teniendo acceso con frecuencia. Especifique la ruta de acceso de calificacin en la parte de inicializacin de la declaracin. Copiar cdigo

Dim ctrlActv As Control = someForm.ActiveForm.ActiveControl


2. Utilice la variable para tener acceso a los miembros del objeto. Copiar cdigo

ctrlActv.Text = "Test" ctrlActv.Location = New Point(100, 100)

ctrlActv.Show()
Para acelerar el acceso a un objeto muy calificado mediante un bloque With...End
1. Coloque la ruta de acceso de calificacin en una instruccin With. Copiar cdigo

With someForm.ActiveForm.ActiveControl
2. Tenga acceso a los miembros del objeto dentro del bloque With, antes de la instruccin End With. Copiar cdigo

.Text = "Test" .Location = New Point(100, 100) .Show() End With

Declaracin de variables de objeto


Utiliza una instruccin de declaracin normal para declarar una variable de objeto. Para el tipo de datos, especifica Object (es decir, Object (Tipo de datos)) o una clase ms especfica a partir de la cual se crea el objeto. Declarar una variable como Object es lo mismo que declararla como System..::.Object. Cuando se declara una variable con una clase de objeto especfica, sta obtiene acceso a todos los mtodos y propiedades de dicha clase y las clases de las que hereda. Si declara la variable con Object, puede tener acceso slo a los miembros de la clase Object, a menos que cambie Option Strict Off para permitir el enlace en tiempo de ejecucin. Sintaxis de la declaracin Use la sintaxis siguiente para declarar una variable de objeto: Copiar cdigo

Dim variablename As [New] { objectclass | Object }


Tambin puede especificar Public (Visual Basic), Protected (Visual Basic), Friend (Visual Basic), Protected Friend, Private (Visual Basic), Shared (Visual Basic) o Static (Visual Basic) en la declaracin. Son vlidas las siguientes declaraciones de ejemplo: Copiar cdigo

Private objA As Object Static objB As System.Windows.Forms.Label Dim objC As System.OperatingSystem


Enlace en tiempo de ejecucin y enlace en tiempo de compilacin A veces la clase especfica es desconocida hasta que se ejecuta el cdigo. En este caso, debe declarar la variable de objeto con el tipo de datos Object, Esto crea una referencia general a cualquier tipo de objeto y se asigna la clase especfica en tiempo de ejecucin. Esto se llama enlace en tiempo de ejecucin. El enlace en tiempo de ejecucin requiere tiempo de ejecucin adicional. Tambin limita su cdigo a los mtodos y propiedades de la clase que le ha asignado recientemente. Esto puede producir errores en tiempo de ejecucin si su cdigo intenta tener acceso a miembros de una clase diferente. Si conoce la clase especfica en tiempo de compilacin, declare la variable de objeto como miembro de dicha clase. Esto se llama enlace en tiempo de compilacin. El enlace en tiempo de compilacin mejora el rendimiento y garantiza el acceso de su cdigo a todos los mtodos y propiedades de la clase especfica. En las declaraciones del ejemplo anterior, si la variable objA utiliza slo objetos de clase System.Windows.Forms..::.Label, debe especificar As System.Windows.Forms.Label en su declaracin.

Ventajas del enlace en tiempo de compilacin La declaracin de una variable de objeto como una clase especfica ofrece varias ventajas:

Comprobacin automtica de tipos Acceso garantizado a todos los miembros de la clase especfica Compatibilidad con Microsoft IntelliSense en el Editor de cdigo Legibilidad mejorada de su cdigo Disminucin del nmero de errores en el cdigo Errores detectados en tiempo de compilacin en vez de en tiempo de ejecucin Aumento de la velocidad de ejecucin del cdigo

Acceso a los miembros de variables de objeto Si Option Strict est en On, una variable de objeto slo puede tener acceso a los mtodos y propiedades de la clase con la que se ha declarado. Esto se ilustra en el siguiente ejemplo: Copiar cdigo

' Option statements must precede all other source file lines. Option Strict On ' Imports statement must precede all declarations in the source file. Imports System.Windows.Forms Public Sub accessMembers() Dim p As Object Dim q As System.Windows.Forms.Label p = New System.Windows.Forms.Label q = New System.Windows.Forms.Label Dim j, k As Integer ' The following statement generates a compiler ERROR. j = p.Left ' The following statement retrieves the left edge of the label in pixels. k = q.Left End Sub
En este ejemplo, p puede utilizar slo los miembros de la propia clase Object, que no incluyen la propiedad Left. Por otro lado, q se ha declarado con el tipo Label, as que puede utilizar todos los mtodos y propiedades de la clase Label en el espacio de nombres System.Windows.Forms. Flexibilidad de las variables de objeto Cuando se trabaja con objetos en una jerarqua de herencia, existe la posibilidad de elegir la clase que se va a utilizar para declarar las variables de objeto. A la hora de tomar esta decisin, debe buscarse un equilibrio entre la flexibilidad de la asignacin de objetos y el acceso a los miembros de una clase. Por ejemplo, si consideramos la jerarqua de herencia que conduce a la clase System.Windows.Forms..::.Form: Object Component Control ScrollableControl ContainerControl Form

Supongamos que una aplicacin define un clase de formulario denominado specialForm, que hereda de la clase Form. Puede declarar una variable de objeto que haga referencia especficamente a

specialForm, como se muestra en el ejemplo siguiente:


Copiar cdigo

Public Class Inherits ' Insert End Class Dim nextForm

specialForm System.Windows.Forms.Form code defining methods and properties of specialForm. As New specialForm

La declaracin del ejemplo anterior limita la variable nextForm a objetos de la clase specialForm, pero tambin pone todos los mtodos y propiedades de specialForm a disposicin de nextForm, as como todos los miembros de todas las clases de las que hereda specialForm. Puede hacer que una variable de objeto sea ms general si la declara de tipo Form, como se muestra en el ejemplo siguiente. Copiar cdigo

Dim anyForm As System.Windows.Forms.Form


La declaracin del ejemplo anterior le permite asignar cualquier formulario de su aplicacin a anyForm. Sin embargo, aunque anyForm pueda tener acceso a todos los miembros de la clase Form, no puede utilizar ninguno de los mtodos o propiedades adicionales definidos para formularios especficos como

specialForm.
Todos los miembros de una clase base estn disponibles para las clases derivadas, pero los miembros adicionales de una clase derivada no estn disponibles para la clase base.

Cmo: Obtener acceso a los miembros de un objeto


Cuando tiene una variable de objeto que hace referencia a un objeto, a menudo quiere trabajar con los miembros de ese objeto, como mtodos, propiedades, campos y eventos. Por ejemplo, una vez haya creado un nuevo objeto Form, podra querer establecer la propiedad Text o llamar al mtodo Focus. Tener acceso a miembros Tiene acceso a los miembros de un objeto a travs de la variable que hace referencia a l.

Para tener acceso a los miembros de un objeto

Utilice el operador de acceso a miembros (.) entre el nombre de la variable de objeto y el nombre del miembro. Copiar cdigo

currentText = newForm.Text
Si el miembro es Shared (Visual Basic), no necesita una variable para tener acceso a l. Para obtener ms informacin, consulte Cmo: Obtener acceso a miembros compartidos y no compartidos de un objeto. Tener acceso a miembros de un objeto de tipo conocido Si conoce el tipo de un objeto en tiempo de compilacin, puede utilizar el enlace en tiempo de compilacin para una variable que hace referencia a l.

Para tener acceso a los miembros de un objeto para el que conoce el tipo en tiempo de compilacin
1. Declare la variable de objeto para que sea del tipo del objeto que piensa asignar a la variable.

Copiar cdigo

Dim extraForm As System.Windows.Forms.Form


2. Con Option Strict On, puede asignar slo objetos Form (u objetos de un tipo derivado de Form) a extraForm. Si ha definido una clase o estructura con una conversin de ampliacin CType en Form, tambin puede asignar esa clase o estructura a extraForm. 3. Utilice el operador de acceso a miembros (.) entre el nombre de la variable de objeto y el nombre del miembro. Copiar cdigo

extraForm.Show()
4. Puede tener acceso a todos los mtodos y propiedades especficos de la clase Form, independientemente de cul sea la configuracin de Option Strict. Tener acceso a miembros de un objeto de tipo desconocido Si no conoce el tipo de un objeto en tiempo de compilacin, debe utilizar el enlace en tiempo de ejecucin para una variable que hace referencia a l.

Para tener acceso a los miembros de un objeto para el que no conoce el tipo en tiempo de compilacin
1. Declare la variable de objeto para que sea Object (Tipo de datos). (Declarar una variable como Object es lo mismo que declararla como System..::.Object.) Copiar cdigo

Dim someControl As Object


2. Con Option Strict On, puede tener acceso slo a miembros que estn definidos en la clase Object. 3. Utilice el operador de acceso a miembros (.) entre el nombre de la variable de objeto y el nombre del miembro. Copiar cdigo

someControl.GetType()
4. Para poder tener acceso a miembros de cualquier objeto que asigne a la variable de objeto, debe establecer Option Strict Off. Cuando hace esto, el compilador no puede garantizar que el objeto que asigna a la variable exponga un miembro determinado. Si el objeto no expone un miembro al que intenta tener acceso, se produce una excepcin MemberAccessException.

5. Asignacin de variables de objeto


6. Utilice una instruccin de asignacin normal para asignar un objeto a una variable de objeto. Puede asignar una expresin de objeto o la palabra clave Nothing, tal como se muestra en el ejemplo siguiente. Copiar cdigo

Dim thisObject As Object ' The following statement assigns an object reference. thisObject = Form1 ' The following statement discontinues association with any object. thisObject = Nothing
7. 8. Nothing significa que no hay ningn objeto asignado actualmente a la variable. Inicializacin

9.

Cuando el cdigo empieza a ejecutarse, las variables de objeto se inicializan con Nothing. Aqullos cuyas declaraciones incluyen la inicializacin se reinicializan con los valores que especifica cuando se ejecutan las instrucciones de declaracin.

10. Puede incluir la inicializacin en su declaracin utilizando la palabra clave New. En las siguientes instrucciones de declaracin se declaran variables de objeto testUri y ver, y se les asignan objetos especficos. Cada una utiliza uno de los constructores sobrecargados de la clase adecuada para inicializar el objeto. Copiar cdigo

Dim testUri As New System.Uri("http://www.microsoft.com") Dim ver As New System.Version(6, 1, 0)


11. Desasociacin con cualquier objeto especfico, lo que impide que el objeto se modifique de forma accidental al cambiar la variable. Tambin permite comprobar si la variable de objeto seala a un objeto vlido, tal como se muestra en el ejemplo siguiente: Copiar cdigo

12. Si se establece una variable de objeto en Nothing se interrumpe la asociacin de la variable

If otherObject IsNot Nothing Then ' otherObject refers to a valid object, so your code can use it. End If
13. Si el objeto al que hace referencia la variable est en otra aplicacin, esta comprobacin no permite averiguar si la aplicacin se ha terminado o ha invalidado el objeto. 14. Una variable de objeto con un valor de Nothing tambin se llama referencia nula. 15. Instancia actual todo el cdigo se ejecuta siempre dentro de un procedimiento, la instancia actual es aquella en la cual se invoc al procedimiento. 17. La palabra clave Me cumple la funcin de una variable de objeto que hace referencia a la instancia actual. Si un procedimiento no es Shared (Visual Basic), puede utilizar la palabra clave Me para obtener un puntero a la instancia actual. Los procedimientos compartidos no pueden asociarse a una instancia especfica de una clase. 18. El uso de la palabra clave Me es especialmente til para pasar la instancia actual a un procedimiento de otro mdulo. Por ejemplo, suponga que tiene varios documentos XML y desea agregar un texto estndar a todos ellos. El ejemplo siguiente define un procedimiento para ello. Copiar cdigo 16. La instancia actual de un objeto es aquella en la que se est ejecutando el cdigo. Dado que

Sub addStandardText(XmlDoc As System.Xml.XmlDocument) XmlDoc.CreateTextNode("This text goes into every XML document.") End Sub
19. Despus, todos los objetos de documento XML pueden llamar al procedimiento y pasar como argumento su instancia actual. En el siguiente ejemplo se muestra cmo.

Cmo: Declarar una variable de objeto y asignarle un objeto en Visual Basic

Declara una variable de Object (Tipo de datos) especificando As Object en Instruccin Dim (Visual Basic). Asigna un objeto a este tipo de variable colocando el objeto despus del signo igual (=) en una instruccin de asignacin o una clusula de inicializacin. Ejemplo En el siguiente ejemplo se declara una variable Object y se le asigna la instancia actual. Copiar cdigo

Dim thisObject As Object thisObject = "This is an Object"


Puede combinar la declaracin y la asignacin inicializando la variable como parte de su declaracin. El ejemplo siguiente es equivalente al ejemplo anterior. Copiar cdigo

Dim thisObject As Object = "This is an Object"


Compilar el cdigo Este ejemplo necesita:

Una referencia al espacio de nombres System. Una clase, estructura o mdulo en las que colocar la instruccin Dim. Un procedimiento en el que colocar la instruccin de asignacin.

Cmo: Crear una variable de objeto que no haga referencia a ninguna instancia
Puede desasociar una variable de objeto de cualquier instancia de objeto establecindola en Nothing (Visual Basic).

Para desasociar una variable de objeto de cualquier instancia de objeto

Establezca la variable en Nothing en una instruccin de asignacin. Copiar cdigo

' Assume account is a defined class Dim currentAccount As account currentAccount = Nothing
Programacin eficaz Si su cdigo intenta tener acceso a un miembro de una variable de objeto establecida en Nothing, se produce una excepcin NullReferenceException. Si establece a menudo una variable de objeto en Nothing o si es posible que la variable no est inicializada, resulta conveniente agregar los accesos a los miembros en un bloque Try...Catch...Finally. Seguridad Si utiliza una variable para objetos que contienen datos confidenciales o sensibles, puede establecer la variable en Nothing cuando no est tratando activamente uno de esos objetos. Esto reduce la posibilidad de que cdigo malintencionado tenga acceso a los datos.

Valores de las variables de objeto


Una variable de Object (Tipo de datos) puede hacer referencia a datos de cualquier tipo. El valor que se le da a una variable Object se guarda en algn lugar de la memoria fuera de la variable; lo que contiene la variable es un puntero a los datos. Funciones del clasificador de objetos

Visual Basic proporciona funciones que devuelven informacin de la referencia a que remite una variable Object, tal como se muestra en la siguiente tabla. Funcin IsArray (Funcin, Visual Basic) IsDate (Funcin, Visual Basic) IsDBNull (Funcin) Devuelve True si la variable Object hace referencia a Una matriz de valores, en lugar de un valor nico.

Un valor Date (Tipo de datos, Visual Basic) o una cadena que puede interpretarse como un valor de fecha y hora. Un objeto de tipo DBNull que representa datos que faltan o que no existen. Un objeto de excepcin que se deriva de Exception. Nothing (Visual Basic), es decir que no hay ningn objeto asignado actualmente a la variable. Un nmero o una cadena que puede interpretarse como un nmero.

IsError (Funcin) IsNothing (Funcin)

IsNumeric (Funcin, Visual Basic) IsReference (Funcin)

Un tipo de referencia (como una cadena, matriz, delegado o tipo de clase).

Puede utilizar estas funciones para impedir que se enve un valor no vlido a una operacin o a un procedimiento. Operador TypeOf Tambin puede utilizar el operador TypeOf (Operador, Visual Basic) para averiguar si una variable de objeto hace referencia en ese momento a un tipo de datos especfico. La expresin TypeOf...Is se evala como True si el tipo en tiempo de ejecucin del operando se deriva del tipo especificado o lo implementa. En el siguiente ejemplo se utiliza TypeOf en variables de objeto que hacen referencia a tipos de valor y de referencia: Copiar cdigo

' The following statement puts a value type (Integer) in an Object variable. Dim num As Object = 10 ' The following statement puts a reference type (Form) in an Object variable. Dim frm As Object = New Form() If TypeOf num Is Long Then Debug.WriteLine("num is Long") If TypeOf num Is Integer Then Debug.WriteLine("num is Integer") If TypeOf num Is Short Then Debug.WriteLine("num is Short") If TypeOf num Is Object Then Debug.WriteLine("num is Object") If TypeOf frm Is Form Then Debug.WriteLine("frm is Form") If TypeOf frm Is Label Then Debug.WriteLine("frm is Label") If TypeOf frm Is Object Then Debug.WriteLine("frm is Object")
Como resultado del ejemplo anterior, se escriben las siguientes lneas en la ventana Depuracin:

num is Integer num is Object frm is Form

frm is Object
La variable de objeto num hace referencia a datos de tipo Integer y frm hace referencia a un objeto de clase Form. Matrices de objetos Puede declarar y utilizar matrices de variables Object, lo cual puede resultarle til si necesita controlar varios tipos de datos y clases de objetos. Todos los elementos de una matriz deben tener declarado el mismo tipo de datos. Si este tipo de datos se declara como Object, se pueden almacenar en la matriz instancias de clase y objetos junto con otros tipos de datos.

Cmo: Hacer referencia a la instancia actual de un objeto


La instancia actual de un objeto es la instancia en la que se est ejecutando el cdigo. Utiliza la palabra clave Me para hacer referencia a la instancia actual.

Para hacer referencia a la instancia actual

Utilice la palabra clave Me donde utilizara normalmente el nombre de una variable de objeto. Copiar cdigo

Me.ForeColor = System.Drawing.Color.Crimson Me.Close()


Aunque Me se comporta como una variable de objeto, no puede declararlo ni asignarle nada. Me siempre hace referencia a la instancia actual.

Cmo: Determinar el tipo al que hace referencia una variable de objeto


Una variable de objeto contiene un puntero a datos que se almacenan en otra parte. El tipo de estos datos puede cambiar durante el tiempo de ejecucin. En cualquier momento, puede utilizar el mtodo GetTypeCode para determinar el tipo en tiempo de ejecucin actual o TypeOf (Operador, Visual Basic) para averiguar si el tipo en tiempo de ejecucin actual es compatible con un tipo especificado.

Para determinar el tipo exacto al que una variable de objeto hace referencia actualmente
1. En la variable de objeto, llame al mtodo GetType para recuperar un objeto System..::.Type. Copiar cdigo

Dim myObject As Object myObject.GetType()


2. En la clase System..::.Type, llame al mtodo GetTypeCode compartido para recuperar el valor de enumeracin TypeCode para el tipo del objeto. Copiar cdigo

Dim myObject As Object Dim datTyp As Integer = Type.GetTypeCode(myObject.GetType()) MsgBox("myObject currently has type code " & CStr(datTyp))
3. Puede probar el valor de enumeracin TypeCode con los miembros de enumeracin que sean de su inters, como Double.

Para determinar si el tipo de una variable de objeto es compatible con un tipo especificado

Utilice al operador TypeOf en combinacin con Is (Operador, Visual Basic) para probar el objeto con una expresin TypeOf...Is. Copiar cdigo

If TypeOf objA Is System.Windows.Forms.Control Then MsgBox("objA is compatible with the Control class") End If
La expresin TypeOf...Is devuelve True si el tipo del objeto en tiempo de ejecucin es compatible con el tipo especificado. El criterio para la compatibilidad depende de si el tipo especificado es una clase, estructura o interfaz. En general, los tipos son compatibles si el objeto es del mismo tipo que hereda o implementa el tipo especificado. Para obtener ms informacin, consulte TypeOf (Operador, Visual Basic). Compilar el cdigo Observe que el tipo especificado no puede ser una variable o expresin. Debe ser el nombre de un tipo definido, como una clase, estructura o interfaz. Esto incluye los tipos intrnsecos como Integer y String.

Cmo: Determinar si dos objetos estn relacionados


Puede comprar dos objetos para determinar la relacin que hay, si existe, entre las clases a partir de las cuales se crearon. El mtodo IsInstanceOfType de la clase System..::.Type devuelve True si la clase especificada se hereda de la clase actual o si el tipo actual es una interfaz compatible con la clase especificada.

Para determinar si un objeto hereda de la clase o interfaz de otro objeto


1. 2. 3. En el objeto que piensa que podra ser del tipo base, invoque el mtodo GetType. En el objeto System..::.Type devuelto por GetType, invoque el mtodo IsInstanceOfType. En la lista de argumentos para IsInstanceOfType, especifique el objeto que piensa que podra ser del tipo derivado. IsInstanceOfType devuelve True si su tipo de argumento hereda del tipo de objeto System..::.Type. Ejemplo El ejemplo siguiente determina si un objeto representa una clase derivada de la clase de otro objeto. Copiar cdigo

Public Class baseClass End Class Public Class derivedClass : Inherits baseClass End Class Public Class testTheseClasses Public Sub seeIfRelated() Dim baseObj As Object = New baseClass() Dim derivedObj As Object = New derivedClass() Dim related As Boolean related = baseObj.GetType().IsInstanceOfType(derivedObj) MsgBox(CStr(related)) End Sub

End Class
Observe la posicin inesperada de las dos variables de objeto en la llamada a IsInstanceOfType. El tipo base supuesto se utiliza para generar la clase System..::.Type y el tipo derivado supuesto se pasa como argumento al mtodo IsInstanceOfType.

Cmo: Determinar si dos objetos son idnticos


Visual Basic considera que dos objetos son idnticos si sus punteros son los mismos, es decir, si ambas variables sealan a la misma instancia de clase en la memoria. Es posible que desee realizar esta comparacin, por ejemplo, para determinar si la instancia actual (Me) es igual que una instancia determinada como Form2. Visual Basic proporciona dos operadores para comparar los punteros. Is (Operador, Visual Basic) devuelve True si los objetos son idnticos e IsNot (Operador) devuelve True si no lo son. Determinar si dos objetos son idnticos

Para determinar si dos objetos son idnticos


1. 2. Prepare una expresin Boolean para probar los dos objetos. En la expresin de prueba, utilice el operador Is con los dos objetos como operandos. Is devuelve True si los objetos sealan a la misma instancia de clase. Determinar si dos objetos no son idnticos A veces, desea realizar una accin cuando los dos objetos no son idnticos y puede ser complicado combinar Not e Is, por ejemplo If Not obj1 Is obj2. En estos casos puede utilizar el operador IsNot.

Para determinar si dos objetos no son idnticos


1. 2. Prepare una expresin Boolean para probar los dos objetos. En la expresin de prueba, utilice el operador IsNot con los dos objetos como operandos. IsNot devuelve True si los objetos no sealan a la misma instancia de clase. Ejemplo El ejemplo siguiente prueba pares de variables Object para ver si sealan a la misma instancia de clase. Copiar cdigo

Dim objA, objB, objC as Object objA = Me objB = New System.Windows.Forms.Form() objC = Me MsgBox("objA different from objB? " & CStr(objA IsNot objB)) MsgBox("objA identical to objC? " & CStr(objA Is objC))
El ejemplo anterior muestra el siguiente resultado.

objA different from objB? True objA identical to objC? True

Inferencia de tipo de variable local


El compilador de Visual Basic 2008 utiliza la inferencia de tipos para determinar los tipos de datos de las variables locales declarados sin ninguna clusula As. El compilador deduce el tipo de la variable a partir

del tipo de la expresin de inicializacin. De esta forma, puede declarar las variables sin indicar explcitamente un tipo, como se muestra en el ejemplo siguiente. Visual Basic Copiar cdigo

Public Sub inferenceExample() ' Using explicit typing. Dim num1 As Integer = 3 ' Using local type inference. Dim num2 = 3 End Sub
Nota: La inferencia de tipo de variable local no se puede utilizar para declarar los campos de clase. Si num2, en el ejemplo anterior, fuese un campo en vez de una variable local, la declaracin provocara un error con la instruccin Option Strict activada y clasificara num2 como Object con la instruccin Option Strict desactivada. De igual forma, no se pueden deducir los tipos de las variables estticas cuando la instruccin Option Strict est activada. Con la instruccin Option Strict desactivada, el tipo de staticVar de Static staticVar = 5 es Object. El cdigo que usa la inferencia de tipos se parece al cdigo que depende del enlace en tiempo de ejecucin. Sin embargo, la inferencia de tipos permite el establecimiento inflexible de los tipos de la variable en lugar de dejarla como Object. El compilador utiliza el inicializador de una variable para determinar su tipo en tiempo de compilacin con el fin de generar cdigo de enlace en tiempo de compilacin. En el ejemplo anterior, num2 se escribe como Integer. El comportamiento de las variables de enlace en tiempo de compilacin difiere del de las variables de enlace en tiempo de ejecucin, cuyo tipo slo se conoce en tiempo de ejecucin. Si se sabe el tipo pronto, el compilador puede identificar los problemas antes de la ejecucin, asignar la memoria con precisin y realizar otras optimizaciones. El enlace en tiempo de compilacin tambin permite que el entorno de desarrollo integrado (IDE) de Visual Basic proporcione ayuda de IntelliSense sobre los miembros de un objeto. El enlace en tiempo de compilacin tambin se prefiere por razones de rendimiento. Esto ocurre porque todos los datos almacenados en una variable de enlace en tiempo de ejecucin se deben ajustar como tipo Object y si se tiene acceso a los miembros del tipo en tiempo de ejecucin, el programa se ejecuta ms lentamente.

Nota: Si no desea que num2 del ejemplo anterior vaya a tener un tipo como Integer, puede especificar otro tipo mediante una declaracin como Dim num3 As Object = 3 o Dim num4 As Double = 3. Ejemplos La inferencia de tipo se produce cuando una variable local se declara sin ninguna clusula As y se le asigna un valor. El compilador utiliza el tipo del valor como el tipo de la variable. Por ejemplo, cada una de las siguientes lneas de cdigo declara una variable de tipo String: Visual Basic Copiar cdigo

' Using explicit typing. Dim name1 As String = "Springfield" ' Using local type inference. Dim name2 = "Springfield"

El cdigo siguiente muestra dos maneras equivalentes de crear una matriz de enteros. Visual Basic Copiar cdigo

' Using explicit typing. Dim someNumbers1() As Integer = New Integer() {4, 18, 11, 9, 8, 0, 5} ' Using local type inference. Dim someNumbers2 = New Integer() {4, 18, 11, 9, 8, 0, 5}
Puede utilizar la inferencia de tipos para determinar el tipo de una variable de control de bucle. En el cdigo siguiente, el compilador deduce que num es Integer, porque someNumbers2 es una matriz de enteros. Visual Basic Copiar cdigo

Dim total = 0 For Each number In someNumbers2 total += number Next


La inferencia de tipo de variable local se puede utilizar en instrucciones Using para establecer el tipo del nombre del recurso, como se muestra en el ejemplo siguiente. Visual Basic Copiar cdigo

Using proc = New System.Diagnostics.Process ' Insert code to work with the resource. End Using
El tipo de una variable tambin se puede deducir de los valores devueltos de las funciones, como muestra el ejemplo siguiente. Tanto pList1 como pList2 son listas de procesos. Visual Basic Copiar cdigo

' Using explicit typing. Dim pList1() As Process = Process.GetProcesses() ' Using local type inference. Dim pList2 = Process.GetProcesses()
Option Infer Una nueva opcin, Option Infer, permite especificar si la inferencia de tipo de variable local se permite en un archivo determinado. Para habilitar o bloquear la opcin, escriba una de las instrucciones siguientes al principio del archivo.

Option Infer On Option Infer Off


Si no especifica ningn valor para Option Infer en el cdigo, el valor predeterminado del compilador es

Option Infer On para los proyectos creados en Visual Basic 2008 y Option Infer Off para los
proyectos actualizados a partir de versiones anteriores. Para obtener ms informacin, consulte Option Infer (Instruccin) y /optioninfer.

Nota: Si el valor que se establece para Option Infer en un archivo est en conflicto con el valor establecido

en el IDE o la lnea de comandos, tiene prioridad el valor del archivo. Restricciones La inferencia de tipo slo se puede utilizar para las variables locales no estticas; no se puede usar para determinar el tipo de los campos de clase, las propiedades o las funciones.

Solucionar problemas de variables en Visual Basic


Esta pgina muestra algunos problemas comunes que pueden aparecer al trabajar con variables en Visual Basic. No se puede obtener acceso a los miembros de un objeto Si el cdigo intenta tener acceso a una propiedad o un mtodo en un objeto, hay dos posibles resultados de error:

El compilador puede generar un mensaje de error si declara la variable de objeto con un tipo especfico y, a continuacin, hace referencia a un miembro no definido por dicho tipo. Se produce una excepcin MemberAccessException en tiempo de ejecucin cuando el objeto asignado a una variable de objeto no expone el miembro al que el cdigo intenta obtener acceso. En el caso de una variable de Object (Tipo de datos), tambin puede obtener esta excepcin si el miembro no es de tipo Public. Esto se debe a que el enlace en tiempo de ejecucin slo permite el acceso a miembros de tipo Public.

Si Option Strict (Instruccin) establece la comprobacin de tipos como On, una variable de objeto slo puede tener acceso a los mtodos y propiedades de la clase con la que se ha declarado. Esto se ilustra en el siguiente ejemplo: Visual Basic Copiar cdigo

Option Strict On
Visual Basic Copiar cdigo

Dim p As Object = New System.Windows.Forms.Label Dim q As System.Windows.Forms.Label = New System.Windows.Forms.Label Dim j, k As Integer ' The following statement generates a compiler error. j = p.Left ' The following statement retrieves the left edge of the label ' in pixels. k = q.Left
En este ejemplo, p puede utilizar slo los miembros de la propia clase Object, que no incluyen la propiedad Left. Por otro lado, q se ha declarado con el tipo Label, as que puede utilizar todos los mtodos y propiedades de la clase Label en el espacio de nombres System.Windows.Forms. Enfoque correcto Para obtener acceso a todos los miembros de un objeto de una clase determinada, declare la variable de objeto con el tipo de dicha clase siempre que sea posible. Si no puede realizarlo de esta manera, por ejemplo si no conoce el tipo del objeto en tiempo de compilacin, debe establecer Option Strict como Off y declarar la variable como Object (Tipo de datos). Esto permite que se asignen a la variable los objetos de cualquier tipo; debe llevar a cabo los pasos necesarios para asegurarse de que el objeto asignado es de un tipo vlido. Para esto, puede utilizar TypeOf (Operador, Visual Basic). Otros componentes no pueden tener acceso a la variable

En los nombres de Visual Basic no se distingue entre maysculas y minsculas. Si dos nombres slo se distinguen por el uso de maysculas y minsculas, el compilador los interpreta como el mismo nombre. Por ejemplo, ABC y abc hacen referencia al mismo elemento declarado. No obstante, Common Language Runtime (CLR) utiliza enlaces que s distinguen entre maysculas y minsculas. Por lo tanto, cuando genere un ensamblado o una DLL que pueda estar disponible para otros ensamblados, sus nombres s se distinguirn por sus maysculas o minsculas. Por ejemplo, si define una clase que tiene un elemento denominado ABC, y otros ensamblados utilizan la clase por medio de Common Language Runtime, debern hacer referencia al elemento como ABC. Si, posteriormente, vuelve a compilar la clase y cambia el nombre del elemento a abc, los otros ensamblados que utilicen la clase ya no tendrn acceso a este elemento. Por lo tanto, cuando se lance una versin actualizada de un ensamblado, no se deben cambiar las maysculas o minsculas de los elementos pblicos. Para obtener ms informacin, vea Common Language Runtime. Enfoque correcto Para permitir a otros componentes tener acceso a las variables, trate sus nombres como si distinguieran entre maysculas y minsculas. Cuando pruebe la clase o el mdulo, asegrese de que los dems ensamblados se enlazan con las variables esperadas. Despus de publicar un componente, no realice ninguna modificacin en los nombres de variable existentes, incluido el cambio entre maysculas y minsculas. Uso de la variable equivocada Cuando tiene ms de una variable con el mismo nombre, el compilador de Visual Basic intenta resolver cada referencia como dicho nombre. Si las variables tienen mbito diferente, el compilador resuelve una referencia como la declaracin con el mbito ms limitado. Si tienen el mismo mbito, se produce un error en la resolucin y el compilador seala un error. Para obtener ms informacin, vea Resolver una referencia cuando muchas variables tienen el mismo nombre. Enfoque correcto Evite utilizar variables con el mismo nombre pero mbito diferente. Si utiliza otros ensamblados o proyectos, evite en la medida de lo posible utilizar nombres definidos en dichos componentes externos. Si tiene ms de una variable con el mismo nombre, asegrese de calificar todas las referencias a ella. Para obtener ms informacin, vea Cmo: Distinguir entre dos elementos con el mismo nombre.

Matrices en Visual Basic


Al utilizar matrices, puede emplear el mismo nombre para hacer referencia a distintos valores gracias a la utilizacin de un nmero denominado ndice o subndice que permite distinguirlos. Las matrices pueden reducir y simplificar el cdigo, permitiendo crear bucles que gestionan de forma eficiente cualquier nmero de elementos.

Informacin general sobre matrices en Visual Basic


Una matriz es un conjunto de valores relacionados lgicamente entre s, como el nmero de estudiantes de cada curso en una escuela primaria. Una matriz permite hacer referencia a estos valores relacionados mediante un mismo nombre y utilizar un nmero, denominado ndice o subndice, para distinguirlos. Los valores individuales se llaman elementos de la matriz. Son contiguos desde el ndice 0 hasta el valor del ndice superior. Ejemplo En el ejemplo siguiente se declara una variable de matriz para que contenga el nmero de estudiantes de cada curso en una escuela primaria.

Copiar cdigo

Dim students(6) As Integer


La matriz students del ejemplo anterior contiene 7 elementos. Los ndices de los elementos van de 0 a 6. Tener esta matriz es ms fcil que declarar 7 variables diferentes. En la siguiente ilustracin se muestra la matriz students. Para cada elemento de la matriz:

El ndice del elemento representa el curso (el ndice 0 representa el jardn de infancia). El valor contenido en el elemento representa el nmero de estudiantes en ese curso.

Elementos de la matriz "students"

En el ejemplo siguiente se muestra cmo hacer referencia al primer, segundo y ltimo elemento de la matriz students. Copiar cdigo

Dim kindergarten As Integer = students(0) Dim firstGrade As Integer = students(1) Dim sixthGrade As Integer = students(6) MsgBox("Students in kindergarten = " & CStr(kindergarten)) MsgBox("Students in first grade = " & CStr(firstGrade)) MsgBox("Students in sixth grade = " & CStr(sixthGrade))
Puede hacer referencia a la matriz en conjunto utilizando simplemente el nombre de la variable de la matriz sin ndices. Tipos de matriz y otros tipos Tipos de datos Cada matriz tiene un tipo de datos pero no es igual que el tipo de datos de sus elementos. Por ejemplo, la matriz students del ejemplo anterior es de tipo Integer(), mientras que cada uno de sus elementos es de tipo Integer. La notacin Integer() significa una matriz de elementos Integer. Para obtener ms informacin, consulte Tipos de datos de matrices en Visual Basic. Cada matriz hereda de la clase System..::.Array y puede declarar una variable que sea de tipo Array pero no puede crear una matriz de tipo Array. Asimismo, Instruccin ReDim (Visual Basic) no puede funcionar en una variable declarada de tipo Array. Por estas razones y para mayor seguridad del tipo, es aconsejable declarar cada matriz como un tipo especfico, como por ejemplo Integer en el ejemplo anterior. Dimensiones de matriz La matriz students del ejemplo anterior utiliza un ndice y se dice que es unidimensional. Una matriz que utiliza ms de un ndice o subndice se denomina multidimensional. Otro tipo de matriz es el que contiene otras matrices como elementos. Esto se conoce como una matriz de matrices o una matriz escalonada. Una matriz escalonada puede ser unidimensional o multidimensional, y lo mismo sucede con sus elementos.

Contrastar tipos A diferencia de una matriz, una variable que contiene un nico valor se llama variable escalar. Una matriz no es lo mismo que una coleccin. Para obtener ms informacin, consulte Colecciones como alternativa a las matrices.

Cmo: Declarar una variable de matriz


Una variable de matriz se declara de la misma manera que cualquier otra variable mediante la instruccin Dim. Se agregan uno o ms pares de parntesis a continuacin del nombre de la variable para indicar que es para contener una matriz en vez de una variable escalar (una variable que contiene un solo valor). Declarar variables de matriz

Para declarar una variable de matriz unidimensional

En su declaracin, agregue un par de parntesis despus del nombre de variable. En el ejemplo siguiente se declara una variable para que contenga una matriz unidimensional con elementos de Double (Tipo de datos, Visual Basic). Copiar cdigo

Dim cargoWeights() As Double


En el ejemplo anterior se declara una variable de matriz pero no se le asigna una matriz. Todava debe crear una matriz unidimensional, inicializarla y asignarla a cargoWeights.

Para declarar una variable de matriz multidimensional

En la declaracin, agregue un par de parntesis detrs del nombre de la variable y coloque comas dentro de los parntesis para separar las dimensiones. En el ejemplo siguiente se declara una variable para que contenga una matriz de cuatro dimensiones con elementos de Short (Tipo de datos, Visual Basic). Copiar cdigo

Dim atmospherePressures(,,,) As Short


En el ejemplo anterior se declara una variable de matriz pero no se le asigna una matriz. Todava debe crear una matriz de cuatro dimensiones, inicializarla y asignarla a

atmospherePressures.

Para declarar una variable de matriz escalonada

En la declaracin, agregue tantos pares de parntesis despus del nombre de variable como niveles haya de matrices anidadas. En el ejemplo siguiente se declara una variable para que contenga una matriz de matrices de matrices (una matriz, cada elemento de la cual es una matriz, cada elemento de la cual es una matriz), en la que la matriz ms profunda tiene elementos de Byte (Tipo de datos, Visual Basic). Copiar cdigo

Dim inquiriesByYearMonthDay()()() As Byte


En el ejemplo anterior se declara una variable de matriz pero no se le asigna una matriz. Todava debe crear una matriz de matrices de matrices, inicializarla y asignarla a

inquiriesByYearMonthDay.

Cmo: Crear una matriz

Una matriz es un objeto, por lo que la crea con una clusula New (Visual Basic) y la asigna a la variable de matriz. Puede hacer esto como parte de la declaracin de la matriz o en una instruccin de asignacin subsiguiente.

Para crear una matriz en la instruccin de declaracin de matriz

En su declaracin, agregue una clusula New despus del nombre de variable y sus parntesis. En el ejemplo siguiente se declara una variable para que contenga una matriz con elementos de Date (Tipo de datos, Visual Basic), se crea la matriz y se asigna a la variable. Copiar cdigo

Dim validDates() As Date = New Date() {}


Tras la ejecucin de esta instruccin, la matriz de la variable validDates tiene una longitud de 0.

Nota: La clusula New debe especificar el nombre de tipo, seguido de parntesis y luego llaves, {}. Los parntesis no representan una llamada a un constructor de matriz. Indican que el tipo de objeto es un tipo de matriz. Las llaves proporcionan los valores de inicializacin. El compilador requiere las llaves aunque no proporcionen ningn valor. Por consiguiente, la clusula New debe incluir parntesis y llaves, aunque estn vacos.

Para crear una matriz en una instruccin de asignacin separada

Utilice una instruccin de asignacin posterior con una clusula New. En el ejemplo siguiente se declara una variable para que contenga una matriz con elementos de Integer (Tipo de datos, Visual Basic), se crea la matriz y se asigna a la variable de otra instruccin. Copiar cdigo

Dim scores() As Integer scores = New Integer() {}


Tras la ejecucin de estas instrucciones, la matriz de la variable scores tiene una longitud de 0. o bien Utilice Instruccin ReDim (Visual Basic) no slo para crear una matriz sino para inicializar su longitud. Copiar cdigo

ReDim scores(4)
Tras la ejecucin de esta instruccin, la matriz de la variable scores tiene una longitud de 5, con todos los elementos que contienen valores predeterminados.

Cmo: Crear una matriz con tipos de elementos mixtos


Declara slo un tipo de datos para una matriz y todos sus elementos deben ser de ese tipo de datos. Normalmente, es preferible esta limitacin, ya que todos los elementos se relacionan estrechamente entre s y tienen tipos de valores similares. Sin embargo, a veces los elementos no estn estrechamente relacionados o no tienen valores similares. En este caso, puede declarar los elementos de la matriz para que sean Object (Tipo de datos) y los elementos individuales pueden sealar a tipos de datos diferentes, como nmeros, caracteres, cadenas, objetos y otras matrices.

Para crear una matriz con elementos de tipos de datos diferentes

Declare la matriz como Object. El ejemplo siguiente declara una variable para que contenga una matriz de elementos de Object, crea la matriz y la asigna a la variable. Copiar cdigo

Dim mixedTypes As Object() = New Object() {}


Cuando utiliza el tipo de datos Object, tenga presente que el rendimiento no es tan eficaz como cuando utiliza un tipo de datos ms concreto. Esto se debe a que el tiempo de ejecucin tiene que convertir los datos entre su tipo de datos natural y Object, utilizando operaciones llamadas conversin boxing y conversin unboxing. Este procesamiento adicional puede afectar negativamente al rendimiento si lo hace a menudo.

Para tener acceso a los elementos de tipos de datos diferentes de una matriz

Lea o escriba los elementos de la manera normal. Puede almacenar y recuperar un elemento de cualquier tipo de datos en una matriz Object. El ejemplo siguiente muestra cmo colocar informacin de tipos de datos diferentes en una matriz Object. Almacena informacin de empleado en la matriz de una variable

employeeData.
Copiar cdigo

Dim employeeData(3) As Object employeeData(0) = "Alex Hankin" employeeData(1) = "4242 Maple Street" employeeData(2) = 48 employeeData(3) = #8/23/1956#
Para recuperar informacin de tipos de datos diferentes de una matriz Object, puede convertir un elemento en el tipo de datos adecuado, como se muestra en el ejemplo siguiente. Copiar cdigo

Dim age As Integer = CInt(employeeData(2)) Dim birthDate as Date = CDate(employeeData(3))


En una situacin en la que los elementos no son similares o no estn relacionados entre s, existe la posibilidad de colocarlos en una coleccin en lugar de una matriz Object. Para obtener ms informacin, consulte Colecciones como alternativa a las matrices.

Cmo: Crear una matriz sin elementos


Una matriz sin elementos se llama tambin una matriz de longitud cero. Un variable que contenga una matriz de longitud cero no tiene el valor Nothing. Podra necesitar crear una matriz de longitud cero en las circunstancias siguientes:

Su cdigo necesita tener acceso a los miembros de la clase Array, como Length o Rank, o llamar a una funcin de Visual Basic como UBound (Funcin, Visual Basic), sin arriesgarse a provocar una excepcin NullReferenceException.

Desea que el cdigo utilizado sea ms sencillo sin tener que comprobar Nothing como caso especial. El cdigo interacta con una interfaz de programacin de aplicaciones (API) que le exige que pase una matriz de longitud cero a uno o ms procedimientos o que devuelve una matriz de longitud cero desde uno o ms procedimientos.

Para crear una matriz sin elementos

Declare una de las dimensiones de la matriz para que sea -1. En el ejemplo siguiente se declara una variable para que contenga una matriz con elementos de String (Tipo de datos, Visual Basic), pero se establece inicialmente que est vaca. Copiar cdigo

Dim twoDimensionalStrings(-1, 3) As String


Tras la ejecucin de esta instruccin, la matriz de la variable twoDimensionalStrings es bidimensional con una longitud de 0. Est vaca pero existe no obstante. En consecuencia, una variable que apunte a la matriz no ser igual a Nothing. En consecuencia, puede crear una matriz no vaca y asignarla a twoDimensionalStrings.

Por el contrario, en el ejemplo siguiente se declara una variable de matriz que no seala inicialmente a ninguna matriz. Copiar cdigo

Dim twoDimStrings( , ) As String


A diferencia de twoDimensionalStrings en el ejemplo anterior, la variable

twoDimStrings tiene el valor Nothing.

Cmo: Inicializar una variable de matriz


Puede inicializar una matriz al mismo tiempo que la crea, como parte de la clusula New (Visual Basic). Tambin puede inicializarla en instrucciones de asignacin subsiguientes. Los aspectos de una matriz que puede inicializar son los siguientes:

Los lmites superiores del ndice que especifican las longitudes de las dimensiones de la matriz Los valores de algunos o de todos los elementos de la matriz

Puede inicializar uno de stos aspectos sin inicializar otros. Sin embargo, si proporciona valores de elementos pero no los lmites superiores, el nmero de valores proporcionados determina los lmites superiores.

Para inicializar una matriz en la clusula New en el momento de la creacin

En la clusula New, especifique el lmite superior del ndice dentro de parntesis y proporcione los valores de elementos dentro de llaves ({}). El ejemplo siguiente declara, crea e inicializa una variable para contener una matriz con elementos de Char (Tipo de datos, Visual Basic), especificando el lmite superior y los valores. Copiar cdigo

Dim testChars As Char() = New Char(2) {"%"c, "&"c, "@"c}


Tras la ejecucin de esta instruccin, la matriz de la variable testChars tiene una longitud de 3, con elementos desde el ndice 0 hasta el 2 que contienen valores inicializados. Si proporciona el lmite superior y los valores, debe incluir un valor para cada elemento desde el ndice 0 hasta el lmite superior.

Tenga en cuenta el carcter c de tipo literal, que fuerza un literal de carcter para que sea del tipo de datos Char. De forma predeterminada, si no hay ningn carcter de tipo, un literal incluido entre comillas String usa (" ").

No tiene que especificar el lmite superior del ndice si proporciona valores de elementos en la clusula New. El ejemplo siguiente declara, crea e inicializa una variable para contener una matriz con elementos de Boolean (Tipo de datos, Visual Basic), especificando slo los valores de elementos. Copiar cdigo

Dim answers As Boolean() = New Boolean() {True, True, False, True}


Tras la ejecucin de esta instruccin, la matriz de la variable answers tiene una longitud de 4, con elementos desde el ndice 0 hasta el 3 que contienen valores inicializados. Puede inicializar el lmite superior del ndice sin inicializar ningn elemento. Si crea una matriz de esta forma, debe usar una instruccin de asignacin subsiguiente para inicializar cada valor de elemento.

Para inicializar una matriz en instrucciones de asignacin subsiguientes


1. 2. Especifique el lmite superior del ndice en la declaracin de la variable de matriz. Utilice una o ms instrucciones de asignacin, cada una de las cuales asignan un valor a uno de los elementos de la matriz. El ejemplo siguiente declara y crea una variable para contener una matriz con elementos de String (Tipo de datos, Visual Basic) y proporciona dos valores de elementos en instrucciones subsiguientes. Copiar cdigo

Dim comments(30) As String comments(0) = "This is the first comment." comments(5) = "This is the sixth comment."
3. Tras la ejecucin de estas instrucciones, la matriz de la variable comments tiene una longitud de 31, con elementos en los ndices 0 y 5 que contienen valores inicializados y los otros 29 elementos que contienen valores predeterminados. Si inicializa una matriz de esta forma, puede inicializar algunos elementos y omitir otros. o bien

Utilice Instruccin ReDim (Visual Basic) para inicializar la longitud de la matriz. Copiar cdigo

ReDim comments(5)
Tras la ejecucin de esta instruccin, la matriz de la variable comments tiene una longitud de 6, con todos los elementos que contienen valores predeterminados.

Nota: Puede inicializar el lmite superior del ndice solamente en una ubicacin. Si especifica un lmite superior en los parntesis que siguen al nombre de la variable de la matriz, no puede usar una clusula New. Si especifica el lmite superior en los parntesis de la clusula New, debe dejar vacos los parntesis que siguen al nombre de variable.

Dimensiones de matrices en Visual Basic


Una dimensin es una direccin en la que puede variar la especificacin de los elementos de una matriz. Una matriz que contiene el total de ventas de todos los das del mes tiene una dimensin (el da del mes). Una matriz que contiene el total de ventas por departamento de todos los das del mes tiene dos dimensiones (el nmero del departamento y el da del mes). El nmero de dimensiones que tiene una matriz se denomina rango. Trabajar con dimensiones

Para especificar un elemento de una matriz, proporcione un ndice o un subndice para cada una de sus dimensiones. Los elementos son contiguos a lo largo de cada dimensin del ndice 0 al ndice ms alto para esa dimensin. Las ilustraciones siguientes muestran la estructura conceptual de matrices con rangos diferentes. Cada elemento de las ilustraciones muestra los valores de ndice que tienen acceso a l. Por ejemplo, puede tener acceso al primer elemento de la segunda fila de la matriz bidimensional especificando los ndices

(1, 0).
Matriz unidimensional

Matriz bidimensional

Matriz tridimensional

Una dimensin Muchas matrices tienen slo una dimensin, como el nmero de personas de cada edad. El nico requisito para especificar un elemento es la edad para la que ese elemento contiene el recuento. Por lo tanto, este tipo de matriz utiliza slo un ndice. El ejemplo siguiente declara una variable para que contenga una matriz unidimensional de recuentos de edad para edades de 0 a 120. Copiar cdigo

Dim ageCounts(120) As UInteger


Dos dimensiones

Algunas matrices tienen dos dimensiones, como el nmero de oficinas de cada planta de todos los edificios de un campus. La especificacin de un elemento requiere el nmero del edificio y de la planta, y cada elemento contiene el recuento para esa combinacin de edificio y planta. Por consiguiente, este tipo de matriz utiliza dos ndices. El ejemplo siguiente declara una variable para que contenga una matriz bidimensional de recuentos de oficinas para 0 a 40 edificios y 0 a 5 plantas. Copiar cdigo

Dim officeCounts(40, 5) As Byte


Una matriz bidimensional tambin se denomina matriz rectangular. Tres dimensiones Algunas matrices tienen tres dimensiones, como los valores de un espacio tridimensional. Este tipo de matriz utiliza tres ndices que, en este caso, representan las coordenadas x, y y z del espacio fsico. El ejemplo siguiente declara una variable para que contenga una matriz tridimensional de las temperaturas del aire en distintos puntos de un volumen tridimensional. Copiar cdigo

Dim airTemperatures(99, 99, 24) As Single


Ms de tres dimensiones Aunque una matriz puede tener hasta un mximo de 32 dimensiones, es raro que tenga ms de tres.

Nota: Cuando se agregan dimensiones a una matriz, el espacio total necesario para guardar la matriz aumenta considerablemente; por ello, debe utilizar las matrices multidimensionales con prudencia. Uso de dimensiones diferentes Suponga que desea realizar el seguimiento de las cantidades de ventas de todos los das del mes actual. Es posible que desee declarar una matriz unidimensional con 31 elementos, uno por cada da del mes, tal como muestra el ejemplo siguiente. Copiar cdigo

Dim salesAmounts(30) As Double


Ahora, suponga que desea realizar el seguimiento de la misma informacin no slo para todos los das del mes sino tambin para todos los meses del ao. Puede declarar una matriz bidimensional con 12 filas (para los meses) y 31 columnas (para los das), tal como muestra el ejemplo siguiente. Copiar cdigo

Dim salesAmounts(11, 30) As Double


Ahora, suponga que decide mantener la informacin en la matriz durante ms de un ao. Si desea realizar el seguimiento de las cantidades de ventas durante 5 aos, puede declarar una matriz tridimensional con 5 capas, 12 filas y 31 columnas, tal como muestra el ejemplo siguiente. Copiar cdigo

Dim salesAmounts(4, 11, 30) As Double


Tenga en cuenta que, debido a que un ndice vara de 0 a su mximo, las dimensiones de

salesAmounts se declaran como una menos que la longitud necesaria para esa dimensin. Observe
igualmente que el tamao de la matriz aumenta con cada nueva dimensin. Los tres tamaos de los ejemplos anteriores son respectivamente 31, 372 y 1.860 elementos.

Cmo: Especificar el lmite inferior cero de una matriz


Si est declarando una matriz, puede especificar el lmite inferior de cada dimensin utilizando el carcter cero (0) con la palabra clave To. Esto no cambia el lmite inferior necesario, pero puede facilitar la lectura de su cdigo.

Para especificar el lmite inferior cero de forma explcita en una matriz


1. 2. Declare la matriz de la manera normal. Dentro de los parntesis, agregue 0 To delante del lmite superior de cada dimensin. Copiar cdigo

Public Sub declarelowerbounds() Dim monthtotal(0 To 11) As Double Dim cell(0 To 39, 0 To 19) As Integer MsgBox("Total number of elements:" _ & vbCrLf & "monthtotal (0 To 11) length " & CStr(monthtotal.Length) _ & vbCrLf & "cell (0 To 39, 0 To 19) length " & CStr(cell.Length)) End Sub
El lmite inferior debe ser siempre 0, pero su cdigo puede ser ms legible si lo declara explcitamente. La especificacin de ambos lmites recuerda igualmente al lector que el lmite inferior es 0. Creacin de una matriz alternativa. Puede crear una matriz sin utilizar la clusula Instruccin Dim (Visual Basic) o New (Visual Basic). Por ejemplo, puede llamar al mtodo CreateInstance u otro componente puede pasar su cdigo a una matriz creada de esta manera. Este tipo de matriz puede tener lmites inferiores distintos de 0. Siempre puede probar el lmite inferior de una dimensin con el mtodo GetLowerBound o LBound (Funcin, Visual Basic).

Cmo: Determinar el nmero de dimensiones de una matriz


La propiedad Rank de una matriz devuelve su rango (el nmero de dimensiones).

Para determinar el rango de una matriz

Lea la propiedad Rank de la matriz. No agregue parntesis detrs del nombre de la matriz. Copiar cdigo

Dim thisThreeDimArray(,,) As Byte = New Byte(4, 4, 4) {} MsgBox("Rank of thisThreeDimArray is " & CStr(thisThreeDimArray.Rank))
La llamada a MsgBox muestra "Rank of thisThreeDimArray is 3". El rango de una matriz forma parte de su tipo de datos. Por ello, no puede cambiar el rango, incluso con una instruccin ReDim.

Matrices multidimensionales en Visual Basic


Las matrices pueden tener una o varias dimensiones. Si tiene ms de una, se llama matriz multidimensional. Observe que tener varias dimensiones no es lo mismo que una matriz escalonada que tiene otras matrices como elementos suyos. Dimensiones y tamao La dimensin o rango de una matriz corresponde al nmero de ndices que se utilizan para identificar un elemento individual. Se pueden especificar hasta 32 dimensiones, aunque no es habitual tener ms de tres. El ejemplo siguiente declara una variable de matriz bidimensional y una variable de matriz tridimensional. Copiar cdigo

Dim populations(200, 3) As Long Dim matrix(5, 15, 10) As Single

El nmero total de elementos es el producto de las longitudes de todas las dimensiones. En el ejemplo anterior, populations tiene un total de 804 elementos (201 x 4) y matrix tiene 1056 elementos (6 x 16 x 11). Cada ndice va de 0 a la longitud especificada para su dimensin. Una matriz bidimensional tambin se denomina una matriz rectangular.

Nota: Cuando se agregan dimensiones a una matriz, el espacio total necesario para guardar la matriz aumenta considerablemente; por ello, debe utilizar las matrices multidimensionales con prudencia. Miembros de clase de matriz Todas las matrices heredan de la clase Array del espacio de nombres System, por lo que es posible obtener acceso a los mtodos y a las propiedades de Array para cualquier matriz. Los miembros siguientes de Array pueden ser tiles:

La propiedad Rank devuelve la categora de la matriz (nmero de dimensiones). El mtodo GetLength devuelve la longitud a lo largo de la dimensin especificada. El mtodo GetUpperBound devuelve el valor de ndice ms alto para la dimensin especificada. El valor de ndice ms bajo para cada dimensin es siempre 0. La propiedad Length devuelve el nmero total de elementos en la matriz. El mtodo Array..::.Sort ordena los elementos de una matriz unidimensional.

Tenga en cuenta que GetLength y GetUpperBound toman un argumento basado en 0 para la dimensin que est especificando.

Cmo: Crear una matriz con varias dimensiones


Una matriz que utiliza ms de un ndice se denomina matriz multidimensional. Al igual que con una matriz unidimensional, se crea con una clusula New (Visual Basic) y se asigna a la variable de matriz. Puede hacer esto como parte de la declaracin de la matriz o en una instruccin de asignacin subsiguiente.

Para crear una matriz multidimensional


1. Coloque el nmero adecuado de comas dentro de los parntesis que siguen al nombre de variable. Debe tener una coma menos que el nmero de dimensiones. 2. Coloque el nmero adecuado de comas dentro de los parntesis en la clusula New. No necesita comas dentro de las llaves ({}) si no proporciona ningn valor de elemento. El ejemplo siguiente declara una variable para que contenga una matriz bidimensional con elementos de Double (Tipo de datos, Visual Basic), crea la matriz y la asigna a la variable. Copiar cdigo

Dim weights(,) As Double = New Double(,) {}


Tras la ejecucin de esta instruccin, la matriz de la variable weights tiene una longitud de 0.

Nota: Cuando se agregan dimensiones a una matriz, el espacio total necesario para guardar la matriz aumenta considerablemente; por ello, debe utilizar las matrices multidimensionales con prudencia.

Para trabajar de forma eficaz con una matriz multidimensional

Agrguela a un bucle For anidado. En el siguiente ejemplo se inicializan todos los elementos de matrix con valores comprendidos entre 0 y 99, segn sus posiciones en la matriz. Copiar cdigo

Dim Dim Dim For

matrix(9, 9) As Double maxDim0 As Integer = UBound(matrix, 1) maxDim1 As Integer = UBound(matrix, 2) i As Integer = 0 To maxDim0 For j As Integer = 0 To maxDim1 matrix(i, j) = (i * 10) + j Next j Next i
Una matriz multidimensional no es lo mismo que una matriz escalonada. Para obtener ms informacin, consulte Cmo: Crear una matriz de matrices.

Cmo: Inicializar una matriz multidimensional


Puede inicializar una variable de matriz multidimensional de la misma manera que inicializa una matriz unidimensional, slo que debe contar con cada dimensin.

Para inicializar una variable de matriz multidimensional

En la declaracin de la variable de matriz, especifique cada lmite superior del ndice entre parntesis, separado por comas. El ejemplo siguiente declara y crea una variable que contiene una matriz bidimensional con elementos de Short (Tipo de datos, Visual Basic), especificando slo los lmites superiores. Copiar cdigo

Dim sizes(1, 1) As Short


Tras la ejecucin de esta instruccin, la matriz de la variable sizes tiene un total de cuatro elementos, en los ndices (0, 0), (0, 1) (1, 0) y (1, 1), que contienen valores predeterminados. Si crea una matriz de esta manera, debe utilizar una instruccin de asignacin subsiguiente para asignar cada valor de elemento.

o bien La declaracin debe ir seguida del signo de igualdad (=) y una clusula New (Visual Basic). En la clusula New, repita el tipo de datos del elemento, especifique los lmites superiores del ndice entre parntesis e incluya llaves vacas ({}). El ejemplo siguiente declara y crea una variable que contiene una matriz tridimensional con elementos del tipo de datos Short, especificando slo los lmites superiores. Copiar cdigo

Dim replyCounts(,,) As Short = New Short(2, 1, 2) {}


Tras la ejecucin de esta instruccin, la matriz de la variable replyCounts tiene una longitud de 18, que contiene elementos predeterminados. Si crea una matriz de esta manera, debe utilizar una instruccin de asignacin subsiguiente para asignar cada valor de elemento.

Nota: Puede inicializar los lmites superiores del ndice solamente en una ubicacin. Si especifica los lmites

superiores en los parntesis que siguen al nombre de la variable de la matriz, no puede utilizar una clusula New. Si especifica los lmites superiores en los parntesis de la clusula New, debe dejar vacos los parntesis que siguen al nombre de variable.

o bien En la clusula New, especifique los lmites superiores del ndice entre parntesis y proporcione los valores de elementos entre llaves ({}). El ejemplo siguiente declara, crea e inicializa una variable para contener una matriz bidimensional con elementos del tipo de datos Short, especificando los lmites superiores y los valores. Tenga en cuenta los dos niveles de llaves en la clusula New. Copiar cdigo

Dim startingScores(,) As Short = New Short(1, 1) {{10, 10}, {10, 10}}


Tras la ejecucin de esta instruccin, la matriz de la variable startingScores contiene cuatro elementos inicializados. Si proporciona los lmites superiores y los valores, debe incluir un valor para cada elemento desde el ndice 0 hasta el lmite superior en cada dimensin.

o bien En la clusula New, debe dejar vacos los parntesis, excepto en el caso de las comas para el nmero apropiado de dimensiones, e incluya los valores de elemento entre las llaves ({}). El ejemplo siguiente declara, crea e inicializa una variable para contener una matriz bidimensional con elementos de String (Tipo de datos, Visual Basic), especificando slo los valores de elementos. Tenga en cuenta los dos niveles de llaves en la clusula New. Copiar cdigo

Dim diagonal(,) As Single = New Single(,) {{1, 0}, {0, 1}}


Tras la ejecucin de esta instruccin, la matriz de la variable diagonal contiene cuatro elementos inicializados.

Matrices escalonadas en Visual Basic


Una matriz de la que cada elemento es una matriz se llama una matriz de matrices o una matriz escalonada. Observe que tener matrices como elementos no es lo mismo que una matriz multidimensional que tiene ms de un ndice en una nica matriz.

Significado de escalonado En algunas ocasiones, la estructura de datos de la aplicacin es bidimensional pero no rectangular. Por ejemplo, puede tener una matriz de meses, siendo cada elemento a su vez una matriz de das. Puesto que los distintos meses tienen un nmero distinto de das, los elementos no forman una matriz bidimensional rectangular. En este caso, puede utilizar una matriz escalonada en lugar de una matriz multidimensional.

Ejemplo El ejemplo siguiente declara una variable de matriz para que contenga una matriz de matrices con elementos de Double (Tipo de datos, Visual Basic). Cada elemento de la matriz

sales es una matriz que representa un mes. Cada matriz de meses contiene valores para
cada da de ese mes. Copiar cdigo

Dim Dim Dim For

sales()() As Double = New Double(11)() {} month As Integer days As Integer month = 0 To 11 days = DateTime.DaysInMonth(Year(Now), month + 1)

sales(month) = New Double(days - 1) {} Next month


La clusula New de la declaracin sales establece la variable de matriz en un matriz de 12 elementos, cada uno de los cuales es de tipo Double(), una matriz de elementos Double. El bucle For determina cuntos das tiene cada mes este ao (Year(Now)) y establece el elemento correspondiente de sales en una matriz Double del tamao adecuado.

En el ejemplo anterior, la matriz escalonada guarda siete elementos (seis en un ao bisiesto) en comparacin con una matriz bidimensional. En un caso ms extremo, el ahorro de memoria podra ser significativo.

Cmo: Crear una matriz de matrices


Una matriz con matrices para elementos se denomina matriz de matrices o matriz escalonada. Al igual que con una matriz unidimensional, se crea con una clusula New (Visual Basic) y se asigna a la variable de matriz. Puede hacer esto como parte de la declaracin de la matriz o en una instruccin de asignacin subsiguiente.

Para crear una matriz escalonada


1. Agregue despus del nombre de variable tantos pares de parntesis como niveles de matrices anidadas existan. 2. Agregue el mismo nmero de pares de parntesis a la clusula New. No necesita ms que un par de llaves ({}) si no va a proporcionar ningn valor de elemento. El ejemplo siguiente declara una variable para que contenga una matriz de matrices con elementos de Byte (Tipo de datos, Visual Basic), crea la matriz y la asigna a la variable. Copiar cdigo

Dim ratings As Byte()() = New Byte()() {}


3. Tras la ejecucin de esta instruccin, la matriz de la variable ratings tiene una longitud de 0.

Cmo: Inicializar una matriz escalonada


Al inicializar una variable de matriz escalonada, slo puede especificar las longitudes de dimensin para la matriz del nivel superior. Existen varias maneras de hacerlo:

Para inicializar una variable de matriz escalonada

En la declaracin de la variable de la matriz, especifique el lmite superior del ndice del nivel superior dentro del primer par de parntesis, separado por comas. El ejemplo siguiente declara y crea una variable para contener una matriz escalonada de elementos Byte, especificando slo el lmite superior del nivel superior. Copiar cdigo

Dim rainfall(11)() As Byte


Tras la ejecucin de esta instruccin, la matriz de la variable rainfall contiene 12 elementos, cada uno de los cuales es una matriz vaca de elementos Byte. o bien En la clusula New, especifique el lmite superior del ndice del nivel superior dentro del primer par de parntesis y proporcione llaves vacas ({}). El ejemplo siguiente declara y

crea una variable para contener una matriz escalonada de elementos Short, especificando slo el lmite superior del nivel superior. Copiar cdigo

Dim snowfall()() As Short = New Short(11)() {}


Tras la ejecucin de esta instruccin, la matriz de la variable snowfall contiene 12 elementos, cada uno de los cuales es una matriz vaca de elementos Short.

Nota: Puede inicializar el lmite superior del ndice del nivel superior solamente en un lugar. Si especifica un lmite superior en los parntesis que siguen al nombre de la variable de la matriz, no puede utilizar una clusula New. Si especifica el lmite superior en los parntesis de la clusula New, debe dejar vacos los parntesis que siguen al nombre de variable.

o bien En la clusula New, especifique el lmite superior del ndice del nivel dentro de los parntesis y proporcione los valores de elementos dentro de llaves ({}). El ejemplo siguiente declara, crea e inicializa una variable para contener una matriz escalonada de elementos Char, especificando el lmite superior del nivel superior y los valores. Tenga en cuenta las clusulas New anidadas para inicializar las matrices del nivel inferior. Copiar cdigo

Dim decodeValues()() As Char = New Char(1)() {New Char() {"a"c, "b"c}, New Char() {"p"c, "q"c}}
Tras la ejecucin de esta instruccin, la matriz de la variable decodeValues contiene dos elementos, cada uno de los cuales es una matriz Char de longitud 1 con el elemento en el ndice 0 que contiene un valor inicializado. Si proporciona el lmite superior del nivel superior y los valores, debe incluir un valor para cada elemento del nivel superior desde el ndice 0 hasta el lmite superior.

o bien En la clusula New, omita los parntesis del nivel superior y proporcione los valores de elementos dentro de llaves ({}). El ejemplo siguiente declara, crea e inicializa una variable para contener una matriz escalonada de elementos Byte, especificando slo los valores de elementos. Tenga en cuenta los dos niveles de llaves en la clusula New. Copiar cdigo

Dim firstValues()() As Byte = {New Byte() {2, 1}, New Byte() {3, 0}}
Tras la ejecucin de esta instruccin, la matriz de la variable firstValues tiene una longitud de 2, con elementos firstValues(0) y firstValues(1). Cada uno de los elementos se inicializa en una matriz Byte de dos elementos, el primero con los valores de elementos 2 y 1, y el segundo con los valores de elementos 3 y 0.

Tipos de datos de matrices en Visual Basic


No existe ningn tipo de datos para todas las matrices. Los factores siguientes determinan, en su lugar, el tipo de datos de una matriz:

El hecho de ser una matriz El rango (nmero de dimensiones) El tipo de datos de los elementos de la matriz

Por lo tanto, se considera que dos variables de matrices son del mismo tipo de datos slo cuando tienen el mismo rango y sus elementos tienen el mismo tipo de datos. Observe que las longitudes de las dimensiones no influyen en el tipo de datos de la matriz. Ejemplos de matriz En el ejemplo siguiente se declaran cuatro variables de matriz que tienen distintos tipos de datos. Copiar cdigo

Dim Dim Dim Dim

firstArray(12, 8) As UInteger secondArray(12, 8, 3) As UInteger thirdArray(12, 8) As String fourthArray(5, 20) As UInteger

Tras la ejecucin de las instrucciones anteriores, las relaciones del tipo de datos siguientes se aplican a las variables de matriz:

Las variables firstArray y secondArray no son del mismo tipo porque tienen rangos diferentes. Las variables firstArray y thirdArray no son del mismo tipo de datos porque tienen tipos de datos de elementos diferentes. Las variables firstArray y fourthArray son del mismo tipo de datos y puede asignar una a otra.

Tipos de datos de matrices escalonadas Matrices de matrices, es decir, matrices que contienen otras matrices como elementos, tambin se conocen como matrices escalonadas porque las longitudes de las matrices de elementos no son necesariamente iguales. En el ejemplo siguiente se declaran dos variables de matrices escalonadas que tienen distintos tipos de datos. Copiar cdigo

Dim twoDimOfOneDim(,)() As Integer Dim oneDimOfTwoDim()(,) As Integer


La matriz de twoDimOfOneDim es bidimensional y su tipo de datos de elementos es Integer() o matrices Integer unidimensionales. La matriz de oneDimOfTwoDim es unidimensional y su tipo de datos de elementos es Integer(,) o matrices Integer bidimensionales.

Cmo: Determinar el tipo de datos de una matriz


Recuerde que el tipo de datos de una matriz nunca es igual al de sus elementos. Puede averiguar el tipo de datos de una matriz o de sus elementos de varias maneras.

Llame al mtodo Object..::.GetType en la variable a fin de recibir un objeto Type para el tipo en tiempo de ejecucin de la variable. El objeto Type contiene amplia informacin en sus propiedades y mtodos.

Pase la variable a TypeName (Funcin, Visual Basic) para recibir un objeto String que contiene el nombre del tipo en tiempo de ejecucin. Pase la variable a VarType (Funcin, Visual Basic) para recibir un valor VariantType que representa la clasificacin del tipo de la variable.

Para determinar el tipo de datos de una matriz

Llame a TypeName en el nombre de la matriz. No agregue parntesis detrs del nombre de la matriz porque est solicitando el tipo de la propia matriz.

Copiar cdigo

Dim thisTwoDimArray(,) As Integer = New Integer(9, 9) {} MsgBox("Type of thisTwoDimArray is " & TypeName(thisTwoDimArray))
La llamada a MsgBox muestra "Type of thisTwoDimArray is Integer(,)" que indica el tipo de elemento y el nmero de dimensiones. No muestra las longitudes actuales de las dimensiones porque no forman parte del tipo de datos de una matriz.

Para determinar el tipo de datos de un elemento de matriz

Seleccione un elemento existente y llame a TypeName en ese elemento. Copiar cdigo

Dim thisTwoDimArray(,) As Integer = New Integer(9, 9) {} MsgBox("Type of thisTwoDimArray(0, 0) is " & TypeName(thisTwoDimArray(0, 0)))
La llamada a MsgBox muestra "Type of thisTwoDimArray(0, 0) is Integer". El tipo de datos de los elementos forma parte del tipo de datos de la matriz. Por ello, el tipo de datos no se puede cambiar ni siquiera con una instruccin de asignacin o una instruccin ReDim.

Tamao de matriz en Visual Basic


El tamao de una matriz es el producto de las longitudes de todas sus dimensiones. Representa el nmero total de elementos contenido actualmente en la matriz. A continuacin, se muestra un ejemplo de declaracin de una matriz tridimensional.

Copiar cdigo

Dim prices(3, 4, 5) As Long


El tamao total de la matriz en la variable prices es (3 + 1) x (4 + 1) x (5 + 1) = 120. Consideraciones sobre el tamao de una matriz Se deben tener presentes varias cosas cuando se trata con el tamao de una matriz. Longitud de la dimensin El ndice de cada dimensin est basado en 0, lo que significa que va desde 0 hasta su lmite superior. Por consiguiente, la longitud de una dimensin determinada supera en 1 al lmite superior declarado para esa dimensin.

Lmites de longitud La longitud de cada dimensin de una matriz est limitada al valor mximo del tipo de datos Integer que es (2 ^ 31) - 1. No obstante, la memoria disponible en el sistema limita tambin el tamao total de una matriz. Si intenta inicializar una matriz que supera la cantidad de memoria RAM disponible, Common Language Runtime produce una excepcin OutOfMemoryException.

Tamao y tamao de elementos El tamao de una matriz es independiente del tipo de datos de sus elementos. El tamao siempre representa el nmero total de elementos, no el nmero de bytes que utilizan en el almacenamiento.

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 vara en funcin de las plataformas de diferentes anchos de datos, por lo que la misma matriz puede utilizar ms memoria en un sistema de 64 bits que en un sistema de 32 bits. Segn la configuracin 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 lmites

naturales del hardware. Asimismo, una matriz requiere una sobrecarga de almacenamiento para obtener su informacin de control y esta sobrecarga aumenta con cada dimensin agregada.

Cmo: Determinar el tamao de una matriz


El tamao total de una matriz es el producto de las longitudes de todas sus dimensiones. La propiedad Length de la matriz devuelve este tamao total, que representa el nmero total de elementos contenidos actualmente en la matriz, no el nmero de bytes que se utilizan en el almacenamiento.

Para determinar el tamao total de una matriz

Lea la propiedad Length de la matriz. No agregue parntesis detrs del nombre de la matriz. Copiar cdigo

Dim thisDoubleArray(,) As Char = New Char(4, 9) {} MsgBox("Total length of thisDoubleArray is " & CStr(thisDoubleArray.Length))
La llamada a MsgBox muestra "Total length of thisDoubleArray is 50". Puede averiguar la longitud de cada dimensin en el mtodo GetLength de la matriz. Puede cambiar la longitud de una dimensin individual, lo cual modifica el tamao total. Sin embargo, no puede cambiar el rango (el nmero de dimensiones).

Cmo: Cambiar el tamao de una matriz


Cambia el tamao de una variable de matriz asignndole un nuevo objeto de matriz. Puede utilizar una instruccin de asignacin estndar o Instruccin ReDim (Visual Basic). En cualquier caso, la matriz original se reemplaza por una completamente nueva y la variable de matriz seala a la nueva matriz. Cambiar el tamao de una matriz le ayuda a administrar la memoria de forma eficaz. Por ejemplo, puede empezar con una matriz pequea y aumentar su tamao si necesita ms elementos. Asimismo, puede empezar con una matriz grande y reducir su tamao cuando ya no la necesita entera. Esta tcnica slo ocupa la memoria adicional cuando se necesita.

Para cambiar el tamao de una variable de matriz mediante una instruccin de asignacin estndar
1. 2. Cree el nuevo objeto de matriz especificando las nuevas longitudes de la dimensin. Asigne el nuevo objeto de matriz a la variable de matriz. Copiar cdigo

Dim thisArrayVariable() As Integer = New Integer(99) {} thisArrayVariable = New Integer(49) {}


Para cambiar el tamao de una variable de matriz mediante la instruccin ReDim

Especifique las nuevas longitudes de dimensin para la variable de matriz en la instruccin ReDim. Copiar cdigo

Dim thisArrayVariable() As Integer = New Integer(99) {}

ReDim thisArrayVariable(9)
Cuando se redimensiona una matriz mediante ReDim, normalmente se pierden los valores existentes de sus elementos. No obstante, se pueden conservar si se incluye la palabra clave Preserve en la instruccin ReDim.

Para cambiar el tamao de una variable de matriz conservando los valores de elementos existentes
1. Especifique las nuevas longitudes de dimensin para la variable de matriz en la instruccin ReDim. 2. Agregue la palabra clave Preserve en la instruccin ReDim. El ejemplo siguiente crea una nueva matriz, inicializa sus elementos desde los elementos correspondientes de la matriz existente en

arrayToIncreasey asigna la nueva matriz a la variable de matriz arrayToIncrease.


Copiar cdigo

Dim arrayToIncrease(9, 49) ReDim Preserve arrayToIncrease(9, 199)


Si utiliza Preserve en una matriz multidimensional, puede cambiar slo la ltima longitud de dimensin. Si intenta cambiar cualquiera de las dems dimensiones, aparece una excepcin ArrayTypeMismatchException. Si cambia el tamao de una matriz grande mediante la palabra clave Preserve, tenga presente que Visual Basic debe copiar todos los elementos existentes en la nueva matriz. Esto puede ralentizar el rendimiento.

Cmo: Determinar la longitud de una dimensin de una matriz


El mtodo GetLength de una matriz devuelve la longitud junto con la dimensin especificada.

Para determinar la longitud de una dimensin de una matriz

Llame a GetLength en el nombre de la matriz. Proporcione la dimensin cuya longitud desea definir como argumento para GetLength. Observe que el argumento de dimensin est basado en 0. Copiar cdigo

Dim sampleTripleArray(,,) As Short = New Short(2, 3, 4) {} MsgBox("Dimension lengths of sampleTripleArray are " & CStr(sampleTripleArray.GetLength(0)) _ & ", " & CStr(sampleTripleArray.GetLength(1)) & ", " & CStr(sampleTripleArray.GetLength(2)))
La llamada a MsgBox muestra "Dimension lengths of sampleTripleArray are 3, 4, 5". El valor de ndice inferior para cada dimensin es siempre 0 y el mtodo GetUpperBound devuelve el valor de ndice superior de una dimensin. Para cada dimensin, GetLength devuelve un valor superior en 1 al devuelto por GetUpperBound. Al igual que ocurre con GetLength, la dimensin que se especifica para GetUpperBound est basada en 0. Puede averiguar la longitud total de una matriz a partir de su propiedad Length. Para cambiar el tamao total, modifique la longitud de una dimensin individual. Sin embargo, no puede cambiar el rango (el nmero de dimensiones).

Trabajar con matrices y elementos de matrices


Esta seccin trata la ordenacin de matrices, la colocacin u obtencin de un valor de la matriz y otras acciones en las matrices y elementos de matriz.

Cmo: Establecer un valor en una matriz


Puede almacenar uno de los valores de una matriz utilizando el nombre de la matriz y los ndices adecuados para especificar el elemento individual.

Para poner un valor en un elemento de matriz


1. 2. A la izquierda del signo igual (=), especifique el nombre de la matriz seguido de parntesis. Dentro de los parntesis, incluya una expresin para cada ndice que corresponda al elemento que desea almacenar. Necesita un ndice para cada dimensin de la matriz. El ejemplo siguiente muestra algunas instrucciones que almacenan valores en matrices.

Dim numbers() As Integer Dim matrix(,) As Double numbers(i + 1) = 0 matrix(3, j * 2) = j


Para cada dimensin de la matriz, el mtodo GetUpperBound devuelve el valor mximo que puede tener el ndice. El valor de ndice mnimo es siempre 0.

Cmo: Obtener un valor a partir de una matriz


Puede obtener uno de los valores de una matriz utilizando el nombre de la matriz y los ndices adecuados para especificar el elemento individual.

Para recibir un valor de un elemento de matriz


1. 2. Dentro de una expresin, especifique el nombre de la matriz seguido de parntesis. Dentro de los parntesis, incluya una expresin para cada ndice que corresponda al elemento que desea obtener. Necesita un ndice para cada dimensin de la matriz. El ejemplo siguiente muestra algunas instrucciones que reciben valores de las matrices. Copiar cdigo

Dim sortedValues(), rawValues(), estimates(,,) As Double lowestValue = sortedValues(0) wTotal += (rawValues(v) ^ 2) firstGuess = estimates(i, j, k)
Para cada dimensin de la matriz, el mtodo GetUpperBound devuelve el valor mximo que puede tener el ndice. El valor de ndice mnimo es siempre 0.

Cmo: Localizar un elemento en una matriz de Visual Basic


En este ejemplo se declara una matriz de objetos String denominada zooAnimals, se llena y se busca el elemento "turtle" y se muestra su ubicacin. Ejemplo

Este ejemplo de cdigo tambin est disponible en el fragmento de cdigo de IntelliSense. En el selector de fragmentos de cdigo, se encuentra en Lenguaje Visual Basic. Para obtener ms informacin, vea Cmo: Insertar fragmentos de cdigo en el cdigo (Visual Basic). Copiar cdigo

Public Sub findAnimal() Dim zooAnimals(2) As String zooAnimals(0) = "lion" zooAnimals(1) = "turtle" zooAnimals(2) = "ostrich" Dim turtleIndex As Integer turtleIndex = (Array.IndexOf(zooAnimals,"turtle")) MsgBox("The turtle is element " & turtleIndex) End Sub
Compilar el cdigo Este ejemplo necesita:

Obtener acceso a Mscorlib.dll y al espacio de nombres System.

Programacin eficaz Las condiciones siguientes pueden provocar una excepcin:

La matriz est vaca (clase ArgumentNullException) La matriz es multidimensional (clase RankException) Uno o ms elementos de la matriz no implementan la interfaz IComparable (clase InvalidOperationException).

Cmo: Invertir el contenido de una matriz en Visual Basic


En este ejemplo se declara una matriz de objetos String denominada zooAnimals, se llena y se invierte su contenido. Ejemplo Este ejemplo de cdigo tambin est disponible en el fragmento de cdigo de IntelliSense. En el selector de fragmentos de cdigo, se encuentra en Lenguaje Visual Basic. Para obtener ms informacin, vea Cmo: Insertar fragmentos de cdigo en el cdigo (Visual Basic). Copiar cdigo

Public Sub reverseAnimals() Dim zooAnimals(2) As String zooAnimals(0) = "lion" zooAnimals(1) = "turtle" zooAnimals(2) = "ostrich" Array.Reverse(zooAnimals) End Sub
Compilar el cdigo Este ejemplo necesita:

Obtener acceso a Mscorlib.dll y al espacio de nombres System.

Programacin eficaz Las condiciones siguientes pueden provocar una excepcin:

La matriz est vaca (clase ArgumentNullException) La matriz es multidimensional (clase RankException)

Uno o ms elementos de la matriz no implementan la interfaz IComparable (clase InvalidOperationException).

Cmo: Ordenar una matriz en Visual Basic


En el siguiente ejemplo se declara una matriz de objetos String denominada zooAnimals, se llena y se ordena alfabticamente. Ejemplo Este ejemplo de cdigo tambin est disponible en el fragmento de cdigo de IntelliSense. En el selector de fragmentos de cdigo, se encuentra en Lenguaje Visual Basic. Para obtener ms informacin, vea Cmo: Insertar fragmentos de cdigo en el cdigo (Visual Basic). Copiar cdigo

Private Sub sortAnimals() Dim zooAnimals(2) As String zooAnimals(0) = "lion" zooAnimals(1) = "turtle" zooAnimals(2) = "ostrich" Array.Sort(zooAnimals) End Sub
Compilar el cdigo Este ejemplo necesita:

Obtener acceso a Mscorlib.dll y al espacio de nombres System.

Programacin eficaz Las condiciones siguientes pueden provocar una excepcin:

La matriz est vaca (clase ArgumentNullException) La matriz es multidimensional (clase RankException) Uno o ms elementos de la matriz no implementan la interfaz IComparable (clase InvalidOperationException).

Cmo: Asignar una matriz a otra


Puesto que las matrices son objetos, puede utilizarlas en instrucciones de asignacin como cualquier otro tipo de objeto. Una variable de matriz contiene un puntero a los datos que constituyen los elementos de matriz, y a la informacin de rango y longitud; una asignacin copia slo este puntero.

Para asignar una matriz a otra


1. Asegrese de que las dos matrices tienen el mismo rango (nmero de dimensiones) y tipos de datos de elementos compatibles. 2. Utilice una instruccin de asignacin estndar para asignar la matriz de origen a la matriz de destino. No agregue parntesis detrs del nombre de las matrices. Copiar cdigo

Dim formArray() As System.Windows.Forms.Form Dim controlArray() As System.Windows.Forms.Control controlArray = formArray


En la asignacin de una matriz a otra, se aplican las siguientes reglas:

Rangos iguales. El rango (nmero de dimensiones) de la matriz de destino debe coincidir con el de la matriz de origen.

Siempre que los rangos de las dos matrices sean iguales, no es necesario que las dimensiones sean iguales. El nmero de elementos de una dimensin dada puede cambiar durante la asignacin.

Tipos de elementos. Ambas matrices deben tener elementos de tipo de referencia o bien ambas matrices deben tener elementos de tipo de valor. Para obtener ms informacin, consulte Tipos de valores y tipos de referencia.

Si ambas matrices tienen elementos de tipo valor, los tipos de datos deben coincidir exactamente. La nica excepcin a esto es que puede asignar una matriz de elementos Enum a una matriz del tipo base de esta Enum.

Si ambas matrices tienen elementos de tipo de referencia, el tipo de elemento de origen debe derivar del tipo de elemento de destino. Cuando ste es el caso, las dos matrices tienen la misma relacin de herencia que sus elementos. Esto se denomina covarianza de matriz.

El compilador notifica un error si las reglas anteriores no se cumplen, por ejemplo, si los tipos de datos no son compatibles o si los rangos no son iguales. Se puede incluir control de errores en el cdigo para comprobar si las matrices son compatibles antes de intentar realizar la asignacin. Tambin puede utilizar la palabra clave TryCast si desea evitar que se produzca una excepcin.

Cmo: Cambiar una matriz por otra distinta


Es importante distinguir entre un objeto de matriz y una variable de matriz. Una variable de matriz contiene un puntero a un objeto de matriz que contiene los elementos de la matriz, as como el rango y la informacin de longitud.

Una vez creado un objeto de matriz, no puede cambiar su rango (nmero de dimensiones), sus longitudes de dimensin ni el tipo de datos de sus elementos. Slo puede cambiar el contenido de sus elementos.

Una vez declarada una variable de matriz, no puede cambiar su rango ni el tipo de datos de sus elementos. Sin embargo, puede asignar una sucesin de diferentes objetos de matriz a la variable durante su perodo de duracin. Estos objetos de matriz pueden tener longitudes de dimensin diferentes.

Para cambiar una variable de matriz para que seale a un objeto de matriz diferente

Utilice una instruccin de asignacin estndar para asignar la matriz de origen a la matriz de destino. Copiar cdigo

Dim array1(4), array2(19) As String array2 = array1


Puede cambiar una variable de matriz para que seale a un objeto de matriz con longitudes de dimensin diferentes, pero no puede cambiarla para que seale a un objeto de matriz de un tipo de datos diferente. Esto significa que el rango y el tipo de datos de los elementos deben seguir siendo los mismos porque forman parte inherente del tipo de datos de la variable de matriz.

Cmo: Pasar una matriz a un procedimiento o una propiedad

Puede pasar una matriz de la misma manera que cualquier otra variable. Proporcione el nombre de la variable de matriz en el argumento adecuado cuando llame al procedimiento o tenga acceso a la propiedad.

Para pasar una matriz a un procedimiento


1. Asegrese de que uno de los parmetros del procedimiento especifica una matriz con el mismo rango (nmero de dimensiones) y tipo de datos de los elementos. 2. Proporcione la variable de matriz en el lugar correspondiente en la lista de argumentos. No agregue parntesis detrs del nombre de la matriz. Copiar cdigo

Public Function findLargest(ByVal numbers() As Double) As Double ' Insert code to calculate and return largest number. End Function Dim testNumbers() As Double = New Double() {5.0, 3.7, 1.2, 7.6} Dim largestNumber As Double = findLargest(testNumbers)
Para pasar una matriz a una propiedad
1. Asegrese de que uno de los parmetros de la propiedad especifica una matriz con el mismo rango (nmero de dimensiones) y tipo de datos de los elementos. 2. Proporcione la variable de matriz en el lugar correspondiente en la lista de argumentos. No agregue parntesis detrs del nombre de la matriz. Copiar cdigo

Public Property bestMatch(ByVal formattedStrings() As String) As Double ' Insert Get and Set procedures for number best matching strings. End Property Dim testStrings() As String = New String() {} Dim formattedNumber As Double = bestMatch(testStrings)

Cmo: Devolver una matriz desde un procedimiento o una propiedad


Puede devolver una matriz de la misma manera que cualquier otro tipo de datos. Proporcione el tipo de matriz como tipo de valor devuelto del procedimiento o de la propiedad.

Para devolver una matriz de un procedimiento Function


1. Especifique el tipo de matriz (rango y tipo de datos de los elementos) como el tipo de valor devuelto en Instruccin Function (Visual Basic). 2. Dentro del procedimiento, declare una variable de matriz local con el mismo rango y tipo de datos de los elementos. 3. Incluya esta variable de matriz local en Instruccin Return (Visual Basic). No agregue parntesis detrs del nombre de la matriz. Copiar cdigo

Public Function splitNumber(ByVal number As Double) As Char() Dim characters() As Char ' Insert code to split number into characters.

Return characters End Function Dim piCharacters() As Char = splitNumber(3.14159265)


Para devolver una matriz de una propiedad
1. Especifique el tipo de matriz (rango y tipo de datos de los elementos) como el tipo de propiedad en Property (Instruccin). 2. Dentro del procedimiento Get de la propiedad o en un lugar disponible para el procedimiento Get, declare una variable de matriz local con el mismo rango y tipo de datos de los elementos. 3. Incluya esta variable de matriz local en la instruccin Return. No agregue parntesis detrs del nombre de la matriz. Copiar cdigo

Private nameList() As String Public Property stationNames As String() Get Return nameList End Get Set(ByVal Value As String()) ' Insert code to store nameList values. End Set End Property Dim listOfNames() As String = stationNames

Colecciones como alternativa a las matrices


Aunque las colecciones se suelen utilizar para trabajar con Object (Tipo de datos), tambin se pueden usar para trabajar con cualquier tipo de datos. En algunas circunstancias, puede resultar ms eficaz almacenar elementos en una coleccin que en una matriz. Si necesita cambiar el tamao de una matriz, debe utilizar Instruccin ReDim (Visual Basic). Si hace esto, Visual Basic crea una nueva matriz y libera la matriz anterior para su disposicin. Esto requiere tiempo de ejecucin. Por consiguiente, si el nmero de elementos con los que trabaja cambia a menudo o no puede predecir el nmero mximo de elementos que necesita, puede obtener un mejor rendimiento utilizando una coleccin. Una coleccin, que no tiene que crear un nuevo objeto o copiar elementos existentes, puede controlar el cambio de tamao en un tiempo de ejecucin menor que una matriz, que tiene que utilizar ReDim. Pero si el tamao no cambia, o slo cambia raramente, es probable que una matriz sea ms eficaz. Como siempre, el rendimiento depende en gran medida de la aplicacin individual. Suele merecer la pena probar una matriz y una coleccin. Colecciones especializadas .NET Framework tambin proporciona una variedad de clases, interfaces y estructuras para colecciones generales y especiales. Los espacios de nombres System.Collections y System.Collections.Specialized contienen las definiciones e implementaciones que incluyen diccionarios, listas, colas y pilas. El espacio de nombres System.Collections.Generic proporciona muchos de ellos en versiones genricas que adoptan uno o ms argumentos de tipos. Si su coleccin es para contener elementos de slo un tipo de datos concreto, una coleccin genrica tiene la ventaja de forzar la seguridad de tipos. Para obtener ms informacin sobre genricos, consulte Tipos genricos en Visual Basic. Ejemplo Descripcin

El ejemplo siguiente utiliza la clase genrica System.Collections.Generic..::.List<(Of <(T>)>) de .NET Framework para crear una coleccin de listas de estructuras customer. Cdigo Copiar cdigo

' Define the structure for a customer. Public Structure customer Public name As String ' Insert code for other members of customer structure. End Structure ' Create a module-level collection that can hold 200 elements. Public custFile As New List(Of customer)(200) ' Add a specified customer to the collection. Private Sub addNewCustomer(ByVal newCust As customer) ' Insert code to perform validity check on newCust. custFile.Add(newCust) End Sub ' Display the list of customers in the Debug window. Private Sub printCustomers() For Each cust As customer In custFile Debug.WriteLine(cust) Next cust End Sub
Comentarios La declaracin de la coleccin custFile especifica que slo puede contener elementos de tipo

customer. Tambin proporciona una capacidad inicial de 200 elementos. El procedimiento addNewCustomer comprueba la validez del nuevo elemento y, a continuacin, lo agrega a la coleccin. El procedimiento printCustomers utiliza un bucle For Each para recorrer la coleccin y mostrar sus
elementos.

Solucionar problemas de matrices


En esta pgina se muestran algunos problemas comunes que pueden aparecer al trabajar con matrices. Errores de compilacin al declarar e inicializar una matriz Pueden surgir errores de compilacin si se comprenden mal las reglas para declarar, crear e inicializar matrices. Las causas ms comunes de errores son las siguientes:

Proporcionar una clusula New (Visual Basic) despus de especificar longitudes de dimensin en la declaracin de variables de la matriz. En las lneas de cdigo siguientes se muestran declaraciones no vlidas de este tipo.

Dim INVALIDsingleDimByteArray(2) As Byte = New Byte() Dim INVALIDtwoDimShortArray(1, 1) As Short = New Short(,) Dim INVALIDjaggedByteArray(1)() As Byte = New Byte()()

Especificar longitudes de dimensin para ms que la matriz de nivel superior de una matriz escalonada. En la lnea de cdigo siguiente se muestra una declaracin no vlida de este tipo.

Dim INVALIDjaggedByteArray(1)(1) As Byte

Omitir la palabra clave New al especificar los valores de elemento. En la lnea de cdigo siguiente se muestra una declaracin no vlida de este tipo.

Dim INVALIDoneDimShortArray() As Short = Short() {0, 1, 2, 3}

Proporcionar una clusula New sin corchetes ({}). En las lneas de cdigo siguientes se muestran declaraciones no vlidas de este tipo.

Dim INVALIDsingleDimByteArray() As Byte = New Byte() Dim INVALIDsingleDimByteArray() As Byte = New Byte(2) Dim INVALIDtwoDimShortArray(,) As Short = New Short(,) Dim INVALIDtwoDimShortArray(,) As Short = New Short(1, 1)
Tener acceso a una matriz fuera de lmites El proceso de inicializar una matriz asigna un lmite superior y un lmite inferior a cada dimensin. Cada acceso a un elemento de la matriz debe especificar un ndice vlido, o subndice, para cada dimensin. Si un ndice est por debajo del lmite inferior o por encima del lmite superior, se produce una excepcin IndexOutOfRangeException. El compilador no puede detectar este tipo de error, por lo que aparece un error en tiempo de ejecucin. Determinar los lmites Si otro componente pasa una matriz al cdigo, por ejemplo como un argumento de procedimiento, no se conoce el tamao de la matriz o la longitud de sus dimensiones. Siempre se debe determinar el lmite superior para cada dimensin de una matriz antes de intentar tener acceso a cualquier elemento. Si la matriz se ha creado por un medio distinto de una clusula New de Visual Basic, el lmite inferior podra ser distinto de cero y es ms seguro determinar tambin ese lmite inferior. Especificar la dimensin Al determinar los lmites de una matriz multidimensional, tenga cuidado de cmo especifica la dimensin. Los parmetros dimension de los mtodos GetLowerBound y GetUpperBound estn basados en cero, mientras los parmetros Rank de Visual Basic LBound (Funcin, Visual Basic) y UBound (Funcin, Visual Basic) estn basados en uno.

Objetos en Visual Basic


Cuando se crea una aplicacin en Visual Basic, se trabaja constantemente con objetos. Se pueden usar los objetos proporcionados por Visual Basic, como controles, formularios y objetos de acceso a datos. Tambin se pueden usar los objetos de otras aplicaciones en la aplicacin de Visual Basic. Incluso pueden crearse objetos propios y agregarles propiedades y mtodos adicionales. Los objetos actan como unidades de creacin prefabricadas para programas: permiten escribir una porcin de cdigo y utilizarla una y otra vez. Los siguientes temas describen los objetos con ms detalle:

Objetos y clases
Un objeto es una combinacin de cdigo y datos que puede tratarse como una unidad. Un objeto puede ser una porcin de una aplicacin, como un control o un formulario. Una aplicacin entera tambin puede ser un objeto. Reutilizar el cdigo Los objetos permiten declarar variables y procedimientos una vez y utilizarlos siempre que sean necesarios. Por ejemplo, si desea agregar un corrector ortogrfico a una aplicacin, puede definir todas las variables y funciones auxiliares para proporcionar funcionalidad de correccin ortogrfica. Si crea el corrector ortogrfico como una clase, puede volver a utilizarlo en otras aplicaciones mediante la inclusin de una referencia en el ensamblado compilado. An mejor, tal vez pueda ahorrarse trabajo mediante el uso de una clase de corrector ortogrfico que otra persona ya haya desarrollado.

Clases Cada objeto de Visual Basic est definido por una clase. Una clase describe las variables, propiedades, procedimientos y eventos de un objeto. Los objetos son instancias de clases; pueden crearse tantos objetos como sean necesarios una vez que se defina una clase. Para comprender la relacin entre un objeto y su clase, piense en los moldes de hacer galletas y en las galletas. El molde es la clase. Define las caractersticas de cada galleta, por ejemplo, el tamao y la forma. La clase se utiliza para crear objetos. Los objetos son las galletas. Dos ejemplos en Visual Basic podran ayudar a ilustrar la relacin entre las clases y objetos.

Los controles en el Cuadro de herramientas de Visual Basic representan las clases. Cuando se arrastra un control del Cuadro de herramientas a un formulario, se est creando un objeto; una instancia de una clase.

El formulario con el que se trabaja en tiempo de diseo es una clase. En tiempo de ejecucin, Visual Basic crea una instancia de la clase del formulario, es decir, un objeto.

Varias instancias Los objetos recientemente creados a partir de una clase son a menudo idnticos. Una vez que existen como objetos individuales no obstante, sus variables y propiedades se pueden cambiar independientemente de las dems instancias. Por ejemplo, si agrega tres casillas de verificacin a un formulario, cada objeto de botn de casilla de verificacin es una instancia de la clase CheckBox. Los objetos CheckBox individuales comparten un conjunto de caractersticas y funciones comunes (propiedades, variables, procedimientos y eventos) definidos por la clase. No obstante, cada uno tiene su propio nombre, puede habilitarse y deshabilitarse por separado, y puede colocarse en una ubicacin diferente en el formulario.

Cmo: Crear un objeto


Una objeto es una instancia de una clase. Para usar los miembros de la clase debe crear primero un objeto a partir de ella.

Para crear un objeto a partir de una clase


1. 2. Determine en qu clase desea crear un objeto. Escriba Instruccin Dim (Visual Basic) para crear una variable a la que puede asignar una instancia de clase. La variable debe ser del tipo de la clase deseada. Copiar cdigo

Dim nextCustomer As customer


3. Agregue la palabra clave New (Visual Basic) para inicializar la variable a una nueva instancia de la clase. Copiar cdigo

Dim nextCustomer As New customer


4. Puede tener acceso a los miembros de la clase ahora a travs de la variable de objeto. Copiar cdigo

nextCustomer.accountNumber = lastAccountNumber + 1
Programacin eficaz Siempre que sea posible, debe declarar la variable para que sea del tipo de clase que piensa asignarle. Esto se llama enlace en tiempo de compilacin. Si no conoce el tipo de clase en el tiempo de compilacin, puede invocar el enlace en tiempo de ejecucin declarando la variable para que sea Object (Tipo de datos). Sin embargo, el enlace en tiempo de ejecucin puede ralentizar el rendimiento y limitar

el acceso a los miembros del objeto en tiempo de ejecucin. Para obtener ms informacin, consulte Declaracin de variables de objeto.

Cmo: Volver a usar un componente de trabajo


Si ya existe un componente y est depurado y en funcionamiento, puede aprovecharlo y utilizarlo en su cdigo en lugar de desarrollar otro componente con la misma funcionalidad. Este tipo de componente se expone normalmente como una clase. Para volver a usarlo, cree un objeto a partir de esa clase. Ejemplo .NET Framework proporciona muchos ejemplos de componentes que estn disponibles para su uso. Este componente es la clase TimeZone en el espacio de nombres System. TimeZone proporciona miembros que le permiten recuperar informacin acerca de la zona horaria del sistema del equipo actual. Copiar cdigo

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
El primer Instruccin Dim (Visual Basic) declara una variable de objeto de tipo TimeZone y le asigna un objeto TimeZone devuelto por la propiedad CurrentTimeZone.

Cmo: Definir una clase que usa miembros de una clase existente
Puede utilizar miembros de una clase existente en otra clase que se deriva de ella. En el ejemplo siguiente, suponga que desea definir un tipo especial de Button que se comporta como una clase Button normal pero tambin expone un mtodo que invierte los colores de primer plano y de fondo.

Para definir una clase que utiliza los miembros de una clase existente
1. Utilice Instruccin Class (Visual Basic) para definir una clase a partir de la cual crea el objeto que necesita.

Public Class reversibleButton


Asegrese de que sigue una instruccin End Class despus de la ltima lnea de cdigo de la clase. De manera predeterminada, el entorno de desarrollo integrado (IDE) genera automticamente End Class cuando escribe una instruccin Class. 2. Agregue Inherits (Instruccin) inmediatamente despus de la instruccin Class. Especifique la clase de la que se deriva su nueva clase.

Inherits System.Windows.Forms.Button
Su nueva clase hereda todos los miembros definidos por la clase base.

3.

Agregue el cdigo para los miembros adicionales que expone la clase derivada. Por ejemplo, puede agregar un mtodo reverseColors y su clase derivada podra aparecer del modo siguiente: Copiar cdigo

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
4. Si crea un objeto a partir de la clase reversibleButton, puede tener acceso a todos los miembros de la clase Button, as como al mtodo reverseColors y a cualquier otro miembro nuevo que define en reversibleButton. Compilar el cdigo Asegrese de que el compilador puede tener acceso a la clase de la que piensa hacer derivar su nueva clase. Esto podra significar la calificacin completa de su nombre, como en el ejemplo anterior, o la identificacin del espacio de nombres en Instruccin Imports (Tipo y espacio de nombres de .NET). Si la clase est en un proyecto diferente, es posible que necesite agregar una referencia a ese proyecto. Para obtener ms informacin, consulte Hacer referencia a espacios de nombres y componentes.

Relaciones entre objetos


Los objetos pueden relacionarse entre s de varias maneras. Los tipos principales de relacin son jerrquicos y contencin. Relacin jerrquica Cuando las clases se derivan de las clases ms fundamentales, se dice que tienen una relacin jerrquica. Las jerarquas de clases son tiles cuando se describen elementos que constituyen un subtipo de una clase ms general. Por ejemplo, en el espacio de nombres System.Windows.Forms, las clases Label y TextBox derivan las dos de la clase Control. Las clases derivadas heredan miembros de la clase en la que se basan, lo que permite agregar complejidad a medida que se progresa en una jerarqua de clases. Relacin de contencin Otra manera en que se pueden relacionar objetos es una relacin de contencin. Los objetos contenedores encapsulan lgicamente otros objetos. Por ejemplo, el objeto OperatingSystem contiene lgicamente un objeto Version que vuelve a travs de su propiedad Version. Observe que el objeto contenedor no contiene ningn otro objeto fsicamente. Colecciones Un tipo de contencin de objetos particular lo representan las colecciones. Las colecciones son grupos de objetos similares que se pueden enumerar. Visual Basic admite una sintaxis especfica en Instruccin For Each...Next (Visual Basic) que le permite recorrer en iteracin los elementos de una coleccin. Adems, las colecciones suelen permitir el uso de Item (Propiedad, objeto Collection) para recuperar elementos mediante su ndice o asocindolos con una cadena nica. Las colecciones pueden ser ms fciles 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 frecuentemente para almacenar formularios y controles.

Miembros de objetos

Los objetos son las unidades bsicas de la programacin orientada a objetos. Un objeto es un elemento de una aplicacin, que representa una instancia de una clase. Campos, propiedades, mtodos y eventos son las unidades de creacin bsicas de los objetos y constituyen sus miembros. Objetos Un objeto representa una instancia de una clase, como Form o Label. Debe crear un objeto antes de poder tener acceso a sus miembros no compartidos. Para ello, utiliza la palabra clave New a fin de especificar la clase a partir de la cual va a crear el objeto y, a continuacin, asigna el nuevo objeto a una variable de objeto. Copiar cdigo

Dim warningLabel As New System.Windows.Forms.Label


Para obtener ms informacin, consulte Cmo: Crear un objeto. Acceso a miembros Tiene acceso a un miembro de un objeto especificando, en orden, el nombre de la variable de objeto, un punto (.) y el nombre del miembro. En el siguiente ejemplo se establece la propiedad Text de un objeto Label. Copiar cdigo

warningLabel.Text = "Data not saved"


Campos y propiedades Campos y propiedades representan informacin almacenada en un objeto. Recupera y establece los valores con instrucciones de asignacin de la misma manera que recupera y establece variables locales en un procedimiento. En el siguiente ejemplo se recupera la propiedad Width y se establece la propiedad ForeColor de un objeto Label. Copiar cdigo

Dim warningWidth As Integer = warningLabel.Width warningLabel.ForeColor = System.Drawing.Color.Red


Observe que un campo se llama tambin variable miembro. Para obtener ms informacin, consulte Comparacin de procedimientos de propiedades y campos. Mtodos Un mtodo es una accin que un objeto puede realizar. Por ejemplo, Add es un mtodo del objeto ComboBox que agrega una nueva entrada a un cuadro combinado. En el siguiente ejemplo se muestra el mtodo Start de un objeto Timer. Copiar cdigo

Dim safetyTimer As New System.Windows.Forms.Timer safetyTimer.Start()


Observe que un mtodo es simplemente un procedimiento expuesto por un objeto. Para obtener ms informacin, consulte Cmo: Realizar acciones con mtodos. Eventos Un evento es una accin que un objeto reconoce, como hacer clic con el mouse (ratn) o presionar una tecla, y para el que puede escribir cdigo para responder. Los eventos se producen como consecuencia de una accin del usuario o de cdigo de programa, o bien pueden ser generados por el sistema. Se dice que el cdigo que seala un evento provoca el evento y que el cdigo que responde a l lo controla. Tambin puede desarrollar eventos personalizados propios para que los generen sus objetos y los controlen otros objetos. Para obtener ms informacin, consulte Eventos y controladores de eventos. Miembros de instancias y miembros compartidos

Cuando crea un objeto a partir de una clase, el resultado es una instancia de esa clase. Los miembros que no estn declarados con la palabra clave Shared (Visual Basic) son miembros de instancias que pertenecen estrictamente a esta instancia en particular. Un miembro de instancia en una instancia es independiente del mismo miembro en otra instancia de la misma clase. Por ejemplo, una variable miembro de la instancia puede tener valores diferentes en instancias diferentes. Los miembros declarados con la palabra clave Shared son miembros compartidos que pertenecen a la clase en su conjunto y no a una instancia determinada. Un miembro compartido slo existe una vez, independientemente de las instancias de su clase que pueda crear o incluso si no crea ninguna. Por ejemplo, una variable miembro compartida tiene slo un valor que est disponible para todo el cdigo que pueda tener acceso a la clase. Lista de miembros de IntelliSense IntelliSense lista los miembros de una clase cuando invoca su opcin Lista de miembros, por ejemplo, cuando escribe un punto (.) como un operador de acceso a miembros. Si escribe el punto despus del nombre de una variable declarada como una instancia de esa clase, IntelliSense muestra todos los miembros de instancias y ninguno de los miembros compartidos. Si escribe el punto despus del nombre de clase, IntelliSense lista todos los miembros compartidos y ninguno de los miembros de instancias. Para obtener ms informacin, consulte Utilizar IntelliSense.

Cmo: Obtener acceso a miembros compartidos y no compartidos de un objeto


Una vez creado un objeto, puede tener acceso a sus campos, propiedades, mtodos y eventos a travs de la variable del objeto. Si el miembro es Shared (Visual Basic), no necesita crear un objeto para tener acceso a l. Tener acceso a miembros no compartidos

Para tener acceso a un miembro no compartido de un objeto


1. Asegrese de que el objeto se ha creado a partir de su clase y se ha asignado a una variable de objeto. Copiar cdigo

Dim secondForm As New System.Windows.Forms.Form


2. En la instruccin que tiene acceso al miembro, agregue detrs del nombre de la variable de objeto el operador de acceso a miembros (.) y, a continuacin, el nombre del miembro. Copiar cdigo

secondForm.Show()
Tener acceso a miembros compartidos

Para tener acceso a un miembro compartido de un objeto

Agregue detrs del nombre de clase el operador de acceso a miembros (.) y, a continuacin, el nombre del miembro. Siempre debe tener acceso a un miembro Shared del objeto directamente a travs del nombre de clase. Copiar cdigo

MsgBox("This computer is called " & Environment.MachineName)


Si ya ha creado un objeto a partir de la clase, puede tener acceso a un miembro Shared alternativamente a travs de la variable del objeto.

Tipos annimos
Visual Basic 2008 presenta los tipos annimos, que permiten crear objetos sin escribir ninguna definicin de clase para el tipo de datos. En su lugar, el compilador genera una clase. La clase no tiene ningn nombre que se pueda usar, hereda directamente de Object y contiene las propiedades especificadas al declarar el objeto. Dado que no se especifica el nombre del tipo de datos, se hace referencia a l como tipo annimo. El ejemplo siguiente declara y crea la variable product como instancia de un tipo annimo que tiene dos propiedades, Name y Price. Visual Basic Copiar cdigo

' Variable product is an instance of a simple anonymous type. Dim product = New With {Key .Name = "paperclips", .Price = 1.29}
Una expresin de consulta utiliza los tipos annimos para combinar las columnas de datos seleccionadas por una consulta. No puede definir el tipo del resultado de antemano, ya que no puede predecir las columnas que podra seleccionar una consulta determinada. Los tipos annimos permiten escribir una consulta que selecciona cualquier nmero de columnas, en cualquier orden. El compilador crea un tipo de datos que coincide con las propiedades y el orden especificados. En los ejemplos siguientes, products es una lista de objetos de producto, cada uno de los cuales tiene muchas propiedades. La variable namePriceQuery contiene la definicin de una consulta que, cuando se ejecuta, devuelve una coleccin de instancias de un tipo annimo con dos propiedades, Name y Price. Visual Basic Copiar cdigo

Dim namePriceQuery = From prod In products _ Select prod.Name, prod.Price


La variable nameQuantityQuery contiene la definicin de una consulta que, cuando se ejecuta, devuelve una coleccin de instancias de un tipo annimo con dos propiedades, Name y OnHand. Visual Basic Copiar cdigo

Dim nameQuantityQuery = From prod In products _ Select prod.Name, prod.OnHand


Para obtener ms informacin sobre el cdigo creado por el compilador para un tipo annimo, vea Definicin de tipo annimo.

Precaucin: El compilador genera el nombre del tipo annimo y quiz cambie de una compilacin a otra. El cdigo no debe usar ni depender del nombre de un tipo annimo porque el nombre podra cambiar cuando se vuelva a compilar el proyecto. Declarar un tipo annimo La declaracin de una instancia de un tipo annimo utiliza una lista de inicializadores para especificar las propiedades del tipo. Slo puede especificar las propiedades al declarar un tipo annimo, y no otros elementos de clase como mtodos o eventos. En el ejemplo siguiente, product1 es una instancia de un tipo annimo que tiene dos propiedades: Name y Price. Visual Basic Copiar cdigo

' Variable product1 is an instance of a simple anonymous type. Dim product1 = New With {.Name = "paperclips", .Price = 1.29}

' -or' product2 is an instance of an anonymous type with key properties. Dim product2 = New With {Key .Name = "paperclips", Key .Price = 1.29}
Si designa las propiedades como propiedades de clave, puede utilizarlas con el fin de comparar dos instancias de tipo annimas para comprobar la igualdad. Sin embargo, los valores de las propiedades de clave no se pueden cambiar. Para obtener ms informacin, vea la seccin Propiedades de clave ms adelante en este tema. Observe que declarar una instancia de un tipo annimo es como declarar una instancia de un tipo con nombre utilizando un inicializador de objeto: Visual Basic Copiar cdigo

' Variable product3 is an instance of a class named Product. Dim product3 = New Product With {.Name = "paperclips", .Price = 1.29}
Para obtener una comparacin ms detallada de declaraciones de tipo con nombre y annimos, vea Tipos con nombre y annimos comparados. Para obtener ms informacin sobre otras maneras de especificar las propiedades de tipos annimos, vea Cmo: Deducir tipos y nombres de propiedades en declaraciones de tipos annimos. Propiedades principales Las propiedades de clave difieren de las propiedades no lo son de varias maneras bsicas:


Igualdad

Slo los valores de las propiedades de clave se comparan para determinar si dos instancias son iguales. Los valores de las propiedades de clave son de slo lectura y no se pueden cambiar. Slo los valores de las propiedades de clave se incluyen en el algoritmo del cdigo hash generado por compilador para un tipo annimo.

Las instancias de tipos annimos slo pueden ser iguales si son instancias del mismo tipo annimo. El compilador trata las dos instancias como instancias del mismo tipo si cumplen las condiciones siguientes:

Se declaran en el mismo ensamblado. Sus propiedades tienen los mismos nombres, los mismos tipos deducidos y se declaran en el mismo orden. Las comparaciones de nombres no distinguen maysculas de minsculas. Las mismas propiedades de cada una se marcan como propiedades de clave. Por lo menos una propiedad de cada declaracin es una propiedad de clave.

Una instancia de un tipo annimo que no tiene ninguna propiedad de clave slo es igual a s misma. Visual Basic Copiar cdigo

' prod1 and prod2 have no key values. Dim prod1 = New With {.Name = "paperclips", .Price = 1.29} Dim prod2 = New With {.Name = "paperclips", .Price = 1.29} ' The following line displays False, because prod1 and prod2 have no ' key properties.

Console.WriteLine(prod1.Equals(prod2)) ' The following statement displays True because prod1 is equal to itself. Console.WriteLine(prod1.Equals(prod1))
Dos instancias del mismo tipo annimo son iguales si los valores de sus propiedades de clave son iguales. Los ejemplos siguientes muestran cmo se comprueba la igualdad. Visual Basic Copiar cdigo

Dim prod3 = New With {Key .Name = "paperclips", Key .Price = 1.29} Dim prod4 = New With {Key .Name = "paperclips", Key .Price = 1.29} ' The following line displays True, because prod3 and prod4 are ' instances of the same anonymous type, and the values of their ' key properties are equal. Console.WriteLine(prod3.Equals(prod4)) Dim prod5 = New With {Key .Name = "paperclips", Key .Price = 1.29} Dim prod6 = New With {Key .Name = "paperclips", Key .Price = 1.29, _ .OnHand = 423} ' The following line displays False, because prod5 and prod6 do not ' have the same properties. Console.WriteLine(prod5.Equals(prod6)) Dim prod7 = New With {Key .Name = "paperclips", Key .Price = 1.29, _ .OnHand = 24} Dim prod8 = New With {Key .Name = "paperclips", Key .Price = 1.29, _ .OnHand = 423} ' The following line displays True, because prod7 and prod8 are ' instances of the same anonymous type, and the values of their ' key properties are equal. The equality check does not compare the ' values of the non-key field. Console.WriteLine(prod7.Equals(prod8))
Valores de slo lectura Los valores de las propiedades de clave no se pueden cambiar. Por ejemplo, en prod8 del ejemplo anterior, los campos Name y Price son read-only, pero OnHand se puede cambiar. Visual Basic Copiar cdigo

' The following statement will not compile, because Name is a key ' property and its value cannot be changed. ' prod8.Name = "clamps" ' OnHand is not a Key property. Its value can be changed. prod8.OnHand = 22
Tipos annimos a partir de expresiones de consulta Las expresiones de consulta no siempre requieren la creacin de tipos annimos. Siempre que es posible, utilizan un tipo existente para contener los datos de la columna. Esto se produce cuando la consulta devuelve los registros completos desde el origen de datos o slo un campo de cada registro. En los ejemplos de cdigo siguientes, customers es una coleccin de objetos de una clase Customer. La clase tiene muchas propiedades y puede incluir una o ms en el resultado de la consulta, en cualquier orden. En los dos primeros ejemplos, no se requiere ningn tipo annimo porque las consultas seleccionan los elementos de tipos con nombre:

custs1 contiene una coleccin de cadenas, porque cust.Name es una cadena.

Visual Basic Copiar cdigo

Dim custs1 = From cust In customers _ Select cust.Name


custs2 contiene una coleccin de objetos Customer, porque cada elemento de customers es un objeto Customer y la consulta selecciona el elemento completo.
Visual Basic Copiar cdigo

Dim custs2 = From cust In customers _ Select cust


Sin embargo, los tipos con nombre adecuados no siempre estn disponibles. Quiz desee seleccionar nombres y direcciones de clientes con una finalidad, nmeros de identificador y ubicaciones de clientes con otra y nombres, direcciones e historiales de pedidos de clientes con una tercera. Los tipos annimos permiten seleccionar cualquier combinacin de propiedades, en cualquier orden, sin declarar primero un nuevo tipo con nombre para contener el resultado. En su lugar, el compilador crea un tipo annimo para cada compilacin de propiedades. La consulta siguiente slo selecciona el nmero de identificacin del cliente desde cada objeto Customer de customers. Por consiguiente, el compilador crea un tipo annimo que contiene slo esas dos propiedades. Visual Basic Copiar cdigo

Dim custs3 = From cust In customers _ Select cust.Name, cust.ID


Tanto los nombres como los tipos de datos de las propiedades del tipo annimo se toman de los argumentos de Select, cust.Name y cust.ID. Las propiedades de un tipo annimo creado por una consulta siempre son las propiedades de clave. Cuando custs3 se ejecuta en el bucle For Each siguiente, el resultado es una coleccin de instancias de un tipo annimo con dos propiedades de clave,

Name e ID.
Visual Basic Copiar cdigo

For Each selectedCust In custs3 Console.WriteLine(selectedCust.ID & ": " & selectedCust.Name) Next
Los elementos de la coleccin representada por custs3 tienen establecimiento inflexible de tipos y se puede utilizar IntelliSense para navegar por las propiedades disponibles y comprobar sus tipos. Para obtener ms informacin, consulte Introduccin a LINQ en Visual Basic. Decidir si se usan tipos annimos Antes de crear un objeto como instancia de una clase annima, tenga en cuenta si es la mejor opcin. Por ejemplo, si desea crear un objeto temporal para que contenga datos relacionados y no necesita el resto de los campos o mtodos que pudiera contener una clase completa, un tipo annimo es una buena solucin. Los tipos annimos tambin son adecuados si desea una seleccin diferente de propiedades para cada declaracin o si desea cambiar el orden de las propiedades. Sin embargo, si el proyecto incluye varios objetos con las mismas propiedades, en un orden fijo, puede declararlas ms fcilmente utilizando un tipo con nombre con un constructor de clase. Por ejemplo, con un constructor adecuado es ms fcil declarar varias instancias de una clase Product que declarar varias instancias de un tipo annimo. Visual Basic Copiar cdigo

' Declaring instances of a named type.

Dim firstProd1 As New Product("paperclips", 1.29) Dim secondProd1 As New Product("desklamp", 28.99) Dim thirdProd1 As New Product("stapler", 5.09) ' Declaring instances of an anonymous type. Dim firstProd2 = New With {Key .Name = "paperclips", Key .Price = 1.29} Dim secondProd2 = New With {Key .Name = "desklamp", Key .Price = 28.99} Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = 5.09}
Otra ventaja de los tipos con nombre es que el compilador puede detectar un error ortogrfico accidental del nombre de una propiedad. En los ejemplos anteriores, la finalidad de firstProd2, secondProd2 y

thirdProd2 es ser instancias del mismo tipo annimo. Sin embargo, si fuera a declarar accidentalmente thirdProd2 de una de las siguientes formas, su tipo sera diferente del de firstProd2 y secondProd2.
Visual Basic Copiar cdigo

' Dim thirdProd2 = New With {Key .Nmae = "stapler", Key .Price = 5.09} ' Dim thirdProd2 = New With {Key .Name = "stapler", Key .Price = "5.09"} ' Dim thirdProd2 = New With {Key .Name = "stapler", .Price = 5.09}
Mucho ms importante es que existen limitaciones de uso de los tipos annimos que no se aplican a las instancias de tipos con nombre. firstProd2, secondProd2 y thirdProd2 son instancias del mismo tipo annimo. Sin embargo, el nombre del tipo annimo compartido no est disponible y no puede aparecer en los lugares donde se espera un nombre de tipo en el cdigo. Por ejemplo, un tipo annimo no se puede utilizar para definir una firma de mtodo, declarar otra variable o campo ni en ninguna declaracin de tipos. Como resultado, los tipos annimos no son adecuados cuando los mtodos deben compartir informacin. Definicin de tipo annimo En respuesta a la declaracin de una instancia de un tipo annimo, el compilador crea una nueva definicin de clase que contiene las propiedades especificadas. Si el tipo annimo contiene al menos una propiedad de clave, la definicin invalida tres miembros heredados de Object: Equals, GetHashCode y ToString. El cdigo generado para comprobar la igualdad y determinar el valor de cdigo hash tiene en cuenta slo las propiedades de clave. Si el tipo annimo no contiene ninguna propiedad de clave, slo se invalida ToString. Explcitamente las propiedades con nombre de un tipo annimo no pueden estar en conflicto con estos mtodos generados. Es decir, no puede utilizar .Equals, .GetHashCodeni .ToString para asignar un nombre a una propiedad. Las definiciones de tipo annimas que tienen por lo menos una propiedad de clave tambin implementan la interfaz System..::.IEquatable<(Of <(T>)>), donde T es el tipo del tipo annimo. Para obtener ms informacin sobre el cdigo creado por el compilador y la funcionalidad de los mtodos invalidados, vea Definicin de tipo annimo.

Inicializadores de objeto: Tipos con nombre y annimos


Los inicializadores de objeto permiten especificar las propiedades de un objeto complejo mediante una sola expresin. Se pueden usar para crear instancias de tipos con nombre y tipos annimos. Declaraciones

Las declaraciones de instancias de tipos con nombre y annimos pueden parecer casi idnticas, pero su aplicacin no es la misma. Cada categora tiene funcionalidades y restricciones propias. El ejemplo siguiente muestra una forma adecuada de declarar e inicializar una instancia de una clase con nombre,

Customer, mediante un lista de inicializadores de objeto. Observe que el nombre de la clase se


especifica despus de la palabra clave New. Visual Basic Copiar cdigo

Dim namedCust = New Customer With {.Name = "Terry Adams"}


Un tipo annimo no tiene ningn nombre que se pueda usar. Por consiguiente, una creacin de instancias de un tipo annimo no puede incluir un nombre de clase. Visual Basic Copiar cdigo

Dim anonymousCust = New With {.Name = "Hugo Garcia"}


Los requisitos y resultados de las dos declaraciones no son los mismos. En namedCust, ya debe existir una clase Customer con una propiedad Name y la declaracin crea una instancia de la clase. En

anonymousCust, el compilador define una nueva clase que tiene una propiedad, una cadena denominada Name y crea una nueva instancia de esa clase.
Tipos con nombre Los inicializadores de objeto proporcionan una forma sencilla de llamar al constructor de un tipo y, a continuacin, establecer los valores de algunas o de todas las propiedades en una sola instruccin. El compilador invoca al constructor adecuado de la instruccin: el constructor predeterminado si no hay argumentos o un constructor con parmetros si se envan uno o ms argumentos. Despus, se inicializan las propiedades especificadas en el orden en que aparecen en la lista de inicializadores. Cada inicializacin de la lista de inicializadores est formada por la asignacin de un valor inicial a un miembro de la clase. Se determinan los nombres y los tipos de datos de los miembros cuando se define la clase. En los ejemplos siguientes, la clase Customer debe existir y debe tener miembros denominados

Name y City que pueden aceptar valores de cadena.


Visual Basic Copiar cdigo

Dim cust0 As Customer = New Customer With {.Name = "Toni Poe", _ .City = "Louisville"}
O bien, puede obtener el mismo resultado utilizando el cdigo siguiente: Visual Basic Copiar cdigo

Dim cust1 As New Customer With {.Name = "Toni Poe", _ .City = "Louisville"}
Cada una de estas declaraciones es equivalente al siguiente ejemplo, que crea un objeto Customer mediante el constructor predeterminado y, a continuacin, especifica los valores iniciales de las propiedades Name y City mediante el uso de una instruccin With. Visual Basic Copiar cdigo

Dim cust2 As New Customer() With cust2 .Name = "Toni Poe" .City = "Louisville" End With

Si la clase Customer contiene un constructor con parmetros que permita enviar un valor de Name, por ejemplo, tambin puede declarar e inicializar un objeto Customer de las siguientes formas: Visual Basic Copiar cdigo

Dim cust3 As Customer = New Customer("Toni Poe") _ With {.City = "Louisville"} ' --or-Dim cust4 As New Customer("Toni Poe") _ With {.City = "Louisville"}
No debe inicializar todas las propiedades, como muestra el cdigo siguiente. Visual Basic Copiar cdigo

Dim cust5 As Customer = New Customer With {.Name = "Toni Poe"}


Sin embargo, la lista de inicializaciones no puede estar vaca. Las propiedades sin inicializar conservan sus valores predeterminados. Inferencia de tipo con tipos con nombre Puede acortar el cdigo de la declaracin de cust1 combinando los inicializadores de objeto y la inferencia de tipo de variable local. De esta forma, puede pasar por alto la clusula As en la declaracin de variable. El tipo de datos de la variable se deduce del tipo del objeto que se crea mediante la asignacin. En el ejemplo siguiente, el tipo de cust6 es Customer. Visual Basic Copiar cdigo

Dim cust6 = New Customer With {.Name = "Toni Poe", _ .City = "Louisville"}
Comentarios sobre los tipos con nombre

Un miembro de clase slo se puede inicializar una vez en la lista de inicializadores de objeto. La declaracin de cust7 provoca un error. Visual Basic Copiar cdigo

'' This code does not compile because Name is initialized twice. ' Dim cust7 = New Customer With {.Name = "Toni Poe", _ ' .City = "Louisville" _ ' .Name = "Blue Yonder Airlines"}
Un miembro se puede usar para inicializarse a s mismo o a otro campo. Si se tiene acceso a un miembro antes de haberse inicializado, como ocurre en la declaracin siguiente de

cust8, se usar el valor predeterminado. Recuerde que cuando se procesa una declaracin
con un inicializador de objeto, lo primero que ocurre es que se invoca el constructor adecuado. Despus, se inicializan los campos individuales de la lista de inicializadores. En los ejemplos siguientes, el valor predeterminado de Name se asigna para cust8 y se asigna un valor inicializado de cust9. Visual Basic Copiar cdigo

Dim cust8 = New Customer With {.Name = .Name & ", President"} Dim cust9 = New Customer With {.Name = "Toni Poe", _ .Title = .Name & ", President"}
El ejemplo siguiente utiliza el constructor con parmetros de cust3 y cust4 para declarar e inicializar cust10 y cust11.

Visual Basic Copiar cdigo

Dim cust10 = New Customer("Toni Poe") With {.Name = .Name & ", President"} ' --or-Dim cust11 As New Customer("Toni Poe") With {.Name = .Name & ", President"}
Los inicializadores de objeto pueden estar anidados. En el ejemplo siguiente, AddressClass es una clase que tiene dos propiedades, City y State, y la clase Customer tiene una propiedad Address que es una instancia de AddressClass. Visual Basic Copiar cdigo

Dim cust12 = New Customer With {.Name = "Toni Poe", _ .Address = New AddressClass _ With {.City = "Louisville", _ .State = "Kentucky"}} Console.WriteLine(cust12.Address.State)
La lista de inicializaciones no puede estar vaca. La instancia que se inicializa no puede ser de tipo Object. Los miembros de clase que se inicializan no pueden ser miembros compartidos, miembros de slo lectura, constantes ni llamadas a mtodos. Los miembros de clase que se inicializan no se pueden indizar ni certificar. Los ejemplos siguientes provocan errores del compilador:

'' Not valid. ' Dim c1 = New Customer With {.OrderNumbers(0) = 148662} ' Dim c2 = New Customer with {.Address.City = "Springfield"}
Tipos annimos Los tipos annimos usan inicializadores de objetos para crear instancias de tipos nuevos que el usuario no define ni a los que les asigna nombres explcitamente. En su lugar, el compilador genera un tipo segn las propiedades designadas en la lista de inicializadores de objeto. Puesto que no se especifica el nombre del tipo, se hace referencia a l como tipo annimo. Por ejemplo, compare la declaracin siguiente con la anterior de cust6. Visual Basic Copiar cdigo

Dim cust13 = New With {.Name = "Toni Poe", _ .City = "Louisville"}


La nica diferencia sintcticamente es que no se especifica ningn nombre detrs de New para el tipo de datos. Sin embargo, lo que ocurre es muy diferente. El compilador define un nuevo tipo annimo con dos propiedades, Name y City, y crea una instancia de l con los valores especificados. La inferencia de tipo determina los tipos de Name y City del ejemplo para que sean cadenas.

Precaucin: El compilador genera el nombre del tipo annimo y quiz cambie de una compilacin a otra. El cdigo no debe usar el nombre de un tipo annimo ni depender de l.

Dado que el nombre del tipo no est disponible, no puede utilizar una clusula As para declarar cust13. Se debe deducir su tipo. Si no se usa el enlace en tiempo de ejecucin, se limita el uso de tipos annimos en variables locales. Los tipos annimos proporcionan la compatibilidad crtica de las consultas LINQ. Para obtener ms informacin sobre el uso de tipos annimos en consultas, vea Tipos annimos e Introduccin a LINQ en Visual Basic. Comentarios sobre tipos annimos

Normalmente, todas o la mayora de las propiedades de una declaracin de tipos annimos sern propiedades de clave, lo que se indica escribiendo la palabra clave Key delante del nombre de la propiedad. Visual Basic Copiar cdigo

Dim anonymousCust1 = New With {Key .Name = "Hugo Garcia", _ Key .City = "Louisville"}
Para obtener ms informacin sobre propiedades de clave, vea Key (Visual Basic). Como ocurre con los tipos con nombre, las listas de inicializadores de las definiciones de tipo annimo debe declarar al menos una propiedad. Visual Basic Copiar cdigo

Dim anonymousCust = New With {.Name = "Hugo Garcia"}


Cuando se declara una instancia de un tipo annimo, el compilador genera una definicin de tipo annimo coincidente. Los nombres y tipos de datos de las propiedades se toman de la declaracin de la instancia y el compilador los incluye en la definicin. A las propiedades no se les asigna nombre ni se definen de antemano, como ocurrira con un tipo con nombre. Se deducen sus tipos. No puede especificar los tipos de datos de las propiedades utilizando una clusula As.

Los tipos annimos tambin pueden establecer los nombres y valores de sus propiedades de otras maneras distintas. Por ejemplo, una propiedad de tipo annimo puede tomar tanto el nombre como el valor de una variable o el nombre y valor de una propiedad de otro objeto. Visual Basic Copiar cdigo

' Create a variable, Name, and give it an initial value. Dim Name = "Hugo Garcia" ' Variable anonymousCust2 will have one property, Name, with ' "Hugo Garcia" as its initial value. Dim anonymousCust2 = New With {Key Name} ' The next declaration uses a property from namedCust, defined ' in an earlier example. After the declaration, anonymousCust3 will ' have one property, Name, with "Terry Adams" as its value. Dim anonymousCust3 = New With {Key namedCust.Name}
Para obtener ms informacin sobre las opciones para definir propiedades de tipos annimos, vea Cmo: Deducir tipos y nombres de propiedades en declaraciones de tipos annimos.

Cmo: Declarar un objeto usando un inicializador de objeto

Los inicializadores de objeto permiten declarar y crear instancias de una instancia de una clase en una sola instruccin. Adems, puede inicializar uno o ms miembros de la instancia a la vez, sin invocar ningn constructor con parmetros. Al utilizar un inicializador de objeto para crear una instancia de un tipo con nombre, se llama al constructor predeterminado de la clase, seguido de la inicializacin de los miembros designados en el orden especificado. El procedimiento siguiente muestra cmo crear una instancia de una clase Student de tres maneras diferentes. La clase tiene, entre otros datos, el nombre, apellido y propiedades de ao de clase. Cada una de las tres declaraciones crea una nueva instancia de Student, con la propiedad First establecida en "Michael", la propiedad Last establecida en "Tucker" y todos los otros miembros establecidos en sus valores predeterminados. El resultado de cada declaracin del procedimiento es equivalente al ejemplo siguiente, que no utiliza ningn inicializador de objeto. Visual Basic Copiar cdigo

Dim student0 As New Student With student0 .First = "Michael" .Last = "Tucker" End With
Para obtener una implementacin de la clase Student, vea Cmo: Crear una lista de elementos. Puede copiar el cdigo desde ese tema con el fin de configurar la clase y crear una lista de objetos Student con los que trabajar. Para ver una demostracin en vdeo, vea Video How to: Declare an Object by Using an Object Initializer.

Para crear un objeto de una clase con nombre utilizando un inicializador de objeto
1. Comience la declaracin como si pensara utilizar un constructor.

Dim student1 As New Student


2. Escriba la palabra clave With, seguida por una lista de inicializaciones entre llaves.

Dim student1 As New Student With { <initialization list> }


3. En la lista de inicializaciones, incluya cada propiedad que desee inicializar y a la que desee asignar un valor inicial. El nombre de la propiedad va precedido por un punto. Visual Basic Copiar cdigo

Dim student1 As New Student With {.First = "Michael", _ .Last = "Tucker"}


4. 5. Puede inicializar uno o ms miembros de la clase. O bien, puede declarar una nueva instancia de la clase y, a continuacin, asignarle un valor. Primero, declare una instancia de Student:

Dim student2 As Student


6. Comience la creacin de una instancia de Student de la manera normal.

Dim student2 As Student = New Student

7.

Escriba With y, a continuacin, un inicializador de objeto para inicializar uno o ms miembros de la nueva instancia.

Visual Basic Copiar cdigo

Dim student2 As Student = New Student With {.First = "Michael", _ .Last = "Tucker"}
8. Puede simplificar la definicin del paso anterior omitiendo As Student. De esta forma, el compilador determina que student3 es una instancia de Student utilizando la inferencia de tipo de variable local. Visual Basic Copiar cdigo

Dim student3 = New Student With {.First = "Michael", _ .Last = "Tucker"}


9. Para obtener ms informacin, consulte Inferencia de tipo de variable local.

10. 12. 14.

Cadenas en Visual Basic Introduccin a las cadenas en Visual Basic Fundamentos de cadenas en Visual Basic

11. En esta seccin se describen los conceptos bsicos del uso de cadenas en Visual Basic.

13. En esta seccin se describen los conceptos bsicos del uso de cadenas en Visual Basic.

15. El tipo de datos String representa una serie de caracteres (que, a su vez, representan cada uno una instancia del tipo de datos Char). En este tema se presentan los conceptos bsicos de las cadenas en Visual Basic. 16. Variables de cadena caracteres. Por ejemplo: Visual Basic Copiar cdigo 17. A una instancia de una cadena se puede asignar un valor literal que representa una serie de

Dim MyString As String MyString = "This is an example of the String data type"

18. Una variable String tambin puede aceptar cualquier expresin que se evale como una cadena. A continuacin, se muestran algunos ejemplos: Visual Basic Copiar cdigo

Dim OneString As String Dim TwoString As String OneString = "one, two, three, four, five" ' Evaluates to "two". TwoString = OneString.Substring(5, 3) OneString = "1" ' Evaluates to "11". TwoString = OneString & "1"

19. Cualquier literal que se asigne a una variable String debe escribirse entre comillas (""). Esto significa que una comilla contenida en una cadena no se puede representar mediante una comilla. Por ejemplo, el cdigo siguiente provoca un error del compilador:

Visual Basic Copiar cdigo

Dim myString As String ' This line would cause an error. ' myString = "He said, "Look at this example!""

20. Este cdigo provoca un error porque el compilador termina la cadena despus de la segunda comilla, y el resto de la cadena se interpreta como cdigo. Para solucionar este problema, Visual Basic interpreta dos comillas en un literal de cadena como una comilla en la cadena. En el ejemplo siguiente se muestra la forma correcta de incluir una comilla en una cadena: Visual Basic Copiar cdigo

' The value of myString is: He said, "Look at this example!" myString = "He said, ""Look at this example!"""

21. En el ejemplo anterior, las dos comillas que preceden la palabra Look se convierten en una comilla en la cadena. Las tres comillas al final de la lnea representan una comilla en la cadena y un carcter de terminacin de cadena. 22. Caracteres en cadenas String tiene funciones integradas que permiten realizar muchas manipulaciones en una cadena, similares a las permitidas por las matrices. Como toda la matriz en .NET Framework, stas son matrices basadas en cero. Puede hacer referencia a un carcter especfico de una cadena con la propiedad Chars, que proporciona una forma de acceso a un carcter mediante la posicin en la que ste aparece en la cadena. Por ejemplo: Visual Basic Copiar cdigo 23. Una cadena puede considerarse como una serie de instancias de valores Char y el tipo

Dim myString As String = "ABCDE" Dim myChar As Char ' The value of myChar is "C". myChar = myString.Chars(3)

24. En el ejemplo anterior, la propiedad Chars de la cadena devuelve el cuarto carcter de la cadena, el carcter D, y lo asigna a myChar. Tambin puede obtener la longitud de una cadena concreta mediante la propiedad Length. Si necesita realizar varias manipulaciones de tipo de matriz en una cadena, puede convertirla en una matriz de instancias de Char usando la funcin ToCharArray de la cadena. Por ejemplo: Visual Basic Copiar cdigo

Dim myString As String = "abcdefghijklmnop" Dim myArray As Char() = myString.ToCharArray

25. La variable myArray contiene ahora una matriz de instancias Char, que representan, cada una de ellas, un carcter de myString. 26. La inmutabilidad de las cadenas

27. Una cadena es inmutable, lo que significa que su valor no se puede cambiar una vez que ha sido creado. Sin embargo, esto no impide que se asigne ms que un valor a una variable de cadena. Considere el ejemplo siguiente: Visual Basic Copiar cdigo

Dim myString As String = "This string is immutable" myString = "Or is it?"

28. Aqu, se crea una variable de cadena, se le da un valor y, a continuacin, se cambia su valor. 29. Ms especficamente, en la primera lnea, se crea una instancia de tipo String y se le asigna el valor This string is immutable. En la segunda lnea del ejemplo, se crea una nueva instancia y se le da el valor Or is it?, y la variable de cadena descarta su referencia a la primera instancia y almacena una referencia a la nueva instancia. 30. A diferencia de otros tipos de datos intrnsecos, String es un tipo de referencia. Cuando se pasa una variable de tipo de referencia como un argumento a una funcin o subrutina, se pasa una referencia a la direccin de memoria donde se almacenan los datos en lugar del valor real de la cadena. As, en el ejemplo anterior, el nombre de la variable sigue siendo el mismo, pero apunta a una nueva instancia diferente de la clase String, que contiene el nuevo valor.

31. Tipos de mtodos de manipulacin de cadenas en Visual Basic


32. Existen diferentes formas de analizar y manipular las cadenas. Algunos mtodos forman parte del lenguaje Visual Basic, mientras que otros son inherentes a la clase String. 33. Lenguaje Visual Studio y .NET Framework

34. Los mtodos de Visual Basic se utilizan como funciones inherentes del lenguaje. Pueden utilizarse sin calificacin en el cdigo. En el siguiente ejemplo se muestra el uso habitual de un comando de manipulacin de cadenas de Visual Basic: Visual Basic Copiar cdigo

Dim aString As String = "SomeString" Dim bString As String bString = Mid(aString, 3, 3)


35. En este ejemplo, la funcin Mid realiza una operacin directa en aString y asigna el valor a

bString.
36. Mtodos compartidos y mtodos de instancia 37. Tambin puede manipular cadenas con los mtodos de la clase String. Existen dos tipos de mtodos en String: mtodos compartidos y mtodos de instancia. 38. Mtodos compartidos 39. Un mtodo compartido es un mtodo que se deriva de la propia clase String y no necesita una instancia de dicha clase para funcionar. Estos mtodos se pueden calificar con el nombre de la clase (String) en lugar de hacerlo con una instancia de la clase String. Por ejemplo: Visual Basic

Copiar cdigo

Dim aString As String = String.Copy("A literal string")


40. En el ejemplo anterior, el mtodo String..::.Copy es un mtodo esttico, que acta sobre una expresin dada y asigna el valor resultante a bString. 41. Mtodos de instancia 42. En contraste, los mtodos de instancia se derivan de una instancia concreta de String y deben calificarse con el nombre de la instancia. Por ejemplo: Visual Basic Copiar cdigo

Dim aString As String = "A String" Dim bString As String ' Assign "String" to bString. bString = aString.Substring(2, 6)
43. En este ejemplo, el mtodo String..::.Substring es un mtodo de la instancia de String (es decir, aString). Realiza una operacin en aString y asigna ese valor a bString.

44.
46.

Nothing y cadenas en Visual Basic


Visual Basic Runtime y .NET Framework

45. Visual Basic en tiempo de ejecucin y .NET Framework evalan de manera diferente Nothing cuando se trata de cadenas. 47. Considere el ejemplo siguiente: Visual Basic Copiar cdigo

Dim MyString As String = "This is my string" Dim stringLength As Integer ' Explicitly set the string to Nothing. MyString = Nothing ' stringLength = 0 stringLength = Len(MyString) ' This line, however, causes an exception to be thrown. stringLength = MyString.Length

48. Visual Basic Runtime normalmente evala Nothing como una cadena vaca (""). Sin embargo, .NET Framework no lo hace, y se producir una excepcin cuando se intente realizar una operacin de cadena en Nothing.

Cmo afecta la referencia cultural a las cadenas en Visual Basic


En esta pgina de ayuda se describe cmo Visual Basic usa la informacin de referencia cultural para realizar conversiones y comparaciones de cadenas. Cundo utilizar las cadenas especficas de referencia cultural Normalmente, debe utilizar cadenas especficas de referencia cultural para todos los datos que se presentan a y se leen de los usuarios y utilizar cadenas independientes de la referencia cultural para los datos internos de la aplicacin.

Por ejemplo, si la aplicacin pide a los usuarios que escriban una fecha como una cadena, debe esperar que los usuarios adopten el formato de las cadenas correspondiente a su referencia cultural y debe convertir la cadena de manera adecuada. Si a continuacin la aplicacin presenta esta fecha en su interfaz de usuario, debe presentarla en la referencia cultural del usuario. Sin embargo, si la aplicacin carga la fecha en un servidor central, debe aplicar a la cadena el formato correspondiente a una referencia cultural especfica, para evitar la confusin entre formatos de fecha potencialmente diferentes. Funciones que tienen en cuenta la referencia cultural Todas las funciones de conversin de cadenas de Visual Basic (excepto las funciones Str y Val) usan la informacin de referencia cultural de la aplicacin para asegurarse de que las conversiones y comparaciones resultan adecuadas para la referencia cultural del usuario de la aplicacin. La clave para utilizar correctamente las funciones de conversin de cadenas en aplicaciones que se ejecutan en equipos con configuraciones de referencia cultural diferentes consiste en comprender qu funciones utilizan una configuracin de referencia cultural especfica y cules utilizan la configuracin de referencia cultural actual. Observe que la configuracin de la referencia cultural de la aplicacin, de manera predeterminada, se hereda de la configuracin de la referencia cultural del sistema operativo. Para obtener ms informacin, vea Asc, AscW (Funciones), Chr, ChrW (Funciones), Format (Funcin), Hex (Funcin, Visual Basic), Oct (Funcin) y Funciones de conversin de tipos. Las funciones Str (convierte nmeros a cadenas) y Val (convierte cadenas a nmeros) no utilizan la informacin de referencia cultural de la aplicacin cuando convierten entre cadenas y nmeros. De hecho, slo reconocen el punto (.) como separador decimal vlido. Los elementos anlogos de estas funciones que s tienen en cuenta la referencia cultural son:

Conversiones que utilizan la referencia cultural actual. Las funciones CStr y Format convierten un nmero en una cadena y las funciones CDbl y CInt convierten una cadena en un nmero.

Conversiones que utilizan una referencia cultural especfica. Cada objeto de nmero dispone de un mtodo ToString(IFormatProvider) que convierte un nmero en una cadena y un mtodo Parse(String, IFormatProvider) que convierte una cadena en un nmero. Por ejemplo, el tipo Double proporciona los mtodos ToString(IFormatProvider) y Parse(String, IFormatProvider).

Para obtener ms informacin, vea Str (Funcin) y Val (Funcin). Utilizar una referencia cultural concreta Supongamos que desarrolla una aplicacin que enva una fecha (con formato de cadena) a un servicio Web. En este caso, la aplicacin debe utilizar una referencia cultural concreta para la conversin de cadenas. Para explicarlo, supongamos cul es el resultado de utilizar el mtodo ToString()()() de la fecha: Si la aplicacin utiliza este mtodo para aplicar formato a la fecha 4 de julio de 2005, devuelve "7/4/2005 12:00:00 AM" cuando se ejecuta con la referencia cultural de ingls de Estados Unidos (enUS) o "04.07.2005 00:00:00" cuando se ejecuta con la referencia cultura de alemn (de-DE). Cuando necesite realizar una conversin de cadenas en un formato de referencia cultural especfico, debe usar la clase CultureInfo integrada en .NET Framework. Puede crear un nuevo objeto CultureInfo para una referencia cultural concreta pasando el nombre de la referencia cultural al constructor CultureInfo. Los nombres de referencia cultural compatibles se muestran en la pgina de ayuda de la clase CultureInfo. Tambin puede obtener una instancia de la referencia cultural de todos los idiomas de la propiedad CultureInfo..::.InvariantCulture. La referencia cultural de todos los idiomas se basa en la referencia

cultural inglesa, pero hay algunas diferencias. Por ejemplo, la referencia cultural de todos los idiomas especifica el formato de hora de 24 horas en lugar del formato de 12 horas. Para convertir una fecha a la cadena de la referencia cultural, pase el objeto CultureInfo al mtodo ToString(IFormatProvider) del objeto de fecha. Por ejemplo, el cdigo siguiente muestra "07/04/2005 00:00:00", independientemente de la configuracin de la referencia cultural de la aplicacin. Copiar cdigo

Dim d As Date = #7/4/2005# MsgBox(d.ToString(System.Globalization.CultureInfo.InvariantCulture))


Nota: Los literales de fecha siempre se interpretan segn la referencia cultural inglesa. Comparar cadenas Existen dos situaciones importantes donde se necesitan las comparaciones de cadenas:

Ordenar datos para la presentacin al usuario. Utilice operaciones basadas en la referencia cultural actual para que las cadenas se ordenen correctamente. Determinar si dos cadenas internas de la aplicacin coinciden de forma exacta (normalmente por motivos de seguridad). Utilice operaciones que no tengan en cuenta la referencia cultural actual.

Puede realizar ambos tipos de comparacin con la funcin StrComp de Visual Basic. Especifique el argumento opcional Compare para controlar el tipo de comparacin: Text para la mayora de las entradas y salidas, Binary para determinar coincidencias exactas. La funcin StrComp devuelve un entero que indica la relacin entre las dos cadenas comparadas basndose en el criterio de ordenacin. Un resultado con un valor positivo indica que la primera cadena es mayor que la segunda. Un resultado negativo indica que la primera cadena es ms pequea y cero indica igualdad entre las dos cadenas. Visual Basic Copiar cdigo

' Defines variables. Dim TestStr1 As String = "ABCD" Dim TestStr2 As String = "abcd" Dim TestComp As Integer ' The two strings sort equally. Returns 0. TestComp = StrComp(TestStr1, TestStr2, CompareMethod.Text) ' TestStr1 sorts after TestStr2. Returns -1. TestComp = StrComp(TestStr1, TestStr2, CompareMethod.Binary) ' TestStr2 sorts before TestStr1. Returns 1. TestComp = StrComp(TestStr2, TestStr1)
Tambin puede usar el equivalente en .NET Framework de la funcin StrComp, es decir, el mtodo String..::.Compare. ste es un mtodo esttico sobrecargado de la clase de cadena base. En el siguiente ejemplo se ilustra cmo se utiliza este mtodo: Visual Basic Copiar cdigo

Dim myString As String = "Alphabetical" Dim secondString As String = "Order" Dim result As Integer result = String.Compare(myString, secondString)

Para un control ms estricto sobre la realizacin de las comparaciones, puede utilizar sobrecargas adicionales del mtodo Compare. Con el mtodo String..::.Compare, puede utilizar el argumento comparisonType para especificar qu tipo de comparacin se debe utilizar. Valor para el argumento comparisonType Ordinal Tipo de comparacin Comparacin basada en los bytes del componente de las cadenas. Cundo utilizarla Utilice este valor al comparar identificadores con distincin entre maysculas y minsculas, configuracin relacionada con seguridad u otros identificadores no lingsticos donde los bytes deben coincidir exactamente. Utilice este valor al comparar identificadores sin distincin entre maysculas y minsculas, configuracin relacionada con seguridad y datos almacenaron en Windows.

OrdinalIgnoreCase

Comparacin basada en los bytes del componente de las cadenas. OrdinalIgnoreCase utiliza la informacin de la referencia cultural de todos los idiomas para determinar si dos caracteres slo se diferencian por el uso de maysculas.

CurrentCulture O bien CurrentCultureIgnoreCase

Comparacin basada en la interpretacin de las cadenas en la referencia cultural actual.

Utilice estos valores al comparar datos que se muestran al usuario, la mayor parte de los datos proporcionados por el usuario y otros datos que requieren interpretacin lingstica. Utilice estos valores nicamente al comparar datos persistentes o mostrar datos lingsticamente pertinentes que requieren un criterio de ordenacin fijo.

InvariantCulture O bien InvariantCultureIgnoreCase

Comparacin basada en la interpretacin de las cadenas en la referencia cultural de todos los idiomas. Es diferente de Ordinal y OrdinalIgnoreCase, porque la referencia cultural de todos los idiomas trata los caracteres fuera de su intervalo aceptado como caracteres de todos los idiomas equivalentes.

Consideraciones de seguridad Si la aplicacin toma decisiones sobre la seguridad basndose en el resultado de una comparacin o de una operacin de cambio de maysculas y minsculas, la operacin debe utilizar el mtodo String..::.Compare y pasar Ordinal o OrdinalIgnoreCase al argumento comparisonType.

Acceso de base cero y de base uno a a cadenas en Visual Basic


En este tema se compara cmo Visual Basic y .NET Framework proporcionan el acceso a los caracteres de una cadena. .NET Framework siempre proporciona el acceso basado en cero a los caracteres en una cadena, mientras que Visual Basic proporciona acceso basado en cero y basado en uno, dependiendo de la funcin. Basado en uno Para obtener un ejemplo de una funcin Visual Basic basada en uno, observe la funcin Mid. Toma un argumento que indica la posicin del carcter en el que comenzar la subcadena, empezando por la posicin 1. El mtodo String..::.Substring de .NET Framework toma un ndice del carcter de la cadena

en el que debe comenzar la subcadena, empezando por la posicin 0. De esta manera, si tiene una cadena "ABCDE", los caracteres individuales se numeran como 1,2,3,4,5 para su uso con la funcin Mid, pero como 0,1,2,3,4 para usarlos con el mtodo String..::.Substring. Basado en cero Para obtener un ejemplo de una funcin de Visual Basic basada en uno, observe la funcin Split. Divide una cadena y devuelve una matriz que contiene las subcadenas. El mtodo String..::.Split de .NET Framework tambin divide una cadena y devuelve una matriz que contiene las subcadenas. Puesto que la funcin Split y el mtodo Split devuelven matrices de .NET Framework, deben ser estar basados en cero.

Crear cadenas en Visual Basic


En esta seccin se trata la creacin de cadenas en Visual Basic.

Cmo: Crear cadenas mediante un objeto StringBuilder en Visual Basic


Este ejemplo crea una cadena larga a partir de muchas cadenas ms pequeas mediante la clase StringBuilder. La clase StringBuilder es ms eficaz que el operador &= para concatenar muchas cadenas. Ejemplo En el ejemplo siguiente se crea una instancia de la clase StringBuilder, se anexan 1.000 cadenas a esa instancia y, a continuacin, se devuelve su representacin de cadena. Visual Basic Copiar cdigo

Private Function StringBuilderTest() As String Dim builder As New System.Text.StringBuilder For i As Integer = 1 To 1000 builder.Append("Step " & i & vbCrLf) Next Return builder.ToString End Function

Cmo: Generar literales de cadena multilnea (Visual Basic)


En este ejemplo se construye un literal de cadena de tres lneas de longitud. Ejemplo Visual Basic Copiar cdigo

Dim MyString As String MyString = "This is the first line of my string." & VbCrLf & _ "This is the second line of my string." & VbCrLf & _ "This is the third line of my string."
Este ejemplo de cdigo tambin est disponible como fragmento de cdigo de IntelliSense. En el selector de fragmentos de cdigo, se encuentra en Tipos de datos: definidos por Visual Basic. Para obtener ms informacin, vea Cmo: Insertar fragmentos de cdigo en el cdigo (Visual Basic). Compilar el cdigo Para este ejemplo se necesita:

Una instruccin Imports que especifica el espacio de nombres System. Para obtener ms informacin, vea Instruccin Imports (Tipo y espacio de nombres de .NET).

Conversin entre cadenas y otros tipos de datos en Visual Basic


En esta seccin se describe cmo convertir cadenas en otros tipos de datos.

Cmo: Convertir una matriz de bytes en una cadena en Visual Basic


En este tema se muestra cmo convertir los bytes de una matriz de bytes en una cadena. Ejemplo Este ejemplo utiliza el mtodo GetString de la clase de codificacin Encoding..::.Unicode para convertir todos los bytes de una matriz de bytes en una cadena. Visual Basic Copiar cdigo

Private Function UnicodeBytesToString( _ ByVal bytes() As Byte) _ As String Return System.Text.Encoding.Unicode.GetString(bytes) End Function
Puede elegir varias opciones de codificacin para convertir una matriz de bytes en una cadena:

Encoding..::.ASCII: Obtiene una codificacin para el juego de caracteres ASCII (7 bits). Encoding..::.BigEndianUnicode: Obtiene una codificacin para el formato UTF-16 utilizando el orden de bytes big-endian. Encoding..::.Default: Obtiene una codificacin para la pgina de cdigos ANSI actual del sistema. Encoding..::.Unicode: Obtiene una codificacin para el formato UTF-16 utilizando el orden de bytes little-endian. Encoding..::.UTF32: Obtiene una codificacin para el formato UTF-32 utilizando el orden de bytes little-endian. Encoding..::.UTF7: Obtiene una codificacin para el formato UTF-7. Encoding..::.UTF8: Obtiene una codificacin para el formato UTF-8.

Cmo: Convertir cadenas en una matriz de bytes en Visual Basic


En este tema se muestra cmo convertir una cadena en una matriz de bytes. Ejemplo Este ejemplo utiliza el mtodo GetBytes de la clase de codificacin Encoding..::.Unicode para convertir una cadena en una matriz de bytes. Visual Basic Copiar cdigo

Private Function UnicodeStringToBytes( _ ByVal str As String) _ As Byte() Return System.Text.Encoding.Unicode.GetBytes(str)

End Function
Puede elegir varias opciones de codificacin para convertir una cadena en una matriz de bytes:

Encoding..::.ASCII: Obtiene una codificacin para el juego de caracteres ASCII (7 bits). Encoding..::.BigEndianUnicode: Obtiene una codificacin para el formato UTF-16 utilizando el orden de bytes big-endian. Encoding..::.Default: Obtiene una codificacin para la pgina de cdigos ANSI actual del sistema. Encoding..::.Unicode: Obtiene una codificacin para el formato UTF-16 utilizando el orden de bytes little-endian. Encoding..::.UTF32: Obtiene una codificacin para el formato UTF-32 utilizando el orden de bytes little-endian. Encoding..::.UTF7: Obtiene una codificacin para el formato UTF-7. Encoding..::.UTF8: Obtiene una codificacin para el formato UTF-8.

Cmo: Crear una cadena a partir de una matriz de caracteres (Visual Basic)
Este ejemplo crea la cadena "abcd" a partir de caracteres individuales. Ejemplo

Visual Basic Copiar cdigo

Private Sub MakeStringFromCharacters() Dim characters() As Char = {"a"c, "b"c, "c"c, "d"c} Dim alphabet As New String(characters) End Sub

Compilar el cdigo Este mtodo no tiene ningn requisito especial. Para crear un literal de carcter se utiliza la sintaxis "a"c, donde una c nica sigue a un carcter individual en comillas. Programacin eficaz Los caracteres Null (equivalentes a Chr(0)) de la cadena producirn resultados inesperados cuando sta se utilice. Aunque el carcter null se incluir en la cadena, podra ocurrir que los caracteres que lo siguen no aparezcan en algunas situaciones.

Cmo: Convertir cadenas hexadecimales en nmeros


En este ejemplo se convierte una cadena hexadecimal en un entero utilizando el mtodo ToInt32.

Para convertir una cadena hexadecimal en un nmero

Utilice el mtodo ToInt32 para convertir el nmero expresado en base 16 a un entero. El primer argumento del mtodo ToInt32 es la cadena que se va a convertir. El segundo argumento describe la base en que se expresa el nmero; el valor hexadecimal es base 16.

Visual Basic Copiar cdigo

' Assign the value 49153 to i. Dim i As Integer = Convert.ToInt32("c001", 16)

Cmo: Convertir una cadena en una matriz de caracteres en Visual Basic


En ocasiones es til tener informacin sobre los caracteres de una cadena y de su posicin dentro de la misma, como cuando se est analizando una cadena. Este ejemplo muestra cmo se puede obtener una matriz de los caracteres que contiene una cadena llamando al mtodo ToCharArray de la cadena. Ejemplo Este ejemplo muestra cmo dividir una cadena en una matriz de caracteres (Char), y cmo dividir una cadena en una matriz String de sus caracteres de texto Unicode. El motivo de esta distincin es que los caracteres de texto Unicode pueden constar de dos o ms caracteres Char (como un par suplente o una secuencia de caracteres combinada). Para obtener ms informacin, vea TextElementEnumerator y el "Estndar Unicode" en la direccin http://www.unicode.org. Visual Basic Copiar cdigo

Dim testString1 As String = "ABC" ' Create an array containing "A", "B", and "C". Dim charArray() As Char = testString1.ToCharArray
Es ms difcil dividir una cadena en sus caracteres de texto Unicode, pero es necesario hacerlo si necesita informacin sobre la representacin visual de una cadena. Este ejemplo utiliza el mtodo SubstringByTextElements para obtener informacin sobre los caracteres de texto Unicode que constituyen una cadena. Visual Basic Copiar cdigo

' This string is made up of a surrogate pair (high surrogate ' U+D800 and low surrogate U+DC00) and a combining character ' sequence (the letter "a" with the combining grave accent). Dim testString2 As String = ChrW(&HD800) & ChrW(&HDC00) & "a" & ChrW(&H300) ' Create and initialize a StringInfo object for the string. Dim si As New System.Globalization.StringInfo(testString2) ' Create and populate the array. Dim unicodeTestArray(si.LengthInTextElements) As String For i As Integer = 0 To si.LengthInTextElements - 1 unicodeTestArray(i) = si.SubstringByTextElements(i, 1) Next

Cmo: Obtener acceso a caracteres de cadenas en Visual Basic


Este ejemplo muestra cmo utilizar la propiedad Chars para tener acceso al carcter situado en la ubicacin especificada en una cadena. Ejemplo En ocasiones es til tener informacin sobre los caracteres de una cadena y de su posicin dentro de la misma. Una cadena se puede considerar como una matriz de caracteres (instancias Char); se puede

recuperar un carcter concreto haciendo referencia al ndice de dicho carcter a travs de la propiedad Chars. Visual Basic Copiar cdigo

Dim myString As String = "ABCDE" Dim myChar As Char ' Assign "D" to myChar. myChar = myString.Chars(3)
El parmetro index de la propiedad Chars est basado en cero. Programacin eficaz La propiedad Chars devuelve el carcter situado en la posicin especificada. Sin embargo, algunos caracteres Unicode se pueden representar con ms de un carcter. Para obtener ms informacin sobre cmo trabajar con caracteres Unicode, vea Cmo: Convertir una cadena en una matriz de caracteres en Visual Basic. La propiedad Chars produce una excepcin IndexOutOfRangeException si el parmetro index es mayor o igual que la longitud de la cadena, o si es menor que cero.

Tutoriales para cadenas en Visual Basic


Esta seccin contiene un tutorial en el que se realiza manipulacin de cadenas de caracteres.

Tutorial: Cifrar y descifrar cadenas en Visual Basic


Este tutorial muestra cmo utilizar la clase DESCryptoServiceProvider para cifrar y descifrar cadenas utilizando la versin del proveedor de servicios criptogrficos (CSP) del algoritmo de Triple cifrado de datos estndar (TripleDES). El primer paso consiste en crear una clase contenedora simple que encapsula el algoritmo (3DES) y almacena los datos cifrados como una cadena Base-64 codificada. A continuacin, ese contenedor se utiliza para almacenar con seguridad los datos privados del usuario en un archivo de texto pblicamente accesible. Puede utilizar el cifrado para proteger secretos de usuario (por ejemplo, contraseas) y hacer que las credenciales sean ilegibles por los usuarios no autorizados. As se puede proteger la identidad de un usuario autorizado contra su substraccin, que protege los activos del usuario y proporciona su no repudiacin. El cifrado tambin puede proteger los datos de un usuario para que los usuarios no autorizados no puedan tener acceso a ellos. Para obtener ms informacin, vea Informacin general sobre criptografa.

Nota de seguridad: Los algoritmos Rijndael (denominado en la actualidad como Estndar avanzado de cifrado [AES]) y Triple cifrado de datos estndar (3DES) proporcionan una seguridad mayor que la de DES porque realizan una mayor carga computacional. Para obtener ms informacin, vea DES y Rijndael.

Para crear el contenedor de cifrado


1. Agregue una importacin del espacio de nombres de criptografa al principio del archivo.

Visual Basic Copiar cdigo

Imports System.Security.Cryptography
2. Cree una clase para encapsular los mtodos de cifrado y descifrado.

Visual Basic Copiar cdigo

Public NotInheritable Class Simple3Des End Class


3. Agregue un campo privado para almacenar el proveedor de servicios criptogrficos 3DES.

Visual Basic Copiar cdigo

Private TripleDes As New TripleDESCryptoServiceProvider


4. Agregar un mtodo privado que cree una matriz de bytes de una longitud especificada a partir del hash de la clave especificada. Visual Basic Copiar cdigo

Private Function TruncateHash( _ ByVal key As String, _ ByVal length As Integer) _ As Byte() Dim sha1 As New SHA1CryptoServiceProvider ' Hash the key. Dim keyBytes() As Byte = _ System.Text.Encoding.Unicode.GetBytes(key) Dim hash() As Byte = sha1.ComputeHash(keyBytes) ' Truncate or pad the hash. ReDim Preserve hash(length - 1) Return hash End Function
5. Agregar un constructor para inicializar el proveedor de servicios criptogrficos 3DES. El parmetro key controla los mtodos EncryptData y DecryptData. Visual Basic Copiar cdigo

Sub New(ByVal key As String) ' Initialize the crypto provider. TripleDes.Key = TruncateHash(key, TripleDes.KeySize \ 8) TripleDes.IV = TruncateHash("", TripleDes.BlockSize \ 8) End Sub
6. Agregue un mtodo pblico que cifre una cadena.

Visual Basic Copiar cdigo

Public Function EncryptData( _ ByVal plaintext As String) _ As String ' Convert the plaintext string to a byte array. Dim plaintextBytes() As Byte = _ System.Text.Encoding.Unicode.GetBytes(plaintext) ' Create the stream. Dim ms As New System.IO.MemoryStream ' Create the encoder to write to the stream. Dim encStream As New CryptoStream(ms, _ TripleDes.CreateEncryptor(), _

System.Security.Cryptography.CryptoStreamMode.Write) ' Use the crypto stream to write the byte array to the stream. encStream.Write(plaintextBytes, 0, plaintextBytes.Length) encStream.FlushFinalBlock() ' Convert the encrypted stream to a printable string. Return Convert.ToBase64String(ms.ToArray) End Function
7. Agregue un mtodo pblico que descifre una cadena.

Visual Basic Copiar cdigo

Public Function DecryptData( _ ByVal encryptedtext As String) _ As String ' Convert the encrypted text string to a byte array. Dim encryptedBytes() As Byte = Convert.FromBase64String(encryptedtext) ' Create the stream. Dim ms As New System.IO.MemoryStream ' Create the decoder to write to the stream. Dim decStream As New CryptoStream(ms, _ TripleDes.CreateDecryptor(), _ System.Security.Cryptography.CryptoStreamMode.Write) ' Use the crypto stream to write the byte array to the stream. decStream.Write(encryptedBytes, 0, encryptedBytes.Length) decStream.FlushFinalBlock() ' Convert the plaintext stream to a string. Return System.Text.Encoding.Unicode.GetString(ms.ToArray) End Function
8. La clase contenedora se puede utilizar ahora para proteger los activos del usuario. En este ejemplo, se utiliza para almacenar con seguridad los datos privados del usuario en un archivo de texto pblicamente accesible.

Para probar el contenedor de cifrado


1. En una clase independiente, agregue un mtodo que utilice el mtodo EncryptData del contenedor para cifrar una cadena y escribirla en la carpeta Mis documentos del usuario. Visual Basic Copiar cdigo

Sub TestEncoding() Dim plainText As String = InputBox("Enter the plain text:") Dim password As String = InputBox("Enter the password:") Dim wrapper As New Simple3Des(password) Dim cipherText As String = wrapper.EncryptData(plainText) MsgBox("The cipher text is: " & cipherText) My.Computer.FileSystem.WriteAllText( _ My.Computer.FileSystem.SpecialDirectories.MyDocuments & _ "\cipherText.txt", cipherText, False) End Sub

2.

Agregue un mtodo que lea la cadena cifrada de la carpeta Mis documentos del usuario y descifre la cadena con el mtodo DecryptData del contenedor.

Visual Basic Copiar cdigo

Sub TestDecoding() Dim cipherText As String = My.Computer.FileSystem.ReadAllText( _ My.Computer.FileSystem.SpecialDirectories.MyDocuments & _ "\cipherText.txt") Dim password As String = InputBox("Enter the password:") Dim wrapper As New Simple3Des(password) ' DecryptData throws if the wrong password is used. Try Dim plainText As String = wrapper.DecryptData(cipherText) MsgBox("The plain text is: " & plainText) Catch ex As System.Security.Cryptography.CryptographicException MsgBox("The data could not be decrypted with the password.") End Try End Sub
3. Agregue el cdigo de la interfaz de usuario para llamar a los mtodos TestEncoding y

TestDecoding.
4. Ejecute la aplicacin. Cuando pruebe la aplicacin, fjese en que no descifrar los datos si proporciona una contrasea incorrecta.

Validar cadenas en Visual Basic


En esta seccin se trata la validacin de cadenas en Visual Basic.

Crear una funcin de validacin en Visual Basic


Una funcin de validacin determina si una cadena cumple o no ciertos requisitos. Este tema trata las propiedades de funciones de validacin y describe cmo crear y utilizar dichas funciones. Tipos de funciones de validacin Una cadena que est intentando validar pertenece a una de estas tres categoras: 1. 2. 3. Est demostrado que es vlida. Est demostrado que no es vlido. No esta demostrado que sea vlida ni no vlida.

Est claro lo que una funcin de validacin debera hacer con las cadenas de las primeras dos categoras; la tercera categora es ms problemtica. Las funciones de validacin se pueden agrupar en dos categoras, dependiendo de cmo tratan las cadenas de la tercera categora:

Funciones de validacin conservadoras. Estas funciones slo validan las cadenas que se puede demostrar que son vlidas. Debe utilizar funciones de validacin conservadoras cuando su aplicacin confa en la cadena para la seguridad. Por ejemplo, no cree un filtro que intente dejar fuera los

elementos inaceptables: resulta difcil anticipar todas las entradas incorrectas posibles. En lugar de eso, si decide crear un filtro, incluya en l una lista de los elementos aceptables.

Funciones de validacin permisivas. Estas funciones validan todas las cadenas a menos que no sean demostrablemente no vlidas. En la mayora de las situaciones no relacionadas con la seguridad, como guardar un perfil de usuario, puede utilizar funciones de validacin permisivas, que son ms flexibles y fciles de usar que las funciones de validacin conservadoras.

Expresiones regulares en funciones de validacin Puede utilizar la clase de expresiones regulares Regex de .NET Framework para determinar si una cadena coincide con cierto modelo o contiene cierto modelo. Al validar una cadena, la expresin regular se debe iniciar con el carcter ^. Esto indica al motor de expresiones regulares que inicie la concordancia con el modelo especificado al principio de la cadena.

Cmo: Validar rutas de acceso y nombres de archivo en Visual Basic


Este ejemplo devuelve un valor Boolean que indica si una cadena representa un nombre de archivo o ruta de acceso. La validacin comprueba si el nombre contiene caracteres que el sistema de archivos no admite. Ejemplo Visual Basic Copiar cdigo

Function IsValidFileNameOrPath(ByVal name As String) As Boolean ' Determines if the name is Nothing. If name Is Nothing Then Return False End If ' Determines if there are bad characters in the name. For Each badChar As Char In System.IO.Path.GetInvalidPathChars If InStr(name, badChar) > 0 Then Return False End If Next ' The name passes basic validation. Return True End Function
Este ejemplo no comprueba si el nombre tiene signos de punto y coma en posiciones incorrectas, si hay directorios sin nombre o si la longitud del nombre supera la longitud mxima definida por el sistema. Tampoco comprueba si la aplicacin dispone de permiso para tener acceso al recurso del sistema de archivos con el nombre especificado.

Cmo: Validar cadenas que representan fechas u horas (Visual Basic)


El ejemplo de cdigo siguiente establece un valor Boolean que indica si una cadena representa una fecha o una hora vlida. Ejemplo

Visual Basic Copiar cdigo

Dim isValidDate As Boolean = IsDate("01/01/03") Dim isValidTime As Boolean = IsDate("9:30 PM")


Compilar el cdigo Reemplace ("01/01/03") y "9:30 PM" con la fecha y hora que desea validar. Puede reemplazar la cadena con otra cadena codificada, con una variable String o con un mtodo que devuelve una cadena, como InputBox. Programacin eficaz Utilice este mtodo para validar la cadena antes de intentar convertir el objeto String en una variable DateTime. Si comprueba previamente la fecha o la hora, puede evitar generar una excepcin en tiempo de ejecucin.

Cmo: Validar cadenas que representan direcciones de correo electrnico (Visual Basic)
En el ejemplo de cdigo siguiente se establece una variable booleana que indica si una cadena representa una direccin de correo electrnico vlida. Ejemplo Visual Basic Copiar cdigo

Function ValidateEmail(ByVal email As String) As Boolean Dim emailRegex As _ New System.Text.RegularExpressions.Regex( _ "^(?<user>[^@]+)@(?<host>.+)$") Dim emailMatch As _ System.Text.RegularExpressions.Match = emailRegex.Match(email) Return emailMatch.Success End Function
Compilar el cdigo Llame a este mtodo y pase la cadena que contiene una direccin de correo electrnico. Programacin eficaz Este mtodo comprueba que las direcciones de correo electrnico tengan el formato "alguien@microsoft.com". Utilice este cdigo para validar la cadena antes de intentar utilizarla como una direccin de correo electrnico. Esto podra evitar otros errores en tiempo de ejecucin.

Cmo: Validar texto para su presentacin en un explorador Web en Visual Basic


Este ejemplo muestra cmo utilizar el mtodo HtmlEncode para garantizar que un explorador muestra el texto correctamente. Los caracteres de una cadena como <, > y & se representan incorrectamente a menos que se precedan de caracteres de escape como &lt;, &gt; y &amp;. Ejemplo El ejemplo de cdigo siguiente codifica una cadena que se va a mostrar en un explorador. Codifica la cadena denominada TestString, que contiene el texto This is a <Test String>, y lo copia en la cadena denominada EncodedString como This is a &lt;Test String&gt;.

Copiar cdigo

Dim TestString As String = "This is a <Test String>" Dim EncodedString As String = Server.HtmlEncode(TestString)
Este ejemplo requiere una referencia a System.Web.dll.

Utilizar expresiones regulares con el control MaskedTextBox en Visual Basic


Este ejemplo muestra cmo convertir las expresiones regulares simples para trabajar con el control MaskedTextBox. Descripcin del idioma de enmascarado El lenguaje de enmascarado estndar MaskedTextBox se basa en el usado por el control Masked Edit de Visual Basic 6.0 y debe resultar familiar a los usuarios que migren desde esa plataforma. La propiedad Mask del control MaskedTextBox especifica qu mscara de entrada se debe utilizar. La mscara debe ser una cadena compuesta de uno o ms de los elementos de enmascarado contenidos en la tabla siguiente. Elemento de enmascarado 0

Descripcin Cualquier dgito nico comprendido entre 0 y 9. Entrada obligatoria. Dgito o espacio. Entrada opcional. Dgito o espacio. Entrada opcional. Si esta posicin es el espacio en blanco izquierdo de la mscara, se representar como un espacio. Se pueden usar signos ms (+) y menos (-). Letra ASCII. Entrada obligatoria. Letra ASCII. Entrada opcional. Character. Entrada obligatoria. Character. Entrada opcional. Alfanumrico. Entrada opcional. Marcador de posicin de decimales adecuado para la configuracin regional. Marcador de posicin de separador de miles adecuado para la referencia cultural. Separador de hora adecuado para la configuracin regional. Separador de fecha adecuado para la configuracin regional. Smbolo de moneda adecuado para la referencia cultural.

Elemento de expresin regular \d

9 #

[ \d]? [ \d+-]?

L ? & C A .

[a-zA-Z] [a-zA-Z]? [\p{Ll}\p{Lu}\p{Lt}\p{Lm}\p{Lo}] [\p{Ll}\p{Lu}\p{Lt}\p{Lm}\p{Lo}]? \W No disponible.

No disponible.

No disponible.

No disponible.

No disponible.

<

Convierte a minsculas todos los caracteres siguientes. Convierte a maysculas todos los caracteres siguientes. Deshace un cambio anterior a maysculas o minsculas. Es un escape para un carcter de mscara, convirtindolo en un literal. "\\" es la secuencia de escape para una barra diagonal inversa. Literales. Todos los elementos no enmascarados aparecern como tales dentro de MaskedTextBox.

No disponible.

>

No disponible.

No disponible.

Todos los dems caracteres.

Todos los dems caracteres.

Los smbolos decimal (.), de miles (,), de hora (:), de fecha (/) y de moneda ($) toman como valor predeterminado los definidos por la configuracin regional y de referencia cultural de la aplicacin. Puede forzarlos a que muestren los smbolos de otra referencia cultural utilizando la propiedad FormatProvider. Expresiones regulares y mscaras Aunque puede utilizar expresiones regulares y mscaras para validar los datos proporcionados por el usuario, no son completamente equivalentes. Las expresiones regulares pueden expresar modelos ms complejos que los de las mscaras, pero las mscaras pueden expresar ms sucintamente la misma informacin y en un formato adecuado a las referencias culturales. La tabla siguiente compara cuatro expresiones regulares y la mscara equivalente a cada una. Expresin regular Mscara Notas El carcter / de la mscara es un separador de fecha lgico, y se presentar al usuario como el separador de fecha apropiado a las referencias culturales actuales de la aplicacin. Una fecha (da, abreviatura del mes y ao) en el formato de Estados Unidos, en el que se muestra la abreviatura de los meses con tres letras con una letra mayscula inicial seguida por dos letras en minscula. Nmero de telfono de Estados Unidos, con cdigo de rea opcional. Si el usuario no desea escribir los caracteres opcionales, puede escribir espacios o colocar el puntero del mouse directamente en la posicin de la mscara representada por el primer 0. Un valor de moneda comprendido entre 0 y 999999. Los caracteres de moneda, separadores de miles y separadores decimales se reemplazarn en tiempo de ejecucin con sus equivalentes en la referencia cultural.

\d{2}/\d{2}/\d{4}

00/00/0000

\d{2}-[A-Z][az]{2}-\d{4}

00->L<LL0000

(\(\d{3}\))?\d{3}-d{4}

(999)-0000000

$\d{6}.00

$999,999.00

Expresiones regulares y el operador Like


Este tema compara y contrasta el operador Like de Visual Basic y las expresiones regulares de .NET Framework. Comparacin de la sintaxis

La tabla siguiente compara la especificacin del modelo de sintaxis del lenguaje para el operador Like con la sintaxis de las expresiones regulares. Sintaxis del operador Like El comportamiento del operador Like depende de Option Compare (Instruccin). El mtodo de comparacin de cadenas predeterminado para cada archivo de cdigo fuente es Option Compare Binary. Para hacer coincidir cualquier carcter individual de la lista charlist, utilice [charlist]. Para hacer coincidir cualquier carcter individual no incluido en la lista charlist, utilice [!charlist]. Para hacer coincidir cualquier dgito nico (0-9), utilice #. Sintaxis de las expresiones regulares Las expresiones regulares funcionan de la misma manera sin tener en cuenta Option Compare.

Para hacer coincidir cualquier carcter individual de la lista charlist, utilice [charlist]. Para hacer coincidir cualquier carcter individual no incluido en la lista charlist, utilice [^charlist]. Para hacer coincidir cualquier dgito nico (0-9), utilice la clase de caracteres para los dgitos decimales, \d. Para hacer coincidir cualquier carcter individual, especifique clases de caracteres mutuamente exclusivas para charlist en [charlist]. Por ejemplo, [\s\S]. Para hacer coincidir cero o ms caracteres, especifique clases de caracteres mutuamente exclusivas para charlist en [charlist]*. Por ejemplo, [\s\S]*. Para hacer coincidir un carcter especial char, coloque una barra diagonal inversa delante del mismo: \char. Para hacer coincidir cualquier carcter incluido en un intervalo, utilice un guin () para separar los lmites inferior y superior del intervalo en una lista charlist

Para hacer coincidir cualquier carcter individual, utilice ?.

Para hacer coincidir cero o ms caracteres, utilice *.

Para hacer coincidir un carcter especial con un char, inclyalo entre corchetes: [char]. Para hacer coincidir cualquier carcter incluido en un intervalo, utilice un guin () para separar los lmites inferior y superior del intervalo en una lista charlist.

Tutorial: Comprobar la complejidad de las contraseas (Visual Basic)


Este mtodo comprueba algunas caractersticas de contrasea segura y actualiza un parmetro de cadena con informacin sobre qu comprobaciones no supera la contrasea. Las contraseas se pueden utilizar en un sistema seguro para autorizar a un usuario. Sin embargo, las contraseas deben ser difciles de adivinar para los usuarios no autorizados. Los atacantes pueden utilizar un programa de ataque de diccionario, que recorre en iteracin todas las palabras de un diccionario (o varios diccionarios en distintos idiomas) y prueba si alguna de las palabras funciona como contrasea de un usuario. Las contraseas dbiles como "Ferrari" o "Barcelona" se pueden averiguar rpidamente. Hay muchas menos posibilidades de que se adivinen las contraseas ms fuertes, como "?nUnKaseT'8oCurRir@mYcoNtrase_n_a3!". Un sistema protegido mediante contrasea debera garantizar que los usuarios eligen contraseas seguras. Una contrasea segura es compleja (contiene una mezcla de maysculas, minsculas, nmeros y caracteres especiales) y no es una palabra. Este ejemplo muestra cmo comprobar la complejidad. Ejemplo Cdigo Visual Basic

Copiar cdigo

''' <summary>Determines if a password is sufficiently complex.</summary> ''' <param name="pwd">Password to validate</param> ''' <param name="minLength">Minimum number of password characters.</param> ''' <param name="numUpper">Minimum number of uppercase characters.</param> ''' <param name="numLower">Minimum number of lowercase characters.</param> ''' <param name="numNumbers">Minimum number of numeric characters.</param> ''' <param name="numSpecial">Minimum number of special characters.</param> ''' <returns>True if the password is sufficiently complex.</returns> Function ValidatePassword(ByVal pwd As String, _ Optional ByVal minLength As Integer = 8, _ Optional ByVal numUpper As Integer = 2, _ Optional ByVal numLower As Integer = 2, _ Optional ByVal numNumbers As Integer = 2, _ Optional ByVal numSpecial As Integer = 2) _ As Boolean ' Replace [A-Z] with \p{Lu}, to allow for Unicode uppercase letters. Dim upper As New System.Text.RegularExpressions.Regex("[A-Z]") Dim lower As New System.Text.RegularExpressions.Regex("[a-z]") Dim number As New System.Text.RegularExpressions.Regex("[0-9]") ' Special is "none of the above". Dim special As New System.Text.RegularExpressions.Regex("[^a-zAZ0-9]") ' Check the length. If Len(pwd) < minLength Then Return False ' Check for minimum number of occurrences. If upper.Matches(pwd).Count < numUpper Then Return False If lower.Matches(pwd).Count < numLower Then Return False If number.Matches(pwd).Count < numNumbers Then Return False If special.Matches(pwd).Count < numSpecial Then Return False ' Passed all checks. Return True End Function Sub TestValidatePassword() Dim password As String = "Password" ' Demonstrate that "Password" is not complex. MsgBox(password & " is complex: " & ValidatePassword(password)) password = "Z9f%a>2kQ" ' Demonstrate that "Z9f%a>2kQ" is not complex. MsgBox(password & " is complex: " & ValidatePassword(password)) End Sub
Compilar el cdigo Llame a este mtodo pasando la cadena que contiene esa contrasea. Para este ejemplo se necesita:

Acceso a los miembros del espacio de nombres System.Text.RegularExpressions. Agregue una instruccin Imports si no incluye nombres de miembro completos en el cdigo. Para obtener ms informacin, vea Instruccin Imports (Tipo y espacio de nombres de .NET).

Seguridad Si est moviendo la contrasea por una red, necesita utilizar un mtodo seguro para transferir los datos. Para obtener ms informacin, vea Seguridad de aplicaciones Web ASP.NET. Puede mejorar la exactitud de la funcin ValidatePassword agregando comprobaciones de complejidad adicionales:

Compare la contrasea y sus subcadenas con respecto al nombre del usuario, el identificador de usuario y un diccionario definido por la aplicacin. Adems, trate los caracteres visualmente similares como equivalentes al realizar las comparaciones. Por ejemplo, considere las letras "l" y "e" como equivalentes a los nmeros "1" y "3".

Si hay slo un carcter en mayscula, asegrese de que no es el primer carcter de la contrasea. Asegrese de que los ltimos dos caracteres de la contrasea son caracteres de letra. No permita contraseas en las que todos los smbolos se escriben desde la fila superior del teclado.

Buscar y reemplazar cadenas en Visual Basic


En esta seccin se describe cmo utilizar la funcin de buscar y reemplazar para las cadenas en Visual Basic.

Cmo: Quitar secciones de una cadena (Visual Basic)


El ejemplo de cdigo siguiente quita todas las apariciones de una cadena de otra cadena. Ejemplo En este ejemplo se utiliza la funcin Replace para reemplazar cada aparicin de la subcadena por una cadena vaca. El resultado es una nueva cadena sin las subcadenas. El ejemplo asigna el valor devuelto de la funcin Replace a la variable de cadena

withoutParts. No se cambia la cadena original, almacenada en withParts.


Visual Basic Copiar cdigo

Dim withParts As String = "Books and Chapters and Pages" Dim withoutParts As String = Replace(withParts, "and ", "")

Compilar el cdigo Reemplace "Books and Chapters and Pages" con la cadena que desea manipular.

Cmo: Buscar una cadena en una matriz de cadenas (Visual Basic)


En este ejemplo se recorren las cadenas de una matriz de cadenas para determinar cules contienen la subcadena especificada. Para cada coincidencia, el ejemplo muestra el ndice de la subcadena en la cadena. Ejemplo

El ejemplo siguiente utiliza los mtodos Contains y IndexOf del objeto String. El mtodo Contains indica si la cadena contiene la subcadena especificada. El mtodo IndexOf informa de la ubicacin del primer carcter de la primera aparicin de la subcadena. El ndice est basado en 0, lo que significa que el primer carcter de una cadena tiene un ndice de 0. Si IndexOf no encuentra la subcadena, devuelve -1. Visual Basic Copiar cdigo

Dim StrArray() As String = {"ABCDEFG", "HIJKLMNOP"} Dim FindThisString As String = "JKL" For Each Str As String In StrArray If Str.Contains(FindThisString) Then MsgBox("Found " & FindThisString & " at index " & _ Str.IndexOf(FindThisString)) End If Next
Este ejemplo de cdigo tambin est disponible como fragmento de cdigo de IntelliSense. En el selector de fragmentos de cdigo, se encuentra en Tipos de datos - definidos por Visual Basic. Para obtener ms informacin, vea Cmo: Insertar fragmentos de cdigo en el cdigo (Visual Basic). Compilar el cdigo Para este ejemplo se necesitan:

Una instruccin Imports que especifica el espacio de nombres System. Para obtener ms informacin, vea Instruccin Imports (Tipo y espacio de nombres de .NET).

Programacin eficaz El mtodo IndexOf distingue entre maysculas y minsculas, y utiliza la referencia cultural actual. Para un control ptimo de errores, sera recomendable incluir la bsqueda de cadenas en el bloque Try de una construccin Instruccin Try...Catch...Finally (Visual Basic).

Cmo: Buscar en una cadena (Visual Basic)


En este ejemplo se llama al mtodo IndexOf de un objeto String para informar del ndice de la primera aparicin de una subcadena. Ejemplo Visual Basic Copiar cdigo

Dim SearchWithinThis As String = "ABCDEFGHIJKLMNOP" Dim SearchForThis As String = "DEF" Dim FirstCharacter As Integer = SearchWithinThis.IndexOf(SearchForThis)
Este ejemplo de cdigo tambin est disponible como fragmento de cdigo de IntelliSense. En el selector de fragmentos de cdigo, se encuentra en Tipos de datos: definidos por Visual Basic. Para obtener ms informacin, vea Cmo: Insertar fragmentos de cdigo en el cdigo (Visual Basic). Compilar el cdigo Para este ejemplo se necesitan:

Una instruccin Imports que especifica el espacio de nombres System. Para obtener ms informacin, vea Instruccin Imports (Tipo y espacio de nombres de .NET).

Programacin eficaz El mtodo IndexOf informa de la ubicacin del primer carcter de la primera aparicin de la subcadena. El ndice es de base 0, lo que significa que el ndice del primer carcter de una cadena es 0. Si IndexOf no encuentra la subcadena, devuelve -1. El mtodo IndexOf distingue entre maysculas y minsculas y utiliza la referencia cultural actual. Para un control ptimo de errores, sera recomendable incluir la bsqueda de cadenas en el bloque Try de una construccin Instruccin Try...Catch...Finally (Visual Basic).

Analizar cadenas en Visual Basic


En esta seccin se trata el anlisis de cadenas en Visual Basic.

Cmo: Analizar URI en Visual Basic


Este ejemplo muestra cmo utilizar la clase System..::.Uri para analizar un identificador uniforme de recursos (URI). Ejemplo Este ejemplo utiliza varios mtodos de un objeto Uri para obtener informacin sobre un identificador uniforme de recursos (URI). Copiar cdigo

Dim uriString As String = "http://www.contoso.com/index.htm?date=today" Dim uriObject As New Uri(uriString) ' Display "Scheme: http" MsgBox("Scheme: " & uriObject.Scheme) ' Display "Host: www.contoso.com" MsgBox("Host: " & uriObject.Host) ' Display "Local path: /index.htm" MsgBox("Local path: " & uriObject.LocalPath) ' Display "Query: ?date=today" MsgBox("Query: " & uriObject.Query)

Cmo: Analizar direcciones de correo electrnico en Visual Basic


Este ejemplo muestra una expresin regular simple para analizar una direccin de correo electrnico. Ejemplo Este ejemplo utiliza la expresin regular (\S+)@([^\.\s]+)(?:\.([^\.\s]+))+, que quiere decir: 1. 2. 3. 4. Conjunto de uno o ms caracteres distintos del espacio en blanco (capturados), seguido del carcter "@", seguido Conjunto de uno o ms caracteres distintos del espacio en blanco (capturados), seguido de Uno o ms de los siguientes elementos: 1. 2. El carcter ".", seguido de Un conjunto de uno o ms caracteres distintos del espacio en blanco (capturados).

El mtodo Match de la expresin regular devuelve un objeto Match que contiene informacin sobre con qu parte de la cadena de entrada coincide la expresin regular.

Copiar cdigo

<summary> Parses an e-mail address into its parts. </summary> <param name="emailString">E-mail address to parse.</param> <remarks> For example, this method displays the following text when called with "someone@mail.contoso.com": User name: someone Address part: mail Address part: contoso Address part: com </remarks> ParseEmailAddress(ByVal emailString As String) Dim emailRegEx As New Regex("(\S+)@([^\.\s]+)(?:\.([^\.\s]+))+") Dim m As Match = emailRegEx.Match(emailString) If m.Success Then Dim output As String = "" output &= "User name: " & m.Groups(1).Value & vbCrLf For i As Integer = 2 To m.Groups.Count - 1 Dim g As Group = m.Groups(i) For Each c As Capture In g.Captures output &= "Address part: " & c.Value & vbCrLf Next Next MsgBox(output) Else MsgBox("The e-mail address cannot be parsed.") End If End Sub
Este ejemplo requiere que utilice la instruccin Imports para importar el espacio de nombres System.Text.RegularExpressions. Para obtener ms informacin, vea Instruccin Imports (Tipo y espacio de nombres de .NET).

''' ''' ''' ''' ''' ''' ''' ''' ''' ''' ''' Sub

Cmo: Identificar URI en una cadena en Visual Basic


Este ejemplo muestra cmo utilizar una expresin regular simple para identificar un identificador uniforme de recursos URI en una cadena. Para reducir el nmero de falsos positivos (texto identificado incorrectamente como URI), se supone un formato URI especfico. Esto significa que habr algunos falsos negativos, donde no se identifican los identificadores uniforme de recursos (URI) vlidos. Ejemplo Un formulario concreto de URI puede coincidir con la expresin regular ([^=":\s]+:)?//[^\s"]+, lo que supone: 1. Aparicin opcional de: 1. Conjunto de uno o ms caracteres que no son =, ": o un carcter de espacio en blanco, seguido por 2. 2. 3. El carcter :, seguido por

La cadena //, seguida por Conjunto de uno o ms caracteres que no son comillas o caracteres de espacio en blanco.

El objeto Regex se inicializa con la expresin regular. El mtodo Matches del objeto Regex devuelve un objeto MatchCollection que contiene informacin sobre todas las partes de la cadena de entrada con las que coincide la expresin regular.

Copiar cdigo

''' ''' ''' Sub

<summary>Identifies URIs in text.</summary> <param name="text">Text to parse.</param> <remarks>Displays each URI in the input text.</remarks> IdentifyURIs(ByVal text As String) Dim uriRegex As New Regex("([^="":\s]+:)?//[^\s""]+") Dim output As String = "" For Each m As Match In uriRegex.Matches(text) output &= m.Value & vbCrLf Next MsgBox(output) End Sub
Este ejemplo requiere que utilice la instruccin Imports para importar el espacio de nombres System.Text.RegularExpressions. Para obtener ms informacin, vea Instruccin Imports (Tipo y espacio de nombres de .NET).

Cmo: Identificar texto en una cadena HTML en Visual Basic


En este ejemplo se muestra cmo utilizar una expresin regular simple para quitar las etiquetas de un documento HTML. Ejemplo Las etiquetas HTML se pueden buscar con la expresin regular \<[^\>]+\>, que significa: 1. 2. 3. El carcter "<", seguido de Un conjunto de uno o ms caracteres, no incluido el carcter ">", seguido de El carcter ">".

En este ejemplo se utiliza el mtodo Regex..::.Replace compartido para reemplazar todas las coincidencias de la expresin regular de etiqueta con la cadena vaca. Copiar cdigo

''' <summary>Removes the tags from an HTML document.</summary> ''' <param name="htmlText">HTML text to parse.</param> ''' <returns>The text of an HTML document without tags.</returns> ''' <remarks></remarks> Function GetTextFromHtml(ByVal htmlText As String) As String Dim output As String = Regex.Replace(htmlText, "\<[^\>]+\>", "") Return output End Function
Este ejemplo requiere que se utilice la instruccin Imports para importar el espacio de nombres System.Text.RegularExpressions. Para obtener ms informacin, vea Instruccin Imports (Tipo y espacio de nombres de .NET).

Cmo: Identificar hipervnculos en una cadena HTML en Visual Basic


Este ejemplo muestra una expresin regular simple para identificar los hipervnculos en un documento HTML. Ejemplo Este ejemplo utiliza la expresin regular <A[^>]*?HREF\s*=\s*"([^"]+)"[^>]*?>([\s\S]*?)<\/A>, que quiere decir:

1. 2. 3. 4. 5. 6. 7. 8. 9.

La cadena"<A", seguida de El menor conjunto de cero o ms caracteres que no incluye el carcter">", seguido por La cadena"HREF", seguida de Cero o ms caracteres de espacio en blanco, seguidos por El carcter "=", seguido de Cero o ms caracteres de espacio en blanco, seguidos por El carcter de comilla, seguido de El conjunto de caracteres que no incluyen el carcter de la comilla (capturado), seguido por El carcter de comilla, seguido de

10. El menor conjunto de cero o ms caracteres que no incluye el carcter">", seguido por 11. El carcter ">", seguido de 12. El conjunto ms pequeo de cero o ms caracteres (capturados), seguido por 13. La cadena"</A>". El objeto Regex se inicializa con la expresin regular, especificando que no se distinga entre maysculas y minsculas. El mtodo Matches del objeto Regex devuelve un objeto MatchCollection que contiene informacin sobre todas las partes de la cadena de entrada que hace coincidir la expresin regular. Copiar cdigo

''' ''' ''' ''' Sub _

<summary>Identifies hyperlinks in HTML text.</summary> <param name="htmlText">HTML text to parse.</param> <remarks>This method displays the label and destination for each link in the input text.</remarks> IdentifyLinks(ByVal htmlText As String) Dim hrefRegex As New Regex( _ "<A[^>]*?HREF\s*=\s*""([^""]+)""[^>]*?>([\s\S]*?)<\/A>", RegexOptions.IgnoreCase) Dim output As String = "" For Each m As Match In hrefRegex.Matches(htmlText) output &= "Link label: " & m.Groups(2).Value & vbCrLf output &= "Link destination: " & m.Groups(1).Value &

vbCrLf Next MsgBox(output) End Sub


Este ejemplo requiere que utilice la instruccin Imports para importar el espacio de nombres System.Text.RegularExpressions. Para obtener ms informacin, vea Instruccin Imports (Tipo y espacio de nombres de .NET).

Solucionar problemas de cadenas en Visual Basic


En esta seccin se proporcionan consejos sobre cmo solucionar problemas de la manipulacin de cadenas de caracteres en Visual Basic.

Solucionar problemas de expresiones regulares en Visual Basic

En este tema se tratan algunos problemas habituales que se pueden producir al trabajar con expresiones regulares, se proporcionan algunas sugerencias para solucionar estos problemas y se proporciona un procedimiento para obtener acceso a cadenas capturadas. Sin coincidencia con el patrn esperado A continuacin se indican algunas tareas comunes que puede realizar con expresiones regulares, as como sugerencias para solucionar problemas si no obtiene los resultados que espera:

Validacin de las cadenas. Una expresin regular de validacin de cadenas debe comenzar con el carcter ^. Esto indica al motor de la expresin regular que inicie la concordancia con el patrn especificado en el inicio de la cadena. Para obtener ms informacin, vea Crear una funcin de validacin en Visual Basic y Aserciones atmicas de ancho cero.

Coincidencia con cuantificadores. Los cuantificadores de expresin regular (*, +, ?, {}) son expansivos, es decir, coinciden con la cadena ms larga posible. Sin embargo, en algunos patrones puede preferir utilizar una coincidencia no expansiva para obtener la cadena ms corta posible. Los cuantificadores de expresin regular no expansivos son *?, +?, ?? y {}?. Para obtener ms informacin, vea Cuantificadores.

Coincidencia con cuantificadores anidados. Cuando utilice cuantificadores anidados, debe asegurarse de que todos los cuantificadores son expansivos o no expansivos. De lo contrario, los resultados de la coincidencia sern difciles de predecir.

Acceso a cadenas capturadas Cuando una expresin regular localiza las cadenas esperadas, puede desear capturar esas cadenas y a continuacin, tener acceso a lo capturado. Puede utilizar estructuras de agrupacin para capturar las cadenas que coinciden con grupos de subexpresiones de la expresin regular. Para obtener ms informacin, vea Construcciones de agrupamiento. El acceso a cadenas capturadas con grupos anidados implica varios pasos.

Para tener acceso a texto capturado


1. 2. Cree un objeto Regex para una expresin regular. Llame al mtodo Match para obtener el objeto Match. El objeto Match contiene informacin sobre cmo la expresin regular coincide con la cadena. 3. Recorra en iteracin los objetos Group almacenados en la coleccin Groups del objeto Match. El objeto Group contiene informacin sobre el resultado de un nico grupo de capturas. 4. Recorra en iteracin los objetos Capture almacenados en la coleccin Captures de cada objeto Group. Cada objeto Capture contiene informacin sobre una nica subexpresin capturada, incluida la subcadena coincidente y la ubicacin. Por ejemplo, el cdigo siguiente muestra cmo tener acceso a las cadenas capturadas con una expresin regular que contiene tres grupos de captura: Copiar cdigo

''' <summary> ''' Parses an e-mail address into its parts. ''' </summary>

<param name="emailString">E-mail address to parse.</param> <remarks> For example, this method displays the following text when called with "someone@mail.contoso.com": User name: someone Address part: mail Address part: contoso Address part: com </remarks> ParseEmailAddress(ByVal emailString As String) Dim emailRegEx As New Regex("(\S+)@([^\.\s]+)(?:\.([^\.\s]+))+") Dim m As Match = emailRegEx.Match(emailString) If m.Success Then Dim output As String = "" output &= "User name: " & m.Groups(1).Value & vbCrLf For i As Integer = 2 To m.Groups.Count - 1 Dim g As Group = m.Groups(i) For Each c As Capture In g.Captures output &= "Address part: " & c.Value & vbCrLf Next Next MsgBox(output) Else MsgBox("The e-mail address cannot be parsed.") End If End Sub

''' ''' ''' ''' ''' ''' ''' ''' Sub

Constantes y enumeraciones en Visual Basic


Las constantes son una forma de utilizar nombres significativos en lugar de valores que no se modifican. Las constantes almacenan valores que, como su nombre indica, permanecen constantes durante la ejecucin de una aplicacin. Puede utilizar constantes para hacer ms legible el cdigo, puesto que se utilizan nombres significativos en lugar de nmeros. Las enumeraciones proporcionan una forma cmoda de trabajar con conjuntos de constantes relacionadas y de asociar valores de constantes con nombres. Por ejemplo, se puede declarar una enumeracin para un conjunto de constantes de tipo entero asociadas con los das de la semana, y despus utilizar los nombres de los das en el cdigo en lugar de sus valores enteros.

Constantes de Visual Basic


Las constantes almacenan valores que, como su nombre indica, permanecen constantes durante la ejecucin de una aplicacin. Utilice las constantes de su cdigo para valores que se utilizan repetidamente o para facilitar la lectura del cdigo.

Informacin general sobre las constantes


Una constante es un nombre significativo que toma el lugar de un nmero o cadena que no cambia. Las constantes almacenan valores que, como su nombre indica, permanecen iguales durante la ejecucin de una aplicacin. Puede mejorar considerablemente la legibilidad del cdigo y facilitar su mantenimiento mediante constantes. Utilcelas en cdigo que contiene valores que reaparecen o que dependen de ciertos nmeros que son difciles de recordar o que no tienen un significado evidente. Cmo crear y utilizar constantes Visual Basic contiene varias constantes predefinidas, que se utilizan principalmente para imprimir y mostrar. Puede crear tambin sus propias constantes con la instruccin Const, utilizando las mismas directrices que en la creacin de nombres de variables. Si Option Strict es On, debe declarar el tipo de constante explcitamente.

El mbito de una constante, que es el conjunto de todo el cdigo que puede hacer referencia a ella sin calificar su nombre, es igual al de una variable declarada en la misma ubicacin. Para crear una constante que exista en el mbito de un procedimiento concreto, declrela dentro de dicho procedimiento. Para crear una constante disponible en toda la aplicacin, declrela con la palabra clave Public en la seccin de declaraciones de la clase.

Nota: Aunque las constantes son de algn modo similares a las variables, no se pueden modificar ni asignrseles valores como a stas ltimas. Las constantes que se utilizan en el cdigo pueden ser definidas por el modelo de objeto para los controles o componentes con los que trabaja o definidas por el usuario, es decir, creadas por ste. Constantes en tiempo de compilacin y en tiempo de ejecucin Una constante en tiempo de compilacin se calcula cuando se compila el cdigo, mientras que una constante en tiempo de ejecucin slo se puede calcular mientras la aplicacin est en ejecucin. Una constante en tiempo de compilacin tendr el mismo valor cada vez que se ejecuta una aplicacin, mientras que una constante en tiempo de ejecucin puede cambiar cada vez. Las constantes en tiempo de compilacin se requieren para casos como lmites de matriz, expresiones de caso o inicializadores de enumerador.

Constantes declaradas por Visual Basic


Visual Basic proporciona varias constantes predefinidas a los desarrolladores para utilizarlas en la compilacin condicional, as como para imprimir y mostrar datos. Constantes de compilacin condicional La tabla siguiente lista las constantes predefinidas disponibles para la compilacin condicional. Constante Descripcin CONFIG Una cadena que corresponde a la configuracin actual del cuadro Configuracin de soluciones activas en el Administrador de configuracin. Un valor Boolean que se puede establecer en el cuadro de dilogo Propiedades del proyecto. De manera predeterminada, la configuracin de depuracin para un proyecto define DEBUG. Si est definido DEBUG, los mtodos de la clase Debug generan resultados en la ventana Resultados. Si no est definido, los mtodos de la clase Debug no se compilan y no se generan resultados de depuracin. Una cadena que representa el tipo de resultado para el proyecto o la configuracin de la opcin /target de la lnea de comandos. Los posibles valores de TARGET son:

DEBUG

TARGET

"winexe" para una aplicacin para Windows. "exe" para una aplicacin de la consola. "library" para una biblioteca de clases. "module" para un mdulo. La opcin /target se puede establecer en el entorno de desarrollo integrado de Visual Studio. Para obtener ms informacin, consulte /target (Visual Basic).

TRACE

Un valor Boolean que se puede establecer en el cuadro de dilogo Propiedades del proyecto. De manera predeterminada, todas las configuraciones para un proyecto

definen TRACE. Si est definido TRACE, los mtodos de la clase Trace generan resultados en la ventana Resultados. Si no est definido, los mtodos de la clase Trace no se compilan y no se generan resultados Trace. VBC_VER Un nmero que representa la versin de Visual Basic, en formato major.minor. El nmero de versin para Visual Basic 2005 es 8.0.

Constantes de impresin y presentacin Cuando se llama a funciones de impresin y presentacin, se pueden utilizar las siguientes constantes en el cdigo en lugar de los valores reales. Constante vbCrLf vbCr vbLf vbNewLine vbNullChar vbNullString Descripcin Combinacin de caracteres de retorno de carro/avance de lnea. Carcter de retorno de carro. Carcter de avance de lnea. Carcter de nueva lnea. Carcter que tiene el valor 0. No es lo mismo que una cadena de longitud cero (""). Se utiliza para llamar a procedimientos externos. Nmero de error. Los nmeros de error definidos por el usuario deberan ser mayores que este valor. Por ejemplo:

vbObjectError

Err.Raise(Number) = vbObjectError + 1000


vbTab vbBack vbFormFeed vbVerticalTab Carcter de tabulador. Carcter de retroceso. No se utiliza en Microsoft Windows. No es til en Microsoft Windows.

Constantes declaradas por Visual Basic


Visual Basic proporciona varias constantes predefinidas a los desarrolladores para utilizarlas en la compilacin condicional, as como para imprimir y mostrar datos. Constantes de compilacin condicional La tabla siguiente lista las constantes predefinidas disponibles para la compilacin condicional. Constante Descripcin CONFIG Una cadena que corresponde a la configuracin actual del cuadro Configuracin de soluciones activas en el Administrador de configuracin. Un valor Boolean que se puede establecer en el cuadro de dilogo Propiedades del proyecto. De manera predeterminada, la configuracin de depuracin para un proyecto define DEBUG. Si est definido DEBUG, los mtodos de la clase Debug generan resultados en la ventana Resultados. Si no est definido, los mtodos de la clase Debug

DEBUG

no se compilan y no se generan resultados de depuracin. TARGET Una cadena que representa el tipo de resultado para el proyecto o la configuracin de la opcin /target de la lnea de comandos. Los posibles valores de TARGET son:

"winexe" para una aplicacin para Windows. "exe" para una aplicacin de la consola. "library" para una biblioteca de clases. "module" para un mdulo. La opcin /target se puede establecer en el entorno de desarrollo integrado de Visual Studio. Para obtener ms informacin, consulte /target (Visual Basic).

TRACE

Un valor Boolean que se puede establecer en el cuadro de dilogo Propiedades del proyecto. De manera predeterminada, todas las configuraciones para un proyecto definen TRACE. Si est definido TRACE, los mtodos de la clase Trace generan resultados en la ventana Resultados. Si no est definido, los mtodos de la clase Trace no se compilan y no se generan resultados Trace. Un nmero que representa la versin de Visual Basic, en formato major.minor. El nmero de versin para Visual Basic 2005 es 8.0.

VBC_VER

Constantes de impresin y presentacin Cuando se llama a funciones de impresin y presentacin, se pueden utilizar las siguientes constantes en el cdigo en lugar de los valores reales. Constante vbCrLf vbCr vbLf vbNewLine vbNullChar vbNullString Descripcin Combinacin de caracteres de retorno de carro/avance de lnea. Carcter de retorno de carro. Carcter de avance de lnea. Carcter de nueva lnea. Carcter que tiene el valor 0. No es lo mismo que una cadena de longitud cero (""). Se utiliza para llamar a procedimientos externos. Nmero de error. Los nmeros de error definidos por el usuario deberan ser mayores que este valor. Por ejemplo:

vbObjectError

Err.Raise(Number) = vbObjectError + 1000


vbTab vbBack vbFormFeed vbVerticalTab Carcter de tabulador. Carcter de retroceso. No se utiliza en Microsoft Windows. No es til en Microsoft Windows.

Constantes definidas por el usuario


Una constante es un nombre significativo que toma el lugar de un nmero o cadena que no cambia. Las constantes almacenan valores que, como su nombre indica, permanecen constantes durante la ejecucin de una aplicacin. Puede utilizar constantes definidas por los controles o componentes con los que trabaja o puede crear sus propias constantes. Las constantes que crea el usuario se denominan definidas por el usuario. Las constantes se declaran con la instruccin Const, utilizando las mismas directrices que en la creacin de nombres de variables. Si Option Strict es On, debe declarar el tipo de constante explcitamente. Utilizacin de la instruccin Const Una instruccin Const puede representar una cantidad matemtica o fecha y hora: Visual Basic Copiar cdigo

Const conPi = 3.14159265358979 Public Const conMaxPlanets As Integer = 9 Const conReleaseDate = #1/1/1995#
Tambin puede definir constantes String: Visual Basic Copiar cdigo

Public Const conVersion = "07.10.A" Const conCodeName = "Enigma"


La expresin a la derecha del signo igual (=) suele ser un nmero o una cadena de literal, pero tambin puede ser una expresin que da como resultado un nmero o una cadena (si bien dicha expresin no puede contener llamadas a funciones). Incluso pueden definirse constantes en trminos de constantes definidas anteriormente: Visual Basic Copiar cdigo

Const conPi2 = conPi * 2


mbito de las constantes definidas por el usuario El mbito de la instruccin Const es el mismo que el de una variable declarada en la misma ubicacin. Puede especificar el mbito de cualquiera de las siguientes maneras:

Para crear una constante que exista slo dentro de un procedimiento concreto, declrela dentro de dicho procedimiento. Para crear una constante disponible para todos los procedimientos de una clase, pero no para cdigo fuera de ese mdulo, declrela en la seccin de declaraciones de la clase. Para crear una constante que est disponible para todos los miembros de un ensamblado, pero no para clientes fuera del ensamblado, declrela mediante la palabra clave Friend en la seccin de declaraciones de la clase.

Para crear una constante disponible en toda la aplicacin, declrela con la palabra clave Public en la seccin de declaraciones de la clase.

Para obtener ms informacin, consulte Cmo: Declarar una constante. Evitar referencias circulares Puesto que las constantes pueden definirse en funcin de otras constantes, puede ocurrir que sin darse cuenta cree un ciclo o referencia circular involuntariamente, entre dos o ms constantes. Un ciclo se

produce cuando hay dos o ms constantes pblicas, cada una definida basndose en la otra, como en este ejemplo: Visual Basic Copiar cdigo

Public Const conA = conB * 2 ... Public Const conB = conA / 2


Si se produce un ciclo, Visual Basic genera un error del compilador.

Tipos de datos constantes y literales


Un literal es un valor que se expresa a s mismo en lugar de a un valor de variable o el resultado de una expresin, como el nmero 3 o la cadena "Hello". Una constante es un nombre descriptivo que sustituye a un literal y retiene este mismo valor a lo largo del programa, lo que se opone a una variable cuyo valor puede cambiar. Cuando Option Strict es On, debe declarar todas las constantes explcitamente con un tipo de datos. En el siguiente ejemplo, el tipo de datos de MyByte se declara explcitamente como tipo de datos Byte: Copiar cdigo

Option Strict On Public Const MyByte As Byte = 2


La declaracin explcita de los tipos de datos es inequvoca, y el cdigo con tipo es ms fcil de leer y mantener. No obstante, si Option Strict es Off, el compilador utiliza el tipo de la expresin que se usa para inicializar la constante. Un literal entero numrico se convierte a tipo de datos Integer de manera predeterminada. El tipo de datos predeterminado para nmeros de punto flotante es Double, y las palabras clave True y False especifican una constante de tipo Boolean. Literales y conversin de tipos En algunos casos, puede que sea conveniente forzar un literal a un tipo de datos concreto, por ejemplo, al asignar un valor literal integral de gran tamao a una variable de tipo Decimal. El siguiente ejemplo produce un error: Copiar cdigo

Dim myDecimal as Decimal myDecimal = 100000000000000000000

' This causes a compiler error.

El error tiene su origen en la representacin del literal. El tipo de datos Decimal puede contener un valor de este tamao. Sin embargo, el literal se representa implcitamente como Long, lo que no es posible. Se puede forzar la conversin de un literal a un tipo de datos concreto de dos maneras: agregndole un carcter de tipo o encerrndolo entre caracteres de inclusin. El carcter de tipo o los caracteres de inclusin deben ir justo antes o a continuacin del literal, sin ningn espacio o caracteres intermedios. Para que funcione el ejemplo anterior, se anexa el carcter de tipo D al literal para que sea representado como un Decimal: Copiar cdigo

MyDecimal = 100000000000000000000D
En el ejemplo siguiente se muestra la utilizacin correcta de los caracteres de tipo y de inclusin: Copiar cdigo

Option Strict Off

Public Const Public Const Public Const type. Public Const constants. Public Const Public Const Public Const
Visual Basic. Tipo de datos Boolean Byte Char Date Decimal Double Integer Long Short Single String

DefaultInteger = 100 ' Default is Integer. DefaultDouble = 54.3345612 ' Default is Double. MyCharacter = "a"C ' Forces constant to be a Char MyDate = #01/15/01# ' Demonstrates DateTime

MyTime = #1:15:59 AM# MyLong = 45L ' Forces data type to be a Long. MySingle = 45.55! ' Forces data type to be a Single.

En la siguiente tabla se muestran los caracteres de inclusin y los caracteres de tipo disponibles en

Carcter de inclusin (ninguno) (ninguno) " # (ninguno) (ninguno) (ninguno) (ninguno) (ninguno) (ninguno) "

Carcter de tipo anexado (ninguno) (ninguno) C (ninguno) Do@ Ro# Io% Lo& S Fo! (ninguno)

Cmo: Agrupar valores de constantes relacionadas


Una enumeracin es la manera mejor de agrupar las constantes relacionadas. Una enumeracin se crea con la instruccin Enum en la seccin de declaraciones de una clase o mdulo. Para obtener ms informacin, consulte Cmo: Declarar enumeraciones.

Para agrupar los valores de constantes relacionadas


1. Escriba una declaracin que incluya un nivel de acceso a cdigo, la palabra clave Enum y un nombre vlido. Este ejemplo crea los valores temperatureValues de la enumeracin Private. Visual Basic Copiar cdigo

Private Enum temperatureValues


2. Defina las constantes en la enumeracin. Este ejemplo crea los valores temperatureValues de la enumeracin Public y asigna sus valores. Visual Basic Copiar cdigo

Public Enum temperatureValues Scorching Hot Lukewarm Cool Cold End Enum

Informacin general sobre las enumeraciones


Las enumeraciones proporcionan una forma cmoda de trabajar con conjuntos de constantes relacionadas y de asociar valores de constantes con nombres. Por ejemplo, se puede declarar una enumeracin para un conjunto de constantes de tipo entero asociadas con los das de la semana, y despus utilizar los nombres de los das en el cdigo en lugar de sus valores enteros. Tareas que implican enumeraciones La tabla siguiente lista tareas comunes que implican enumeraciones. Para esto Encuentre una enumeracin predefinida Declare una enumeracin Asigne un nombre completo a una enumeracin Haga referencia a un miembro de una enumeracin Recorra en iteracin una enumeracin Vea Enumeraciones declaradas por Visual Basic Cmo: Declarar enumeraciones Enumeraciones y calificacin de nombres

Cmo: Hacer referencia al miembro de una enumeracin Cmo: Recorrer en iteracin una enumeracin en Visual Basic Cmo: Determinar la cadena asociada a un valor de enumeracin Cundo se debe utilizar una enumeracin

Determine la cadena asociada a una enumeracin Decida cundo utilizar una enumeracin

Enumeraciones declaradas por Visual Basic


Las enumeraciones proporcionan una forma cmoda de trabajar con conjuntos de constantes relacionadas y de asociar valores de constantes con nombres. Visual Basic proporciona algunas enumeraciones tiles. Enumeraciones predefinidas La tabla siguiente lista y describe las enumeraciones proporcionadas en Visual Basic. Enumeracin AppWinStyle (Enumeracin) Descripcin Indica el estilo de ventana que se va a utilizar para el programa invocado al llamar a la funcin Shell. Indica cmo reproducir sonidos al llamar a los mtodos de audio.

AudioPlayMode (Enumeracin) BuiltInRole (Enumeracin)

Indica el tipo de funcin que se debe comprobar cuando se llama a

My.User.IsInRole (Mtodo). CallType (Enumeracin) Indica el tipo de procedimiento que se debe invocar al llamar a la funcin CallByName. Indica cmo comparar las cadenas cuando se llama a las funciones de comparacin. Indica cmo se muestran las fechas al llamar a la funcin FormatDateTime. Indica cmo determinar y dar formato a los intervalos de fecha al llamar a las funciones relacionadas con fechas. Especifica qu se hace cuando un directorio que se va a borrar contiene archivos o directorios. Indica cundo vencen los pagos al llamar a mtodos financieros. Indica si los campos de texto estn delimitados o son de ancho fijo. Indica los atributos de archivo que se deben utilizar al llamar a las funciones de acceso a archivos. Indica el primer da de la semana que se utiliza al llamar a funciones relacionadas con fechas. Indica la primera semana del ao que se utiliza al llamar a funciones relacionadas con fechas. Indica en qu botn se hizo clic en un cuadro de mensaje, devuelto por la funcin MsgBox. Indica los botones que se muestran al llamar a la funcin MsgBox. Indica el tipo de acceso cuando se llama a las funciones de acceso a archivos. Indica el modo que se debe utilizar al llamar a las funciones de acceso a archivos. Indica si otros procesos pueden utilizar un archivo al llamar a las funciones de acceso a archivos. Especifica si se debe eliminar un archivo permanentemente o colocar en la Papelera de reciclaje. Especifica si se buscan todos o slo los directorios de nivel superior. Indica un valor Boolean o si se debe utilizar el valor predeterminado al llamar a las funciones de formato de nmeros. Especifica lo que se debe hacer si el usuario hace clic en Cancelar durante una operacin. Especifica si se muestra o no un cuadro de dilogo de progreso al copiar, eliminar o mover archivos o directorios.

CompareMethod (Enumeracin) DateFormat (Enumeracin)

DateInterval (Enumeracin)

DeleteDirectoryOption (Enumeracin) DueDate (Enumeracin) FieldType (Enumeracin) FileAttribute (Enumeracin)

FirstDayOfWeek (Enumeracin) FirstWeekOfYear (Enumeracin) MsgBoxResult (Enumeracin)

MsgBoxStyle (Enumeracin) OpenAccess (Enumeracin)

OpenMode (Enumeracin)

OpenShare (Enumeracin)

RecycleOption (Enumeracin)

SearchOption (Enumeracin) TriState (Enumeracin)

UICancelOption (Enumeracin) UIOption (Enumeracin)

VariantType (Enumeracin)

Indica el tipo de un objeto de variante, devuelto por la funcin VarType. Indica qu tipo de conversin se debe realizar al llamar a la funcin StrConv. Indica cundo vencen los pagos al llamar a mtodos financieros.

VbStrConv (Enumeracin)

DueDate (Enumeracin)

Cmo: Declarar enumeraciones


Una enumeracin se crea con la instruccin Enum en la seccin de declaraciones de una clase o mdulo. No puede declarar una enumeracin dentro de un mtodo. Para especificar el nivel adecuado de acceso, utilice Private, Protected, Friend o Public. Un tipo Enum tiene un nombre, un tipo subyacente y un conjunto de campos, cada uno de los cuales representa una constante. El nombre debe ser un calificador de Visual Basic 2005 vlido. El tipo subyacente debe ser uno de los tipos de enteros Byte, Short, Long o Integer. Integer es el valor predeterminado. Las enumeraciones tienen siempre establecimiento inflexible de tipos y no son intercambiables con los tipos de nmeros enteros. Las enumeraciones no pueden tener valores de punto flotante. Si se asigna un valor de punto flotante a una enumeracin con Option Strict On, se producir un error del compilador. Si Option Strict es Off, el valor se convierte automticamente en el tipo Enum. Para obtener informacin sobre los nombres y sobre cmo utilizar la instruccin Imports de manera que la calificacin de nombres resulte innecesaria, consulte Enumeraciones y calificacin de nombres.

Para declarar una enumeracin


1. Escriba una declaracin que incluya un nivel de acceso al cdigo, la palabra clave Enum y un nombre vlido, como en los ejemplos siguientes, cada uno de los cuales declara una palabra clave Enum diferente. Visual Basic Copiar cdigo

Private Enum SampleEnum SampleMember End Enum Public Enum SampleEnum2 SampleMember End Enum Protected Enum SampleEnum3 SampleMember End Enum Friend Enum SampleEnum4 SampleMember End Enum Protected Friend Enum SampleEnum5 SampleMember End Enum
2. Defina las constantes en la enumeracin. De manera predeterminada, la primera constante de una enumeracin se inicializa con 0 y las siguientes se inicializan con un valor igual al de la constante anterior ms uno. Por ejemplo, la siguiente enumeracin, Days, contiene una constante denominada Sunday con el valor 0, una constante denominada Monday con el valor 1, una constante denominada Tuesday con el valor 2, etc.

Visual Basic Copiar cdigo

Public Enum Days Sunday Monday Tuesday Wednesday Thursday Friday Saturday End Enum
3. Se pueden asignar explcitamente valores a constantes en una enumeracin mediante una instruccin de asignacin. Se puede asignar cualquier valor entero, incluidos nmeros negativos. Por ejemplo, puede que desee que las constantes con valores menores que cero representen condiciones de error. En la siguiente enumeracin, a la constante Invalid se le asigna explcitamente el valor 1, y a la constante Sunday se le asigna el valor 0. Como es la primera constante de la enumeracin, Saturday tambin se inicializa con el valor 0. El valor de Monday es 1 (el valor de Sunday ms uno); el valor de Tuesday es 2, y as sucesivamente. Visual Basic Copiar cdigo

Public Enum WorkDays Saturday Sunday = 0 Monday Tuesday Wednesday Thursday Friday Invalid = -1 End Enum
Este ejemplo de cdigo tambin est disponible en el fragmento de cdigo de IntelliSense. En el selector de fragmentos de cdigo, se encuentra en Lenguaje Visual Basic. Para obtener ms informacin, consulte Cmo: Insertar fragmentos de cdigo en el cdigo (Visual Basic).

Para declarar una enumeracin explcitamente

Escriba una declaracin con la sintaxis siguiente. Visual Basic Copiar cdigo

Public Enum MyEnum As Byte Zero One Two End Enum

Cmo: Hacer referencia al miembro de una enumeracin


Las enumeraciones proporcionan una forma cmoda de trabajar con conjuntos de constantes relacionadas y de asociar valores de constantes con nombres. Por ejemplo, se puede declarar una enumeracin para un conjunto de constantes de tipo entero asociadas con los das de la semana, y despus utilizar los nombres de los das en el cdigo en lugar de sus valores enteros. Puede evitar utilizar los nombres completos con la instruccin Imports. Para obtener ms informacin, consulte Enumeraciones y calificacin de nombres.

Para hacer referencia a un miembro de una enumeracin

Califique el nombre de miembro con la enumeracin. Por ejemplo, el ejemplo siguiente asigna el miembro Saturday de la enumeracin FirstDayOfWeek a la variable DayValue.

Enumeraciones y calificacin de nombres


Normalmente, cuando se hace referencia a un miembro de una enumeracin, es necesario calificarlo con el nombre de la enumeracin. Por ejemplo, para hacer referencia al miembro

Sunday de la enumeracin Days, se utilizara la siguiente sintaxis:


Visual Basic Copiar cdigo

X = Days.Sunday

Utilizar la instruccin Imports Se puede evitar la utilizacin de nombres completos agregando la instruccin Imports a la seccin de declaraciones de espacios de nombres del cdigo, como en el ejemplo siguiente:

Visual Basic Copiar cdigo

Imports WindowsApplication1.Form1.Days Imports WindowsApplication1.Form1.WorkDays

Una instruccin Imports importa nombres de espacios de nombres de proyectos y ensamblados a los que se hace referencia y de dentro del mismo proyecto como el mdulo en el que aparece la instruccin. Una vez agregada esta instruccin, podra hacer referencia a los miembros de la enumeracin sin calificacin, como se muestra a continuacin:

Visual Basic Copiar cdigo

X = Sunday

Mediante la organizacin de conjuntos de constantes relacionadas en enumeraciones, se pueden utilizar los mismos nombres de constantes en diferentes contextos. Por ejemplo, puede utilizar los mismos nombres de las constantes de das de la semana en las enumeraciones Days y WorkDays. Si utiliza la instruccin Imports con las enumeraciones, debe evitar referencias ambiguas. Considere el ejemplo siguiente:

Visual Basic Copiar cdigo

Imports WindowsApplication1.Form1.Days Imports WindowsApplication1.Form1.WorkDays


Visual Basic Copiar cdigo

Public Sub New() ' Insert code to implement constructor. X = Monday End Sub

Suponiendo que Monday sea un miembro de las enumeraciones Days y Workdays, este cdigo generar un error del compilador. Para evitar las referencias ambiguas a una constante individual, debe calificar el nombre de la constante con su enumeracin. El siguiente cdigo hace referencia a las constantes Saturday en las enumeraciones Days y

WorkDays.
Visual Basic Copiar cdigo

X = Days.Saturday Y = WorkDays.Saturday

Cmo: Recorrer en iteracin una enumeracin en Visual Basic


Las enumeraciones proporcionan una forma cmoda de trabajar con conjuntos de constantes relacionadas y de asociar valores de constantes con nombres. Para recorrer en iteracin una enumeracin, puede moverla a una matriz mediante el mtodo GetValues. Tambin puede recorrer en iteracin una enumeracin mediante una instruccin For...Each, mediante un mtodo GetNames o GetValues para extraer la cadena o valor numrico.

Para recorrer en iteracin una enumeracin

Declare una matriz y convierta la enumeracin en ella con el mtodo GetValues antes de pasar la matriz como hara con cualquier otra variable. En el ejemplo siguiente se muestra cada miembro de la enumeracin MyEnum cuando la recorre en iteracin. Visual Basic Copiar cdigo

Dim items As Array items = System.Enum.GetValues(GetType(FirstDayOfWeek)) Dim item As String For Each item In items MsgBox(item) Next

Cmo: Determinar la cadena asociada a un valor de enumeracin


Los mtodos GetValues y GetNames permiten determinar las cadenas y los valores asociados a miembros de enumeracin.

Para determinar la cadena asociada a una enumeracin

Utilice el mtodo GetNames para recuperar las cadenas asociadas a los miembros de enumeracin. Este ejemplo declara una enumeracin, flavorEnum, y utiliza luego el mtodo GetNames para mostrar las cadenas asociadas a cada miembro. Visual Basic Copiar cdigo

Public Enum flavorEnum salty sweet sour bitter End Enum

Private Sub TestMethod() MsgBox("The strings in the flavorEnum are:") Dim i As String For Each i In [Enum].GetNames(GetType(flavorEnum)) MsgBox(i) Next End Sub

Cundo se debe utilizar una enumeracin


Las enumeraciones ofrecen un modo fcil de trabajar con conjuntos de constantes relacionadas. Una enumeracin, o Enum, es un nombre simblico para un conjunto de valores. Las enumeraciones se tratan como tipos de datos, y puede utilizarlas para crear conjuntos de constantes y usarlas con variables y propiedades. Cundo se debe utilizar una enumeracin Cuando un procedimiento acepta un conjunto limitado de variables, considere el uso de una enumeracin. Las enumeraciones hacen que el cdigo sea ms claro y legible, especialmente cuando se utilizan nombres significativos. Entre las ventajas de utilizar las enumeraciones se incluyen:

Reducir los errores producidos por nmeros transpuestos o mal escritos. Facilitar el cambio de valores en el futuro. Facilitar la lectura del cdigo, lo que significa que habr menos posibilidad de errores. Garantizar la compatibilidad futura. Con enumeraciones, es menos probable que haya errores en el cdigo si alguien cambia los valores correspondientes a los nombres de miembros en el futuro.

Nombres de enumeraciones Utilice una convencin de nomenclatura para los miembros de enumeraciones. Cuando Visual Basic encuentra un nombre de miembro de una enumeracin, se puede producir una excepcin si otras bibliotecas de tipos a los que se hace referencia contienen el mismo nombre. Utilice un prefijo nico que identifique los valores de su aplicacin o componente. Cuando se hace referencia a un miembro de una enumeracin, es necesario calificarlo con el nombre de la enumeracin o utilizar si no la instruccin Imports. Para obtener ms informacin, consulte Enumeraciones y calificacin de nombres. Enumeraciones predefinidas Visual Basic proporciona varias enumeraciones predefinidas, como FirstDayOfWeek y MsgBoxResul, para facilitar el cdigo. Para obtener una lista de ellas, consulte Enumeraciones declaradas por Visual Basic.

Constantes y enumeraciones intrnsecas


Visual Basic proporciona una serie de constantes y enumeraciones intrnsecas para facilitar el proceso de programacin. Comentarios Las constantes almacenan valores que permanecen constantes durante la ejecucin de una aplicacin. Son nombres significativos que ocupan el lugar de un nmero o una cadena y facilitan la lectura del cdigo. Las enumeraciones ofrecen un modo fcil de trabajar con conjuntos de constantes relacionadas. Una enumeracin, o Enum, es un nombre simblico para un conjunto de valores.

Puede crear sus propias constantes y enumeraciones, tal como se indica en Constantes definidas por el usuario, o puede utilizar las constantes y las enumeraciones intrnsecas que proporciona Visual Basic y que se muestran en Examinador de objetos. La tabla siguiente lista y describe las enumeraciones intrnsecas disponibles en Visual Basic. Enumeracin AppWinStyle (Enumeracin) Descripcin Indica el estilo de ventana que se va a utilizar para el programa invocado al llamar a la funcin Shell. Indica cmo reproducir sonidos al llamar a los mtodos de audio.

AudioPlayMode (Enumeracin) BuiltInRole (Enumeracin)

Indica el tipo de funcin que se debe comprobar cuando se llama a My.User.IsInRole (Mtodo). Indica el tipo de procedimiento que se debe invocar al llamar a la funcin CallByName. Indica cmo comparar las cadenas cuando se llama a las funciones de comparacin. Indica cmo se muestran las fechas al llamar a la funcin FormatDateTime. Indica cmo determinar y dar formato a los intervalos de fecha al llamar a las funciones relacionadas con fechas. Especifica qu se hace cuando un directorio que se va a borrar contiene archivos o directorios. Indica cundo vencen los pagos al llamar a mtodos financieros. Indica si los campos de texto estn delimitados o son de ancho fijo. Indica los atributos de archivo que se deben utilizar al llamar a las funciones de acceso a archivos. Indica el primer da de la semana que se utiliza al llamar a funciones relacionadas con fechas. Indica la primera semana del ao que se utiliza al llamar a funciones relacionadas con fechas. Indica en qu botn se hizo clic en un cuadro de mensaje, devuelto por la funcin MsgBox. Indica los botones que se muestran al llamar a la funcin MsgBox. Identifica si se puede leer, escribir en un archivo o ambos. Indica qu modo de acceso se debe utilizar al tener acceso a un archivo. Especifica si otros procesos pueden tener acceso a un archivo abierto.

CallType (Enumeracin)

CompareMethod (Enumeracin) DateFormat (Enumeracin)

DateInterval (Enumeracin)

DeleteDirectoryOption (Enumeracin) DueDate (Enumeracin) FieldType (Enumeracin) FileAttribute (Enumeracin)

FirstDayOfWeek (Enumeracin) FirstWeekOfYear (Enumeracin) MsgBoxResult (Enumeracin)

MsgBoxStyle (Enumeracin) OpenAccess (Enumeracin) OpenMode (Enumeracin)

OpenShare (Enumeracin)

RecycleOption (Enumeracin)

Especifica si se debe eliminar un archivo permanentemente o colocar en la Papelera de reciclaje. Especifica si se buscan todos o slo los directorios de nivel superior. Indica un valor booleano o si se debe utilizar el valor predeterminado al llamar a las funciones de formato de nmeros. Especifica lo que se debe hacer si el usuario hace clic en Cancelar durante una operacin. Especifica si se muestra o no un cuadro de dilogo de progreso al copiar, eliminar o mover archivos o directorios. Indica el tipo de un objeto de variante, devuelto por la funcin VarType. Indica qu tipo de conversin se debe realizar al llamar a la funcin StrConv.

SearchOption (Enumeracin) TriState (Enumeracin)

UICancelOption (Enumeracin) UIOption (Enumeracin)

VariantType (Enumeracin)

VbStrConv (Enumeracin)

Operadores y expresiones en Visual Basic


Un operador es un elemento de cdigo que realiza una operacin en uno o ms elementos de cdigo que contienen valores. Los elementos de valor incluyen variables, constantes, literales, propiedades, valores devueltos de procedimientos Function y Operator y expresiones. Una expresin es una serie de elementos de valor combinados con operadores, que produce un nuevo valor. Los operadores actan sobre los elementos de valor realizando clculos, comparaciones y otras operaciones.

Tareas comunes realizadas con los operadores de Visual Basic


Los operadores realizan muchas tareas comunes en las que intervienen una o ms expresiones denominadas operandos. Tareas aritmticas y de cambio de bits En la tabla siguiente se resumen las operaciones aritmticas y de cambio de bits disponibles. Para Sumar un valor numrico a otro Restar un valor numrico de otro Invertir el signo de un valor numrico Multiplicar un valor numrico por otro Dividir un valor numrico por otro Encontrar el cociente de un valor numrico dividido por otro (sin el resto) Encontrar el resto de un valor numrico dividido por otro (sin el Vea + (Operador, Visual Basic) - (Operador, Visual Basic) - (Operador, Visual Basic) * (Operador, Visual Basic) / (Operador, Visual Basic) \ (Operador, Visual Basic)

Mod (Operador, Visual

cociente) Elevar un valor numrico a una potencia Desplazar el modelo de bits de un valor numrico a la izquierda Desplazar el modelo de bits de un valor numrico a la derecha Tareas de comparacin

Basic) ^ (Operador, Visual Basic) << (Operador, Visual Basic) >> (Operador, Visual Basic)

En la tabla siguiente se resumen las operaciones de comparacin disponibles. Para Determinar si dos valores son iguales Vea Operador = (Operadores de comparacin en Visual Basic) Operador <> (Operadores de comparacin en Visual Basic) Operador < (Operadores de comparacin en Visual Basic) Operador > (Operadores de comparacin en Visual Basic) Operador <= (Operadores de comparacin en Visual Basic) Operador >= (Operadores de comparacin en Visual Basic) Is (Operador, Visual Basic)

Determinar si dos valores no son iguales

Determinar si un valor es menor que otro

Determinar si un valor es mayor que otro

Determinar si un valor es menor o igual que otro

Determinar si un valor es mayor o igual que otro

Determinar si dos variables de objeto hacen referencia a la misma instancia de objeto Determinar si dos variables de objeto hacen referencia a instancias de objeto diferentes Determinar si un objeto es de un tipo especfico Tareas de concatenacin

IsNot (Operador)

TypeOf (Operador, Visual Basic)

En la tabla siguiente se resumen las operaciones de concatenacin disponibles. Para Unir varias cadenas en una nica cadena Vea Operador & (Operadores de concatenacin en Visual Basic) Operador + (Operadores de concatenacin en Visual Basic)

Unir valores numricos con valores de cadena Tareas lgicas y bit a bit

En la tabla siguiente se resumen las operaciones lgicas y bit a bit disponibles. Para Vea

Realizar la negacin lgica en un valor booleano

Not (Operador, Visual Basic) And (Operador, Visual Basic) Or (Operador, Visual Basic) Xor (Operador, Visual Basic) AndAlso (Operador)

Realizar la conjuncin lgica en dos valores booleanos

Realizar la disyuncin lgica inclusiva en dos valores booleanos

Realizar la disyuncin lgica exclusiva en dos valores booleanos

Realizar la conjuncin lgica de evaluacin cortocircuitada en dos valores booleanos Realizar la disyuncin lgica inclusiva de evaluacin cortocircuitada en dos valores booleanos Realizar la conjuncin lgica bit a bit en dos valores enteros

OrElse (Operador)

And (Operador, Visual Basic) Or (Operador, Visual Basic) Xor (Operador, Visual Basic) Not (Operador, Visual Basic)

Realizar la disyuncin lgica inclusiva bit a bit en dos valores enteros

Realizar la disyuncin lgica exclusiva bit a bit en dos valores enteros

Realizar la negacin lgica bit a bit en un valor entero

Operadores aritmticos en Visual Basic


Los operadores aritmticos se utilizan para realizar muchas de las operaciones aritmticas habituales que implican el clculo de valores numricos representados por literales, variables, otras expresiones, llamadas a funciones y propiedades, y constantes. Tambin se clasifican como operadores aritmticos los operadores de desplazamiento de bits, que actan al nivel de bits individuales de los operandos y cambian sus modelos de bits a la izquierda o la derecha. Operaciones aritmticas Puede sumar dos valores en una expresin con el + (Operador, Visual Basic) o restar un valor de otro con el - (Operador, Visual Basic), como se muestra en el siguiente ejemplo. Visual Basic Copiar cdigo

Dim x As Integer x = 67 + 34 x = 32 - 12
La negacin tambin utiliza el - (Operador, Visual Basic), pero con un solo operando, como se puede ver en el ejemplo siguiente. Visual Basic Copiar cdigo

Dim x As Integer = 65 Dim y As Integer y = -x


La multiplicacin y la divisin utilizan los * (Operador, Visual Basic) y / (Operador, Visual Basic), respectivamente, como se muestra en el ejemplo siguiente.

Visual Basic Copiar cdigo

Dim y As Double y = 45 * 55.23 y = 32 / 23


La exponenciacin utiliza el ^ (Operador, Visual Basic), como se puede ver en el ejemplo siguiente. Visual Basic Copiar cdigo

Dim z As Double z = 23 ^ 3 ' The preceding statement sets z to 12167 (the cube of 23).
La divisin de enteros se lleva a cabo con el \ (Operador, Visual Basic). La divisin de enteros devuelve el cociente, es decir, el nmero entero que representa el nmero de veces que puede se puede dividir dividendo entre el divisor sin tener en cuenta el valor del resto. El divisor y el dividendo deben ser tipos integrales (SByte, Byte, Short, UShort, Integer, UInteger, Long y ULong) para este operador. Todos los dems tipos deben convertirse antes a tipo integral. El ejemplo siguiente ilustra la divisin de enteros. Visual Basic Copiar cdigo

Dim k As Integer k = 23 \ 5 ' The preceding statement sets k to 4.


El mdulo aritmtico se calcula con el Mod (Operador, Visual Basic). Este operador devuelve el resto despus de dividir el divisor por el dividendo un nmero integral de veces. Si tanto el divisor como el dividendo son tipos integrales, el valor devuelto es integral. Si el divisor y el dividendo son tipos de punto flotante, el valor devuelto es una variable de punto flotante. En el siguiente ejemplo se muestra este comportamiento. Visual Basic Copiar cdigo

Dim x Dim y Dim z z = x ' The

As Integer = 100 As Integer = 6 As Integer Mod y preceding statement sets z to 4.

Visual Basic Copiar cdigo

Dim a Dim b Dim c c = a ' The

As Double = 100.3 As Double = 4.13 As Double Mod b preceding statement sets c to 1.18.

Intento de dividir por cero La divisin por cero produce resultados diferentes dependiendo de los tipos de datos que se utilicen. En divisiones de enteros (SByte, Byte, Short, UShort, Integer, UInteger, Long, ULong), .NET Framework produce una excepcin DivideByZeroException. En operaciones de divisin en tipos de datos Decimal o Single, .NET Framework tambin produce una excepcin DivideByZeroException. En las divisiones de punto flotante que impliquen el tipo de datos Double, no se produce ninguna excepcin y el resultado es el miembro de clase que representa NaN, PositiveInfinity o NegativeInfinity, dependiendo del dividendo. La siguiente tabla resume los diferentes resultados de intentar dividir un valor Double por cero.

Tipo de datos del dividendo Double

Tipo de datos del Valor del divisor dividendo Double 0

Resultado NaN (no es un nmero definido matemticamente) PositiveInfinity NegativeInfinity

Double Double

Double Double

>0 <0

Cuando se detecta una excepcin DivideByZeroException, puede utilizar los miembros de la excepcin para controlarla. Por ejemplo, la propiedad Message contiene el texto del mensaje de la excepcin. Para obtener ms informacin, vea Informacin general sobre el control estructurado de excepciones de Visual Basic. Operaciones de desplazamiento de bits Una operacin de desplazamiento de bits realiza un desplazamiento aritmtico sobre un modelo de bits. El patrn est contenido en el operando de la izquierda, mientras que el operando de la derecha especifica el nmero de posiciones que debe desplazarse el modelo. Puede desplazar el modelo a la derecha con >> (Operador, Visual Basic) o a la izquierda con << (Operador, Visual Basic). El tipo de datos del operando del modelo debe ser SByte, Byte, Short, UShort, Integer, UInteger, Long o ULong. El tipo de datos del operando de cantidad de desplazamiento debe ser Integer o se debe ampliar a Integer. Los desplazamientos aritmticos no son circulares, lo que significa que los bits desplazados a un extremo del resultado no se vuelven a introducir en el otro extremo. Las posiciones de bits que quedan vacantes debido a un desplazamiento se establecen de la siguiente manera:

0 para un desplazamiento aritmtico a la izquierda 0 para un desplazamiento aritmtico a la derecha de un nmero positivo 0 para un desplazamiento aritmtico a la derecha de un tipo de datos sin signo (Byte, UShort, UInteger, ULong) 1 para un desplazamiento aritmtico a la derecha de un nmero negativo (SByte, Short, Integer o Long)

El ejemplo siguiente desplaza un valor Integer tanto a la izquierda como a la derecha. Visual Basic Copiar cdigo

Dim lResult, rResult As Integer Dim pattern As Integer = 12 ' The low-order bits of pattern are 0000 1100. lResult = pattern << 3 ' A left shift of 3 bits produces a value of 96. rResult = pattern >> 2 ' A right shift of 2 bits produces value of 3.
Los desplazamientos aritmticos nunca generan excepciones de desbordamiento. Operaciones bit a bit Adems de ser operadores lgicos, Not, Or, And y Xor tambin realizan operaciones aritmticas bit a bit cuando se utilizan en valores numricos. Para obtener ms informacin, vea "Operaciones bit a bit" en Operadores lgicos y bit a bit en Visual Basic.

Seguridad de tipos Normalmente, los operandos deben ser del mismo tipo. Por ejemplo, si est realizando sumas con una variable Integer, debe sumarla a otra variable Integer y asignar el resultado a una variable que tambin sea del tipo Integer. Una manera de asegurar unas buenas prcticas de codificacin con seguridad de tipos consiste en usar la Option Strict (Instruccin). Si establece Option Strict On, Visual Basic realiza automticamente las conversiones con seguridad de tipos. Por ejemplo, si intenta agregar una variable Integer a una variable Double y asignar el valor a una variable de tipo Double, la operacin se realizar normalmente, porque un valor Integer puede convertirse a Double sin prdida de datos. Por otra parte, las conversiones no seguras de tipos, causan un error del compilador con Option Strict On. Por ejemplo, si intenta agregar una variable Integer a una variable Double y asignar el valor a la variable Integer, se produce un error del compilador, porque una variable Double no se puede convertir implcitamente al tipo Integer. Sin embargo, si establece Option Strict Off, Visual Basic permite que se efecten conversiones implcitas de restriccin, aunque pueden dar como resultado la prdida inesperada de datos o de precisin. Por esta razn, es recomendable utilizar Option Strict On al escribir el cdigo de produccin. Para obtener ms informacin, vea Conversiones de ampliacin y de restriccin.

Operadores de comparacin en Visual Basic


Los operadores de comparacin comparan dos expresiones y devuelven un valor Boolean que representa la relacin entre sus valores. Existen operadores para comparar valores numricos, operadores para comparar cadenas y operadores para comparar objetos. Los tres tipos de operadores se describen a continuacin. Comparar valores numricos Visual Basic compara valores numricos mediante seis operadores de comparacin numricos. Cada operador toma como operandos dos expresiones que se evalan como valores numricos. La tabla siguiente enumera los operadores y muestra ejemplos de cada uno. Operador = (Igualdad) Condicin que prueba Es igual el valor de la primera expresin que el de la segunda? Ejemplos

23 = 33 ' False 23 = 23 ' True 23 = 12 ' False

<> (Desigualdad)

Es distinto el valor de la primera expresin del valor de la segunda?

23 <> 33 ' True 23 <> 23 ' False 23 <> 12 ' True

< (Menor que)

Es el valor de la primera expresin menor que el valor de la segunda?

23 < 33 ' True 23 < 23 ' False 23 < 12 ' False

> (Mayor que)

Es el valor de la primera expresin mayor que el valor de la segunda?

23 > 33 ' False 23 > 23 ' False 23 > 12 ' True

<= (Menor o igual que)

Es el valor de la primera expresin menor o igual que el valor de la segunda?

23 <= 33 ' True 23 <= 23 ' True 23 <= 12 ' False

>= (Mayor o igual que)

Es el valor de la primera expresin mayor o igual que el valor de la segunda?

23 >= 33 ' False 23 >= 23 ' True 23 >= 12 ' True

Comparar cadenas Visual Basic compara cadenas mediante Like (operador, Visual Basic) as como los operadores de comparacin numricos. El operador Like le permite especificar un modelo. La cadena se compara a continuacin contra el modelo y si coincide, el resultado es True. De lo contrario, el resultado es False. Los operadores numricos permiten comparar valores String basndose en su criterio de ordenacin, como se indica en el ejemplo siguiente:

"73" < "9" ' The result of the preceding comparison is True.
El resultado del ejemplo anterior es True porque el primer carcter de la primera cadena se ordena antes que el primer carcter de la segunda cadena. Si los primeros caracteres fueran iguales, la comparacin continuara con el siguiente carcter de las dos cadenas, y as sucesivamente. Tambin puede probar la igualdad de cadenas utilizando al operador de igualdad, como se puede ver en el ejemplo siguiente.

"734" = "734" ' The result of the preceding comparison is True.


Si una cadena es un prefijo de otra, como "aa" y "aaa", la cadena ms larga se considera mayor que la ms corta. Esto se ilustra en el siguiente ejemplo:

"aaa" > "aa" ' The result of the preceding comparison is True.
El criterio de ordenacin se basar en una comparacin binaria o una comparacin textual, en funcin del valor de Option Compare. Para obtener ms informacin, vea Option Compare (Instruccin). Comparar objetos Visual Basic compara dos variables de referencia a objeto con Is (Operador, Visual Basic) e IsNot (Operador). Puede utilizar cualquiera de estos operadores para determinar si las dos variables de referencia se refieren a la misma instancia de objeto. Esto se ilustra en el siguiente ejemplo: Visual Basic

Copiar cdigo

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, x Is y se evala como True, porque ambas variables se refieren a la misma instancia. Compare este resultado con el del ejemplo siguiente. Visual Basic Copiar cdigo

Dim x As New customer() Dim y As New customer() If x Is y Then ' Insert code to run if x and y point to the same instance. End If
En el ejemplo anterior, x Is y se evala como False, porque aunque las variables hacen referencia a objetos del mismo tipo, se refieren a distintas instancias de ese tipo. Cuando desee probar dos objetos que no sealan a la misma instancia, el operador IsNot permite evitar una combinacin gramaticalmente torpe de Not e Is. Esto se ilustra en el siguiente ejemplo: Visual Basic Copiar cdigo

Dim a As New Dim b As New If a IsNot b ' Insert End If

classA() classB() Then code to run if a and b point to different instances.

En el ejemplo anterior, If a IsNot b es equivalente a If Not a Is b. Comparar tipos de objetos Para probar si un objeto es de un tipo concreto se puede utilizar la expresin TypeOf...Is. La sintaxis es la siguiente:

TypeOf <objectexpression> Is <typename>


Cuando typename especifica un tipo de interfaz, la expresin TypeOf...Is devuelve True si el objeto implementa el tipo de interfaz. Cuando typename es un tipo de clase, la expresin devuelve True si el objeto es una instancia de la clase especificada o de una clase que se deriva de la clase especificada. Esto se ilustra en el siguiente ejemplo: Visual Basic Copiar cdigo

Dim x As System.Windows.Forms.Button x = New System.Windows.Forms.Button() If TypeOf x Is System.Windows.Forms.Control Then ' Insert code to run if x is of type System.Windows.Forms.Control. End If
En el ejemplo anterior, la expresin TypeOf x Is Control se evala como True porque el tipo de x es

Button, que hereda de Control.


Para obtener ms informacin, vea TypeOf (Operador, Visual Basic).

Cmo: Comprobar si dos objetos son iguales


Si hay dos variables que hacen referencia a objetos, se puede utilizar el operador Is o IsNot, o ambos, para determinar si hacen referencia a la misma instancia.

Para probar si dos objetos son el mismo

Utilice el operador Is (Operador, Visual Basic) o IsNot (Operador) con las dos variables como operandos. Visual Basic Copiar cdigo

Public Sub processControl(ByVal f As System.Windows.Forms.Form, _ ByVal c As System.Windows.Forms.Control) Dim active As System.Windows.Forms.Control = f.ActiveControl If (active IsNot Nothing) And (c Is active) Then ' Insert code to process control c End If Return End Sub
Podra ser conveniente tomar ciertas medidas que dependen de si los dos objetos hacen referencia a la misma instancia. En el ejemplo anterior se compara el control c con el control activo en el formulario f. Si no hay un control activo o hay uno que no es la misma instancia de control que c, la instruccin If genera un error y se vuelve al procedimiento sin procesar la instruccin. El uso de Is o IsNot es una cuestin de preferencias personales. Uno podra ser ms fcil de leer que el otro en una expresin determinada.

Cmo: Comprobar si una cadena coincide con un modelo


Si desea averiguar si una expresin de String (Tipo de datos, Visual Basic) satisface un modelo, puede utilizar el Like (operador, Visual Basic). Like toma dos operandos. El operando izquierdo es una expresin de cadena, y el operando derecho es una cadena que contiene el modelo que se debe utilizar para la equivalencia. Like devuelve un valor Boolean que indica que la expresin de cadena se atiene al modelo. Puede hacer coincidir cada carcter de la expresin de cadena con un carcter concreto, un carcter comodn, una lista de caracteres o un intervalo de caracteres. Las posiciones de las especificaciones de la cadena modelo corresponden con las posiciones de los caracteres que se deben hacer coincidir en la expresin de cadena.

Para hacer coincidir un carcter de la expresin de cadena con respecto a un carcter concreto

Coloque directamente el carcter concreto en la cadena del modelo. Ciertos caracteres especiales se deben incluir entre corchetes ([ ]). Para obtener ms informacin, vea Like (operador, Visual Basic). El ejemplo siguiente prueba si myString consta exactamente del carcter individual H. Visual Basic Copiar cdigo

Dim sMatch As Boolean = myString Like "H"

Para hacer coincidir un carcter de la expresin de cadena con respecto a un carcter comodn

Coloque un signo de interrogacin (?) en la cadena del modelo. Cualquier carcter vlido para esta posicin obtiene una coincidencia correcta. El ejemplo siguiente prueba si myString est compuesto del carcter individual W seguido de exactamente dos caracteres de cualquier valor. Visual Basic Copiar cdigo

Dim sMatch As Boolean = myString Like "W??"

Para hacer coincidir un carcter de la expresin de cadena con respecto a una lista de caracteres

Coloque corchetes ([ ]) en la cadena del modelo y, dentro de los corchetes, coloque la lista de caracteres. No separe los caracteres con comas ni con cualquier otro separador. Cualquier carcter individual en la lista consigue una coincidencia correcta. El ejemplo siguiente prueba si myString est compuesto de cualquier carcter vlido seguido por exactamente uno de los caracteres A, C o E. Visual Basic Copiar cdigo

Dim sMatch As Boolean = myString Like "?[ACE]"


Tenga en cuenta que esta coincidencia distingue entre maysculas y minsculas.

Para hacer coincidir un carcter de la expresin de cadena con respecto a un intervalo de caracteres

Coloque corchetes ([ ]) en la cadena del modelo y, dentro de los corchetes, coloque el primer y el ltimo caracteres del intervalo, separados por un guin (). Cualquier carcter individual contenido en del intervalo obtiene una coincidencia correcta. El ejemplo siguiente prueba si myString incluye los caracteres num seguidos por exactamente uno de los caracteres i, j, k, l, m o n. Visual Basic Copiar cdigo

Dim sMatch As Boolean = myString Like "num[i-m]"


Tenga en cuenta que esta coincidencia distingue entre maysculas y minsculas. Coincidencia de cadenas vacas Like trata la secuencia [] como una cadena de longitud cero (""). Puede utilizar [] para probar si toda la expresin de cadena est vaca, pero no para probar si una posicin concreta de la expresin de cadena est vaca. Si una posicin vaca es una de las opciones que necesita comprobar, puede utilizar Like ms de una vez.

Para hacer coincidir un carcter de la expresin de cadena con respecto a una lista de caracteres o con ningn carcter

1.

Llame dos veces al operador Like en la misma expresin de cadena y conecte las dos llamadas con Or (Operador, Visual Basic) u OrElse (Operador).

2.

En la cadena del modelo para la primera clusula Like, incluya la lista de caracteres, encerrndola entre corchetes ([ ]).

3.

En la cadena del modelo para la segunda clusula Like, no coloque ningn carcter en la posicin en cuestin. El ejemplo siguiente prueba el nmero de telfono de siete dgitos phoneNum para ver si est formado exactamente por tres nmeros seguidos por un espacio, un guin (), un punto (.) o ningn carcter, seguidos exactamente por cuatro nmeros.

Visual Basic Copiar cdigo

Dim sMatch As Boolean = _ (phoneNum Like "###[ -.]####") OrElse (phoneNum Like "#######")

Operadores de concatenacin en Visual Basic


Los operadores de concatenacin combinan varias cadenas en una sola. Hay dos operadores de concatenacin: + y &. Los dos realizan la operacin de concatenacin bsica, como se muestra en el ejemplo siguiente. Visual Basic Copiar cdigo

Dim x As String = "Con" & "caten" & "ation" Dim y As String = "Con" + "caten" + "ation" ' The preceding statements set both x and y to "Concatenation".
Estos operadores tambin concatenan variables String, como en el ejemplo siguiente. Visual Basic Copiar cdigo

Dim a Dim d Dim z Dim w ' The

As String As String As String As String preceding

= "abc" = "def" = a & d = a + d statements set both z and w to "abcdef".

Diferencias entre los dos operadores de concatenacin El + (Operador, Visual Basic) tiene la finalidad principal de sumar dos nmeros. Sin embargo, tambin puede concatenar operandos numricos con operandos de cadena. El operador + tiene un conjunto complejo de reglas que determinan si se debe sumar, concatenar, sealar un error del compilador o producir una excepcin InvalidCastException en tiempo de ejecucin. El & (Operador, Visual Basic) slo se define para operandos de tipo String y siempre ampla sus operandos a String, independientemente de la configuracin de Option Strict. El operador & est recomendado para la concatenacin de cadenas, porque est definido exclusivamente para cadenas y reduce las posibilidades de generar una conversin no deseada. Rendimiento: String y StringBuilder Si se realiza un nmero significativo de manipulaciones en una cadena, como concatenaciones, eliminaciones y sustituciones, el rendimiento puede beneficiarse de la clase StringBuilder del espacio de nombres System.Text. La creacin e inicializacin de un objeto StringBuilder requiere una instruccin adicional y otra instruccin ms para convertir su valor final en un valor de tipo String, pero en este caso se puede recuperar porque StringBuilder puede ejecutarse ms rpidamente.

Operadores lgicos y bit a bit en Visual Basic


Los operadores lgicos comparan expresiones Boolean y devuelven un resultado Boolean. Los operadores And, Or, AndAlso, OrElse y Xor son binarios porque toman dos operandos, mientras que el operador Not es unario porque toma un solo operando. Algunos de estos operadores tambin pueden realizar operaciones lgicas bit a bit en valores enteros. Operador lgico unario El Not (Operador, Visual Basic) realiza la negacin lgica en una expresin Boolean. Produce el contrario lgico de su operando. Si la expresin se evala como True, Not devuelve False; si la expresin se evala como False, Not devuelve True. Esto se ilustra en el siguiente ejemplo: Visual Basic Copiar cdigo

Dim x, y As Boolean x = Not 23 > 14 y = Not 23 > 67 ' The preceding statements set x to False and y to True.
Operadores lgicos binarios El And (Operador, Visual Basic) realiza la conjuncin lgica de dos expresiones Boolean. Si ambas expresiones se evalan como True, And devuelve True. Si al menos una de las expresiones se evala como False, And devuelve False. El Or (Operador, Visual Basic) realiza la disyuncin o inclusin lgicas de dos expresiones Boolean. Si una de las expresiones o ambas se evalan como True, Or devuelve True. Si ninguna de las expresiones se evala como True, Or devuelve False. Xor (Operador, Visual Basic) realiza la exclusin lgica de dos expresiones Boolean. Si exactamente una expresin, pero no ambas, se evala como True, Xor devuelve True. Si ambas expresiones se evalan como True o como False, Xor devuelve False. En el siguiente ejemplo se muestra cmo utilizar los operadores And, Or y Xor. Visual Basic Copiar cdigo

Dim a, b, c, d, e, f, g As Boolean a = 23 > 14 And 11 > 8 b = 14 > 23 And 11 > 8 ' The preceding statements set a to True and b to False. c = 23 > 14 Or 8 > 11 d = 23 > 67 Or 8 > 11 ' The preceding statements set c to True and d to False. e = 23 > 67 Xor f = 23 > 14 Xor g = 14 > 23 Xor ' The preceding False. 11 > 8 11 > 8 8 > 11 statements set e to True, f to False, and g to

Cortocircuitar las operaciones lgicas El AndAlso (Operador) es muy similar al operador And, ya que tambin realiza la conjuncin lgica de dos expresiones Boolean. La diferencia clave entre ambos es que AndAlso presenta un comportamiento de evaluacin "cortocircuitada". Si la primera parte de una expresin AndAlso se evala como False, la segunda parte de la expresin no se evala porque no puede modificar el resultado final y AndAlso devuelve False.

De igual forma, el OrElse (Operador) realiza la disyuncin lgica de evaluacin cortocircuitada de dos expresiones Boolean. Si la primera parte de una expresin OrElse se evala como True, la segunda parte de la expresin no se evala porque no puede modificar el resultado final y OrElse devuelve True. Inconvenientes de las evaluaciones cortocircuitadas Cortocircuitar puede mejorar el rendimiento ya que no se evala una expresin que no puede modificar el resultado de la operacin lgica. Sin embargo, si esa expresin realiza acciones adicionales, al cortocircuitar se pasan por alto esas acciones. Por ejemplo, si la expresin incluye una llamada a un procedimiento Function, no se llama a ese procedimiento si la expresin se cortocircuita y el cdigo adicional incluido en Function no se ejecuta. Si la lgica del programa depende de algn cdigo adicional, debe evitar probablemente los operadores de evaluacin cortocircuitada. En el ejemplo siguiente se muestra la diferencia entre And, Or y sus homlogos de evaluacin cortocircuitada. Visual Basic Copiar cdigo

Dim amount As Integer = 12 Dim highestAllowed As Integer = 45 Dim grandTotal As Integer


Visual Basic Copiar cdigo

If amount ' The End If If amount ' The End If If amount ' The End If If amount ' The End If

> highestAllowed And checkIfValid(amount) Then preceding statement calls checkIfValid(). > highestAllowed AndAlso checkIfValid(amount) Then preceding statement does not call checkIfValid(). < highestAllowed Or checkIfValid(amount) Then preceding statement calls checkIfValid(). < highestAllowed OrElse checkIfValid(amount) Then preceding statement does not call checkIfValid().

Visual Basic Copiar cdigo

Function checkIfValid(ByVal checkValue As Integer) As Boolean If checkValue > 15 Then MsgBox(CStr(checkValue) & " is not a valid value.") ' The MsgBox warning is not displayed if the call to ' checkIfValid() is part of a short-circuited expression. Return False Else grandTotal += checkValue ' The grandTotal value is not updated if the call to ' checkIfValid() is part of a short-circuited expression. Return True End If End Function
En el ejemplo anterior, observe que una parte de cdigo importante dentro de checkIfValid() no se ejecuta cuando se cortocircuita la llamada. La primera instruccin If llama a checkIfValid() aunque

12 > 45 devuelve False, porque And no cortocircuita. La segunda instruccin If no llama a checkIfValid(), porque cuando 12 > 45 devuelve False, AndAlso cortocircuita la segunda expresin. La tercera instruccin If llama a checkIfValid() aunque 12 < 45 devuelve True, porque Or no
cortocircuita. La cuarta instruccin If no llama a checkIfValid(), porque cuando 12 < 45 devuelve True, OrElse cortocircuita la segunda expresin.

Operaciones bit a bit Las operaciones bit a bit evalan dos valores enteros en formato binario (base 2). Comparan los bits en las posiciones correspondientes y, a continuacin, asignan valores basados en la comparacin. En el siguiente ejemplo se muestra cmo se utiliza el operador And. Copiar cdigo

Dim x As Integer x = 3 And 5


El ejemplo anterior establece el valor de x en 1. Esto ocurre por las razones siguientes:

Los valores se tratan como binarios: 3 en formato binario = 011 5 en formato binario = 101

El operador And compara las representaciones binarias, una posicin binaria (bit) a la vez. Si los dos bits en una posicin dada son 1, entonces se coloca un 1 en esa posicin del resultado. Si uno de los dos bits es 0, entonces se coloca un 0 en esa posicin del resultado. En el ejemplo anterior, esto funciona como sigue: 011 (3 en formato binario) 101 (5 en formato binario) 001 (el resultado, en formato binario)

El resultado se trata como decimal. El valor 001 es la representacin binaria de 1, por lo que x = 1.

La operacin Or bit a bit es similar, excepto en que se asigna 1 al bit resultante si cualquiera de los bits comparados es 1. Xor asigna 1 al bit del resultado si slo uno de los bits comparados (no ambos) es 1. Not acepta un solo operando e invierte todos los bits, incluido el bit de signo, y asigna ese valor al resultado. Esto significa que para nmeros positivos sin signo, Not siempre devuelve un valor negativo y, para nmeros negativos, Not siempre devuelve un valor positivo o cero. Los operadores AndAlso y OrElse no admiten las operaciones bit a bit.

Nota: Las operaciones bit a bit slo se pueden realizar en tipos enteros. Los valores de punto flotante deben convertirse a tipos enteros para que la operacin bit a bit pueda proseguir.

Combinacin eficaz de operadores


Las expresiones complejas pueden contener muchos operadores diferentes. Esto se ilustra en el siguiente ejemplo:

x = (45 * (y + z)) ^ (2 / 85) * 5 + z


La creacin de expresiones complejas como la del ejemplo anterior requiere comprender a fondo las reglas de prioridad de operador. Para obtener ms informacin, vea Prioridad de operador en Visual Basic. Expresiones entre parntesis A menudo, desea que las operaciones se realicen en un orden diferente del que determina la prioridad de operador. Considere el ejemplo siguiente.

x = z * y + 4

El ejemplo anterior multiplica z por y y suma el resultado a 4. Si desea sumar y y 4 antes de multiplicar el resultado por z, puede anular la prioridad de operadores normal utilizando parntesis. Si escribe una expresin entre parntesis, fuerza a que dicha expresin se evale primero, independientemente de la prioridad de operador. Para indicar que en el ejemplo anterior se lleve a cabo la suma en primer lugar, podra reescribirlo como en el ejemplo siguiente.

x = z * (y + 4)
El ejemplo anterior suma y y 4 y, a continuacin, multiplica esa suma por z. Expresiones entre parntesis anidadas Puede anidar expresiones en varios niveles de parntesis para anular todava ms la prioridad. La expresin en el ltimo nivel de anidacin entre parntesis se evala en primer lugar, despus la siguiente expresin ms anidada y as sucesivamente hasta el ltimo nivel de anidacin; por ltimo, se evalan las expresiones situadas fuera de los parntesis. Esto se ilustra en el siguiente ejemplo:

x = (z * 4) ^ (y * (z + 2))
En el ejemplo anterior, se evala z + 2 en primer lugar y, a continuacin, las otras expresiones entre parntesis. La exponenciacin, que generalmente tiene mayor prioridad que la suma o la multiplicacin, se evala en ltimo lugar debido a que las dems expresiones estn escritas entre parntesis.

Cmo: Calcular valores numricos


Puede calcular valores numricos mediante el uso de expresiones numricas. Una expresin numrica es una expresin que contiene literales, constantes y variables que representan valores numricos, y operadores que actan sobre esos valores. Calcular valores numricos

Para calcular un valor numrico

Combine uno o ms literales, constantes y variables numricos en una expresin numrica. El ejemplo siguiente muestra algunas expresiones numricas vlidas.

93.217 System.Math.PI counter 4 * (67 + i)


Las tres primeras lneas muestran un literal, una constante y una variable. Cada uno forma una expresin numrica vlida por s mismo. La lnea final muestra una combinacin de una variable con dos literales. Observe que una expresin numrica no forma una instruccin de Visual Basic completa por s misma. Debe utilizar la expresin como parte de una instruccin completa.

Para almacenar un valor numrico

Puede utilizar una instruccin de asignacin para asignar el valor representado por una expresin numrica a una variable, como se muestra en el ejemplo siguiente. Visual Basic Copiar cdigo

Dim i As Integer = 2 Dim j As Integer j = 4 * (67 + i)


En el ejemplo anterior, el valor de la expresin situada a la derecha del operador igual (=) se asigna a la variable j situada a la izquierda del operador, por lo que j da como resultado 276.

Para obtener ms informacin, vea Instrucciones de asignacin.

Varios operadores Si la expresin numrica contiene ms de un operador, el orden en que se evalan lo determina las reglas de prioridad de operador. Para anular las reglas de prioridad de operador, las expresiones se escriben entre parntesis, como en el ejemplo anterior; estas expresiones se evalan primero.

Para reemplazar la prioridad normal de operadores

Utilice parntesis para indicar las operaciones que desea efectuar en primer lugar. En el ejemplo siguiente se muestran dos resultados diferentes con los mismos operandos y operadores. Visual Basic Copiar cdigo

Dim Dim j = k =

i As Integer = 2 j, k As Integer 4 * (67 + i) 4 * 67 + i

En el ejemplo anterior, el clculo de j ejecuta el operador de suma (+) en primer lugar debido a que los parntesis en (67 + i) anulan la prioridad normal, por lo que el valor asignado a j es 276 (4 por 69). El clculo de k ejecuta los operadores con su prioridad normal (* antes de +), por lo que el valor asignado a k es 270 (268 ms 2).

Para obtener ms informacin, vea Prioridad de operador en Visual Basic.

Comparaciones de valores
Los operadores de comparacin pueden utilizarse para construir expresiones que comparan los valores de variables numricas. Estas expresiones devuelven un valor Boolean que depende de si la comparacin es verdadera o falsa. A continuacin se exponen ejemplos de estas expresiones.

45 > 26 26 > 45
La primera expresin se evala como True, porque 45 es mayor que 26. El segundo ejemplo se evala como False, porque 26 no es mayor que 45. Tambin puede comparar cualquier par de expresiones numricas de este modo. Las expresiones comparadas pueden ser complejas, como en el siguiente ejemplo:

x / 45 * (y +17) >= System.Math.Sqrt(z) / (p - (x * 16))


Esta expresin compleja incluye literales, variables y llamadas a funciones. Se evalan las expresiones especificadas a ambos lados del operador de comparacin y los valores resultantes se comparan mediante el operador de comparacin >=. Si el valor de la expresin de la izquierda es mayor o igual que el valor de la expresin de la derecha, la evaluacin de la expresin completa devuelve True; de lo contrario, devuelve False.

Las expresiones que comparan valores se utilizan con frecuencia en construcciones If...Then, como en el siguiente ejemplo.

Visual Basic Copiar cdigo

If x > 50 Then ' Insert code to run if x is greater than 50. Else ' Insert code to run if x is less than or equal to 50. End If

El signo = es un operador de comparacin, adems de un operador de asignacin. Cuando se utiliza como operador de comparacin, evala si el valor de la izquierda es igual que el valor de la derecha, como se muestra en el siguiente ejemplo.

Visual Basic Copiar cdigo

If x = 50 Then ' Insert code to continue program. End If

Una expresin de comparacin tambin se puede utilizar all donde sea necesario un valor Boolean, como en una instruccin If, While, Loop, ElseIf, o cuando se asigna o se pasa un valor a una variable Boolean. En el siguiente ejemplo, el valor devuelto por la expresin de comparacin se asigna a una variable Boolean.

Visual Basic Copiar cdigo

Dim x As Boolean x = 50 < 30 ' The preceding statement assigns False to x.

Expresiones booleanas
Una expresin booleana es una expresin que se evala como un valor del Tipo de datos booleano. Las expresiones Boolean pueden tener varias formas. La ms simple es la comparacin directa del valor de una variable Boolean con un literal Boolean, como se muestra en el ejemplo siguiente: Visual Basic Copiar cdigo

If newCustomer = True Then ' Insert code to execute if newCustomer = True. Else ' Insert code to execute if newCustomer = False. End If
Dos significados del operador = Tenga en cuenta que la instruccin de asignacin newCustomer = True tiene la misma apariencia que la expresin del ejemplo anterior, pero realiza funciones diferentes y se utiliza de forma distinta. En el ejemplo anterior, la expresin newCustomer = True representa un valor booleano y el signo = se interpreta como un operador de comparacin. En una instruccin independiente, el signo = se interpretara como operador de asignacin y asignara el valor de la derecha a la variable de la izquierda. Esto se ilustra en el siguiente ejemplo: Visual Basic Copiar cdigo

If newCustomer = True Then newCustomer = False End If

Para obtener ms informacin, vea Comparaciones de valores e Instrucciones de asignacin. Operadores de comparacin Los operadores de comparacin como =, <, >, <>, <= y >= producen expresiones booleanas, comparan la expresin situada a la izquierda del operador con la situada a la derecha y evalan el resultado como True o False. Esto se ilustra en el siguiente ejemplo:

42 < 81
Dado que 42 es menor que 81, la expresin booleana del ejemplo anterior se evala como True. Para obtener ms informacin sobre este tipo de expresin, vea Comparaciones de valores. Operadores de comparacin combinados con operadores lgicos Las expresiones de comparacin se pueden combinar con operadores lgicos para producir expresiones booleanas ms complejas. En el ejemplo siguiente se muestra el uso de operadores de comparacin junto con un operador lgico.

x > y And x < 1000


En el ejemplo anterior, el valor de toda la expresin depende de los valores de las expresiones especificadas a cada lado del operador And. Si las dos expresiones son True, toda la expresin se evala como True. Si una de las expresiones es False, toda la expresin se evala como False. Operadores de evaluacin "cortocircuitada" Los operadores lgicos AndAlso y OrElse exhiben un comportamiento conocido como evaluacin cortocircuitada. Un operador de evaluacin cortocircuitada evala primero el operando de la izquierda. Si el operando de la izquierda determina el valor de la expresin completa, la ejecucin del programa contina sin evaluar la expresin de la derecha. Esto se ilustra en el siguiente ejemplo: Visual Basic Copiar cdigo

If 45 < 12 AndAlso testFunction(3) = 81 Then ' Add code to continue execution. End If
En el ejemplo anterior, el operador evala la expresin de la izquierda, 45 < 12. Dado que la expresin de la izquierda se evala como False, la expresin lgica completa se debe evaluar como False. Por tanto el programa pasa por alto la ejecucin del cdigo del bloque If sin evaluar la expresin de la derecha,

testFunction(3). Este ejemplo no llama a testFunction() porque la expresin de la izquierda hace


que toda la expresin se evale como False. De forma similar, si la expresin de la izquierda en una expresin lgica que utiliza OrElse se evala como True, la ejecucin prosigue con la siguiente lnea de cdigo sin evaluar la expresin de la derecha, puesto que la expresin de la izquierda ya ha validado toda la expresin. Comparacin con operadores que no cortocircuitan Por el contrario, cuando se utilizan los operadores lgicos And y Or, se evalan los dos lados de la expresin. Esto se ilustra en el siguiente ejemplo: Visual Basic Copiar cdigo

If 45 < 12 And testFunction(3) = 81 Then ' Add code to continue execution. End If
El ejemplo anterior llama a testFunction() aunque la expresin de la izquierda se evale como False.

Expresiones entre parntesis Pueden utilizarse parntesis para controlar la evaluacin de expresiones booleanas. Las expresiones entre parntesis se evalan primero. En el caso de mltiples niveles de anidamiento, se garantiza la prioridad de las expresiones anidadas a mayor profundidad. Dentro de los parntesis, la evaluacin se lleva a cabo segn las reglas de prioridad de operador. Para obtener ms informacin, vea Prioridad de operador en Visual Basic.

Instrucciones en Visual Basic


En Visual Basic, una instruccin es una comando completo que puede contener palabras clave, operadores, variables, constantes y expresiones. Las instrucciones se clasifican en dos categoras: instrucciones de declaracin, que asignan nombre a una variable, constante o procedimiento, y tambin pueden especificar un tipo de datos, e instrucciones ejecutables, que inician acciones.

Informacin general sobre las instrucciones


En Visual Basic, una instruccin es una instruccin completa. Puede contener palabras clave, operadores, variables, constantes y expresiones. Cada instruccin pertenece a una de las categoras siguientes:

Instrucciones de declaracin, que dan nombre a una variable, constante o procedimiento y tambin pueden especificar un tipo de datos. Instrucciones ejecutables, que inician acciones. Estas instrucciones pueden llamar a un mtodo o funcin, y pueden recorrer bloques de cdigo o bifurcar a otro bloque de cdigo. Las instrucciones ejecutables incluyen instrucciones de asignacin, que asignan un valor o expresin a una variable o constante.

Colocar varias instrucciones en una lnea Se pueden tener varias instrucciones en una sola lnea separadas por el carcter de dos puntos (:). Esto se ilustra en el siguiente ejemplo: Visual Basic Copiar cdigo

Dim sampleString As String = "Hello World" : MsgBox(sampleString)


Aunque ocasionalmente puede resultar conveniente, esta forma de sintaxis dificulta la lectura y el mantenimiento del cdigo. Por tanto, se recomienda mantener una instruccin por lnea. Continuar una instruccin en varias lneas Normalmente, una lnea suele ser suficiente para una instruccin, pero si la instruccin es demasiado larga, se puede continuar en la siguiente lnea mediante una secuencia de continuacin de lnea, que est compuesta por un espacio seguido de un carcter de subrayado (_) y de un retorno de carro. En el siguiente ejemplo, la instruccin ejecutable MsgBox contina en ms de dos lneas. Visual Basic Copiar cdigo

Public Sub demoBox() Dim nameVar As String nameVar = "John" MsgBox("Hello " & nameVar & _ ". How are you?") End Sub
Agregar comentarios El cdigo fuente no es siempre fcil de entender, ni siquiera para el programador que lo escribi. Por consiguiente, como ayuda para documentar el cdigo, la mayora de los programadores utilizan

libremente comentarios incrustados. Los comentarios del cdigo pueden explicar un procedimiento o una instruccin concreta a cualquiera que los lea o trabaje con ellos posteriormente. Visual Basic omite los comentarios durante la compilacin y no afectan al cdigo compilado. Las lneas de comentario comienzan con un apstrofo (') o REM seguido de un espacio. Se pueden agregar en cualquier parte del cdigo, excepto en una cadena. Para anexar un comentario a una instruccin, inserte un apstrofo o REM despus de la instruccin, seguido del comentario. Los comentarios tambin pueden escribirse separados en una lnea propia. En el ejemplo siguiente se muestran estas posibilidades. Visual Basic Copiar cdigo

' 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.
Comprobar errores de compilacin Si despus de escribir una lnea de cdigo, la lnea se muestra con un subrayado azul con lneas onduladas (tambin puede mostrarse un mensaje de error), la instruccin contiene un error de sintaxis. Debe averiguar cul es el problema en la instruccin y corregirlo; para ello, busque en la lista de tareas o pase el puntero del mouse (ratn) sobre el error y lea el mensaje de error). Mientras no corrija todos los errores de sintaxis del cdigo, el programa no se compilar correctamente.

Instrucciones de asignacin
Las instrucciones de asignacin realizan operaciones de asignacin, que consisten en tomar el valor de la derecha del operador de asignacin (=) y almacenarlo en el elemento de la izquierda, como en el ejemplo siguiente. Visual Basic Copiar cdigo

v = 42
En el ejemplo anterior, la instruccin de asignacin almacena el valor literal 42 en la variable v. Elementos de programacin elegibles El elemento de programacin del lado izquierdo del operador de asignacin debe poder aceptar y almacenar un valor. Esto significa que debe ser una variable o propiedad que no es ReadOnly (Visual Basic), o debe ser un elemento de matriz. En el contexto de una instruccin de asignacin, este tipo de elemento a veces se denomina valor l, que significa "valor de la izquierda". El valor del lado derecho del operador de asignacin se genera mediante una expresin que puede estar formada por cualquier combinacin de literales, constantes, variables, propiedades, elementos de matriz, otras expresiones o llamadas a funcin. Esto se ilustra en el siguiente ejemplo: Visual Basic Copiar cdigo

x = y + z + findResult(3)
En el ejemplo anterior se agrega el valor almacenado en la variable y al valor almacenado en la variable

z y, a continuacin, se agrega el valor que devuelve la llamada a la funcin findResult. El valor total de esta expresin se almacena en la variable x.
Tipos de datos en instrucciones de asignacin Adems de valores numricos, el operador de asignacin tambin puede asignar valores String, tal como muestra el ejemplo siguiente.

Visual Basic Copiar cdigo

Dim a, b As String a = "String variable assignment" b = "Con" & "cat" & "enation" ' The preceding statement assigns the value "Concatenation" to b.
Tambin se pueden asignar valores Boolean utilizando un literal Boolean o una expresin Boolean, tal como muestra el ejemplo siguiente. Visual Basic Copiar cdigo

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.
Igualmente, se pueden asignar valores adecuados a elementos de programacin del tipo de datos Char, Date u Object. Tambin se puede asignar una instancia de objeto a un elemento declarado como miembro de la clase a partir de la que se crea esa instancia. Instrucciones de asignacin compuesta Las instrucciones de asignacin compuesta realizan primero una operacin en una expresin antes de asignarla a un elemento de programacin. En el siguiente ejemplo se muestra uno de estos operadores, +=, que incrementa el valor de la variable del lado izquierdo del operador con el valor de la expresin de la derecha. Visual Basic Copiar cdigo

n += 1
En el ejemplo anterior se suma 1 al valor de n y, a continuacin, el nuevo valor se almacena en n. Es el equivalente abreviado de la siguiente instruccin: Visual Basic Copiar cdigo

n = n + 1
Mediante el uso de este tipo de operadores, puede realizarse una serie de operaciones de asignacin compuestas. Para obtener una lista de estos operadores y ms informacin sobre ellos, vea Operadores de asignacin. El operador de asignacin de concatenacin (&=) es til para agregar una cadena al final de cadenas existentes, como se muestra en este ejemplo. Visual Basic Copiar cdigo

Dim q As String = "Sample " q &= "String" ' q now contains "Sample String".
Conversiones de tipos en instrucciones de asignacin El valor que se asigna a una variable, propiedad o elemento de matriz debe ser de un tipo de datos apropiado para el elemento de destino. En general, hay que intentar generar un valor del mismo tipo de datos que el del elemento de destino. Sin embargo, algunos tipos se pueden convertir en otros tipos durante la asignacin.

Para obtener informacin sobre cmo convertir entre tipos de datos, vea Conversiones de tipos en Visual Basic. En pocas palabras, Visual Basic convierte automticamente un valor de un tipo dado en cualquier otro tipo al que amplia. Una conversin de ampliacin es aquella que siempre se produce en tiempo de ejecucin y no pierde datos. Por ejemplo, Visual Basic convierte un valor Integer en Double cuando es apropiado, porque Integer se amplia a Double. Para obtener ms informacin, vea Conversiones de ampliacin y de restriccin. Las conversiones de restriccin (las que no son de ampliacin) conllevan el riesgo de error o de prdida de datos en tiempo de ejecucin. Las conversiones de restriccin se pueden realizar explcitamente mediante una funcin de conversin de tipos, o se puede indicar al compilador que realice implcitamente todas las conversiones estableciendo Option Strict Off. Para obtener ms informacin, vea Conversiones implcitas y explcitas.

Instrucciones de declaracin en Visual Basic


Las instrucciones de declaracin se utilizan para definir procedimientos, variables, propiedades, matrices y constantes, y asignarles nombre. Cuando se declara un elemento de programacin, tambin se puede definir su tipo de datos, nivel de acceso y mbito. Para obtener ms informacin, vea Caractersticas de los elementos declarados. El siguiente ejemplo contiene tres declaraciones. Visual Basic Copiar cdigo

Public Sub applyFormat() Const limit As Integer = 33 Dim thisWidget As New widget ' Insert code to implement the procedure. End Sub
La primera declaracin es la instruccin Sub. Junto con su instruccin End Sub correspondiente, declara un procedimiento denominado applyFormat. Tambin especifica que applyFormat es Public, lo que quiere decir que cualquier cdigo que pueda hacer referencia a ella, puede tambin llamarla. La segunda declaracin es la instruccin Const, que declara la constante limit, que especifica el tipo de datos Integer y un valor de 33. La tercera declaracin es la instruccin Dim, que declara la variable thisWidget. El tipo de datos es un objeto concreto, especficamente un objeto creado a partir de la clase Widget. Puede declarar una variable para que sea de cualquier tipo de datos elemental o de cualquier tipo de objeto que est expuesto a la aplicacin que est usando. Valores iniciales Cuando se ejecuta el cdigo que contiene una declaracin de instruccin, Visual Basic reserva la memoria requerida para el elemento declarado. Si el elemento contiene un valor, Visual Basic lo inicializa al valor predeterminado para su tipo de datos. Para obtener ms informacin, vea "Comportamiento" en Instruccin Dim (Visual Basic). Puede asignar un valor inicial a una variable como parte de su declaracin, como se puede ver en el ejemplo siguiente. Visual Basic Copiar cdigo

Dim m As Integer = 45 ' The preceding declaration creates m and assigns the value 45 to it.

Si la variable es una variable de objeto, al declararla puede crear de forma explcita una instancia de su clase utilizando la palabra clave New (Visual Basic), como se muestra a continuacin: Visual Basic Copiar cdigo

Dim f As New System.Windows.Forms.Form()


Observe que el valor inicial especificado en una instruccin de declaracin no se asigna a una variable hasta que la ejecucin llega a su instruccin de declaracin. Hasta ese momento, la variable contiene el valor predeterminado para su tipo de datos.

Instrucciones ejecutables
Una instruccin ejecutable realiza una accin. Puede llamar a un procedimiento, bifurcar a otra parte del cdigo, recorrer varias instrucciones con un bucle o evaluar una expresin. Una instruccin de asignacin es un caso especial de una instruccin ejecutable. En el ejemplo siguiente se utiliza una estructura de control If...Then...Else para ejecutar diferentes bloques de cdigo basndose en el valor de una variable. En cada bloque de cdigo, un bucle For...Next se ejecuta un nmero especificado de veces. Visual Basic Copiar cdigo

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
Despus, la instruccin If del ejemplo anterior comprueba el valor del parmetro clockwise. Si el valor es True, llama al mtodo spinClockwise de aWidget. Si el valor es False, llama al mtodo

spinCounterClockwise de aWidget. La estructura de control If...Then...Else finaliza con End If.


El bucle For...Next de cada bloque llama al mtodo adecuado un nmero de veces igual al valor del parmetro revolutions.

Procedimientos en Visual Basic


Un procedimiento es un bloque de instrucciones de Visual Basic incluido entre una instruccin de declaracin (Function, Sub, Operator, Get, Set) y una declaracin End correspondiente. En Visual Basic, todas las instrucciones ejecutables deben incluirse en algn procedimiento. Llamar a un procedimiento Los procedimientos se invocan desde otras partes del cdigo. Esto se conoce como una llamada a procedimiento. Cuando finaliza la ejecucin de un procedimiento, ste devuelve el control al cdigo que lo invoc, que recibe el nombre de cdigo de llamada. El cdigo de llamada es una instruccin o una expresin contenida en una instruccin, que hace referencia al procedimiento por su nombre y le transfiere el control. Volver de un procedimiento

Los procedimientos devuelven el control al cdigo de llamada cuando finalizan su ejecucin. Para ello, puede utilizar Instruccin Return (Visual Basic), la instruccin Instruccin Exit (Visual Basic) apropiada para el procedimiento o la instruccin End (Visual Basic) del procedimiento. El control se devuelve al cdigo de llamada, a continuacin del punto de la llamada al procedimiento.

Con una instruccin Return, el control vuelve inmediatamente al cdigo de llamada. No se ejecutan las instrucciones siguientes a la instruccin Return. Puede tener ms de una instruccin Return en el mismo procedimiento.

Con una instruccin Exit Sub o Exit Function, el control vuelve inmediatamente al cdigo de llamada. No se ejecutan las instrucciones siguientes a la instruccin Exit. Puede tener ms de una instruccin Exit en el mismo procedimiento, y puede mezclar las instrucciones Return y Exit en el mismo procedimiento.

Si un procedimiento no incluye instrucciones Return o Exit, concluye con una instruccin End Sub o End Function, End Get o End Set a continuacin de la ltima instruccin del cuerpo del procedimiento. La instruccin End devuelve el control inmediatamente al cdigo de llamada. Puede tener slo una instruccin End en un procedimiento.

Parmetros y argumentos En la mayora de los casos, un procedimiento necesita funcionar en datos diferentes cada vez que lo llama. Puede pasar esta informacin al procedimiento como parte de la llamada al procedimiento. El procedimiento define cero o ms parmetros, cada uno de los cuales representa un valor que el procedimiento espera que le pase. Cada parmetro de la definicin del procedimiento cuenta con un argumento correspondiente en la llamada al procedimiento. Un argumento representa el valor que pasa al parmetro correspondiente en una llamada a procedimiento determinada. Tipos de procedimientos Visual Basic utiliza varios tipos de procedimientos:

Procedimientos Sub: ejecutan acciones pero no devuelven un valor al cdigo de llamada. Los procedimientos de control de eventos son procedimientos Sub que se ejecutan en respuesta a un evento provocado por una accin del usuario o por un suceso en un programa.

Procedimientos Function: devuelven un valor al cdigo de llamada. Pueden realizar otras acciones antes de volver. Procedimientos de propiedad: devuelven y asignan valores de propiedades en objetos o mdulos. Procedimientos de operador: definen el comportamiento de un operador estndar cuando uno o los dos operandos son una clase definida recientemente o una estructura. Procedimientos genricos en Visual Basic: definen uno o varios parmetros de tipo adems de sus parmetros normales, de forma que el cdigo de llamada puede pasar tipos de datos especficos cada vez que realiza una llamada.

Procedimientos y cdigo estructurado Todas las lneas de cdigo ejecutable de una aplicacin deben encontrarse dentro de un procedimiento, por ejemplo, Main, calculate o Button1_Click. La aplicacin se leer con mayor facilidad si subdivide los procedimientos grandes en procedimientos ms pequeos. Los procedimientos son tiles para realizar tareas repetitivas o compartidas, como clculos de uso frecuente, manipulacin de texto y controles, y operaciones con bases de datos. Se puede llamar a un

procedimiento desde distintos lugares del cdigo; de modo que los procedimientos se prestan a servir de unidades de creacin de la aplicacin. La estructuracin del cdigo en procedimientos aporta las siguientes ventajas:

Los procedimientos permiten desglosar los programas en unidades lgicas independientes. Es ms fcil depurar unidades individuales que todo un programa sin procedimientos. Despus de desarrollar los procedimientos para el uso en un programa, puede utilizarlos en otros programas, a menudo con pocas o ninguna modificacin. Esto ayuda a evitar la duplicacin del cdigo.

Cmo: Dividir secciones de cdigo grandes en secciones ms pequeas


Todas las instrucciones ejecutables en Visual Basic deben estar dentro de algn procedimiento, como

Main, Form1_Load o calculateTotal. Es posible escribir toda la aplicacin como un procedimiento


nico y grande pero si lo divide en partes ms pequeas, el cdigo es ms legible. La programacin estructurada es un enfoque que resalta la modularidad del programa y una estructura jerrquica dentro de una aplicacin. En Visual Basic, la manera ms sencilla de lograr una programacin estructurada es hacer un uso juicioso de los procedimientos para dividir la aplicacin en unidades lgicas discretas. Puede depurar ms fcilmente una unidad individual que el programa completo. Los procedimientos desarrollados para un programa pueden utilizarse tambin en otros programas, generalmente sin tener que realizar apenas modificaciones. Divisin de un procedimiento grande

Para dividir un procedimiento grande en partes independientes


1. 2. Identifique una o ms secciones independientes de su cdigo. Para cada seccin independiente, mueva el cdigo fuente fuera del procedimiento grande e inclyalo entre las instrucciones Sub y End Sub 3. En el lugar del procedimiento grande en el que quit la seccin de cdigo, agregue una instruccin que llame al procedimiento Sub. Devolver un valor al procedimiento grande Si es til que el nuevo procedimiento devuelva un valor al procedimiento grande, puede definir un procedimiento Function.

Para dividir una seccin que devuelve un valor


1. Incluya el cdigo fuente quitado entre las instrucciones Function y End Function en lugar de Sub y End Sub. 2. En el lugar en el que el procedimiento Function tiene el valor listo para devolver al cdigo de llamada, agregue una instruccin Return. 3. En el punto del procedimiento grande en el que quit la seccin de cdigo, asegrese de que la instruccin de llamada hace algo con el valor devuelto. Puede almacenarlo en una variable o utilizarlo en una expresin.

Cmo: crear un procedimiento

Se incluye un procedimiento entre una instruccin de declaracin de inicio (Sub o Function) y una instruccin de declaracin de fin (End Sub o End Function). Todo el cdigo del procedimiento est incluido entre estas instrucciones. Un procedimiento no puede contener otro procedimiento, por lo que sus instrucciones de inicio y de fin deben estar fuera de cualquier otro procedimiento. Si tiene un cdigo que realiza la misma tarea en distintos lugares, puede escribir la tarea una vez como procedimiento y llamarlo despus desde distintos lugares del cdigo.

Para crear un procedimiento que no devuelve un valor


1. Fuera de cualquier otro procedimiento, utilice una instruccin Sub, seguida de una instruccin End Sub. 2. En la instruccin Sub, agregue detrs de la palabra clave Sub el nombre del procedimiento y, a continuacin, la lista de parmetros entre parntesis. 3. Coloque las instrucciones del cdigo del procedimiento entre las instrucciones Sub y End Sub

Para crear un procedimiento que devuelva un valor


1. Fuera de cualquier otro procedimiento, utilice una instruccin Function, seguida de una instruccin End Function. 2. En la instruccin Function, agregue detrs de la palabra clave Function el nombre del procedimiento y una clusula As en la que se especifique el tipo de datos del valor devuelto. 3. Coloque las instrucciones del cdigo del procedimiento entre las instrucciones Function y End Function 4. Utilice una instruccin Return para devolver el valor al cdigo de llamada.

Para conectar el nuevo procedimiento con los anteriores bloques de cdigo repetitivos
1. Asegrese de que define el nuevo procedimiento en un lugar donde el cdigo anterior tiene acceso a l. 2. En el anterior bloque de cdigo repetitivo, reemplace las instrucciones que realizan la tarea repetitiva por una nica instruccin que llama al procedimiento Sub o Function. 3. Si el procedimiento es una Function que devuelve un valor, asegrese de que la instruccin de llamada realiza una accin con el valor devuelto, como almacenarlo en una variable o, de lo contrario, se perder el valor. Ejemplo El siguiente procedimiento Function calcula la hipotenusa de un tringulo rectngulo a partir de los valores de los catetos. Visual Basic Copiar cdigo

Function hypotenuse(ByVal side1 As Single, ByVal side2 As Single) As Single Return Math.Sqrt((side1 ^ 2) + (side2 ^ 2)) End Function

Procedimientos Sub
Un procedimiento Sub consiste en una serie de instrucciones de Visual Basic delimitadas por las instrucciones Sub y End Sub. El procedimiento Sub ejecuta una tarea y devuelve el control al cdigo de llamada, pero no le devuelve un valor. Cada vez que se llama a un procedimiento, se ejecutan las instrucciones de ste, desde la primera instruccin ejecutable tras la instruccin Sub hasta la primera instruccin End Sub, Exit Sub o Return que se encuentre. Se puede definir un procedimiento Sub en mdulos, clases y estructuras. Es Public de forma predeterminada, lo que significa que puede llamarlo desde cualquier lugar de la aplicacin que tenga acceso al mdulo, clase o estructura en el que se ha definido. El trmino mtodo describe un procedimiento Sub o Function al que se tiene acceso desde fuera de su mdulo, clase o estructura en el que se ha definido. Para obtener ms informacin, vea Mtodos de una clase. Un procedimiento Sub puede aceptar argumentos, como constantes, variables o expresiones, que le pasa el cdigo de llamada. Sintaxis de la declaracin La sintaxis para declarar un procedimiento Sub es la siguiente:

[ modifiers ] Sub subname [( parameterlist )] ' Statements of the Sub procedure. End Sub
Los objetos modifiers pueden especificar un nivel de acceso e informacin acerca de la sobrecarga, invalidacin, uso compartido y sombreado. Para obtener ms informacin, vea Instruccin Sub (Visual Basic). Declaracin de parmetros Puede declarar un parmetro del procedimiento de igual forma que lo hara con una variable, especificando el nombre de parmetro y el tipo de datos. Tambin puede especificar el mecanismo para pasar argumentos y si el parmetro es opcional o una matriz de parmetros. La sintaxis de los parmetros de una lista de parmetros es la siguiente:

[Optional] [ByVal | ByRef] [ParamArray] parametername As datatype


Si el parmetro es opcional, debe proporcionar tambin un valor predeterminado como parte de su declaracin. La sintaxis para especificar un valor predeterminado es la siguiente:

Optional [ByVal | ByRef] parametername As datatype = defaultvalue


Parmetros como variables locales Cuando el control pasa al procedimiento, cada parmetro se trata como una variable local. Esto significa que su de duracin es igual a la del procedimiento y su mbito es el procedimiento completo. Sintaxis de llamada Los procedimientos Sub se invocan de forma explcita, con una instruccin de llamada independiente. No se les puede llamar utilizando su nombre en una expresin. Debe suministrar valores para todos los argumentos que no sean opcionales e incluir la lista de argumentos entre parntesis. Si no se proporcionan argumentos, se puede omitir el parntesis. El uso de la palabra clave Call es opcional aunque no recomendado. La sintaxis para llamar a un procedimiento Sub es la siguiente:

[Call] subname [( argumentlist )]


Puede llamar a un mtodo Sub desde fuera de la clase que lo define. Primero, tiene que utilizar la palabra clave New para crear una instancia de la clase o llamar a un mtodo que devuelva una instancia de la clase. Para obtener ms informacin, vea Cmo: Utilizar la nueva palabra clave. A continuacin, puede utilizar la sintaxis siguiente para llamar al mtodo Sub en el objeto de instancia: Object.methodname[(argumentlist)] Para obtener ms informacin, vea Cmo: Realizar acciones con mtodos. Ejemplo de declaracin y llamada El procedimiento Sub que aparece a continuacin notifica al usuario del equipo la tarea que est a punto de realizar la aplicacin, y tambin muestra una marca de tiempo. En lugar de duplicar este cdigo al principio de cada tarea, la aplicacin simplemente llama a tellOperator desde varios lugares. Cada llamada pasa una cadena al argumento task que identifica la tarea que se va a iniciar. Visual Basic Copiar cdigo

Sub tellOperator(ByVal task As String) Dim stamp As Date stamp = TimeOfDay() MsgBox("Starting " & task & " at " & CStr(stamp)) End Sub
El ejemplo siguiente muestra una llamada tpica a tellOperator. Visual Basic Copiar cdigo

Call tellOperator("file update")

Cmo: Llamar a un procedimiento que no devuelve un valor


Un procedimiento Sub no devuelve un valor al cdigo de llamada. Se llama a este procedimiento de forma explcita, con una instruccin de llamada independiente. No se le puede llamar utilizando simplemente su nombre en una expresin. La instruccin de llamada puede utilizar opcionalmente la palabra clave Call. Esto se recomienda porque mejora la legibilidad de su cdigo.

Para llamar a un procedimiento Sub


1. Utilice una instruccin Call y agregue detrs de la palabra clave Call el nombre del procedimiento Sub. 2. Agregue parntesis detrs del nombre de procedimiento para incluir la lista de argumentos. Si no hay ningn argumento, puede omitir opcionalmente los parntesis. No obstante, el uso de parntesis facilita la lectura del cdigo. 3. Coloque los argumentos en la lista de argumentos entre parntesis y separados por comas. Asegrese de proporcionar los argumentos en el mismo orden en que el procedimiento Sub define los parmetros correspondientes. El ejemplo siguiente llama a la funcin AppActivate de Visual Basic para activar una ventana de la aplicacin. AppActivate acepta el ttulo de la ventana como nico argumento. No devuelve ningn valor al cdigo de llamada. Si no se est ejecutando un proceso del Bloc de notas, el

ejemplo produce una excepcin ArgumentException. En el procedimiento Shell se presupone que las aplicaciones se encuentran en las rutas de acceso especificadas. Visual Basic Copiar cdigo

Dim notepadID As Integer ' Activate a running Notepad process. AppActivate("Untitled - Notepad") ' AppActivate can also use the return value of the Shell function. ' Shell runs a new instance of Notepad. notepadID = Shell("C:\WINNT\NOTEPAD.EXE", AppWinStyle.NormalFocus) ' Activate the new instance of Notepad. AppActivate(notepadID)

Cmo: Llamar a un controlador de eventos en Visual Basic


Un evento es una accin o un suceso (por ejemplo, cuando se hace clic con el mouse o cuando se supera un lmite de crdito) que reconoce algn componente del programa y para el cual puede escribirse un cdigo de respuesta. Un controlador de eventos es el cdigo que se escribe para responder a un evento. En Visual Basic, un controlador de eventos es un procedimiento Sub. Sin embargo, normalmente no se llama a este procedimiento del mismo modo que a otros procedimientos Sub; sino que se identifica el procedimiento como un controlador del evento. Esto puede hacerse con una clusula Handles y una variable WithEvents o con una instruccin AddHandler (Instruccin). En Visual Basic, de manera predeterminada se utiliza una clusula Handles para declarar un controlador de eventos. sta es la tcnica que utilizan los diseadores para escribir los controladores de eventos cuando programan en el entorno de desarrollo integrado (IDE). La instruccin AddHandler resulta conveniente para desencadenar eventos de forma dinmica en tiempo de ejecucin. Cuando se produce el evento, Visual Basic llama automticamente al procedimiento del controlador de eventos. Cualquier cdigo que tenga acceso al evento puede hacer que ste se desencadene ejecutando RaiseEvent (Instruccin). Puede asociar ms de un controlador de eventos al mismo evento. En algunos casos, puede desasociar un controlador de un evento. Para obtener ms informacin, vea Eventos en Visual Basic.

Para llamar a un controlador de eventos utilizando Handles y WithEvents


1. 2. Asegrese de que el evento se declara con una instruccin Event (Instruccin). Declare una variable de objeto en el nivel de mdulo o de clase utilizando la palabra clave WithEvents. La clusula As de esta variable debe especificar la clase que produce el evento. 3. En la declaracin del procedimiento Sub de control de eventos, agregue una clusula Handles que especifique la variable WithEvents y el nombre del evento. 4. Cuando se produce el evento, Visual Basic llama automticamente al procedimiento Sub. El cdigo puede utilizar una instruccin RaiseEvent para desencadenar el evento. En el ejemplo siguiente se define un evento y una variable WithEvents que hace referencia a la clase que desencadena el evento. El procedimiento Sub de control de eventos utiliza una clusula Handles para especificar la clase y el evento que sta controla. Visual Basic Copiar cdigo

Public Class raisesEvent Public Event somethingHappened() Dim WithEvents happenObj As New raisesEvent Public Sub processHappen() Handles happenObj.somethingHappened

' Insert code to handle somethingHappened event. End Sub End Class

Para llamar a un controlador de eventos utilizando AddHandler


1. 2. Asegrese de que el evento se declara con una instruccin Event. Ejecute una instruccin AddHandler (Instruccin) para conectar de forma dinmica el procedimiento Sub de control de eventos con el evento. 3. Cuando se produce el evento, Visual Basic llama automticamente al procedimiento Sub. El cdigo puede utilizar una instruccin RaiseEvent para desencadenar el evento. En el ejemplo siguiente se define un procedimiento Sub que controla el evento Closing de un formulario. A continuacin, utiliza la instruccin AddHandler (Instruccin) para asociar el procedimiento catchClose como un controlador del evento Closing. Visual Basic Copiar cdigo

' Place these procedures inside a Form class definition. Private Sub catchClose(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) ' Insert code to deal with impending closure of this form. End Sub Public Sub formOpened() AddHandler Me.Closing, AddressOf catchClose End Sub
Puede desasociar un controlador de eventos de un evento ejecutando RemoveHandler (Instruccin).

Procedimientos Function
Un procedimiento Function es una serie de instrucciones de Visual Basic delimitadas por las instrucciones Function y End Function. El procedimiento Function realiza una tarea y, a continuacin, devuelve el control al cdigo de llamada. Cuando devuelve el control, tambin devuelve un valor al cdigo de llamada. Cada vez que se llama a un procedimiento, se ejecutan las instrucciones de ste, desde la primera instruccin ejecutable tras la instruccin Function hasta la primera instruccin End Function, Exit Function o Return que se encuentre. Puede definir un procedimiento Function en un mdulo, clase o estructura. Es Public de forma predeterminada, lo que significa que puede llamarlo desde cualquier lugar de la aplicacin que tenga acceso al mdulo, clase o estructura en el que se ha definido. Un procedimiento Function puede aceptar argumentos, como constantes, variables o expresiones, que le pasa el cdigo de llamada. Sintaxis de la declaracin La sintaxis para declarar un procedimiento Function es la siguiente:

[ modificadores ] Function nombreDeFuncin [( listaDeParmetros )] As tipoDeValorDevuelto ' Statements of the Function procedure. End Function

Los modificadores pueden especificar un nivel de acceso e informacin relativo a la sobrecarga, a la invalidacin, uso compartido y sombreado. Para obtener ms informacin, vea Instruccin Function (Visual Basic). Declara cada parmetro de la misma manera que para Procedimientos Sub. Tipo de datos Todos los procedimientos Function tienen un tipo de datos, al igual que las variables. La clusula As especifica este tipo de datos en la instruccin Function y determina el tipo de datos del valor que la funcin devuelve al cdigo de llamada. En las siguientes declaraciones de ejemplo se ilustra esto ltimo. Copiar cdigo

Function yesterday() As Date End Function Function findSqrt(ByVal radicand As Single) As Single End Function
Para obtener ms informacin, vea "Partes" en Instruccin Function (Visual Basic). Valores devueltos El valor que un procedimiento Function devuelve al cdigo de llamada se denomina valor devuelto. El procedimiento devuelve dicho valor de dos maneras:

La funcin asigna un valor a su propio nombre de funcin en una o ms instrucciones del procedimiento. El control no vuelve al programa de llamada hasta que se ejecuta una instruccin Exit Function o End Function. Esto se ilustra en el siguiente ejemplo:

Function nombreDeFuncin [( listaDeParmetros )] As tipoDeValorDevuelto ' The following statement does not transfer control back to the calling code.
nombreDeFuncin = expresin

' When control returns to the calling code, expresin is the return value. End Function

Utiliza la instruccin Return para especificar el valor devuelto y devuelve el control inmediatamente al programa de llamada. Esto se ilustra en el siguiente ejemplo:

Function nombreDeFuncin [( listaDeParmetros )] As tipoDeValorDevuelto ' The following statement immediately transfers control back to the calling code and returns the value of expresin . Return expresin End Function
La ventaja de asignar el valor devuelto al nombre de la funcin es que el control permanece en el procedimiento hasta que encuentra una instruccin Exit Function o End Function, lo que permite asignar un valor previo y, si es necesario, se puede ajustar despus. Para obtener ms informacin, vea "Valor devuelto" en Instruccin Function (Visual Basic). Matrices devueltas Si el procedimiento Function devuelve datos de tipo matricial, el acceso a los elementos individuales de la matriz no es posible dentro de la funcin. Si se intentara hacerlo, el compilador lo interpretar como una llamada recursiva al procedimiento. Esto se ilustra en el siguiente ejemplo:

Function allOnes(ByVal n As Integer) As Integer() For i As Integer = 1 To n - 1 ' The following statement generates a COMPILER ERROR . allOnes(i) = 1 Next i ' The following statement generates a COMPILER ERROR . Return allOnes() End Function
En el ejemplo anterior, el compilador interpreta la asignacin intentada allOnes(i) = 1 como una llamada a allOnes en el lado izquierdo de una instruccin de asignacin. Interpreta la instruccin intentada Return allOnes() como una llamada sin argumento. Ambas instrucciones generan errores de compilador. Sintaxis de llamada Para invocar a un procedimiento Function hay que incluir el nombre y los argumentos de ste en la parte derecha de una instruccin de asignacin o en una expresin. Debe suministrar valores para todos los argumentos que no sean opcionales e incluir la lista de argumentos entre parntesis. Si no se proporcionan argumentos, se puede omitir el parntesis. La sintaxis para llamar a un procedimiento Function es la siguiente: valorL = nombreDeFuncin [( listaDeArgumentos )]

If (( nombreDeFuncin [( listaDeArgumentos )] / 3) <= expresin ) Then


Cuando se llama a un procedimiento Function, no es necesario utilizar su valor devuelto, en cuyo caso se ejecutan todas las acciones de la funcin, pero se omite el valor devuelto. A menudo, se llama as a MsgBox. Ejemplo de declaracin y llamada El siguiente procedimiento Function calcula la hipotenusa de un tringulo rectngulo a partir de los valores de los catetos. Visual Basic Copiar cdigo

Function hypotenuse(ByVal side1 As Single, ByVal side2 As Single) As Single Return Math.Sqrt((side1 ^ 2) + (side2 ^ 2)) End Function
El ejemplo siguiente muestra una llamada tpica a hypotenuse. Visual Basic Copiar cdigo

Dim testLength, testHypotenuse As Single testHypotenuse = hypotenuse(testLength, 10.7)


Funciones en tiempo de ejecucin de Visual Basic El motor en tiempo de ejecucin de Visual Basic proporciona muchas funciones, que se encuentran en el espacio de nombres Microsoft.VisualBasic. Entre las funciones ms comunes se incluyen, por ejemplo, Beep (Funcin), MsgBox (Funcin, Visual Basic) y StrComp (Funcin, Visual Basic). Puede llamar a estas funciones de la misma manera que llama a los procedimientos Function que ha creado.

Cmo: Crear un procedimiento que devuelve un valor


Utiliza un procedimiento Function para devolver un valor al cdigo de llamada.

Para crear un procedimiento que devuelva un valor


1. Fuera de cualquier otro procedimiento, utilice una instruccin Function, seguida de una instruccin End Function. 2. En la instruccin Function, siga la palabra clave Function con el nombre del procedimiento y a continuacin la lista de parmetros entre parntesis. 3. A continuacin de parntesis incluya una clusula As para especificar el tipo de datos del valor devuelto. 4. Coloque las instrucciones de cdigo del procedimiento entre las instrucciones Function y End Function. 5. Utilice una instruccin Return para devolver el valor al cdigo de llamada. El siguiente procedimiento Function calcula la hipotenusa de un tringulo rectngulo a partir de los valores de los catetos. Visual Basic Copiar cdigo

Function hypotenuse(ByVal side1 As Single, ByVal side2 As Single) As Single Return Math.Sqrt((side1 ^ 2) + (side2 ^ 2)) End Function
El ejemplo siguiente muestra una llamada tpica a hypotenuse. Visual Basic Copiar cdigo

Dim testLength, testHypotenuse As Single testHypotenuse = hypotenuse(testLength, 10.7)

Cmo: Devolver un valor de un procedimiento


Un procedimiento Function devuelve un valor al cdigo de llamada ejecutando una instruccin Return o encontrando una instruccin Exit Function o End Function

Para devolver un valor mediante la instruccin Return


1. 2. Coloque una instruccin Return en el punto en el que finaliza la tarea del procedimiento. Agregue detrs de la palabra clave Return una expresin que genere el valor que desea que se devuelva al cdigo de llamada. 3. Puede tener ms de una instruccin Return en el mismo procedimiento. El siguiente procedimiento Function calcula la hipotenusa de un tringulo rectngulo y la devuelve al cdigo de llamada. Visual Basic Copiar cdigo

Function hypotenuse(ByVal side1 As Single, ByVal side2 As Single) As Single Return Math.Sqrt((side1 ^ 2) + (side2 ^ 2))

End Function
El ejemplo siguiente muestra una llamada tpica a hypotenuse que almacena el valor devuelto. Visual Basic Copiar cdigo

Dim testLength, testHypotenuse As Single testHypotenuse = hypotenuse(testLength, 10.7)

Para devolver un valor mediante Exit Function o End Function


1. 2. En al menos un lugar del procedimiento Function, asigne un valor al nombre del procedimiento. Al ejecutar una instruccin Exit Function o End Function, Visual Basic devuelve el valor asignado ms recientemente al nombre del procedimiento. 3. Puede tener ms de una instruccin Exit Function en el mismo procedimiento, y puede mezclar las instrucciones Return y Exit Function en el mismo procedimiento. 4. Puede tener slo una instruccin End Function en un procedimiento Function. Para obtener ms informacin y un ejemplo, vea "Valor devuelto" en Instruccin Function (Visual Basic).

Cmo: Llamar a un procedimiento que devuelve un valor


Un procedimiento Function devuelve un valor al cdigo de llamada. Para llamar a un procedimiento, hay que incluir el nombre y los argumentos de ste en la parte derecha de una instruccin de asignacin o en una expresin. Puede utilizar la palabra clave Call para llamar al procedimiento Function. Sin embargo, esta tcnica omite el valor devuelto por el procedimiento.

Para llamar a un procedimiento Function dentro de una expresin


1. Utilice el nombre del procedimiento Function del mismo modo que utilizara una variable. Puede utilizar una llamada al procedimiento Function en cualquier parte de la expresin en la que utilizara una variable o una constante. 2. Agregue parntesis despus del nombre del procedimiento para incluir entre ellos la lista de argumentos. Si no hay ningn argumento, puede omitir opcionalmente los parntesis. Sin embargo, los parntesis hacen que el cdigo sea ms fcil de leer. 3. En la lista de argumentos, site los argumentos entre parntesis y separados por comas. Asegrese de proporcionar los argumentos en el mismo orden en que el procedimiento Function define los parmetros correspondientes. Si lo desea, puede transferir tambin uno o varios argumentos por nombre. Para obtener ms informacin, vea Pasar argumentos por posicin o por nombre. 4. El valor devuelto desde el procedimiento participa en la expresin del mismo modo que lo hara una variable o una constante.

Para llamar a un procedimiento Function en una instruccin de asignacin

1.

Utilice el nombre del procedimiento Function situado detrs del signo igual (=) en una instruccin de asignacin.

2.

Agregue parntesis despus del nombre del procedimiento para incluir entre ellos la lista de argumentos. Si no hay ningn argumento, puede omitir opcionalmente los parntesis. Sin embargo, los parntesis hacen que el cdigo sea ms fcil de leer.

3.

En la lista de argumentos, site los argumentos entre parntesis y separados por comas. Asegrese de proporcionar los argumentos en el mismo orden en que el procedimiento Function define los parmetros correspondientes, a menos que los est transfiriendo por nombre.

4.

El valor devuelto desde el procedimiento se almacena en la variable o propiedad situada en el lado izquierdo de la instruccin de asignacin.

Ejemplo En el ejemplo siguiente se llama a la funcin Environ (Funcin) de Visual Basic para recuperar el valor de una variable de entorno del sistema operativo. La primera lnea llama a Environ dentro de una expresin, y la segunda lnea hace la llamada en una instruccin de asignacin. Environ toma el nombre de la variable como su nico argumento. Devuelve el valor de la variable al cdigo de llamada. Visual Basic Copiar cdigo

MsgBox("Value of PATH is " & Environ("PATH")) Dim currentPath As String = Environ("PATH")

Procedimientos de propiedad
Un procedimiento de propiedad es una serie de instrucciones de Visual Basic que manipulan una propiedad personalizada en un mdulo, clase o estructura. Los procedimientos Property tambin se conocen como descriptores de acceso de propiedades. Visual Basic proporciona los procedimientos de propiedad siguientes:

Un procedimiento Get devuelve el valor de una propiedad. Se le llama al tener acceso a la propiedad en una expresin. Un procedimiento Set establece una propiedad en un valor, incluida una referencia a objeto. Se le llama al asignar un valor a la propiedad.

Se suelen definir procedimientos de propiedad en pares, mediante las instrucciones Get y Set, pero tambin se puede definir uno de los procedimientos solamente si la propiedad es de slo lectura (Get (Instruccin)) o de slo escritura (Instruccin Set (Visual Basic)). Las propiedades pueden definirse en clases, estructuras y mdulos. Las propiedades son Public de manera predeterminada, lo que significa que es posible llamarlas desde cualquier parte de la aplicacin que tenga acceso al contenedor de propiedades. Para consultar una comparacin de propiedades y variables, vea Diferencias entre propiedades y variables en Visual Basic. Sintaxis de la declaracin Una propiedad en s se define como un bloque de cdigo delimitado por las instrucciones Property (Instruccin) y End Property. Dentro de este bloque, cada procedimiento de propiedad aparece como un bloque interno incluido entre una instruccin de declaracin (Get o Set) y la declaracin End correspondiente. La sintaxis para declarar una propiedad y sus procedimientos es la siguiente:

[Default] [modifiers] Property propertyname[(parameterlist)] As datatype

[accesslevel] Get ' Statements of the Get procedure. ' The following statement returns expression as the property's value. Return expression End Get [accesslevel] Set[(ByVal newvalue As datatype)] ' Statements of the Set procedure. ' The following statement assigns newvalue as the property's value. lvalue = newvalue End Set End Property
Los modifiers pueden especificar un nivel de acceso e informacin relativo a la sobrecarga, al reemplazo, uso compartido y sombreado, y si la propiedad es de slo lectura o de slo escritura. El access level del procedimiento Get o Set puede ser cualquier nivel ms restrictivo que el nivel de acceso especificado por la propiedad en s. Para obtener ms informacin, vea Property (Instruccin). Tipo de datos El tipo de datos de una propiedad y el nivel de acceso principal estn definidos en la instruccin Property y no en los procedimientos de propiedad. Una propiedad puede tener slo un tipo de datos. Por ejemplo, no puede definirse una propiedad para que almacene un valor Decimal y que recupere un valor Double. Nivel de acceso Sin embargo, puede definir un nivel de acceso principal para una propiedad y restringir an ms el nivel de acceso en uno de sus procedimientos de propiedad. Por ejemplo, puede definir una propiedad Public y, a continuacin, definir un procedimiento Private Set. El procedimiento Get sigue siendo Public. Puede cambiar el nivel de acceso en slo uno de los procedimientos de una propiedad y que sea an ms restrictivo que el nivel de acceso principal. Para obtener ms informacin, vea Cmo: Declarar una propiedad con niveles de acceso mixtos. Declaracin de parmetros Los parmetros se declaran de la misma manera que se declara Procedimientos Sub, excepto que el mecanismo para pasar argumentos debe ser ByVal. La sintaxis de los parmetros de una lista de parmetros es la siguiente:

[Optional] ByVal [ParamArray] parametername As datatype


Si el parmetro es opcional, debe proporcionar tambin un valor predeterminado como parte de su declaracin. La sintaxis para especificar un valor predeterminado es la siguiente:

Optional ByVal parametername As datatype = defaultvalue


Valor de propiedad En un procedimiento Get, el valor devuelto se suministra a la expresin de llamada como valor de la propiedad. En un procedimiento Set, el nuevo valor de la propiedad se pasa al parmetro de la instruccin Set. Si un parmetro se declara de forma explcita, el tipo de datos de ste debe ser el mismo que el de la propiedad. Si no se declara un parmetro, el compilador utiliza el parmetro implcito Value para representar el nuevo valor que se va a asignar a la propiedad.

Sintaxis de llamada Se invoca un procedimiento de propiedad implcitamente haciendo referencia a la propiedad. Se utiliza el nombre de la propiedad del mismo modo que si se tratase del nombre de una variable, a excepcin de que se deben suministrar valores para todos los argumentos que no sean opcionales e incluir la lista de argumentos entre parntesis. Si no se proporcionan argumentos, se puede omitir el parntesis. La sintaxis de una llamada implcita a un procedimiento Set es la siguiente:

propertyname[(argumentlist)] = expression
La sintaxis de una llamada implcita a un procedimiento Get es la siguiente:

lvalue = propertyname[(argumentlist)] Do While (propertyname[(argumentlist)] > expression)


Ejemplo de declaracin y llamada La propiedad siguiente almacena un nombre completo como dos nombres constitutivos, el nombre y el apellido. Cuando el cdigo de llamada lee fullName, el procedimiento Get combina los dos nombres constitutivos y devuelve el nombre completo. Cuando el cdigo de llamada asigna un nuevo nombre completo, el procedimiento Set intenta dividirlo en dos nombres constitutivos. Si no encuentra espacio, lo almacena como nombre. Visual Basic Copiar cdigo

Dim firstName, lastName As String Property fullName() As String Get If lastName = "" Then Return firstName Else Return firstName & " " & lastName End If End Get Set(ByVal Value As String) Dim space As Integer = Value.IndexOf(" ") If space < 0 Then firstName = Value lastName = "" Else firstName = Value.Substring(0, space) lastName = Value.Substring(space + 1) End If End Set End Property
El ejemplo siguiente muestra las llamadas tpicas a los procedimientos de propiedad de fullName. Visual Basic Copiar cdigo

fullName = "MyFirstName MyLastName" MsgBox(fullName)

Diferencias entre propiedades y variables en Visual Basic


Tanto las variables como las propiedades representan valores a los que puede tener acceso. Sin embargo, existen diferencias en su almacenamiento e implementacin. Variables

Una variable se corresponde directamente con una ubicacin de la memoria. Una variable se define con una nica instruccin de declaracin. Una variable puede ser una variable local, si est definida dentro de un procedimiento y slo est disponible en dicho procedimiento, o puede ser una variable miembro, si se define en un mdulo, una clase o una estructura, pero no dentro de un procedimiento. Una variable miembro tambin se denomina campo. Propiedades Una propiedad es un elemento de datos que se define en un mdulo, una clase o una estructura. Una propiedad se define con un bloque de cdigo comprendido entre las instrucciones Property y End Property. El bloque de cdigo contiene un procedimiento Get, un procedimiento Set o ambos procedimientos. Estos procedimientos se denominan procedimientos de propiedades o descriptores de acceso de propiedades. Adems de recuperar o almacenar el valor de una propiedad, tambin pueden llevar a cabo acciones personalizadas, como actualizar un contador de acceso. Diferencias En la tabla siguiente se muestran algunas diferencias importantes que existen entre las variables y propiedades. Punto de diferencia Declaracin Variable nica instruccin de declaracin nica ubicacin de almacenamiento Directamente asociado con el valor de una variable Propiedad Serie de instrucciones en un bloque de cdigo Cdigo ejecutable (procedimientos de propiedades) Normalmente dispone de un almacn interno que no est disponible fuera de la clase o el mdulo que contiene la propiedad El valor de la propiedad podra existir o no como un elemento almacenado 1 Cdigo ejecutable Acceso de lectura y escritura Ninguno Acceso de lectura y escritura o de slo lectura No es posible Debe tener al menos un procedimiento Acceso de lectura y escritura, de slo lectura o de slo escritura

Implementacin

Almacenamiento

Acciones personalizadas (adems de aceptar o devolver un valor)


1

Se pueden llevar a cabo como parte del proceso de configuracin o de recuperacin del valor de una propiedad

A diferencia de una variable, es posible que el valor de una propiedad no se corresponda directamente

con un nico elemento de almacenamiento. El almacenamiento podra dividirse en partes por motivos de comodidad o seguridad, o el valor podra almacenarse en un formato cifrado. En estos casos, el procedimiento Get ensamblara las partes o descifrara el valor almacenado, y el procedimiento Set cifrara el nuevo valor o lo dividira en el almacenamiento fundamental. El valor de una propiedad podra ser efmero, como una hora del da, en cuyo caso el procedimiento Get lo calculara sobre la marcha cada vez que se obtuviera acceso a la propiedad.

Cmo: Crear una propiedad


Una definicin de propiedad se agrega entre una instruccin Property y una instruccin End Property Dentro de esta definicin, se define un procedimiento Get, un procedimiento Set o ambos. Todo el cdigo de la propiedad est incluido dentro de estos procedimientos.

El procedimiento Get recupera el valor de la propiedad y el procedimiento Set almacena un valor. Si desea que la propiedad tenga acceso de lectura y escritura, debe definir ambos procedimientos. Para una propiedad de slo lectura, se define nicamente Get y para una propiedad de slo escritura, Set.

Para crear una propiedad


1. Fuera de cualquier propiedad o procedimiento, utilice Property (Instruccin), seguido de una instruccin End Property. 2. Si la propiedad acepta parmetros, agregue detrs de la palabra clave Property el nombre del procedimiento y, a continuacin, la lista de parmetros entre parntesis. 3. Agregue detrs de los parntesis una clusula As para especificar el tipo de datos del valor de la propiedad. Debe especificar el tipo de datos incluso para una propiedad de slo escritura. 4. Agregue los procedimientos Get y Set, tal como sea preciso. Vea las direcciones siguientes.

Para crear un procedimiento Get que recupera un valor de la propiedad


1. Entre las instrucciones Property y End Property, escriba Get (Instruccin), seguido de una instruccin End Get. No necesita definir ningn parmetro para el procedimiento Get. 2. Coloque las instrucciones de cdigo para recuperar el valor de la propiedad entre las instrucciones Get y End Get Este cdigo puede incluir otros clculos y manipulaciones de datos, adems de generar y devolver el valor de la propiedad. 3. Utilice una instruccin Return para devolver el valor de la propiedad al cdigo de llamada.

Debe escribir un procedimiento Get para una propiedad de lectura y escritura, as como para una propiedad de slo lectura. No debe definir un procedimiento Get para una propiedad de slo escritura.

Para crear un procedimiento Set que escribe el valor de una propiedad


1. Entre las instrucciones Property y End Property, escriba Instruccin Set (Visual Basic), seguido de una instruccin End Set. 2. En la instruccin Set, agregue detrs de la palabra clave Set una lista de parmetros entre parntesis. Esta lista de parmetros debe incluir por lo menos un parmetro de valor para el valor pasado por el cdigo de llamada. El nombre predeterminado para este parmetro de valor es Value, pero puede utilizar un nombre diferente, si es preciso. El parmetro de valor debe tener el mismo tipo de datos que la propiedad misma. 3. Coloque las instrucciones de cdigo para almacenar la propiedad entre las instrucciones Set y End Set Este cdigo puede incluir otros clculos y manipulaciones de datos, adems de validar y almacenar el valor de la propiedad. 4. Utilice el parmetro de valor para aceptar el valor proporcionado por el cdigo de llamada. Puede almacenar este valor directamente en una instruccin de asignacin o utilizarlo en una expresin para calcular el valor interno que se va a almacenar. Debe escribir un procedimiento Set para una propiedad de lectura y escritura, as como para una propiedad de slo escritura. No debe definir un procedimiento Set para una propiedad de slo lectura. Ejemplo

El ejemplo siguiente crea una propiedad de lectura y escritura que almacena un nombre completo como dos nombres constitutivos, el nombre y el apellido. Cuando el cdigo de llamada lee fullName, el procedimiento Get combina los dos nombres constitutivos y devuelve el nombre completo. Cuando el cdigo de llamada asigna un nuevo nombre completo, el procedimiento Set intenta dividirlo en dos nombres constitutivos. Si no encuentra espacio, lo almacena como nombre. Visual Basic Copiar cdigo

Dim firstName, lastName As String Property fullName() As String Get If lastName = "" Then Return firstName Else Return firstName & " " & lastName End If End Get Set(ByVal Value As String) Dim space As Integer = Value.IndexOf(" ") If space < 0 Then firstName = Value lastName = "" Else firstName = Value.Substring(0, space) lastName = Value.Substring(space + 1) End If End Set End Property
El ejemplo siguiente muestra las llamadas tpicas a los procedimientos de propiedad de fullName. La primera llamada establece el valor de la propiedad y la segunda la recupera. Visual Basic Copiar cdigo

fullName = "MyFirstName MyLastName" MsgBox(fullName)

Cmo: Declarar una propiedad con niveles de acceso mixtos


Si desea que los procedimientos Get y Set de una propiedad tengan niveles de acceso distintos, puede utilizar el nivel ms permisivo en la instruccin Property y el nivel ms restrictivo en las instrucciones Get o Set. Puede utilizar niveles de acceso mixtos en una propiedad cuando desee que ciertas partes del cdigo puedan obtener el valor de la propiedad y que otras partes del cdigo puedan modificar el valor. Para obtener ms informacin sobre los niveles de acceso, vea Niveles de acceso en Visual Basic.

Para declarar una propiedad con niveles de acceso mixtos


1. Declare la propiedad de la manera habitual y especifique el nivel de acceso menos restrictivo (por ejemplo, Public) en la instruccin Property. 2. Declare el procedimiento Get o Set especificando el nivel de acceso ms restrictivo (por ejemplo, Friend).

3.

No especifique un nivel de acceso en el otro procedimiento de propiedad. Se acepta el nivel de acceso declarado en la instruccin Property. Puede restringir el acceso en un solo procedimiento de propiedad.

Visual Basic Copiar cdigo

Public Class employee Private salaryValue As Double Protected Property salary() As Double Get Return salaryValue End Get Private Set(ByVal value As Double) salaryValue = value End Set End Property End Class
4. En el ejemplo anterior, el procedimiento Get tiene el mismo acceso Protected que la propiedad, mientras que el procedimiento Set tiene acceso Private. Una clase derivada de employee puede leer el valor salary, pero slo la clase employee puede establecerlo.

Cmo: Llamar a un procedimiento de propiedad


Cuando se almacena un valor en una propiedad o cuando se recupera el valor de una propiedad, se llama a un procedimiento de dicha propiedad. El acceso a una propiedad se obtiene del mismo modo que el acceso a una variable. El procedimiento Set de la propiedad almacena un valor y el procedimiento Get recupera dicho valor. Sin embargo, no se llama explcitamente a estos procedimientos. Slo tiene que utilizar la propiedad en una expresin o instruccin de asignacin, del mismo que almacenara o recuperara el valor de una variable, y Visual Basic se encargar de realizar las llamadas a los procedimientos de la propiedad.

Para llamar al procedimiento Get de una propiedad


1. Utilice el nombre de la propiedad en una expresin del mismo modo que utilizara el nombre de una variable. Las propiedades pueden utilizarse en los mismos lugares que las variables o las constantes. O bien Utilice el nombre de la propiedad que aparece despus del signo igual (=) en una instruccin de asignacin. En el ejemplo siguiente se lee el valor de Now (Propiedad), y se llama implcitamente a su procedimiento Get. Visual Basic Copiar cdigo

Dim ThisMoment As Date ' The following statement calls the Get procedure of the Visual Basic Now property. ThisMoment = Now
2. Si la propiedad toma argumentos, agregue parntesis despus del nombre de la propiedad para incluir entre ellos la lista de argumentos. Si no hay ningn argumento, de forma opcional puede omitir los parntesis.

3.

En la lista de argumentos, site los argumentos entre parntesis y separados por comas. Asegrese de proporcionar los argumentos en el mismo orden en que la propiedad define los parmetros correspondientes.

El valor de la variable participa en la expresin del mismo modo que una variable o una constante, o se almacena en la variable o propiedad en el lado izquierdo de la instruccin de asignacin.

Para llamar al procedimiento Set de una propiedad


1. Utilice el nombre de la propiedad situado en el lado izquierdo de una instruccin de asignacin. En el ejemplo siguiente se establece el valor de TimeOfDay (Propiedad), y se llama implcitamente a su procedimiento Set. Visual Basic Copiar cdigo

' The following statement calls the Set procedure of the Visual Basic TimeOfDay property. TimeOfDay = #12:00:00 PM#
2. Si la propiedad toma argumentos, agregue parntesis despus del nombre de la propiedad para incluir entre ellos la lista de argumentos. Si no hay ningn argumento, de forma opcional puede omitir los parntesis. 3. En la lista de argumentos, site los argumentos entre parntesis y separados por comas. Asegrese de proporcionar los argumentos en el mismo orden en que la propiedad define los parmetros correspondientes. El valor generado en el lado derecho de la instruccin de asignacin se almacena en la propiedad.

Cmo: Declarar y llamar a una propiedad predeterminada en Visual Basic


Una propiedad predeterminada es una propiedad de clase o de estructura a la que el cdigo puede tener acceso sin especificarlo. Cuando el cdigo de llamada menciona una clase o estructura pero no una propiedad, y el contexto permite tener acceso a una propiedad, Visual Basic resuelve el acceso a la propiedad predeterminada de esa clase o estructura, si existe. Una clase o estructura puede tener a lo sumo una propiedad predeterminada. No obstante, puede sobrecargar una propiedad predeterminada y tener ms de una versin de ella. Para obtener ms informacin, vea Propiedades predeterminadas.

Para declarar una propiedad predeterminada


1. 2. 3. Declare la propiedad de la manera normal. No especifique la palabra clave Shared o Private. Incluya la palabra clave Default en la declaracin de la propiedad. Especifique al menos un parmetro para la propiedad. No puede definir una propiedad predeterminada que no acepte al menos un argumento. Visual Basic Copiar cdigo

Default Property myProperty(ByVal index As Integer) As String

Para llamar a una propiedad predeterminada


1. Declare una variable de la clase contenedora o tipo de estructura.

Visual Basic Copiar cdigo

Dim x As New class1(3)


2. Utilice el nombre de variable solo en una expresin donde normalmente incluira el nombre de propiedad. Visual Basic Copiar cdigo

MsgBox(x)
3. Agregue detrs del nombre de variable una lista de argumentos entre parntesis. Una propiedad predeterminada debe aceptar al menos un argumento. Visual Basic Copiar cdigo

MsgBox(x(1))
4. Para recuperar el valor de la propiedad predeterminada, utilice el nombre de variable, con una lista de argumentos, en una expresin o detrs del signo igual (=) en una instruccin de asignacin. Visual Basic Copiar cdigo

MsgBox(x(1) & x(2) & x(3))


5. Para establecer el valor predeterminado de la propiedad, utilice el nombre de variable, con una lista de argumentos, a la izquierda de una instruccin de asignacin. Visual Basic Copiar cdigo

x(1) = "Hello" x(2) = " " x(3) = "World"


6. Siempre puede especificar el nombre de la propiedad predeterminada junto con el nombre de variable, tal como lo hara para tener acceso a cualquier otra propiedad. Visual Basic Copiar cdigo

x.myProperty(1) = "Hello" x.myProperty(2) = " " x.myProperty(3) = "World"


Ejemplo En el siguiente ejemplo se declara una propiedad predeterminada en una clase. Visual Basic Copiar cdigo

Public Class class1 Private myStrings() As String Sub New(ByVal size As Integer) ReDim myStrings(size) End Sub Default Property myProperty(ByVal index As Integer) As String Get

' The Get property procedure is called when the value ' of the property is retrieved. Return myStrings(index) End Get Set(ByVal Value As String) ' The Set property procedure is called when the value ' of the property is modified. ' The value to be assigned is passed in the argument ' to Set. myStrings(index) = Value End Set End Property End Class
Este ejemplo de cdigo tambin est disponible como fragmento de cdigo de IntelliSense. En el selector de fragmentos de cdigo, se encuentra en Lenguaje Visual Basic. Para obtener ms informacin, vea Cmo: Insertar fragmentos de cdigo en el cdigo (Visual Basic). En el ejemplo siguiente se indica cmo se llama a la propiedad predeterminada myProperty en la clase

class1. Las tres instrucciones de asignacin almacenan valores en myProperty y la llamada MsgBox
lee los valores. Visual Basic Copiar cdigo

Sub Test() Dim x As New class1(3) x(1) = "Hello" x(2) = " " x(3) = "World" MsgBox(x(1) & x(2) & x(3)) End Sub
El uso ms comn de una propiedad predeterminada es Item (Propiedad, objeto Collection) en diversas clases de coleccin. Programacin eficaz Las propiedades predeterminadas pueden producir una pequea reduccin en los caracteres del cdigo fuente pero pueden dificultar la lectura del cdigo. Si el cdigo de llamada no est familiarizado con su clase o estructura, cuando hace referencia al nombre de stas, no puede estar seguro de si esta referencia tiene acceso a la clase o estructura en s, o a una propiedad predeterminada. Esto puede conducir a errores del compilador o a ligeros errores lgicos en tiempo de ejecucin. Puede reducir levemente las posibilidades de errores de propiedades predeterminadas utilizando siempre Option Strict (Instruccin) para establecer la comprobacin de tipos del compilador en On. Si est pensando en utilizar una clase o estructura en el cdigo, debe determinar si tiene una propiedad predeterminada, y si es as, cmo se llama. Debido a estas desventajas, debera considerar no definir propiedades predeterminadas. Para una mejor lectura del cdigo, debera considerar asimismo hacer siempre una referencia explcita a todas las propiedades, incluso a las propiedades predeterminadas.

Cmo: Establecer un valor en una propiedad


Almacena un valor en una propiedad colocando el nombre de propiedad en el lado izquierdo de una instruccin de asignacin.

El procedimiento Set de la propiedad almacena un valor, pero no se llama explcitamente por el nombre. Utiliza la propiedad tal como utilizara una variable. Visual Basic realiza las llamadas a los procedimientos de la propiedad.

Para almacenar un valor en una propiedad


1. Utilice el nombre de propiedad en el lado izquierdo de una instruccin de asignacin. El ejemplo siguiente establece el valor de la propiedad TimeOfDay de Visual Basic en medioda, llamando implcitamente a su procedimiento Set. Visual Basic Copiar cdigo

' The following statement calls the Set procedure of the Visual Basic TimeOfDay property. TimeOfDay = #12:00:00 PM#
2. Si la propiedad toma argumentos, agregue parntesis a continuacin del nombre de la propiedad para incluir entre ellos la lista de argumentos. Si no hay ningn argumento, puede omitir opcionalmente los parntesis. 3. Coloque los argumentos en la lista de argumentos entre parntesis y separados por comas. Asegrese de proporcionar los argumentos en el mismo orden en que la propiedad define los parmetros correspondientes. 4. El valor generado en el lado derecho de la instruccin de asignacin se almacena en la propiedad.

Cmo: Obtener un valor de una propiedad


Recupera el valor de una propiedad incluyendo el nombre de propiedad en una expresin. El procedimiento Get de la propiedad recupera el valor pero no se le llama explcitamente por su nombre. Se utiliza la propiedad igual que una variable. Visual Basic realiza las llamadas a los procedimientos de la propiedad.

Para recuperar un valor de una propiedad


1. Utilice el nombre de propiedad en una expresin de la misma manera que utilizara un nombre de variable. Puede utilizar una propiedad en cualquier parte donde pueda utilizar una variable o constante. O bien, Utilice el nombre de propiedad detrs del signo igual (=) en una instruccin de asignacin. En el ejemplo siguiente se lee el valor de la propiedad Now de Visual Basic, y se llama implcitamente a su procedimiento Get. Visual Basic Copiar cdigo

Dim ThisMoment As Date ' The following statement calls the Get procedure of the Visual Basic Now property. ThisMoment = Now

2.

Si la propiedad acepta argumentos, agregue parntesis a continuacin del nombre de la propiedad para incluir entre ellos la lista de argumentos. Si no hay ningn argumento, puede omitir opcionalmente los parntesis.

3.

Coloque los argumentos en la lista de argumentos entre parntesis y separados por comas. Asegrese de proporcionar los argumentos en el mismo orden en que la propiedad define los parmetros correspondientes.

El valor de la propiedad participa en la expresin del mismo modo que una variable o constante, o se almacena en la variable o propiedad en el lado izquierdo de la instruccin de asignacin.

Procedimientos de operador
Un procedimiento de operador es una serie de instrucciones Visual Basic que definen el comportamiento de un operador estndar (como *, <> o And) en una clase o estructura definida, lo que tambin se conoce como sobrecarga de operadores. Cundo definir procedimientos de operador Tras definir una clase o estructura, puede declarar las variables para que pertenezcan al tipo de dicha clase o estructura. A veces estas variables deben participar en una operacin como parte de una expresin. Para ello, estas variables deben ser un operando de un operador. Visual Basic slo define operadores en sus tipos de datos fundamentales. Puede definir el comportamiento de un operador cuando uno o los dos operandos pertenecen al tipo de la clase o de la estructura. Para obtener ms informacin, vea Operator (Instruccin). Tipos de procedimientos de operador Los procedimientos de operador pueden ser de uno de los siguientes tipos:

Una definicin de un operador unario donde el argumento pertenece al tipo de la clase o estructura. Una definicin de un operador binario donde al menos uno de los argumentos pertenece al tipo de la clase o estructura. Una definicin de un operador de conversin donde el argumento pertenece al tipo de la clase o estructura. Una definicin de un operador de conversin que devuelve el tipo de la clase o estructura.

Los operadores de conversin siempre son unarios y siempre utilizan CType como el operador que se est definiendo. Sintaxis de la declaracin La sintaxis para declarar un procedimiento de operador es la siguiente:

Public Shared [Widening | Narrowing] Operator smboloDeOperador ( operando1 [, operando2 ]) As datatype ' Statements of the operator procedure. End Operator
Utilice nicamente la palabra clave Widening o Narrowing en un operador de conversin de tipos. El smbolo del operador siempre es CType (Funcin) en un operador de conversin de tipos.

Declare dos operandos para definir un operador binario y declare un operando para definir un operador unario, incluidos los operadores de conversin de tipos. Todos los operandos deben declararse ByVal. Declare cada operando del mismo modo que declara los parmetros de Procedimientos Sub. Tipo de datos Como est definiendo un operador de una clase o estructura que ha definido, al menos uno de los operandos debe tener el mismo tipo de datos que la clase o la estructura. En un operador de conversin de tipos, el operando o el tipo de valor devuelto debe pertenecer al tipo de datos de la clase o estructura. Para obtener ms detalles, consulte Operator (Instruccin). Sintaxis de llamada Para invocar un procedimiento de operador de forma implcita, utilice el smbolo del operador en una expresin. Proporcione los operandos de la misma manera que proporciona los operadores predefinidos. La sintaxis de una llamada implcita a un procedimiento de operador es la siguiente:

Dim testStruct As nombreDeEstructura Dim testNewStruct As nombreDeEstructura = testStruct smboloDeOperador 10


Ejemplo de declaracin y llamada La estructura siguiente almacena un valor entero con signo de 128 bits como las partes constitutivas de orden superior y de orden inferior. Esta estructura define el operador + para agregar dos valores

veryLong y generar un valor veryLong resultante.


Visual Basic Copiar cdigo

Public Structure veryLong Dim highOrder As Long Dim lowOrder As Long Public Shared Operator +(ByVal v As veryLong, _ ByVal w As veryLong) As veryLong Dim sum As New veryLong sum = v Try sum.lowOrder += w.lowOrder Catch ex As System.OverflowException sum.lowOrder -= (Long.MaxValue - w.lowOrder + 1) sum.highOrder += 1 End Try sum.highOrder += w.highOrder Return sum End Operator End Structure
En el ejemplo siguiente se muestra una llamada tpica al operador + establecido en veryLong. Visual Basic Copiar cdigo

Dim v1, v2, v3 As veryLong v1.highOrder = 1 v1.lowOrder = Long.MaxValue v2.highOrder = 0 v2.lowOrder = 4 v3 = v1 + v2


Para obtener ms informacin y ejemplos, vea Sobrecarga en Visual Basic 2005

Cmo: Definir un operador


Si ha definido una clase o estructura, puede definir el comportamiento de un operador estndar (como *, <> o And) cuando uno o los dos operandos pertenecen al tipo de datos de la clase o estructura. Defina al operador estndar como un procedimiento de operador dentro de la clase o estructura. Todos los procedimientos de operador deben ser Public Shared. La definicin de un operador de una clase o estructura tambin se denomina sobrecarga del operador. Ejemplo En el ejemplo siguiente se define el operador + en una estructura denominada height. La estructura utiliza altos que se miden en pies y pulgadas. Una pulgada equivale a 2,54 centmetros y un pie a 12 pulgadas. Para garantizar que los valores estn normalizados (pulgadas < 12,0), el constructor lleva a cabo una aritmtica mdulo 12. El operador + utiliza el constructor para generar valores normalizados. Visual Basic Copiar cdigo

Public Shadows Structure height ' Need Shadows because System.Windows.Forms.Form also defines property Height. Private feet As Integer Private inches As Double Public Sub New(ByVal f As Integer, ByVal i As Double) Me.feet = f + (CInt(i) \ 12) Me.inches = i Mod 12.0 End Sub Public Overloads Function ToString() As String Return Me.feet & "' " & Me.inches & """" End Function Public Shared Operator +(ByVal h1 As height, ByVal h2 As height) _ As height Return New height(h1.feet + h2.feet, h1.inches + h2.inches) End Operator End Structure
Puede probar la estructura height con el cdigo siguiente. Visual Basic Copiar cdigo

Public Sub consumeHeight() Dim p1 As New height(3, 10) Dim p2 As New height(4, 8) Dim p3 As height = p1 + p2 Dim s As String = p1.ToString() & " + " & p2.ToString() _ & " = " & p3.ToString() & " (= 8' 6"" ?)" Dim p4 As New height(2, 14) s &= vbCrLf & "2' 14"" = " & p4.ToString() & " (= 3' 2"" ?)" Dim p5 As New height(4, 24) s &= vbCrLf & "4' 24"" = " & p5.ToString() & " (= 6' 0"" ?)" MsgBox(s) End Sub
Para obtener ms informacin y ejemplos, vea Sobrecarga en Visual Basic 2005

Cmo: Definir un operador de conversin


Si ha definido una clase o estructura, puede definir un operador de conversin de tipos entre el tipo de la clase o estructura y otro tipo de datos (como Integer, Double o String).

Defina la conversin de tipos como un procedimiento CType (Funcin) en una clase o estructura. Todos los procedimientos de conversin deben ser Public Shared y cada uno debe especificar Widening o Narrowing. La definicin de un operador en una clase o estructura tambin se denomina sobrecargar al operador. Ejemplo El ejemplo siguiente define operadores de conversin entre una estructura denominada digit y un Byte. Visual Basic Copiar cdigo

Public Structure digit Private dig As Byte Public Sub New(ByVal b As Byte) If (b < 0 OrElse b > 9) Then Throw New _ System.ArgumentException("Argument outside range for Byte") Me.dig = b End Sub Public Shared Widening Operator CType(ByVal d As digit) As Byte Return d.dig End Operator Public Shared Narrowing Operator CType(ByVal b As Byte) As digit Return New digit(b) End Operator End Structure
Puede probar la estructura digit con el cdigo siguiente. Visual Basic Copiar cdigo

Public Sub consumeDigit() Dim d1 As New digit(4) Dim d2 As New digit(7) Dim d3 As digit = CType(CByte(3), digit) Dim s As String = "Initial 4 generates " & CStr(CType(d1, Byte)) _ & vbCrLf & "Initial 7 generates " & CStr(CType(d2, Byte)) _ & vbCrLf & "Converted 3 generates " & CStr(CType(d3, Byte)) Try Dim d4 As digit d4 = CType(CType(d1, Byte) + CType(d2, Byte), digit) Catch e4 As System.Exception s &= vbCrLf & "4 + 7 generates " & """" & e4.Message & """" End Try Try Dim d5 As digit = CType(CByte(10), digit) Catch e5 As System.Exception s &= vbCrLf & "Initial 10 generates " & """" & e5.Message & """" End Try MsgBox(s) End Sub

Cmo: Llamar a un procedimiento de operador


Se llama a un procedimiento de operador utilizando el smbolo de operador en una expresin. En el caso de un operador de conversin, se llama a CType (Funcin) para convertir un valor de un tipo de datos en otro.

No se llama de forma explcita a los procedimientos de operador. Se usa nicamente el operador o la funcin CType, en una instruccin de asignacin o una expresin, como normalmente se hace en un operador. Visual Basic realiza la llamada al procedimiento de operador. Definir un operador en una clase o estructura se denomina tambin sobrecargar el operador.

Para llamar a un procedimiento de operador


1. 2. Use el smbolo de operador en una expresin como lo hara normalmente. Asegrese de que los tipos de datos de los operandos son adecuados para el operador y estn en el orden correcto. 3. El operador contribuye al valor de la expresin tal como se espera.

Para llamar a un procedimiento de operador de conversin


1. 2. Utilice CType dentro de una expresin. Asegrese de que los tipos de datos de los operandos son adecuados para la conversin y estn en el orden correcto. 3. CType llama al procedimiento de operador de conversin y devuelve el valor convertido.

Ejemplo El ejemplo siguiente crea dos estructuras TimeSpan, las suma y almacena el resultado en una tercera estructura TimeSpan. La estructura TimeSpan define los procedimientos de operador para sobrecargar varios operadores estndar. Visual Basic Copiar cdigo

Dim Dim Dim Dim

firstSpan As New TimeSpan(3, 30, 0) secondSpan As New TimeSpan(1, 30, 30) combinedSpan As TimeSpan = firstSpan + secondSpan s As String = firstSpan.ToString() & _ " + " & secondSpan.ToString() & _ " = " & combinedSpan.ToString() MsgBox(s)
Como TimeSpan sobrecarga el operador + estndar, el ejemplo anterior llama a un procedimiento de operador cuando calcula el valor de combinedSpan. Para obtener un ejemplo de llamada a un procedimiento de operador de conversacin, vea Cmo: Utilizar una clase que define operadores. Compilar el cdigo Asegrese de que la clase o estructura que est utilizando define el operador que desea utilizar.

Cmo: Utilizar una clase que define operadores


Si est utilizando una clase o una estructura que define sus propios operadores, puede tener acceso a estos operadores desde Visual Basic. La definicin de un operador de una clase o estructura tambin se denomina sobrecarga del operador. Ejemplo

En el ejemplo siguiente se tiene acceso a la estructura SQL SqlString, que define los operadores de conversin (CType (Funcin)) entre una cadena SQL y una cadena de Visual Basic y viceversa. Use CType(expresin de cadena SQL, String) para convertir una cadena SQL en una cadena de Visual Basic y CType(expresin de cadena de Visual Basic, SqlString) para convertir en la direccin inversa. Visual Basic Copiar cdigo

' Insert the following line at the beginning of your source file. Imports System.Data.SqlTypes
Visual Basic Copiar cdigo

Public Sub setJobString(ByVal g As Integer) Dim title As String Dim jobTitle As System.Data.SqlTypes.SqlString Select Case g Case 1 title = "President" Case 2 title = "Vice President" Case 3 title = "Director" Case 4 title = "Manager" Case Else title = "Worker" End Select jobTitle = CType(title, SqlString) MsgBox("Group " & CStr(g) & " generates title """ _ & CType(jobTitle, String) & """") End Sub
La estructura SqlString define un operador de conversin (CType (Funcin)) de String a SqlString y otro de SqlString a String. La instruccin que asigna title a jobTitle utiliza el primer operador y la llamada a MsgBox (Funcin, Visual Basic) utiliza el segundo. Compilar el cdigo Asegrese de que la clase o la estructura que est utilizando define el operador que desea utilizar. No debe presuponer que la clase o la estructura ha definido cada operador disponible para su sobrecarga. Para obtener una lista de los operadores disponibles, vea Operator (Instruccin). Incluya la instruccin Imports apropiada en la cadena SQL al comienzo de su archivo de cdigo fuente (en este caso System.Data.SqlTypes). El proyecto debe tener referencias a System.Data y System.XML. Si necesita agregarlas, vea Cmo: Agregar y quitar referencias en Visual Studio (C#).

Argumentos y parmetros de procedimiento


En la mayora de los casos, un procedimiento necesita cierta informacin sobre las circunstancias en las que se le ha llamado. Un procedimiento que ejecuta tareas repetidas o compartidas utiliza datos distintos en cada llamada. Estos datos se componen de variables, constantes y expresiones que se transfieren al procedimiento cada vez que se le llama. Un parmetro representa un valor que el procedimiento espera que se proporcione cuando es llamado. La declaracin del procedimiento define sus parmetros. Puede definir un procedimiento sin parmetros, con un parmetro o con varios. La parte de la definicin del procedimiento que especifica los parmetros se denomina lista de parmetros.

Un argumento representa el valor que se proporciona a un parmetro del procedimiento cuando se llama al procedimiento. El cdigo de llamada proporciona los argumentos cuando llama al procedimiento. La parte de la llamada del procedimiento que especifica los argumentos se denomina lista de argumentos. En la siguiente ilustracin se muestra un cdigo que llama al procedimiento safeSquareRoot desde dos lugares diferentes. La primera llamada transfiere el valor de la variable x (4.0) al parmetro number y el valor devuelto en root (2.0) se asigna a la variable y. La segunda llamada transfiere el valor literal 9.0 a number y asigna el valor devuelto (3.0) a la variable z. Pasar un argumento a un parmetro

Para obtener ms informacin, vea Diferencias entre parmetros y argumentos. Tipo de datos de parmetro El tipo de datos de un parmetro se define utilizando la clusula As en su declaracin. Por ejemplo, la siguiente funcin acepta una cadena y un entero. Visual Basic Copiar cdigo

Function appointment(ByVal day As String, ByVal hour As Integer) As String ' Insert code to return any appointment for the given day and time. Return "appointment" End Function
Si el modificador de comprobacin de tipos (Option Strict (Instruccin)) es Off, la clusula As es opcional, pero si la utiliza un parmetro, deben utilizarla todos. Si la comprobacin de tipos es On, la clusula As ser obligatoria para todos los parmetros del procedimiento. Si el cdigo de llamada espera que se proporcione un argumento con un tipo de datos diferente al del parmetro correspondiente, por ejemplo Byte a un parmetro String, debe llevar a cabo una de las operaciones siguientes:

Proporcionar slo argumentos con tipos de datos que se amplen al tipo de datos del parmetro;

Establecer Option Strict Off para que permita conversiones de restriccin implcitas; o Utilizar una palabra clave de conversin para convertir explcitamente el tipo de datos.

Parmetros de tipo Un procedimiento genrico tambin define uno o ms parmetros de tipo, adems de sus parmetros normales. Un procedimiento genrico permite que el cdigo que llama pase tipos de datos distintos cada vez que llame al procedimiento; por tanto, puede personalizar los tipos de datos para los requisitos de cada llamada individual. Vea Procedimientos genricos en Visual Basic.

Diferencias entre parmetros y argumentos


En la mayora de los casos, un procedimiento debe tener cierta informacin sobre las circunstancias en las que se le ha llamado. Un procedimiento que ejecuta tareas repetidas o compartidas utiliza datos distintos en cada llamada. Estos datos se componen de variables, constantes y expresiones que se transfieren al procedimiento cada vez que se le llama. Para comunicar esta informacin al procedimiento, el procedimiento define un parmetro, y el cdigo de llamada transfiere un argumento a dicho parmetro. Puede imaginar el parmetro como una plaza de aparcamiento y el argumento como un automvil. Del mismo modo que diferentes automviles puede aparcan en la misma plaza de aparcamiento en momentos distintos, el cdigo de llamada puede transferir un argumento distinto al mismo parmetro cada vez que llama al procedimiento. Parmetros Un parmetro representa un valor que el procedimiento espera que se transfiera cuando es llamado. La declaracin del procedimiento define sus parmetros. Cuando se define un procedimiento Function o Sub, se especifica una lista de parmetros entre parntesis que va inmediatamente despus del nombre de procedimiento. Para cada parmetro, se especifica un nombre, un tipo de datos y un mecanismo para pasar argumentos (ByVal o ByRef). Tambin puede indicar que un parmetro es opcional. Esto significa que el cdigo de llamada no tiene que transferir un valor. El nombre de cada parmetro acta como una variable local en el procedimiento. El nombre del parmetro se utiliza del mismo modo que cualquier otra variable. Argumentos Un argumento representa el valor que se transfiere a un parmetro del procedimiento cuando se llama al procedimiento. El cdigo de llamada proporciona los argumentos cuando llama al procedimiento. Cuando se llama al procedimiento Function o Sub, se incluye una lista de argumentos entre parntesis que van inmediatamente despus del nombre del procedimiento. Cada argumento se corresponde con el parmetro situado en la misma posicin de la lista. A diferencia de la definicin de parmetros, los argumentos no tienen nombres. Cada argumento es una expresin que puede contener cero o ms variables, constantes y literales. El tipo de datos de la expresin evaluada normalmente debe coincidir con el tipo de datos definido para el parmetro correspondiente, y en algn caso, debe poder convertirse al tipo del parmetro.

Cmo: Definir un parmetro para un procedimiento


Un parmetro permite al cdigo de llamada pasar un valor al procedimiento cuando ste lo invoca. Los parmetros de un procedimiento se declaran igual que las variables, especificando el nombre y el tipo de datos. Tambin puede especificarse el mecanismo para pasar argumentos, y si se trata de un parmetro opcional.

Para obtener ms informacin, vea Argumentos y parmetros de procedimiento.

Para definir un parmetro de procedimiento


1. En la declaracin del procedimiento, agregue el nombre de parmetro a la lista de parmetros del procedimiento, separndolo de otros parmetros mediante comas. 2. 3. 4. Decida el tipo de datos del parmetro. Inserte una clusula As despus del nombre de parmetro para especificar el tipo de datos. Decida el mecanismo para pasar los argumentos que desea para el parmetro. Normalmente los parmetros se transfieren por valor, a menos que desee que el procedimiento pueda cambiar su valor en el cdigo de llamada. 5. Anteponga ByVal o ByRef al nombre del parmetro para especificar el mecanismo para pasar argumentos. Para obtener ms informacin, vea Diferencias entre pasar un argumento por valor y por referencia. 6. Si el parmetro es opcional, anteponga Optional (Visual Basic) al mecanismo para pasar argumentos y, detrs del tipo de datos del parmetro, incluya un signo igual (=) y un valor predeterminado. En el ejemplo siguiente se define el esquema de un procedimiento Sub con tres parmetros. Los dos primeros parmetros son obligatorios, mientras que el tercero es opcional. Las declaraciones de parmetros estn separadas en la lista de parmetros mediante comas. Visual Basic Copiar cdigo

Sub updateCustomer(ByRef c As customer, ByVal region As String, _ Optional ByVal level As Integer = 0) ' Insert code to update a customer object. End Sub
El primer parmetro acepta un objeto customer , y updateCustomer puede actualizar directamente la variable transferida a c porque el argumento se ha transferido ByRef. El procedimiento no puede cambiar los valores de los ltimos dos argumentos porque se han transferido ByVal. Si el cdigo de llamada no proporciona un valor para el parmetro level , Visual Basic lo establece en el valor predeterminado, que es 0. Si el modificador de comprobacin de tipo (Option Strict (Instruccin)) es Off, la clusula As es opcional cuando define un parmetro. Sin embargo, si un parmetro utiliza una clusula As, debern utilizarla todos ellos. Si el modificador de comprobacin de tipo es On, la clusula As es obligatoria en todas las definiciones de parmetros. La especificacin de tipos de datos para todos los elementos de programacin recibe el nombre de establecimiento inflexible de tipos. Cuando se establece Option Strict On, Visual Basic fuerza el establecimiento inflexible de tipos. Esto resulta muy recomendable por las siguientes razones:

Habilita la compatibilidad con IntelliSense para las variables y los parmetros. Esto permite ver las propiedades de las variables y otros miembros a medida que se escribe el cdigo.

Permite que el compilador realice la comprobacin de tipos. Permite detectar las instrucciones en las que se pueden producir errores en tiempo de ejecucin, como el desbordamiento. Tambin detecta llamadas a mtodos en objetos que no las admiten.

Tiene como consecuencia una ejecucin ms rpida del cdigo. Esto se debe en parte a que si no se especifica un tipo de datos para un elemento de programacin, el compilador de Visual Basic asigna el tipo Object. El cdigo compilado tendra que realizar conversiones en ambos sentidos entre Object y otros tipos de datos, lo que reducira el rendimiento.

Cmo: Pasar argumentos a un procedimiento


Al llamar a un procedimiento, se agrega detrs del nombre de procedimiento una lista de argumentos entre parntesis. Se proporciona un argumento correspondiente a cada parmetro necesario que el procedimiento define y, opcionalmente, se pueden proporcionar argumentos para los parmetros Optional. Cuando no se proporciona un parmetro Optional en la llamada, se debe incluir una coma para marcar su lugar en la lista de argumentos si se indica algn argumento posterior. Si se desea pasar un argumento de un tipo de datos diferente al del parmetro correspondiente, como Byte a String, se puede establecer el modificador de comprobacin de tipos (Option Strict (Instruccin)) en Off. Si Option Strict est en On, se deben utilizar conversiones de ampliacin o palabras clave de conversin explcita. Para obtener ms informacin, vea Conversiones de ampliacin y de restriccin y Funciones de conversin de tipos. Para obtener ms informacin, vea Argumentos y parmetros de procedimiento.

Para pasar uno o varios argumentos a un procedimiento


1. 2. En la instruccin de llamada, agregue parntesis detrs del nombre de procedimiento. Coloque una lista de argumentos entre los parntesis. Incluya un argumento para cada parmetro necesario que el procedimiento define y separe los argumentos por comas. 3. Asegrese de que cada argumento sea una expresin vlida que evala el tipo de datos convertible al tipo que el procedimiento define para el parmetro correspondiente. 4. Si un parmetro est definido como Optional (Visual Basic), puede incluirlo en la lista de argumentos u omitirlo. Si lo omite, el procedimiento utiliza el valor predeterminado definido para ese parmetro. 5. Si omite un argumento para un parmetro Optional y hay otro parmetro despus de l en la lista de parmetros, puede marcar el lugar del argumento omitido mediante una coma adicional en la lista de argumentos. El ejemplo siguiente llama a MsgBox (Funcin, Visual Basic) de Visual Basic. Visual Basic Copiar cdigo

Dim mbResult As MsgBoxResult Dim displayString As String = "Show this string to the user" mbResult = MsgBox(displayString, , "Put this in the title bar")
El ejemplo anterior proporciona el primer argumento necesario que es la cadena de mensaje que se va a mostrar. Omite un argumento para el segundo parmetro opcional que especifica los botones que se van a mostrar en el cuadro de mensaje. Como la llamada no proporciona ningn valor, MsgBox utiliza el valor predeterminado, MsgBoxStyle.OKOnly, que muestra slo un botn Aceptar. La segunda coma de la lista de argumentos marca el lugar del segundo argumento omitido y la ltima cadena pasa al tercer parmetro opcional de MsgBox, que es el texto que se va a mostrar en la barra de ttulo.

Pasar argumentos por valor y por referencia


En Visual Basic, puede transferir un argumento a un procedimiento por valor o por referencia. Esto se conoce como mecanismo para pasar argumentos, y determina si el procedimiento puede modificar el elemento de programacin subyacente al argumento en el cdigo de llamada. La declaracin del procedimiento determina el mecanismo para pasar argumentos de cada parmetro mediante la palabra clave ByVal o ByRef. Distinciones Al pasar un argumento a un procedimiento, tenga en cuenta las distintas condiciones que interactan entre s:

Si el elemento de programacin subyacente es modificable o no modificable Si el propio argumento es modificable o no modificable Si el argumento se transfiere por valor o por referencia Si el tipo de datos del argumento es un tipo de valor o un tipo de referencia

Para obtener ms informacin, vea Diferencias entre argumentos modificables y no modificables y Diferencias entre pasar un argumento por valor y por referencia. Seleccin del mecanismo para pasar argumentos Debe seleccionar minuciosamente el mecanismo para pasar argumentos de cada argumento.

Proteccin. A la hora de elegir uno de los dos mecanismos que existen para pasar argumentos, el criterio ms importante que hay que tener en cuenta es la exposicin al cambio de las variables de llamada. La ventaja de pasar un argumento con ByRef es que el procedimiento puede devolver un valor al cdigo de llamada por medio del argumento. La ventaja de pasarlo con ByVal es que protege a la variable de los cambios que sobre ella pueda efectuar el procedimiento.

Rendimiento. Aunque el mecanismo que se utilice para pasar argumentos tambin puede afectar al rendimiento del cdigo, la diferencia suele ser insignificante. Existe una excepcin: cuando se pasa un tipo de valor con ByVal. En esta caso, Visual Basic copia todo el contenido de los datos del argumento. Por lo tanto, para un tipo de valor grande, como una estructura, lo ms eficiente es transferirlo ByRef. En los tipos de referencia, slo se copia el puntero de los datos (cuatro bytes en plataformas de 32 bits y ocho bytes en plataformas de 64 bits). Por lo tanto, se pueden pasar argumentos de tipo String u Object por valor sin que esto afecte negativamente al rendimiento.

Determinacin del mecanismo para pasar argumentos La declaracin del procedimiento especifica el mecanismo para pasar argumentos de cada parmetro. El cdigo de llamada no puede reemplazar a un mecanismo ByVal, pero si un argumento se declara con ByRef, el cdigo de llamada puede forzar al mecanismo para que pase el argumento ByVal; para ello hay que encerrar el nombre del argumento entre parntesis en la llamada. En Visual Basic, los argumentos se pasan por valor de forma predeterminada. Puede hacer que al cdigo sea ms fcil de leer utilizando la palabra clave ByVal. Es un hbito de programacin recomendado incluir la palabra clave ByVal o ByRef con cada parmetro declarado. Cundo pasar un argumento por valor

Si el elemento del cdigo de llamada subyacente al argumento es un elemento no modificable, declare el parmetro correspondiente ByVal. Ningn cdigo puede cambiar el valor de un elemento no modificable.

Si el elemento subyacente es modificable, pero no desea que el procedimiento pueda modificar su valor, declare el parmetro ByVal. Slo el cdigo de llamada puede cambiar el valor de un elemento modificable transferido por valor.

Cundo pasar un argumento por referencia

Si el procedimiento necesita realmente modificar el valor subyacente en el cdigo de llamada, declare el parmetro correspondiente ByRef. Si la ejecucin correcta del cdigo depende del procedimiento que cambia el elemento subyacente en el cdigo de llamada, declare el parmetro ByRef. Si lo transfiere por valor o si el cdigo de llamada en lugar de utilizar el mecanismo para pasar argumentos ByRef incluye el argumento entre parntesis, la llamada al procedimiento podra producir resultados inesperados.

Diferencias entre argumentos modificables y no modificables


Cuando se llama a un procedimiento, normalmente se transfieren uno o varios argumentos a dicho procedimiento. Cada argumento se corresponde con un elemento de programacin subyacente. Los elementos subyacentes y los argumentos pueden ser modificables o no modificables.

Elementos modificables y no modificables Un elemento de programacin puede ser un elemento modificable, cuyo valor se puede modificar, o un elemento no modificable, cuyo valor se mantiene fijo una vez que se ha creado.

En la tabla siguiente se muestran los elementos de programacin modificables y no modificables.

Elementos modificables Variables locales (se declaran dentro de los procedimientos), incluidas las variables de objeto, excepto las de slo lectura Campos (variables miembro de mdulos, clases y estructuras), excepto las de slo lectura Propiedades, salvo las de slo lectura Elementos matriciales

Elementos no modificables Variables, campos y propiedades de slo lectura Constantes y literales

Miembros de enumeraciones Expresiones (aun cuando sus elementos sean modificables)

Argumentos modificables y no modificables Un argumento modificable es aquel que tiene un elemento subyacente que se puede modificar. El cdigo de llamada puede almacenar un nuevo valor en cualquier momento y, si se transfiere el argumento ByRef, el cdigo del procedimiento tambin puede modificar el elemento subyacente en el cdigo de llamada.

Un argumento no modificable o tiene un elemento subyacente no modificable o se ha transferido ByVal. El procedimiento no puede modificar el elemento subyacente en el cdigo

de llamada, aun cuando se trate de un elemento modificable. Si es un elemento no modificable, tampoco podr modificarlo el propio cdigo de llamada.

El procedimiento invocado podra modificar la copia local del argumento no modificable, pero esta modificacin no afectara al elemento subyacente del cdigo de llamada.

Diferencias entre pasar un argumento por valor y por referencia


Cuando pasa uno o ms argumentos a un procedimiento, cada argumento corresponde a un elemento de programacin subyacente en el cdigo de llamada. Puede pasar el valor de este elemento subyacente o una referencia a l. Esto se conoce como mecanismo para pasar argumentos.

Pasar por valor Un argumento se pasa por valor especificando la palabra clave ByVal para el parmetro correspondiente en la definicin de procedimiento. Cuando utiliza este mecanismo para pasar argumentos, Visual Basic copia el valor del elemento de programacin subyacente en una variable local del procedimiento. El cdigo de procedimiento no tiene ningn acceso al elemento subyacente del cdigo de llamada.

Pasar por referencia Un argumento se pasa por referencia especificando la palabra clave ByRef para el parmetro correspondiente en la definicin de procedimiento. Cuando utiliza este mecanismo para pasar argumentos, Visual Basic da al procedimiento una referencia directa al elemento de programacin subyacente del cdigo de llamada.

Mecanismo para pasar argumentos y tipo de elemento La opcin del mecanismo para pasar argumentos no es igual que la clasificacin del tipo de elemento subyacente. Pasar por valor o por referencia hace referencia a lo que Visual Basic proporciona al cdigo de procedimiento. Un tipo de valor o un tipo de referencia hace referencia a cmo se almacena un elemento de programacin en memoria.

Sin embargo, el mecanismo para pasar argumentos y el tipo de elemento estn relacionados. El valor de un tipo de referencia es un puntero que seala a los datos de otra parte de la memoria. Esto significa que cuando pasa un tipo de referencia por valor, el cdigo de procedimiento tiene un puntero que seala a los datos del elemento subyacente, aunque no tenga acceso al elemento subyacente en s. Por ejemplo, si el elemento es una variable de matriz, el cdigo de procedimiento no tiene acceso a la variable en s, pero s a los miembros de la matriz.

Capacidad de modificacin Si se pasa un elemento no modificable como argumento, el procedimiento no podr modificarlo nunca en el cdigo de llamada, se pase con ByVal o con ByRef. En la tabla siguiente se resume, para un elemento modificable, la interaccin entre el tipo del elemento y el mecanismo para pasar argumentos.

Tipo de elemento Tipo de valor (slo contiene un valor)

ByVal pasado El procedimiento no puede modificar la variable ni ninguno de los miembros de sta. El procedimiento no puede modificar la variable, pero puede cambiar los miembros de la instancia a la que seala.

ByRef pasado El procedimiento puede modificar la variable y los miembros de sta. El procedimiento puede cambiar la variable y los miembros de la instancia a la que seala.

Tipo de referencia (contiene un puntero a una instancia de clase o estructura)

Cmo: Cambiar el valor de un argumento de procedimiento

Cuando llama a un procedimiento, cada argumento proporcionado se corresponde con uno de los parmetros definidos en el procedimiento. En algunos casos, el cdigo del procedimiento puede cambiar el valor subyacente a un argumento en el cdigo de llamada. En otros casos, el procedimiento slo puede cambiar la copia local de un argumento. Cuando llama al procedimiento, Visual Basic hace una copia local de cada argumento transferido ByVal. En cada argumento transferido ByRef, Visual Basic proporciona al cdigo del procedimiento una referencia directa al elemento de programacin subyacente al argumento en el cdigo de llamada. Si el elemento subyacente del cdigo de llamada es un elemento modificable y el argumento se transfiere ByRef, el cdigo del procedimiento puede utilizar la referencia directa para cambiar el valor del elemento en el cdigo de llamada. Cambiar el valor subyacente

Para cambiar el valor subyacente de un argumento del procedimiento en el cdigo de llamada


1. En la declaracin del procedimiento, especifique ByRef en el parmetro que se corresponda con el argumento. 2. 3. 4. En el cdigo de llamada, transfiera un elemento de programacin modificable como argumento. En el cdigo de llamada, no incluya el argumento entre parntesis en la lista de argumentos. En el cdigo de procedimiento, utilice el nombre de parmetro para asignar un valor al elemento subyacente del cdigo de llamada. Vea el ejemplo siguiente para consultar una demostracin. Cambiar las copias locales Si el elemento subyacente del cdigo de llamada no es un elemento modificable o si el argumento se transfiere ByVal, el procedimiento no puede cambiar su valor en el cdigo de llamada. Sin embargo, el procedimiento puede cambiar la copia local de este tipo de argumento.

Para cambiar la copia de un argumento del procedimiento en el cdigo del procedimiento


1. En la declaracin del procedimiento, especifique ByVal en el parmetro que se corresponda con el argumento. O bien En el cdigo de llamada, incluya el argumento entre parntesis en la lista de argumentos. Esto hace que Visual Basic transfiera el argumento por valor, aun cuando el parmetro correspondiente especifique ByRef. 2. En el cdigo del procedimiento, utilice el nombre de parmetro para asignar un valor a la copia local del argumento. El valor subyacente del cdigo de llamada no se modifica. Ejemplo En el siguiente ejemplo se muestran dos procedimientos que toman una variable de matriz y operan con sus elementos. El procedimiento increase sencillamente suma una unidad a cada elemento. El procedimiento replace asigna una nueva matriz al parmetro a() y, a continuacin, suma una unidad a cada elemento.

Visual Basic Copiar cdigo

Public Sub increase(ByVal a() As Long) For j As Integer = 0 To UBound(a) a(j) = a(j) + 1 Next j End Sub
Visual Basic Copiar cdigo

Public Sub replace(ByRef a() As Long) Dim k() As Long = {100, 200, 300} a = k For j As Integer = 0 To UBound(a) a(j) = a(j) + 1 Next j End Sub
Visual Basic Copiar cdigo

Dim n() As Long = {10, 20, 30, 40} Call increase(n) MsgBox("After increase(n): " & CStr(n(0)) & ", " & _ CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3))) Call replace(n) MsgBox("After replace(n): " & CStr(n(0)) & ", " & _ CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
La primera llamada a MsgBox muestra "After increase(n): 11, 21, 31, 41". Dado que la matriz n es un tipo de referencia, replace puede cambiar sus miembros, aunque el mecanismo para transferir argumentos es ByVal. La segunda llamada a MsgBox muestra "After replace(n): 101, 201, 301". Dado que n se transfiere ByRef, replace puede modificar la variable n en el cdigo de llamada y asignarle una nueva matriz. Como n es un tipo de referencia, replace tambin puede cambiar sus miembros. Puede evitar que el procedimiento modifique la propia variable en el cdigo de llamada. Vea Cmo: Proteger un argumento de procedimiento para que no se realicen cambios de valor. Compilar el cdigo Cuando se pasa una variable por referencia, debe utilizarse la palabra clave ByRef para especificar este mecanismo. En Visual Basic, los argumentos se pasan por valor de forma predeterminada. Sin embargo, es una prctica de programacin recomendable incluir la palabra clave ByVal o ByRef con cada parmetro declarado. De este modo, el cdigo resulta ms fcil de leer. Seguridad Existe siempre el riesgo potencial de permitir que un procedimiento cambie el valor subyacente a un argumento en el cdigo de llamada. Asegrese de que tiene previsto que este valor se modifique y preprese para comprobar su validez antes de utilizarlo.

Cmo: Proteger un argumento de procedimiento para que no se realicen cambios de valor


Si un procedimiento declara un parmetro ByRef, Visual Basic proporciona al cdigo del procedimiento una referencia directa al elemento de programacin subyacente al argumento en el cdigo de llamada. Esto permite al procedimiento cambiar el valor subyacente al argumento en el cdigo de llamada. En algunos casos, es probable que se desee proteger el cdigo de llamada frente a este tipo de cambios.

Para proteger un argumento y que no se efecten cambios, puede declarar el parmetro correspondiente ByVal en el procedimiento. Si desea poder cambiar un determinado argumento en algunos casos pero no en otros, puede declararlo ByRef y permitir que el cdigo de llamada determine el mecanismo para pasar argumentos en cada llamada. Para ello, incluya el argumento correspondiente entre parntesis para transferirlo por valor o djelo sin parntesis para transferirlo por referencia. Para obtener ms informacin, vea Cmo: Forzar un argumento para que pase como un valor. Ejemplo En el siguiente ejemplo se muestran dos procedimientos que toman una variable de matriz y operan con sus elementos. El procedimiento increase sencillamente suma una unidad a cada elemento. El procedimiento replace asigna una nueva matriz al parmetro a() y, a continuacin, suma una unidad a cada elemento. La reasignacin, sin embargo, no afecta a la variable de matriz subyacente al cdigo de llamada. Visual Basic Copiar cdigo

Public Sub increase(ByVal a() As Long) For j As Integer = 0 To UBound(a) a(j) = a(j) + 1 Next j End Sub
Visual Basic Copiar cdigo

Public Sub replace(ByVal a() As Long) Dim k() As Long = {100, 200, 300} a = k For j As Integer = 0 To UBound(a) a(j) = a(j) + 1 Next j End Sub
Visual Basic Copiar cdigo

Dim n() As Long = {10, 20, 30, 40} Call increase(n) MsgBox("After increase(n): " & CStr(n(0)) & ", " & _ CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3))) Call replace(n) MsgBox("After replace(n): " & CStr(n(0)) & ", " & _ CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
La primera llamada a MsgBox muestra "After increase(n): 11, 21, 31, 41". Dado que la matriz n es un tipo de referencia, replace puede cambiar sus miembros, aunque el mecanismo para transferir argumentos es ByVal. La segunda llamada a MsgBox muestra "After replace(n): 11, 21, 31, 41". Dado que n se transfiere ByVal, replace no puede modificar la variable n en el cdigo de llamada ni asignarle una nueva matriz. Cuando replace crea la nueva instancia de la matriz k y la asigna a la variable local a, pierde la referencia a n que se transfiri en el cdigo de llamada. Cuando cambia los miembros de a, slo resulta afectada la matriz local k . Por consiguiente, replace no incrementa los valores de la matriz n en el cdigo de llamada. Compilar el cdigo En Visual Basic, los argumentos se pasan por valor de forma predeterminada. Sin embargo, es una prctica de programacin recomendable incluir la palabra clave ByVal o ByRef con cada parmetro declarado. De este modo, el cdigo resulta ms fcil de leer.

Cmo: Forzar un argumento para que pase como un valor


El mecanismo para pasar argumentos se determina en la declaracin del procedimiento. Si un parmetro se declara ByRef, Visual Basic espera transferir el argumento correspondiente por referencia. Esto permite al procedimiento cambiar el valor del elemento de programacin subyacente al argumento en el cdigo de llamada. Si desea proteger el elemento subyacente frente a un cambio de este tipo, puede encerrar entre parntesis el nombre del argumento en lugar de utilizar el mecanismo para pasar argumentos ByRef en la llamada al procedimiento. Estos parntesis son distintos de los parntesis que encierran la lista de argumentos en la llamada. El cdigo de llamada no puede reemplazar un mecanismo ByVal.

Para forzar un argumento para que pase por valor


Ejemplo

Si el parmetro correspondiente se declara ByVal en el procedimiento, no es necesario realizar pasos adicionales. Visual Basic ya tiene previsto transferir el argumento por valor. Si el parmetro correspondiente se declara ByRef en el procedimiento, incluya el argumento entre parntesis en la llamada al procedimiento.

En el ejemplo siguiente se reemplaza una declaracin del parmetro ByRef. En la llamada que obliga a utilizar ByVal, tenga en cuenta los dos niveles de parntesis. Visual Basic Copiar cdigo

Sub setNewString(ByRef inString As String) inString = "This is a new value for the inString argument." MsgBox(inString) End Sub
Visual Basic Copiar cdigo

Dim str As String = "Cannot be replaced if passed ByVal" ' The following call passes str ByVal even though it is declared ByRef. Call setNewString((str)) ' The parentheses around str protect it from change. MsgBox(str) ' The following call allows str to be passed ByRef as declared. Call setNewString(str) ' Variable str is not protected from change. MsgBox(str)
Cuando str est encerrado entre parntesis adicionales dentro de la lista de argumentos, el procedimiento setNewString no puede cambiar su valor en el cdigo de llamada, y MsgBox muestra "Cannot be replaced if passed ByVal". Cuando str no est incluido entre parntesis adicionales, el procedimiento no puede cambiarlo, y MsgBox muestra "This is a new value for the inString argument". Compilar el cdigo Cuando se pasa una variable por referencia, debe utilizarse la palabra clave ByRef para especificar este mecanismo.

En Visual Basic, los argumentos se pasan por valor de forma predeterminada. Sin embargo, es una prctica de programacin recomendable incluir la palabra clave ByVal o ByRef con cada parmetro declarado. De este modo, el cdigo resulta ms fcil de leer. Programacin eficaz Si un procedimiento declara un parmetro ByRef, la ejecucin correcta del cdigo depender de si es capaz de cambiar el elemento subyacente en el cdigo de llamada. Si el cdigo de llamada sustituye este mecanismo de llamada encerrando el argumento entre parntesis, o si transfiere un argumento que no se puede modificar, el procedimiento no puede cambiar el elemento subyacente. Esto podra generar resultados inesperados en el cdigo de llamada. Seguridad Existe siempre el riesgo potencial de permitir que un procedimiento cambie el valor subyacente a un argumento en el cdigo de llamada. Asegrese de que tiene previsto que este valor se modifique y preprese para comprobar su validez antes de utilizarlo.

Pasar argumentos por posicin o por nombre


Cuando se llama a un procedimiento Sub o Function, los argumentos pueden pasarse por posicin, es decir, en el orden en que aparecen en la definicin del procedimiento, o por nombre, sin tener en cuenta la posicin. Para pasar un argumento por nombre, hay que especificar el nombre declarado del argumento, seguido de un signo de dos puntos y un signo igual (:=) y seguido del valor del argumento. Los argumentos que se pasan por nombre pueden suministrarse en cualquier orden. Por ejemplo, el siguiente procedimiento Sub toma tres argumentos: Visual Basic Copiar cdigo

Sub studentInfo(ByVal name As String, _ Optional ByVal age As Short = 0, _ Optional ByVal birth As Date = #1/1/2000#) Debug.WriteLine("Name = " & name & _ "; age = " & CStr(age) & _ "; birth date = " & CStr(birth)) End Sub
Cuando se llama a este procedimiento, los argumentos pueden suministrarse por posicin, por nombre o mediante una combinacin de ambos. Pasar argumentos por posicin Puede llamar al procedimiento studentInfo pasando sus argumentos por posicin y delimitados por comas, como se muestra en el ejemplo siguiente: Visual Basic Copiar cdigo

Call studentInfo("Mary", 19, #9/21/1981#)


Si omite un argumento opcional de una lista de argumentos por posicin, deber mantener su posicin mediante una coma. El ejemplo siguiente llama a studentInfo sin el argumento age : Visual Basic Copiar cdigo

Call studentInfo("Mary", , #9/21/1981#)


Pasar argumentos por nombre

Otra opcin es llamar al procedimiento studentInfo pasando sus argumentos por nombre, tambin delimitados por comas, como se muestra en el ejemplo siguiente: Visual Basic Copiar cdigo

Call studentInfo(age:=19, birth:=#9/21/1981#, name:="Mary")


Pasar argumentos por posicin y por nombre Puede suministrar los argumentos por posicin y por nombre a la vez en la misma llamada a un procedimiento, como se muestra en el ejemplo siguiente: Visual Basic Copiar cdigo

Call studentInfo("Mary", birth:=#9/21/1981#)


En el ejemplo anterior, no se necesita una coma adicional para mantener la posicin del argumento age omitido, puesto que birth se pasa por nombre. Si se suministran argumentos por nombre y por posicin, los argumentos por posicin deben preceder al resto. Si se ha suministrado un argumento por nombre, el resto de los argumentos debern especificarse tambin por nombre. Suministrar argumentos opcionales por nombre Pasar argumentos por nombre tiene especial utilidad si se llama a un procedimiento que tiene varios argumentos opcionales. Si se suministran argumentos por nombre, no es necesario utilizar comas consecutivas para denotar los argumentos por posicin ausentes. Pasar argumentos por nombre facilita tambin la tarea de realizar un seguimiento de los argumentos que se pasan y de los que se omiten. Restricciones al suministro de argumentos por nombre No se pueden pasar argumentos por nombre a fin de evitar tener que especificar argumentos requeridos. Slo pueden omitirse los argumentos opcionales. No se puede pasar una matriz de parmetros por nombre. Esto obedece a que, cuando se llama al procedimiento, se suministra a la matriz de parmetros un nmero indeterminado de argumentos separados por comas, y el compilador no puede asociar ms de un argumento a cada nombre individual.

Cmo: Pasar argumentos a un procedimiento por nombre


Cuando llama a un procedimiento Sub o Function, puede transferirle argumentos por nombre, sin tener en cuenta el orden en el que aparecen los parmetros correspondientes en la definicin del procedimiento. Los argumentos que se transfieren por nombre hacen que el cdigo de llamada sea ms fcil de leer porque proporcionan significado a los valores de los argumentos en la llamada al procedimiento. Si el procedimiento tiene parmetros opcionales, al transferir los argumentos por nombre, tambin resulta ms fcil hacer un seguimiento de los argumentos que se estn transfiriendo y de los que se estn omitiendo. Para obtener informacin sobre las reglas y restricciones necesarias para proporcionar argumentos por nombre, vea Pasar argumentos por posicin o por nombre.

Para pasar un argumento por nombre


1. Examine el cdigo fuente de la declaracin del procedimiento para determinar la ortografa exacta de los nombres de parmetro.

2.

En el cdigo de llamada, prepare la llamada al procedimiento de la manera habitual, con la lista de argumentos entre parntesis detrs del nombre de procedimiento.

3.

En cada argumento que desee transferir, proporcione el nombre declarado del parmetro seguido de dos puntos y un signo igual (:=) y, a continuacin, incluya el valor que est transfiriendo para el argumento.

4.

Puede proporcionar los argumentos con nombre en cualquier orden, pero debe proporcionar todos los argumentos posicionales antes de proporcionar cualquier argumento con nombre.

Ejemplo En el ejemplo siguiente se muestra un procedimiento Sub con tres parmetros, y una instruccin Instruccin Call (Visual Basic) que transfiere los argumentos a estos parmetros por nombre. Visual Basic Copiar cdigo

Sub studentInfo(ByVal name As String, _ Optional ByVal age As Short = 0, _ Optional ByVal birth As Date = #1/1/2000#) Debug.WriteLine("Name = " & name & _ "; age = " & CStr(age) & _ "; birth date = " & CStr(birth)) End Sub
Visual Basic Copiar cdigo

Call studentInfo(age:=19, birth:=#9/21/1981#, name:="Mary")


Cuando pasa los argumentos por nombre, no tiene que proporcionarlos en el mismo orden en el que los declara el procedimiento. Compilar el cdigo Asegrese de que el nombre del parmetro en la lista de argumentos coincide exactamente con el nombre declarado por el procedimiento.

Parmetros opcionales
Un parmetro de un procedimiento puede ser opcional si as se especifica y no es necesario proporcionarle argumentos al llamar al procedimiento. Los parmetros opcionales se indican mediante la palabra clave Optional en la definicin del procedimiento. Se aplican las siguientes reglas:

Todos los parmetros opcionales de la definicin del procedimiento deben especificar un valor predeterminado. El valor predeterminado de un parmetro opcional debe ser una expresin constante. Todos los parmetros que vayan a continuacin de un parmetro opcional en la definicin del procedimiento tambin deben ser opcionales.

La siguiente sintaxis muestra una declaracin de procedimiento con un parmetro opcional: Copiar cdigo

Sub sub name(ByVal parameter 1 As data type 1, Optional ByVal parameter 2 As data type 2 = default value)
Llamar a procedimientos con parmetros opcionales Cuando se llama a un procedimiento con un parmetro opcional, se puede elegir si se proporciona o no el argumento. Si no se proporciona, el procedimiento utiliza el valor predeterminado declarado para dicho parmetro.

Si se omiten uno o ms argumentos opcionales de la lista de argumentos, hay que utilizar comas sucesivas para delimitar sus posiciones. En el ejemplo de llamada siguiente se suministran los argumentos primero y cuarto, pero no el segundo ni el tercero: Copiar cdigo

Call sub name(argument 1, , , argument 4)


Determinar si un argumento opcional est presente En tiempo de ejecucin un procedimiento no puede detectar si un argumento determinado se ha omitido o si el cdigo de llamada ha suministrado de forma explcita el valor predeterminado de dicho argumento. Si fuese necesario hacer esta distincin, se podra establecer como valor predeterminado un valor improbable. El siguiente procedimiento define el parmetro opcional office y comprueba si su valor predeterminado, QJZ, ha sido omitido en la llamada: Visual Basic Copiar cdigo

Sub notify(ByVal company As String, Optional ByVal office As String = "QJZ") If office = "QJZ" Then Debug.WriteLine("office not supplied -- using Headquarters") office = "Headquarters" End If ' Insert code to notify headquarters or specified office. End Sub
Si el parmetro opcional es un tipo de referencia, como String, puede utilizar Nothing como valor predeterminado, siempre y cuando ste no sea un valor esperado para el argumento. Parmetros opcionales y sobrecarga Otra forma de definir un procedimiento con parmetros opcionales consiste en utilizar una sobrecarga. Si tiene un parmetro opcional, puede definir dos versiones sobrecargadas del procedimiento, una que acepte el parmetro y otra sin l. Este planteamiento se complica a medida que aumenta el nmero de parmetros opcionales. No obstante, tiene la ventaja de que permite saber con total certeza si el programa de llamada ha suministrado o no cada argumento opcional.

Cmo: Definir parmetros opcionales para un procedimiento


Puede especificar que un parmetro de un procedimiento sea opcional, para que el cdigo de llamada no tenga que proporcionar un argumento al llamar al procedimiento. En este caso, se define un valor predeterminado que el procedimiento utiliza si no se proporciona el argumento. Puede definir ms de un parmetro opcional pero todos los parmetros opcionales deben estar al final de la lista de parmetros. Todos los parmetros necesarios deben preceder a los parmetros opcionales.

Para definir un parmetro opcional


1. En la declaracin del procedimiento, anteponga al nombre de parmetro en la lista de parmetros la palabra clave Optional. 2. Agregue detrs del nombre de parmetro la clusula As de la manera habitual y agregue detrs de la clusula As un signo igual (=). 3. Agregue detrs del signo igual el valor predeterminado para el parmetro. ste debe ser una expresin constante para que el compilador pueda evaluarlo completamente en tiempo de compilacin.

4.

Debe declarar todos los parmetros subsiguientes como Optional.

Ejemplo El siguiente ejemplo muestra una declaracin de procedimiento con un parmetro opcional: Visual Basic Copiar cdigo

Sub notify(ByVal company As String, Optional ByVal office As String = "QJZ") If office = "QJZ" Then Debug.WriteLine("office not supplied -- using Headquarters") office = "Headquarters" End If ' Insert code to notify headquarters or specified office. End Sub
Si el cdigo de llamada no proporciona un valor para office en la lista de argumentos, Visual Basic proporciona el valor predeterminado de "QJZ". Compilar el cdigo Debe especificar un valor predeterminado para todos los parmetros opcionales en la declaracin de procedimiento. Asegrese de que los valores predeterminados sean una constante que el compilador pueda evaluar en tiempo de compilacin.

Cmo: Llamar a un procedimiento que utiliza parmetros opcionales


Cuando se llama a un procedimiento con un parmetro opcional, es posible elegir si se suministra o no el argumento correspondiente. Si no se suministra, el procedimiento utiliza el valor predeterminado declarado para dicho parmetro.


Ejemplo

Si desea proporcionar el argumento, inclyalo en la lista de argumentos del modo habitual, entre comas. Si desea omitir el argumento, utilice comas sucesivas en la lista de argumentos para marcar su omisin. Si omite el argumento y est proporcionando los argumentos por nombre, no es necesario indicar al argumento omitido mediante el nombre ni mediante comas.

En el ejemplo siguiente se llevan a cabo varias llamadas a la funcin MsgBox. MsgBox tiene un parmetro obligatorio y dos parmetros opcionales. Visual Basic Copiar cdigo

MsgBox("Important message", MsgBoxStyle.Critical, "MsgBox Example") MsgBox("Just display this message.") MsgBox("Test message", , "Title bar text") MsgBox(Title:="Title bar text", Prompt:="Test message")
La primera llamada a MsgBox proporciona los tres argumentos en el orden en que MsgBox los define. La segunda llamada nicamente proporciona el argumento obligatorio. La tercera y la cuarta llamada proporcionan el primer y el tercer argumento. La tercera llamada lo hace por posicin y la llamada cuarta, por nombre. Compilar el cdigo

Antes de omitir un argumento en una lista de argumentos, asegrese de que el parmetro correspondiente es opcional y de que desea que el procedimiento utilice el valor predeterminado para dicho parmetro. Si proporciona un argumento por nombre, compruebe que el nombre incluido en la lista de argumentos coincide exactamente con el nombre del parmetro declarado.

Cmo: Determinar si se ha suministrado un parmetro opcional


Cuando un procedimiento define un parmetro opcional, es posible que sea necesario determinar si el cdigo de llamada ha proporcionado el argumento correspondiente o lo ha omitido. Si el valor del parmetro es igual a su valor predeterminado, esto podra deberse a uno de los motivos siguientes:

El cdigo de llamada omiti el argumento en la llamada al procedimiento; o El cdigo de llamada proporcion un argumento con un valor que es exactamente igual al valor predeterminado del parmetro.

El cdigo del procedimiento no puede distinguir entre estas dos posibilidades. A menudo esto no es importante, pero en ciertos casos el procedimiento podra tener que tomar medidas distintas en cada una de estas situaciones. El mejor enfoque del que dispone es definir un valor improbable como valor predeterminado, aunque esto no garantiza que el cdigo de llamada no pueda suministrarlo. Es importante estar completamente seguro de que el programa que realiza la llamada proporciona un argumento opcional; el enfoque ms seguro es definir versiones sobrecargadas del procedimiento. Vea Cmo: Definir varias versiones de un procedimiento y Consideraciones sobre la sobrecarga de procedimientos.

Para determinar si un argumento se ha transferido a un parmetro opcional


1. 2. Defina un valor que sea sumamente improbable como valor predeterminado para el parmetro. Si el argumento opcional es un tipo de referencia, como String, puede utilizar Nothing como valor predeterminado, siempre y cuando ste no sea un valor esperado para el argumento. 3. En el cdigo del procedimiento, compare el parmetro frente el valor predeterminado y tome las medidas adecuadas. Sobrecargar un procedimiento con y sin un parmetro opcional Otra forma de definir un procedimiento con parmetros opcionales consiste en utilizar una sobrecarga. Si tiene un parmetro opcional, puede definir dos versiones sobrecargadas del procedimiento, una que acepte el parmetro y otra que no lo acepte. Este planteamiento se complica a medida que aumenta el nmero de parmetros opcionales. No obstante, tiene la ventaja de que permite saber con total certeza si el programa de llamada ha suministrado o no cada argumento opcional.

Para definir versiones diferentes del procedimiento en las que se incluya y se omita un argumento
1. Defina una versin del procedimiento con el parmetro en la lista de argumentos. No declare el parmetro como Optional.

2.

Defina otra versin del procedimiento sin el parmetro. La declaracin debera ser idntica a la de la primera versin en todos los dems aspectos.

3.

Site el cdigo apropiado para cada llamada en la versin correspondiente del procedimiento.

Ejemplo El procedimiento que se muestra a continuacin define el argumento opcional office y comprueba si su valor predeterminado, QJZ, se ha omitido en la llamada: Visual Basic Copiar cdigo

Sub notify(ByVal company As String, Optional ByVal office As String = "QJZ") If office = "QJZ" Then Debug.WriteLine("office not supplied -- using Headquarters") office = "Headquarters" End If ' Insert code to notify headquarters or specified office. End Sub
Si el cdigo de llamada no proporciona un valor para office en la lista de argumentos, Visual Basic proporciona el valor predeterminado "QJZ". Si el argumento opcional es un tipo de referencia, como String, puede utilizar Nothing (Visual Basic) como valor predeterminado, siempre y cuando ste no sea un valor esperado para el argumento. Para consultar un ejemplo sobre cmo se utilizan las sobrecargas para determinar si se ha transferido un parmetro opcional, vea Cmo: Sobrecargar un procedimiento que toma parmetros opcionales.

Matrices de parmetros
Normalmente no es posible llamar a un procedimiento con un nmero de argumentos superior al especificado en la declaracin del procedimiento. Si se necesita un nmero indeterminado de argumentos, puede declararse una matriz de parmetros, que permite que un procedimiento acepte una matriz de valores en un parmetro. No es necesario conocer el nmero de elementos de la matriz de parmetros en el momento de definir el procedimiento. El tamao de la matriz se determina individualmente en cada llamada al procedimiento. Declarar una matriz de parmetros Utilice la palabra clave ParamArray para denotar una matriz de parmetros en la lista de parmetros. Se aplican las siguientes reglas:

Un procedimiento puede definir nicamente una matriz de parmetros, que debe ser el ltimo parmetro en la definicin del procedimiento. La matriz de parmetros debe pasarse por valor. Es un hbito de programacin recomendado incluir de manera explcita la palabra clave ByVal en la definicin del procedimiento.

La matriz de parmetros es opcional de forma automtica. Su valor predeterminado es una matriz unidimensional vaca del tipo de elemento de la matriz de parmetros. Todos los parmetros que preceden a la matriz de parmetros deben ser obligatorios. La matriz de parmetros debe ser el nico parmetro opcional.

Para obtener ms informacin, vea Cmo: Definir un procedimiento con un nmero indefinido de parmetros.

Llamar a un lista de parmetros Cuando se llama a un procedimiento que define una matriz de parmetros, se puede proporcionar el argumento de los siguientes modos:

Ninguno, es decir, puede omitirse el argumento ParamArray. En este caso, se pasar una matriz vaca al procedimiento. Tambin puede pasarse la palabra clave Nothing (Visual Basic), obtenindose el mismo efecto.

Una lista con un nmero arbitrario de argumentos, separados por comas. El tipo de los datos de cada argumento debe poder convertirse implcitamente al tipo de elemento ParamArray.

Una matriz con el mismo tipo de elemento que la matriz de parmetros.

En todas las clases, el cdigo del procedimiento debe considerar la matriz de parmetros una matriz unidimensional, cuyos elementos deben tener el mismo tipo de datos que ParamArray. Para obtener ms informacin, vea Cmo: Llamar a un procedimiento que toma un nmero indefinido de parmetros.

Nota de seguridad: Si se trabaja con matrices cuyo tamao es excesivamente grande, existe el riesgo de sobrecargar alguna capacidad interna de la aplicacin. Si acepta una matriz de parmetros, debe comprobar el tamao de la matriz que el cdigo de llamada ha transferido. Tome las medidas necesarias si la matriz es demasiado grande para la aplicacin. Para obtener ms informacin, vea Cmo: Determinar el tamao de una matriz.

Cmo: Definir un procedimiento con un nmero indefinido de parmetros


Puede declarar una matriz de parmetros como la ltima entrada en la lista de parmetros de un procedimiento. Esto permite al procedimiento aceptar un conjunto de valores para ese parmetro, en lugar de slo un nico valor. No es necesario conocer el nmero de valores del conjunto en el momento de definir el procedimiento. Cada llamada al procedimiento determina individualmente el conjunto y cada llamada puede pasar un nmero diferente de valores. Para obtener ms informacin, vea Matrices de parmetros.

Para definir un procedimiento que puede aceptar un nmero indefinido de valores para su ltimo parmetro
1. En la declaracin de procedimiento, defina la lista de parmetros de la manera normal. Todos los parmetros excepto el ltimo son obligatorios (no Optional (Visual Basic)). 2. Anteponga al ltimo nombre de parmetro las palabras clave ByVal ParamArray. Este parmetro es opcional de forma automtica. No incluya la palabra clave Optional. 3. 4. 5. Agregue detrs del nombre de la matriz de parmetros un par de parntesis vacos. Agregue detrs de los parntesis vacos la clusula As habitual. No agregue detrs de la clusula As un valor predeterminado. El valor predeterminado de la matriz de parmetros es automticamente una matriz unidimensional vaca del tipo de datos especificado en la clusula As. Trabajar con los valores de la matriz de parmetros

El cdigo del procedimiento debe considerar a la matriz de parmetros una matriz unidimensional; el tipo de datos de los elementos de la matriz ha de ser el mismo que el tipo de datos de ParamArray.

Para tener acceso a uno de los valores de una matriz de parmetros


1. En el cdigo de procedimiento, determine la longitud de la matriz pasada a la matriz de parmetros llamando a UBound (Funcin, Visual Basic) en el nombre de la matriz de parmetros. 2. En una instruccin ejecutable del cdigo de procedimiento, agregue detrs del nombre de la matriz de parmetros un subndice entre parntesis. Este subndice debera estar entre 0 y el lmite superior devuelto por UBound.

Nota de seguridad: Si se trabaja con matrices cuyo tamao es excesivamente grande, existe el riesgo de saturar alguna capacidad interna de la aplicacin. Si acepta un matriz de parmetros desde el cdigo de llamada, debe comprobar su longitud y seguir los pasos adecuados si es demasiado grande para la aplicacin. Ejemplo En el ejemplo siguiente se define un procedimiento con una matriz de parmetros y se generan los valores de todos los elementos de matriz pasados a la matriz de parmetros. Visual Basic Copiar cdigo

Sub studentScores(ByVal name As String, ByVal ParamArray scores() As String) Debug.WriteLine("Scores for " & name & ":" & vbCrLf) ' Use UBound to determine largest subscript of the array. For i As Integer = 0 To UBound(scores, 1) Debug.WriteLine("Score " & i & ": " & scores(i)) Next i End Sub
En los siguientes ejemplos se muestran llamadas tpicas a studentScores. Visual Basic Copiar cdigo

Call studentScores("Anne", Call studentScores("Mary", Dim JohnScores() As String Call studentScores("John",


Compilar el cdigo

"10", "26", "32", "15", "22", "24", "16") "High", "Low", "Average", "High") = {"35", "Absent", "21", "30"} JohnScores)

Asegrese de que ParamArray es el ltimo parmetro en la lista de parmetros y que ninguno de los parmetros anteriores se declara Optional.

Cmo: Llamar a un procedimiento que toma un nmero indefinido de parmetros


Un procedimiento puede declarar que la ltima entrada en su lista de parmetros sea una matriz de parmetros. Esto le permite aceptar un nmero indefinido de valores para ese parmetro, en lugar de slo un nico valor. Para obtener ms informacin, vea Matrices de parmetros.

Para llamar a un procedimiento con una matriz de parmetros y omitir el argumento correspondiente
1. Escriba la llamada al procedimiento de la manera normal. La matriz de parmetros debe ser el ltimo argumento. 2. Finalice la lista de argumentos con el penltimo argumento. La matriz de parmetros es opcional y todos los parmetros anteriores deben ser obligatorios. O bien, Proporcione la palabra clave Nothing como argumento para la matriz de parmetros. 3. Visual Basic pasa una matriz unidimensional vaca al procedimiento para la matriz de parmetros.

Para llamar a un procedimiento con una matriz de parmetros y proporcionar una lista de argumentos
1. Escriba la llamada al procedimiento de la manera normal. La matriz de parmetros debe ser el ltimo argumento. 2. Proporcione cualquier nmero de argumentos, separados por comas, para la matriz de parmetros. El tipo de los datos de cada argumento debe poder convertirse implcitamente al tipo de elemento ParamArray. 3. Visual Basic pasa una matriz unidimensional al procedimiento, que contiene todos los valores proporcionados.

Para llamar a un procedimiento con una matriz de parmetros y proporcionar una matriz de argumentos
1. Escriba la llamada al procedimiento de la manera normal. La matriz de parmetros debe ser el ltimo argumento. 2. Para la matriz de parmetros, proporcione una matriz unidimensional con el mismo tipo de elemento que el de la matriz de parmetros. 3. Visual Basic pasa la matriz al procedimiento.

Ejemplo Los ejemplos siguientes muestran las llamadas tpicas al procedimiento studentScores definido en Cmo: Definir un procedimiento con un nmero indefinido de parmetros. Visual Basic Copiar cdigo

Call studentScores("George") ... Call studentScores("Anne", Call studentScores("Mary", Dim JohnScores() As String Call studentScores("John", "10", "26", "32", "15", "22", "24", "16") "High", "Low", "Average", "High") = {"35", "Absent", "21", "30"} JohnScores)

La primera llamada omite totalmente la matriz de parmetros y proporciona slo el primer argumento necesario. El procedimiento studentScores trata esta llamada como si pasara una matriz vaca. La segunda y la tercera llamadas proporcionan las listas de argumentos de longitudes diferentes a la matriz de parmetros. Cada lista de stas se pasa como una matriz de valores. La cuarta llamada pasa una matriz a la matriz de parmetros.

Procedimientos recursivos
Un procedimiento recursivo es aqul que se llama a s mismo. En general, sta no suele ser la manera ms eficaz de escribir cdigo en Visual Basic. En el siguiente procedimiento se utiliza la recursividad para calcular el factorial de su argumento original. Visual Basic Copiar cdigo

Function factorial(ByVal n As Integer) As Integer If n <= 1 Then Return 1 Else Return factorial(n - 1) * n End If End Function
Consideraciones sobre procedimientos recursivos Condiciones de limitacin. Debe designar un procedimiento recursivo para probar al menos una condicin que pueda poner fin a la recursividad; tambin debe supervisar los casos en los que no se satisface ninguna condicin dentro de un nmero razonable de llamadas recursivas. Si no existe al menos una condicin que pueda cumplirse sin errores, el procedimiento corre un riesgo elevado de ejecutarse en un bucle infinito. Uso de la memoria. La aplicacin tiene una cantidad de espacio limitada para las variables locales. Cada vez que un procedimiento se llama a s mismo, utiliza ms cantidad de ese espacio para las copias adicionales de sus variables locales. Si este proceso contina indefinidamente, se acaba produciendo un error StackOverflowException. Eficacia. Casi siempre se puede sustituir un bucle por la recursividad. Un bucle no tiene la sobrecarga de transferir argumentos, inicializar el almacenamiento adicional y devolver valores. Su rendimiento puede ser mucho mayor sin llamadas recursivas. Recursividad mutua. Si dos procedimientos se llaman mutuamente, el rendimiento puede ser muy deficiente o incluso puede producirse un bucle infinito. Este tipo de diseo presenta los mismos problemas que un procedimiento recursivo nico, pero puede ser ms difcil de detectar y depurar. Llamadas con parntesis. Cuando un procedimiento Function se llama a s mismo de manera recursiva, debe agregar parntesis detrs del nombre del procedimiento, aun cuando no exista una lista de argumentos. De lo contrario, se considerar que el nombre de la funcin representa al valor devuelto por sta. Pruebas Si escribe un procedimiento recursivo, debe probarlo minuciosamente para asegurarse de que siempre cumple ciertas condiciones de limitacin. Tambin debera comprobar que la memoria no resulta insuficiente debido a la gran cantidad de llamadas recursivas.

Sobrecarga de procedimientos

Sobrecargar un procedimiento significa definirlo en varias versiones, utilizando el mismo nombre pero distintas listas de parmetros. El propsito de sobrecargar un procedimiento es definir varias versiones de un procedimiento estrechamente relacionadas sin tener que distinguirlas por su nombre. Esto se lleva a cabo modificando la lista de parmetros. Reglas de sobrecarga Cuando se sobrecarga un procedimiento, se aplican las siguientes reglas:

Mismo nombre. Todas las versiones sobrecargadas deben tener el mismo nombre de procedimiento. Diferente firma. Cada versin sobrecargada debe diferir de todas las dems por lo menos en uno de los siguientes aspectos: Nmero de parmetros Orden de los parmetros Tipos de datos de los parmetros Nmero de parmetros de tipo (para un procedimiento genrico) Tipo de valor devuelto (slo para un operador de conversin) Junto con el nombre de procedimiento, los elementos anteriores se denominan de forma colectiva firma del procedimiento. Cuando llama a un procedimiento sobrecargado, el compilador utiliza la firma para comprobar que la llamada coincide exactamente con la definicin.

Elementos que no forman parte de la firma. No se puede sobrecargar un procedimiento sin modificar la firma. En concreto, no es posible sobrecargar un procedimiento cambiando nicamente uno o varios de los siguientes elementos:

Palabras clave que modifican a los procedimientos, como Public, Shared y Static Nombres de parmetros o de parmetros de tipo Restricciones de parmetros de tipo (para un procedimiento genrico) Palabras clave que modifican a los parmetros, como ByRef y Optional Si devuelve un valor El tipo de datos del valor devuelto (excepto para un operador de conversin) Los elementos de la lista anterior no forman parte de la firma. Aunque no puede utilizarlos para diferenciar las versiones sobrecargadas, puede modificarlos en las versiones sobrecargadas que ya se diferencian debidamente por sus firmas.

Argumentos enlazados en tiempo de ejecucin. Si piensa pasar una variable de objeto de enlace en tiempo de ejecucin a un procedimiento sobrecargado, deber declarar el parmetro correspondiente como Object.

Varias versiones de un procedimiento Supongamos que est escribiendo un procedimiento Sub para contabilizar una transaccin en el saldo de un cliente, y que desea hacer referencia al cliente por su nombre o por su nmero de cuenta. Para ello, puede definir dos procedimientos Sub diferentes, como se indica en este ejemplo:

Visual Basic Copiar cdigo

Sub postName(ByVal custName ' Insert code to access End Sub Sub postAcct(ByVal custAcct ' Insert code to access End Sub
Versiones sobrecargadas

As String, ByVal amount As Single) customer record by customer name. As Integer, ByVal amount As Single) customer record by account number.

Una alternativa podra ser sobrecargar un nico nombre de procedimiento. Puede utilizar la palabra clave Overloads para definir una versin del procedimiento para cada lista de parmetros, tal y como se indica a continuacin: Visual Basic Copiar cdigo

Overloads Sub post(ByVal custName As ' Insert code to access customer End Sub Overloads Sub post(ByVal custAcct As Single) ' Insert code to access customer End Sub
Sobrecargas adicionales

String, ByVal amount As Single) record by customer name. Integer, ByVal amount As record by account number.

Si tambin deseara aceptar el importe de una transaccin en Decimal o Single, podra sobrecargar de nuevo post para que admitiera esa variacin. Si hiciera esto en cada una de las sobrecargas del ejemplo anterior, obtendra cuatro procedimientos Sub, todos ellos con el mismo nombre pero con cuatro firmas diferentes. Ventajas de la sobrecarga La ventaja de sobrecargar un procedimiento radica en la flexibilidad de la llamada. Si utilizamos el procedimiento post declarado en el ejemplo anterior, el cdigo de llamada puede obtener la identificacin de cliente como String o Integer, y despus llamar al mismo procedimiento en los dos casos. Esto se ilustra en el siguiente ejemplo: Visual Basic Copiar cdigo

Imports MSVB = Microsoft.VisualBasic


Visual Basic Copiar cdigo

Dim customer As String Dim accountNum As Integer Dim amount As Single customer = MSVB.Interaction.InputBox("Enter customer name or number") amount = MSVB.Interaction.InputBox("Enter transaction amount") Try accountNum = CInt(customer) Call post(accountNum, amount) Catch Call post(customer, amount) End Try

Cmo: Definir varias versiones de un procedimiento


Puede definir un procedimiento en varias versiones sobrecargndolo, es decir, utilizando el mismo nombre pero una lista de parmetros diferente para cada versin. El propsito de sobrecargar un procedimiento es definir varias versiones de un procedimiento estrechamente relacionadas sin tener que distinguirlas por su nombre. Para obtener ms informacin, vea Sobrecarga de procedimientos.

Para definir varias versiones de un procedimiento


1. Escriba una instruccin de declaracin Sub o Function para cada versin del procedimiento que desea definir. Utilice el mismo nombre de procedimiento en cada declaracin. 2. Anteponga la palabra clave Sub o Function en cada declaracin con la palabra clave Overloads. Si lo desea, puede omitir Overloads en las declaraciones, pero si incluye esta palabra clave en alguna declaracin, deber incluirla en todas. 3. Despus de cada instruccin de declaracin, escriba el cdigo de procedimiento para que controle el caso concreto en el que el cdigo de llamada proporciona argumentos que coinciden con la lista de parmetros de esa versin. No es necesario que compruebe los parmetros que ha proporcionado el cdigo de llamada. Visual Basic transfiere el control a la versin correspondiente de su procedimiento. 4. Finalice cada versin del procedimiento con la instruccin End Sub o End Function

Ejemplo En el ejemplo siguiente se define un procedimiento Sub que contabiliza una transaccin en el balance de un cliente. El procedimiento utiliza la palabra clave Overloads para definir dos versiones del procedimiento, una que acepta al cliente por nombre y otra que lo acepta por nmero de cuenta. Visual Basic Copiar cdigo

Overloads Sub post(ByVal custName As ' Insert code to access customer End Sub Overloads Sub post(ByVal custAcct As Single) ' Insert code to access customer End Sub

String, ByVal amount As Single) record by customer name. Integer, ByVal amount As record by account number.

El cdigo de llamada puede obtener la identificacin del cliente como una String o como un Integer, pero a continuacin utiliza la misma instruccin de llamada en los dos casos. Para obtener informacin sobre cmo llamar a estas versiones del procedimiento post, vea Cmo: Llamar a un procedimiento sobrecargado. Compilar el cdigo Asegrese de que cada una de las versiones sobrecargadas tiene el mismo nombre de procedimiento pero una lista de parmetros diferente.

Cmo: Llamar a un procedimiento sobrecargado


La ventaja de sobrecargar un procedimiento radica en la flexibilidad de la llamada. El cdigo de llamada puede obtener la informacin que necesita pasar al procedimiento y llamar despus a un nico nombre de procedimiento, independientemente de los argumentos que pase.

Para llamar a un procedimiento que tiene ms que una versin definida


1. 2. En el cdigo de llamada, determine qu datos va a pasar al procedimiento. Escriba la llamada a procedimiento de la manera normal y presente los datos en la lista de argumentos. Asegrese de que los argumentos coincidan con la lista de parmetros en una de las versiones definidas para el procedimiento. 3. No tiene que determinar a qu versin del procedimiento debe llamar. Visual Basic pasa el control a la versin que coincida con la lista de argumentos. El ejemplo siguiente llama al procedimiento post declarado en Cmo: Definir varias versiones de un procedimiento. Obtiene la identificacin del cliente, determina si es String o Integer, y a continuacin llama en cualquier caso al mismo procedimiento. Visual Basic Copiar cdigo

Imports MSVB = Microsoft.VisualBasic


Visual Basic Copiar cdigo

Dim customer As String Dim accountNum As Integer Dim amount As Single customer = MSVB.Interaction.InputBox("Enter customer name or number") amount = MSVB.Interaction.InputBox("Enter transaction amount") Try accountNum = CInt(customer) Call post(accountNum, amount) Catch Call post(customer, amount) End Try

Cmo: Sobrecargar un procedimiento que toma parmetros opcionales


Si un procedimiento tiene uno o varios parmetros Optional (Visual Basic), no se puede definir ninguna versin sobrecargada que se corresponda con alguna de sus sobrecargas implcitas. Para obtener ms informacin, vea "Sobrecargas implcitas para parmetros opcionales" en Consideraciones sobre la sobrecarga de procedimientos. Un parmetro opcional

Para sobrecargar un procedimiento que toma un parmetro opcional


1. Escriba una instruccin de declaracin Sub o Function que incluya el parmetro opcional en la lista de parmetros. No utilice la palabra clave Optional en esta versin sobrecargada. 2. 3. Anteponga la palabra clave Overloads a la palabra clave Sub o Function. Escriba el cdigo de procedimiento que debera ejecutarse cuando el cdigo de llamada proporcione el argumento opcional. 4. 5. Finalice el procedimiento con la instruccin End Sub o End Function, segn corresponda. Escriba una segunda instruccin de declaracin que sea idntica a la primera salvo porque no debe incluir el parmetro opcional en la lista de parmetros.

6.

Escriba el cdigo de procedimiento que debera ejecutarse cuando el cdigo de llamada no proporcione el argumento opcional. Finalice el procedimiento con la instruccin End Sub o End Function, segn corresponda. En el ejemplo siguiente se muestra un procedimiento definido con un parmetro opcional, un conjunto equivalente de dos procedimientos sobrecargados y, por ltimo, ejemplos de versiones sobrecargadas vlidas y no vlidas.

Visual Basic Copiar cdigo

Sub q(ByVal b As Byte, Optional ByVal j As Long = 6)


Visual Basic Copiar cdigo

' The preceding definition is equivalent to the following two overloads. ' Overloads Sub q(ByVal b As Byte) ' Overloads Sub q(ByVal b As Byte, ByVal j As Long)
Visual Basic Copiar cdigo

' Therefore, the following overload is not valid because the signature is already in use. ' Overloads Sub q(ByVal c As Byte, ByVal k As Long) ' The following overload uses a different signature and is valid. Overloads Sub q(ByVal b As Byte, ByVal j As Long, ByVal s As Single)
Varios parmetros opcionales En un procedimiento con varios parmetros opcionales, normalmente son necesarias ms de dos versiones sobrecargadas. Por ejemplo, si hay dos parmetros opcionales y el cdigo de llamada puede proporcionar u omitir cada uno de ellos con independencia del otro, sern necesarias cuatro versiones sobrecargadas, una por cada combinacin posible de los argumentos proporcionados. Como el nmero de parmetros opcionales aumenta, tambin se incrementa la complejidad de la sobrecarga. A menos que algunas combinaciones de los argumentos proporcionados no sean aceptables, para N parmetros opcionales necesitar 2 ^ N versiones sobrecargadas. Dependiendo de la naturaleza del procedimiento, quizs considere que la claridad de la lgica podra justificar el esfuerzo adicional que supone definir todas las versiones sobrecargadas.

Para sobrecargar un procedimiento que toma varios parmetros opcionales


1. Determine qu combinaciones de los argumentos opcionales proporcionados son aceptables en la lgica del procedimiento. Podra generarse una combinacin inaceptable si un parmetro opcional dependiera de otro. Por ejemplo, si un parmetro acepta el nombre del cnyuge y otro acepta la edad del cnyuge, una combinacin de argumentos que proporcione la edad pero omita el nombre sera inaceptable. 2. Para cada combinacin aceptable de los argumentos opcionales proporcionados, escriba una instruccin de declaracin Sub o Function que defina la lista de parmetros correspondiente. No utilice la palabra clave Optional. 3. 4. En cada declaracin, anteponga la palabra clave Overloads a la palabra clave Sub o Function. Despus de cada declaracin, escriba el cdigo del procedimiento que debera ejecutarse cuando el cdigo de llamada proporcione una lista de argumentos que se corresponda con la lista de parmetros de esa declaracin. 5. Finalice todos los procedimientos con la instruccin End Sub o End Function, segn corresponda.

Cmo: Sobrecargar un procedimiento que toma un nmero indefinido de parmetros


Si un procedimiento tiene un parmetro ParamArray, no se puede definir una versin sobrecargada que tome una matriz unidimensional para la matriz de parmetros. Para obtener ms informacin, vea "Sobrecargas implcitas de un parmetro ParamArray" en Consideraciones sobre la sobrecarga de procedimientos.

Para sobrecargar un procedimiento que toma un nmero variable de parmetros


1. Determine si para el procedimiento y el cdigo de llamada resulta ms ventajoso utilizar versiones sobrecargadas que utilizar un parmetro ParamArray. Vea "Sobrecargas y matrices de parmetros" en Consideraciones sobre la sobrecarga de procedimientos. 2. Determine qu nmero de valores proporcionados debe aceptar el procedimiento en la parte variable de la lista de parmetros. Podra tratarse de ningn valor y de una matriz unidimensional. 3. Para cada combinacin aceptable de valores proporcionados, escriba una instruccin de declaracin Sub o Function que defina la lista de parmetros correspondiente. No utilice la palabra clave Optional ni ParamArray en esta versin sobrecargada. 4. 5. En cada declaracin, anteponga la palabra clave Overloads a la palabra clave Sub o Function. Despus de cada declaracin, escriba el cdigo del procedimiento que debera ejecutarse cuando el cdigo de llamada proporcione los valores correspondientes a la lista de parmetros de esa declaracin. 6. Finalice todos los procedimientos con la instruccin End Sub o End Function, segn corresponda.

Ejemplo En el ejemplo siguiente se muestra un procedimiento definido con un parmetro ParamArray y a continuacin se muestra una definicin equivalente con procedimientos sobrecargados. Visual Basic Copiar cdigo

Sub p(ByVal d As Date, ByVal ParamArray c() As Char)


Visual Basic Copiar cdigo

' The preceding definition is equivalent to the following overloads. ' Overloads Sub p(ByVal d As Date) ' Overloads Sub p(ByVal d As Date, ByVal c() As Char) ' Overloads Sub p(ByVal d As Date, ByVal c1 As Char) ' Overloads Sub p(ByVal d As Date, ByVal c1 As Char, ByVal c2 As Char) ' And so on, with an additional Char argument in each successive overload.
No puede sobrecargar este tipo de procedimiento con una lista de parmetros que tome una matriz unidimensional para la matriz de parmetros. Sin embargo, puede utilizar las firmas de las otras sobrecarga implcitas. Las siguientes declaraciones ilustran este comportamiento: Visual Basic Copiar cdigo

' The following overload is not valid because it takes an array for the parameter array. ' Overloads Sub p(ByVal x As Date, ByVal y() As Char)

' The following overload takes a single value for the parameter array and is valid. Overloads Sub p(ByVal z As Date, ByVal w As Char)
En las versiones sobrecargadas, el cdigo no tiene que comprobar si el cdigo de llamada proporciona uno o varios valores para el parmetro ParamArray , pero si lo hace, no tiene que comprobar cuntos valores proporciona. Visual Basic transfiere el control a la versin correspondiente a la lista de argumentos de llamada. Compilar el cdigo Como un procedimiento con un parmetro ParamArray es equivalente a un conjunto de versiones sobrecargadas, no puede sobrecargar un procedimiento de este tipo con una lista de parmetros que se corresponda con alguna de estas sobrecargas implcitas. Para obtener ms informacin, vea Consideraciones sobre la sobrecarga de procedimientos. Seguridad Si se trabaja con matrices cuyo tamao es excesivamente grande, existe el riesgo de sobrecargar alguna capacidad interna de la aplicacin. Si acepta una matriz de parmetros, debe comprobar la longitud de la matriz que transfiere el cdigo de llamada y tomar las medidas apropiadas si es demasiado grande para la aplicacin.

Consideraciones sobre la sobrecarga de procedimientos


Cuando se sobrecarga un procedimiento, debe utilizarse una firma diferente en cada versin sobrecargada. Normalmente esto significa que cada versin debe especificar una lista de parmetros diferente. Para obtener ms informacin, vea "Firmas diferentes" en Sobrecarga de procedimientos. Se puede sobrecargar un procedimiento Function con un procedimiento Sub, y viceversa, a condicin de que sus firmas sean diferentes. Dos sobrecargas no pueden diferir nicamente en que una tenga un valor devuelto y la otra no. Se puede sobrecargar una propiedad del mismo modo que se sobrecarga un procedimiento, pero tambin con las mismas restricciones. Sin embargo, no se puede sobrecargar un procedimiento con una propiedad, o viceversa. Alternativas a las versiones sobrecargadas A veces existen alternativas a las versiones sobrecargadas, es especial cuando la presencia de argumentos es opcional o su nmero es variable. Tenga presente que los argumentos opcionales no se admiten necesariamente en todos los lenguajes y que las matrices de parmetros estn limitadas a Visual Basic. Si se est escribiendo un procedimiento y es probable que un cdigo escrito en diferentes lenguajes llame a este procedimiento, las versiones sobrecargadas ofrecen la mayor flexibilidad. Sobrecargas y argumentos opcionales Cuando el cdigo de llamada puede proporcionar u omitir uno o varios argumentos, se pueden definir varias versiones sobrecargadas o utilizar parmetros opcionales. Cundo utilizar versiones sobrecargadas Puede considerar la posibilidad de definir una serie de versiones sobrecargadas en los casos siguientes:

La lgica del cdigo del procedimiento difiere significativamente en funcin de si el cdigo de llamada proporciona o no un argumento opcional.

El cdigo del procedimiento no puede probar con seguridad si el cdigo de llamada ha proporcionado un argumento opcional. Esto ocurre, por ejemplo, si no se puede esperar que el cdigo de llamada proporcione un candidato posible a un valor predeterminado.

Cundo utilizar parmetros opcionales Es posible que prefiera utilizar uno o varios parmetros opcionales en los siguientes casos:

La nica accin necesaria cuando el cdigo de llamada no proporciona un argumento opcional es establecer el parmetro en un valor predeterminado. En una situacin como esta, el cdigo del procedimiento puede resultar menos complicado si se define una nica versin con uno o varios parmetros Optional.

Para obtener ms informacin, vea Parmetros opcionales. Sobrecargas y ParamArrays Cuando el cdigo de llamada puede pasar un nmero variable de argumentos, puede definir varias versiones sobrecargadas o utilizar una matriz de parmetros. Cundo utilizar versiones sobrecargadas Puede considerar la posibilidad de definir una serie de versiones sobrecargadas en los casos siguientes:

Sabe que el cdigo de llamada nunca pasa ms que un pequeo nmero de valores a la matriz de parmetros. La lgica del cdigo del procedimiento difiere significativamente en funcin de la cantidad de valores que transfiere el cdigo de llamada. El cdigo de llamada puede pasar valores de tipos de datos diferentes.

Cundo utilizar una matriz de parmetros Conviene utilizar un parmetro ParamArray en los casos siguientes:

No se puede predecir cuntos valores puede pasar el cdigo de llamada a la matriz de parmetros, y puede tratarse de un nmero elevado. La lgica del procedimiento se presta a recorrer en iteracin todos los valores que transfiere el cdigo de llamada, efectuando fundamentalmente las mismas operaciones en cada valor.

Para obtener ms informacin, vea Matrices de parmetros. Sobrecargas implcitas de parmetros opcionales Un procedimiento con un parmetro Optional (Visual Basic) equivale a dos procedimientos sobrecargados, uno con el parmetro opcional y otro sin l. No puede sobrecargar este tipo de procedimiento con una lista de parmetros que se corresponda con cualquiera de ellos. Las siguientes declaraciones ilustran este comportamiento: Visual Basic Copiar cdigo

Overloads Sub q(ByVal b As Byte, Optional ByVal j As Long = 6)


Visual Basic Copiar cdigo

' The preceding definition is equivalent to the following two overloads. ' Overloads Sub q(ByVal b As Byte) ' Overloads Sub q(ByVal b As Byte, ByVal j As Long)

Visual Basic Copiar cdigo

' Therefore, the following overload is not valid because the signature is already in use. ' Overloads Sub q(ByVal c As Byte, ByVal k As Long) ' The following overload uses a different signature and is valid. Overloads Sub q(ByVal b As Byte, ByVal j As Long, ByVal s As Single)
Existe un conjunto de sobrecargas implcitas para un procedimiento con varios argumentos opcionales, a las que se llega por una lgica similar a la del ejemplo anterior. Sobrecargas implcitas de un parmetro ParamArray El compilador considera que un procedimiento con un parmetro ParamArray tiene un nmero infinito de sobrecargas, que se diferencian entre s por la informacin que el cdigo de llamada pasa a la matriz de parmetros, como se muestra a continuacin:

Una sobrecarga cuando el cdigo de llamada no proporciona ningn argumento a ParamArray Una sobrecarga cuando el cdigo de llamada proporciona una matriz unidimensional del tipo de elemento ParamArray Para cada entero positivo, una sobrecarga cuando el cdigo de llamada pasa ese nmero de argumentos, todos del tipo de elemento ParamArray

Las siguientes declaraciones ilustran estas sobrecargas implcitas: Visual Basic Copiar cdigo

Overloads Sub p(ByVal d As Date, ByVal ParamArray c() As Char)


Visual Basic Copiar cdigo

' The preceding definition is equivalent to the following overloads. ' Overloads Sub p(ByVal d As Date) ' Overloads Sub p(ByVal d As Date, ByVal c() As Char) ' Overloads Sub p(ByVal d As Date, ByVal c1 As Char) ' Overloads Sub p(ByVal d As Date, ByVal c1 As Char, ByVal c2 As Char) ' And so on, with an additional Char argument in each successive overload.
No puede sobrecargar este tipo de procedimiento con una lista de parmetros que tome una matriz unidimensional para la matriz de parmetros. Sin embargo, puede utilizar las firmas de las otras sobrecarga implcitas. Las siguientes declaraciones ilustran este comportamiento: Visual Basic Copiar cdigo

' The following overload is not valid because it takes an array for the parameter array. ' Overloads Sub p(ByVal x As Date, ByVal y() As Char) ' The following overload takes a single value for the parameter array and is valid. Overloads Sub p(ByVal z As Date, ByVal w As Char)
Programacin sin tipos como alternativa a la sobrecarga

Si desea permitir que el cdigo de llamada transfiera tipos de datos diferentes a un parmetro, un enfoque alternativo es Programacin sin tipos en Visual Basic. Puede establecer el modificador de comprobacin de tipo en Off con la opcin del compilador Option Strict (Instruccin) u /optionstrict. No tiene que declarar despus el tipo de datos del parmetro. No obstante, este planteamiento presenta estas desventajas en comparacin con la sobrecarga:

La programacin sin tipos hace que la ejecucin del cdigo sea menos eficiente. El procedimiento debe comprobar todos los tipos de datos que anticipe que se le van a pasar. El compilador no puede indicar que se ha producido un error si el cdigo de llamada pasa un tipo de datos que el procedimiento no admite.

Resolucin de sobrecargas
Cuando el compilador de Visual Basic encuentra una llamada a un procedimiento que est definido en varias versiones sobrecargadas, debe decidir a qu sobrecarga tiene que llamar. Para ello, sigue estos pasos: 1. Accesibilidad. Elimina cualquier sobrecarga con un nivel de acceso que impida que el cdigo de llamada pueda invocarla. 2. Nmero de parmetros. Elimina cualquier sobrecarga que defina un nmero de parmetros que no coincida con los que se suministran en la llamada. 3. Tipos de datos de parmetros.El compilador da prioridad a los mtodos de instancia sobre los mtodos de extensin. Si se encuentra un mtodo de instancia que exige slo conversiones de ampliacin que coincidan con la llamada al procedimiento, se descartan todos los mtodos de extensin y el compilador sigue slo con los candidatos del mtodo de instancia. Si no se encuentra ningn mtodo de instancia de este tipo, sigue con ambos mtodos de instancia y de extensin. En esta fase, elimina cualquier sobrecarga para la que los tipos de datos de los argumentos de llamada no se pueden convertir a los tipos definidos en la sobrecarga. 4. Conversiones de restriccin. Elimina cualquier sobrecarga que requiera una conversin de restriccin de los tipos de argumentos de llamada a los tipos de parmetros definidos. Esto se aplica si el modificador de comprobacin de tipo (Option Strict (Instruccin)) es On u Off. 5. Ampliacin mnima. El compilador considera las sobrecargas restantes en parejas. En cada pareja, compara los tipos de datos de los parmetros definidos. Si los tipos de una de las sobrecargas se amplan a los tipos correspondientes de la otra, el compilador elimina la ltima. Es decir, conserva la sobrecarga que necesite la menor cantidad de ampliacin. 6. Candidata nica. Contina considerando las sobrecargas por partes hasta que slo quede una y resuelve la llamada en esa sobrecarga. Si el compilador no puede reducir las sobrecargas a una sola candidata, genera un error. La ilustracin siguiente muestra el proceso que determina a qu conjunto de versiones sobrecargadas se va a llamar. Resolver entre versiones sobrecargadas

Este proceso de resolucin de las sobrecargas se ilustra en el siguiente ejemplo: Visual Basic Copiar cdigo

Overloads Sub z(ByVal x As Byte, ByVal y As Double) End Sub Overloads Sub z(ByVal x As Short, ByVal y As Single) End Sub Overloads Sub z(ByVal x As Integer, ByVal y As Single) End Sub
Visual Basic Copiar cdigo

Dim r, s As Short Call z(r, s) Dim p As Byte, q As Short ' The following statement causes an overload resolution error. Call z(p, q)
En la primera llamada, el compilador elimina la primera sobrecarga porque el tipo del primer argumento (Short) se restringe al tipo del parmetro correspondiente (Byte). A continuacin, elimina la tercera sobrecarga porque cada tipo de argumento de la segunda sobrecarga (Short y Single) se ampla al tipo

correspondiente a la tercera sobrecarga (Integer y Single). La segunda sobrecarga requiere una ampliacin menor, y por eso el compilador la utiliza en la llamada. En la segunda llamada, el compilador no puede eliminar ninguna sobrecarga teniendo en cuenta la restriccin. Elimina la tercera sobrecarga por el mismo motivo por el que la elimin en la primera llamada, porque puede llamar a la segunda sobrecarga con una ampliacin menor de los tipos de argumentos. Sin embargo, el compilador no puede decidirse entre la primera y la segunda sobrecarga. Cada una de ellas tiene un tipo de parmetro definido que se ampla al tipo correspondiente de la otra (Byte a Short, pero Single a Double). Por lo tanto, el compilador genera un error de resolucin de sobrecarga. Argumentos opcionales sobrecargados y ParamArray Si dos sobrecargas de un procedimiento tienen firmas idnticas excepto en que el ltimo argumento se declara Optional (Visual Basic) en una sobrecarga y ParamArray en la otra, el compilador resuelve la llamada a dicho procedimiento de la manera siguiente: Si la llamada suministra el ltimo argumento como Ningn valor (argumento omitido) Un valor nico Dos o ms valores en una lista separada por comas Una matriz de cualquier longitud (incluida una matriz vaca) El compilador resuelve la llamada a la sobrecarga declarando el ltimo argumento como Optional Optional ParamArray

ParamArray

Procedimientos de solucin de problemas


Esta pgina muestra algunos problemas comunes que pueden aparecer al trabajar con procedimientos. Devolver una matriz de tipo desde un procedimiento de funcin Si un procedimiento Function devuelve un tipo de datos de matriz, no puede utilizar el nombre Function para almacenar valores en los elementos de la matriz. Si se intenta hacerlo, el compilador lo interpreta como una llamada a la funcin Function. En el siguiente ejemplo se generan errores de compilador.

Function allOnes(ByVal n As Integer) As Integer() For i As Integer = 1 To n - 1 ' The following statement generates a COMPILER ERROR . allOnes(i) = 1 Next i ' The following statement generates a COMPILER ERROR . Return allOnes() End Function
La instruccin allOnes(i) = 1 genera un error de compilador porque llama a allOnes con un argumento de tipo de datos errneo (un objeto singleton Integer en lugar de una matriz Integer). La instruccin Return allOnes() genera un error de compilador porque llama a allOnes sin argumento.

Enfoque correcto: para poder modificar los elementos de una matriz que se debe devolver, defina una matriz interna como variable local. En el siguiente ejemplo se compila sin errores. Visual Basic Copiar cdigo

Function allOnes(ByVal n As Integer) As Integer() Dim i As Integer, iArray(n) As Integer For i = 0 To n - 1 iArray(i) = 1 Next i Return iArray End Function
Argumento no modificado por una llamada a procedimiento Si intenta permitir a un procedimiento que cambie un elemento de programacin subyacente a un argumento en el cdigo de llamada, debe pasarlo por referencia. No obstante, un procedimiento puede tener acceso a los elementos de un argumento de tipo de referencia aun cuando se pase por valor.

Variable subyacente Para permitir al procedimiento reemplazar el valor del propio elemento variable subyacente, el procedimiento debe declarar el parmetro ByRef. El cdigo de llamada no debe incluir tampoco el argumento entre parntesis, porque eso reemplazara el mecanismo para pasar argumentos ByRef.

Elementos de tipo de referencia. Si declara un parmetro ByVal, el procedimiento no puede modificar el propio elemento variable subyacente. No obstante, si el argumento es un tipo de referencia, el procedimiento puede modificar los miembros del objeto al que seala, aunque no puede reemplazar el valor de la variable. Por ejemplo, si el argumento es una variable de matriz, el procedimiento no puede asignarle otra matriz, pero s puede cambiar uno o varios de sus elementos. La modificacin de los elementos queda reflejada en la variable de matriz subyacente al cdigo de llamada.

En el siguiente ejemplo se definen dos procedimientos que aceptan una variable de matriz por valor y operan con sus elementos. El procedimiento increase suma sencillamente una unidad a cada elemento. El procedimiento replace asigna una nueva matriz al parmetro a() y, a continuacin, agrega una unidad a cada elemento. La reasignacin, sin embargo, no afecta a la variable de matriz subyacente al cdigo de llamada porque a() se declara ByVal. Visual Basic Copiar cdigo

Public Sub increase(ByVal a() As Long) For j As Integer = 0 To UBound(a) a(j) = a(j) + 1 Next j End Sub
Visual Basic Copiar cdigo

Public Sub replace(ByVal a() As Long) Dim k() As Long = {100, 200, 300} a = k For j As Integer = 0 To UBound(a) a(j) = a(j) + 1 Next j End Sub
En el ejemplo siguiente se realizan llamadas a increase y replace. Visual Basic Copiar cdigo

Dim n() As Long = {10, 20, 30, 40} Call increase(n) MsgBox("After increase(n): " & CStr(n(0)) & ", " & _ CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3))) Call replace(n) MsgBox("After replace(n): " & CStr(n(0)) & ", " & _ CStr(n(1)) & ", " & CStr(n(2)) & ", " & CStr(n(3)))
La primera llamada MsgBox muestra "After increase(n): 11, 21, 31, 41". Como n es un tipo de referencia, increase puede cambiar sus miembros, aunque se pase ByVal. La segunda llamada MsgBox muestra "After replace(n): 11, 21, 31, 41". Como n se pasa ByVal,

replace no puede modificar la variable n asignndole una nueva matriz. Cuando replace crea una nueva instancia de matriz k y la asigna a la variable local a, pierde la referencia a n que le ha pasado el cdigo de llamada. Cuando incrementa los miembros de a, esto slo afecta a la matriz local k.
Enfoque correcto: para poder modificar un elemento variable subyacente en s, pselo por referencia. En el ejemplo siguiente se muestra el cambio en la declaracin de replace que permite reemplazar una matriz por otra en el cdigo de llamada. Visual Basic Copiar cdigo

Public Sub replace(ByRef a() As Long)


No se puede definir una sobrecarga Si desea definir una versin sobrecargada de un procedimiento, debe utilizar el mismo nombre pero con una firma diferente. Si el compilador no puede diferenciar su declaracin de una sobrecarga con la misma firma, genera un error. El nombre de procedimiento y la lista de parmetros determinan la firma de un procedimiento. Cada sobrecarga debe tener el mismo nombre que todas las dems sobrecargas pero debe diferenciarse de todas ellas en al menos uno de los componentes de la firma. Para obtener ms informacin, vea Sobrecarga de procedimientos. Los elementos siguientes, aunque pertenecen a la lista de parmetros, no son componentes de la firma de un procedimiento:


anteriores:

Palabras clave que modifican a los procedimientos, como Public, Shared y Static Nombres de parmetros Palabras clave de modificadores de parmetros, como ByRef y Optional Tipo de datos del valor devuelto (excepto para un operador de conversin)

No es posible sobrecargar un procedimiento cambiando nicamente uno o varios de los elementos

Enfoque correcto: para poder definir una sobrecarga de procedimiento, debe variar la firma. Como debe utilizar el mismo nombre, debe variar el nmero, orden o tipos de datos de los parmetros. En un procedimiento genrico, puede variar el nmero de parmetros de tipo. En un operador de conversin (CType (Funcin)), puede variar el tipo de valor devuelto. Resolucin de sobrecarga con argumentos Optional y ParamArray Si sobrecarga un procedimiento con uno o varios parmetros Optional (Visual Basic) o un parmetro ParamArray, debe evitar duplicar las sobrecargas implcitas. Para obtener ms informacin, vea Consideraciones sobre la sobrecarga de procedimientos. Llamar a una versin incorrecta de un procedimiento sobrecargado

Si un procedimiento tiene varias versiones sobrecargadas, debe estar familiarizado con todas las listas de parmetros y comprender cmo resuelve Visual Basic las llamadas entre las sobrecargas. De lo contrario podra llamar a una sobrecarga distinta de la que desea. Cuando haya determinado a qu sobrecarga desea llamar, observe cuidadosamente las reglas siguientes:

Proporcione el nmero correcto de argumentos y en el orden correcto. Lo ideal es que sus argumentos tengan los mismos tipos de datos exactos que los parmetros correspondientes. En cualquier caso, el tipo de datos de cada argumento debe ampliarse al de su parmetro correspondiente. Esto es verdad incluso con Option Strict (Instruccin) establecido en Off. Si una sobrecarga requiere cualquier conversin de restriccin de la lista de argumentos, no se debe llamar a esta sobrecarga.

Si proporciona argumentos que requieren ampliacin, haga que sus tipos de datos se acerquen lo ms posible a los tipos de datos de los parmetros correspondientes. Si dos o ms sobrecargas aceptan los tipos de datos de argumentos, el compilador resuelve la llamada con la sobrecarga que solicita la menor cantidad de ampliacin.

Puede reducir las posibilidades de que aparezcan discordancias del tipo de datos mediante la palabra clave de conversin CType (Funcin) cuando prepara los argumentos. Error de resolucin de sobrecarga Cuando llama a un procedimiento sobrecargado, el compilador intenta eliminar todas menos una de las sobrecargas. Si lo consigue, resuelve la llamada con esa sobrecarga. Si elimina todas las sobrecargas o si no puede reducir las sobrecargas seleccionables a un candidato nico, genera un error. Este proceso de resolucin de las sobrecargas se ilustra en el siguiente ejemplo: Visual Basic Copiar cdigo

Overloads Sub z(ByVal x As Byte, ByVal y As Double) End Sub Overloads Sub z(ByVal x As Short, ByVal y As Single) End Sub Overloads Sub z(ByVal x As Integer, ByVal y As Single) End Sub
Visual Basic Copiar cdigo

Dim r, s As Short Call z(r, s) Dim p As Byte, q As Short ' The following statement causes an overload resolution error. Call z(p, q)
En la primera llamada, el compilador elimina la primera sobrecarga porque el tipo del primer argumento (Short) se restringe al tipo del parmetro correspondiente (Byte). Luego elimina la tercera sobrecarga porque cada tipo de argumento de la segunda sobrecarga (Short y Single) se ampla al tipo correspondiente de la tercera sobrecarga (Integer y Single). La segunda sobrecarga requiere una ampliacin menor, por lo que el compilador la utiliza para la llamada. En la segunda llamada, el compilador no puede eliminar ninguna de las sobrecargas sobre la base de la restriccin. Elimina la tercera sobrecarga por el mismo motivo que en la primera llamada ya que puede llamar a la segunda sobrecarga con una ampliacin menor de los tipos de argumentos. No obstante, el compilador no puede resolver entre la primera y la segunda sobrecarga. Cada una tiene un tipo de

parmetro definido que se ampla al tipo correspondiente en la otra (de Byte a Short, pero de Single a Double). Por lo tanto, el compilador genera un error de resolucin de sobrecarga. Enfoque correcto: para poder llamar a un procedimiento sobrecargado sin ambigedad, utilice CType (Funcin) para que los tipos de datos de argumentos coincidan con los tipos de parmetros. En el ejemplo siguiente se muestra una llamada a z que fuerza a la resolucin a la segunda sobrecarga. Visual Basic Copiar cdigo

Call z(CType(p, Short), CType(q, Single))


Resolucin de sobrecarga con argumentos Optional y ParamArray Si dos sobrecargas de un procedimiento tienen las mismas firmas excepto que el ltimo parmetro est declarado Optional (Visual Basic) en una y ParamArray en la otra, el compilador resuelve una llamada a ese procedimiento segn la coincidencia ms prxima. Para obtener ms informacin, vea Resolucin de sobrecarg

Mtodos de extensin (Visual Basic)

Visual Basic 2008 ofrece mtodos de extensin, que permiten a los programadores agregar funcionalidad personalizada a los tipos de datos ya definidos sin crear un nuevo tipo derivado. Los mtodos de extensin permiten escribir un mtodo al que se puede llamar como si fuera un mtodo de instancia del tipo existente. Comentarios Un mtodo de extensin puede ser nicamente un procedimiento Sub o un procedimiento Function. No se puede definir ninguna propiedad, campo o evento de extensin. Todos los mtodos de extensin se deben marcar con el atributo de extensin, <Extension()>, del espacio de nombres System.Runtime.CompilerServices. El primer parmetro de una definicin de mtodo de extensin especifica qu tipo de datos extiende el mtodo. Cuando se ejecuta el mtodo, el primer parmetro se enlaza a la instancia del tipo de datos que invoca al mtodo. Ejemplo Descripcin En el siguiente ejemplo se define una extensin Print para el tipo de datos String. El mtodo usa

Console.WriteLine para mostrar una cadena. El parmetro del mtodo Print, aString, establece
que el mtodo de extensin extiende la clase String. Visual Basic Copiar cdigo

Imports System.Runtime.CompilerServices Module StringExtensions <Extension()> _ Public Sub Print(ByVal aString As String) Console.WriteLine(aString) End Sub End Module
Observe que la definicin de mtodo de extensin se marca con el atributo de extensin

<Extension()>. Marcar el mdulo en el que se define el mtodo es opcional, pero se debe marcar cada
mtodo de extensin. System.Runtime.CompilerServices se debe importar para tener acceso al atributo de extensin. Los mtodos de extensin se pueden declarar nicamente dentro de los mdulos. Normalmente, el mdulo en el que se define un mtodo de extensin no es el mismo que el mdulo en el que se llama.

En su lugar, se importa el mdulo que contiene el mtodo de extensin, si fuera necesario, para incluirlo en el mbito. Despus de que el mdulo que contiene Print est en el mbito, se puede llamar al mtodo como si fuera un mtodo de insta