You are on page 1of 20
0008880900808 1eGe8 52 Programacionavancafa ean Miroso Visual Basic NET Figure 119, La pigin Tela del cuara de dlog Options le erat asinar un método abrevado de tcado @ cualguter comando integrate de Vs. Stal as como & ss popios macros lun proyecto con dos archivos: Module vb y Assemblylnto.vb (todos los proyectos de Visual Basic conic nem este timo archivo: su propésito quart claro en el Capitulo I, por lo que lo mejor serd que lo ignore por el momento). Modulel.vb contiere la siguiente planlla de cédigo 0b ma ‘Todas las aplicaciones de consolauilizan el objeto System Console, que representa la ventana de consola. Este objeto expone varias progiedades y méloder, pero en este momento slo utilizaremos tes de ella WET método ReadLine espera aque el usuario esriba un valor y pulse la tela Intro; @continuscién devolveré la eadena que haya sid itroducida. MEI método Write envia una cadena 2 ia ventana de consol, WEL método WrieLine es similar al método Write pero también agrega un caricter de nueva linea Posi intraducir marcadores de posiién numerados en la cadena de salida que vaya a pasar a los métodos Write y WriteLine; estos marcadores de posicién seria sustituidos por el valor de los argumentos aucionales que se pasen al mEtado, El siguiente digo muestra Smo utiliza esos marcadores de posicién: end Modul Capt 1: Primers pasos con Visual Basic NET 53 Pode ejecutar un programa desde el IDE de Visual Studio sia ms que pulsar laweela FS (como sucedia en Visual Basie 6). que se corzesponde con el comando Iniciar del meni Depurar. El problema de este comand es que la ventana de consola se cerar tan pronto como se salga del procedimiento Main, por lo «que no pod ver la salida producida por el sltimo método Console. WriteLine. Prd solucionar este problema sin mids que inserar una llamada al méiodo Console ReadLine justo antes de la insiruccidn End Sub. También podréejecutr el programa sin més que pulsar las teclas Cul+FS (o ejecutando el comando Iniciar sin depurar del meni Depurar); en este caso, se ceraré a ventana dela consola cuando el usuario pulse una tela (véase Figura 1-20). Sin embargo, como implica eF-nombre del comando, el programa se compilaré sin depuracin y no pod definir puntos de inteupcién -comprobar el valor de las variables durante su ejecucin, ‘Nota Hablaréds ls formularos de Windows y delas técncas deintetaz de usuario en ol Capitulo 16, orlo que a mayorta de los ejempos de cddigocontenidos en los Capos 2 a 15 estardn implements os como aplicaciones de consoa. En la prdctica, cada ejemplo es un procedimiento Independiente ‘yo nombre cominza con|a palabra Test; por elmplo,elcécgo ejemplo correspondiente a! Capitulo 2s un proyecto denominade Modules-Demo que centisn ios procedimientos Testractoraly TestBa- ‘Selohertance. “Todos los procedimisntos de prusba se lamardn desde el procedimlanto Sub Main, pero odes las Instruciones de lamada se remarearan, como se muesta a consnuacién: Ejecute cualquiera de Loe procedinientos Textisax sin mis que Come indica el comentario, pod ejeoutar cada uro de los procedimientos da test sin mas que crinar el comentario de a crrespondiotaInstruccén do lamada contanda en la ruina Sub Wan ‘Sé que a sido un capttulo largo que ha tenido que familiarizarse con un buen mero de eonceptos rvevos y ha visto muy poco eédigo, Créame, necesita este capitulo para presentare la caractrstieas és importantes de NET y Visual Sudio. En los siguientes captulos verd bastante més c6digo, empezan- o en el préximo en el que le mostraré novedades relacionadas con Ia sinaxisy los nuevos ipos de datos existetes en Visual Basic NET. Figura 1-20, Sata producia pola apcaion 6a console eempla cuando se cuts cane earardo lnk sia depuar a mend Deport Médulos y variables Ex mop, a mor forma de enfentne & Vissl Basie NET es comsiterano como vn lngunje completamente nvo, eye sintaxi ex vagament compatible con las versiones 126 Por cro la, sigue Seno inonfndblemente Viel Base nl Ios pogramadores gveles en Vistal Basi eseatirin Cenforaies al rabsar con Visual Base NET, aunque fol vee necsten alin empo pr araiarizrse on as nuevas caraceristicas cel lenge y lox umerscs cambios que a sufido se sti. un “isehtoren Vil Basic my experiment, ecuerde us ets cabos se ha eliza pura mejorar el lenge y qu ha tealzad con el fin de gus Visual Barc se parezca se 8 los lon leagues de rogramaign de NET. Como cnsecuenia de este pansaen pas ao lengole NET, por sem flo C#, sertretasvamente sencilla or Toque ro tended qbe afr sigiiestivamente ss habiton ‘MODULOS Y ESPACIOS DE NOMBRES La primera novedad importante de todos ls archivos de Visual Basic NET es que tienen la misma exten- siGn y qu, bisicamente, todos son del mismo tipo, De hecho, Visual Basic NET utiliza la extensién de ‘uchivo para determiner el lenguaje que cada archiva contiene: por tanto, todas Ios archivos de Visual Basic .NET tienen le extensién vb, todos los archivos C# tienen la extesi6n es, ec. Este delle puede desorientare al principio ses un programador experimentado en Visual Basic 6 y en sus versiones anteriores, en las que podria eneontrarse con, l menos, seis extensiones de archiva distintar, {ales como fm para los formularios, .bas para los médulos esténdar y ls para los médulos de clase. Sin embargo, el nuevo sistema para etiquetar fs archivos eesita mis racionaly no Te llevar mucho empo scostmbrare al mismo, Et motivo de que Visual Basic NET utlice una dnicaextensin para todos sus archivos es que basica- ‘mente no existe muchas diferencias entre, digamos, un archivo Médlo oun archivo de Clase. Con rads xaettud l concept de archivo de médula o archivo de clase ba desaparecido en Visual Basic NET ya ‘ue un archivo puede contener varios médulos y varias clases e, incluso, una combinacién de amos, Un archivo puede, incluso, conterer un formularin pero reeuerde que lot formilarios de Vieual Basic ‘NET no son ora cosa que clases que se heredan de Ia clase System Windows Forms Form definida en el NET Framework. Desde a prspectiva del programador, ls fomulatos so clases alas que se ba axocia ‘dou deBador. Los disenadores no son mds que una herramienta que le permit disefarvisualmence la interfa de usuario de un formulario (o un UserControl, sin més que Sota Tos controle desde el cuadro de feamientas y modificar sus propiedades en tempo de diseo tilizando la ventana Propiedades. Visual aie 6 las versiones anteriores ofrecian diseadores de formlrio y de UserControls con una importan- {e diferencia: las propiedades del formularo y de ls contoles se guardaban en el archivo frm pero eran $068 H0SHSHHOHOH9HOEHHHHHHHHOHOHOHHOROEOD 2088008 SHHOHHH9HOHOOHHOOHHOHOHHHOESSO ‘56 Programacén avanzada con Mirosft Visual Basic NET invisible en la ventana del e&igo. En comparacién, los dsefadores de Visual Basic NET producen ‘digo que pode examinar en La ventana del eSdigo; de hecho, reéricamente podré defini el aspecto de un formlario ¥ de su control incluso utlizando el dseiador. "El disefador decide qué médulos, clases y formularios (y ots tipos de componentes, tales como los UserControls) se van a dstbuir entre los archivos del proyecto actual. Por ejemplo, podré utilizar un tnico archivo para almacenar un formularia y todas ls clases wtlizadss por el mismo, lo que puede ser una buena ‘solucin, especialmente si ningtn oto formulario utiliza esas clases. De forma similar, podré reunir todos Ios procedimientos que wilce un formulario en un mismo médulo e incuir tanto el formulario como el ‘médalo en el mismo archivo. Finalmente, un Gnico archivo puede ineluir dos o més formulatios(u otras clases con un ciseiador social). Sin embargo, en la précies, era vex organizari sus formlarios de esta forma porque el entomo e desarolioimegrado (DE) de Visual Studio NET s6lo puede asociar una clase a cada disefiadordentco un determinado archivo, lo que significa que visuelmente s6lo podré editar uno de tos formularios contenidos en el archivo, Sélo pods eta ls restantes formularios esecibiendo manualmente el cédigo, pero enfonces estar despreviando una de las caraceristicas més productive del entorno. Médulos Los médulos de blogue estén delimitados por las palabras clave Module y End Module y pueden contener ‘cualquier ndmero de variables, Subs y Functions. Veamos un ejemplo de un médulo denominado Func nesMater (funciones macemdcas) que contiene una consante que es visible para todo el proyecto, una Warible que s6lo es visible para el eddigo contenido dent de un bloque y wna funcién Publis: Hodute Functonanates public conse Souter ho Bouble = ¢.29328530727858 pelvave valorentechoa (169) Az Souble Npqcslver el Factorial ge on manor ea el rango 0-363 publi Function factarial gyal mAs Incager) As Double ‘Evalue todos Los positles valozes da antonsno gurante 2a priners Uanads 2e'valorentiachos{9) = 8 then Yaloreatechos(a) = 2 * (aloresacnasti} « Valorestiechos(t - U1 * cobi Ut) tence 8 hed ner te Then ratecclal’ > vatorasiacnse(e! El e6igo contenido en la funcién Factorial veriica si ValoresHechos(0) es 0 en cuyo caso lena le rmateia ValoresHechos con todos ls fatorales de Tos nimeros contenidas en el rango O 2 169 (la Funcién factorial no funciona con fos nimeros negatives ¥ los factorales de los ameros superiores @ 170 no se ‘pueden almacenar en una variable Double, (Capitulo 2: Médule y variables 87 Aliza Ia palabra clave Public pod acceder tanto ala constante DoblePI com la funciGn Facto- rial desde cualquier lugar de! proyecto, como sucede en la siguiente instuceisn: Circunterencia = zadto * poblert El procedimiento Sub New ‘Como puede ver, los bloques Module..nd Module son similares a los médulos disponibles en las versio= es pens de Visual Base enel sentido de qu tabaan como conenedore para procedimientosy vai ‘Sin embargo, disponen de funcionesadicionales, tales como e! métoda New, Si un méduto contiene un prozedimiento Sub New, la rtina llamard a este procedimiento antes de ejecuta el eSdigo contenido en cl propio m6dulo. Podré sacar partido a este detalle pars simplificar (y optimizarligeraments) el cédigo Contenido en ta funcién Factorial sin mis que tasladar el cédigo de incializaciéa corespondientet Is ‘mattiz ValorestHechos dentro del procedimiento Sub New: ‘constance pobiica public conse DOS2S9r Ae Double = 6,26218530717958 ateiz peivada Private Valorestechos(269) As couble "Praluae todoe tor vatores gost Bebe tr ie recettloretesiontt) © Valorsatechos(t — 1) + exsetsh \ bevolves el Factorial de un inaco on et cargo 0-368 sanction festorial jai a he Sntegert a9 Dounie tego 0 das ner 16) Tien Devoiver ei valor en Ia natriz ci ot argusente pert Factorial = valorashachosiay Eer.Aaise(6, . “Desbordantento") sea Te Un deal importante l runtime lama al procedimiento Sub New la primera vez que el proyecto que se encuentra en ejecucién haga referencia a una variable © procedimieno del médala. El procediiento Sub New no se ejecutaré cuando se acceda a una constant definida en el médulo. El procedimiento Sub Main 5B Programacin avaeada con Merosot ual Base NET lista se producied un error de compilacéa sexisten dos © mis médulos (0 no exsteninguno) que contenen ‘un procedimiento Sub Maia, De forma similar, se produciré un error de compilaién s especifica el nom ‘ne de un médulo que no contenga un rocedimiento Sub Main, Siest escribiendo una aplicacién de Windows Forms, el procedimiento Sub Main realiza normalmente todas las operaciones deiniializacinrequerides por la apicacién y, a continuacién, muestra un formula fio, como se puede ver en el siguiente wozo de eddigo: tnielartodastarvarisbl Tvoseras nocalnente Clases Heablar€ en detalle sobre los médulos de clase (Class) en el Capitulo 4, por lo que aquf sélo resaltaré slgunas directrices sintdcticas bisieas que necesita conocer para comprender tras pares de est captul, Las clases en Visual Basic NET se definen por el e6digo contenido dentro del Bloque Class.End Class. Una clase puede contener variables Private y Public (0 campos en le tenminologia de NET) y procedimientos. El eSdigo siguiente define una clase denominada Persona que expone una constante, dos ‘campos y un método Pubic class Persona |) as seeing Captle 2 Méduls yvarabes 59 Nota Las dtecices de cenominacién conteridas en la documentacién de NET sugleren que debe Utizar un esto Pascal para los nombres de clase, por ejemplo: EmpleadoTiempoParcial, y que no ber uta el cardeter C coma prefia 6 fs nombres 60 casa, Unitizar a clase Persona en cualquier garde ta splicacién resulta bastante sencill Etarcona.Apeiilaa ~ "doe ConsolectriteLine persona Titulo & aPersana.Nanbreconplets) ‘=> Sr. Joe Doe Las clases pueden exponer constanes pblicas de cualquier tipo, tales como la constante de cadens, ‘Titulo mostrada en el e6digo anterior. Esta posbiidad hace que las clases de Visual Basic NET sean més Aexibles que ls clases disponibles en las versiones previas de este lengua. que s6lo podian contener ‘constants de tipo privado (en Visual Basic 6 podia simular las constants pblias mediante propiedades de slo lectua. una tenica que equiere la cteacién de més e6digo y que resulta menos efics2) La inpovacn mis antiipada relacionadas con las clases de Visual Basic NET es la compatibilidad com la herenci de clases. Toi lo que necesita hacer para heredar una nueva clase a partir de Persona es Jntcoducir una instrecion Inherits justo ders de Ia insilceign Class: (creas Drpteeds Function imersistonsca() Ae steing on nuevo nétodo Tavectivienre = Speltsdo f*. * & Nonbre end Funes Este cédigo moesta que la nueva clase hereda todas las propiedades contenidas en Ia clase base y. también muesra que puede hacer que su c6digo sea menos expictoutilizando el bloque With, como sola hacerlo en Visual Basic 6 Din enteplendo Ae ter Expands) Titer vepieaas Apel go = 'Sénches* UNfesLitar tos newer atenbror (ao-heredados! Fechatae » 43/5/3080" Consolesitiesiin ,iavestistentes) Enel Capitulo 5 desribiré la herencia en profundidad, aunque lilizaré este concepto antes de llegar a (y con mnas Setaleenel Capit 6). Hablaré des bioques Structure al fral Ge astacapiula, Finalmente, analizars los blogs interface en el Capito 6. Espacios de nombre anidados Pod anid fos espacios de nombres. Por ejemplo, el espacio de nombres System.Collections contiene varias class dl tipo coleccin y el espacio de nombres System IO incluye elses con les que por leery eseribic archivos, No existe un limite tdrico para aidarespacios de nombres. Por ejemplo, ls espacio de ‘nombre anidados a tres o mis niveles son bastamte frecuentes en NET Framework, por lo que podrd ver, por ejemplo, Sysem Xml Schema o System, Windows Forms ComiponentModale-Com2Interp. 62 _Progamaciénavareada con Mrosot Visual Basic.NET Pdr crear espacios de nombre anidados en sus proyectos de Visual Basic NET sin més que anidaclos bloques Namespace.._End Namespace. Por ejemplo, el siguiente cdigo define las clases Animales Mami- feros.Permo, Animales Mamiferos.Gato y Animales Reptiles Lagat: Neneapace Aninates stow oat) AP Hoe Ropcties.tagarto0) ‘eed Class acngpace Neots ‘Las reglas de émbito utilizadas para hacer referencia a clases y funciones en ottos espacios de nombre ‘se pueden extender con facilidad a los espacio de nombres anidados. Por ejemplo, el eédigo contenido en In clase Perro puede hacer diectamente referencia a la clase Gato, pero tendté que acceder a través del espacio de nombres Reptiles para referrse Ta clase Lagat: Bim atagerte Ar tev fapeiles.Lagastot) La instruceién imports ‘Cuando trabaje con espacios de nombres anidados, pod hacer que su e6digo sea bastante menos expicito uilizando Ia insiuceiéa Imports. En la préctica, cada instrccién Impors le dice al compilador que el ‘Sigo contenido en el archivo fuente puede acceder a todas las clases, procedimientos y estrcturas defini as en un determinado espacio de nombres, sin tener que especficer el nombre del propio espacio de ‘nombres. Por ejemplo, consider las siguientes instrucciones Imports, nares systen Drawing sparse Syatem Windows. arms Enports Syaten-Conponentscel tas tres instracciones Imports le permit utiliza cédigo mas concso para poder hacer referencia a tos elementos contenides en dichos expacios de nombres im be A aitnay | Iatnekco Syaten Seana. ueaen ‘Dim cone Az Component ' idéntico a System.ComponentModel component Et concepto de Visual Basic 6 mas cercano al instruccis Impors esl sta de elementos seleccions- dos en el evadro de dilogo Referencias de proyecto, Sin embargo, Visual Basic 6 no permite el emplea de referencias anidadas porque no se pueden anidar las clases contenidss en tina biblioteca de tipos. Captuo 2: Méduosy variates 63 Incluso, pod ahorrase trabajo aunque no euente con una istrucci6n Imports que coincida exacte- mente cone espacio de nombres al qu pertenece el element al que desea hacer referencia, Por ejemplo, la siguiente intraccign Impors para el espacio de nombres System le permitré hacer ms breves la mayer parte de sus referencias entemas ya que gran cantidad de abjetos pertenecen al espacio de nombres System © a alin oto espacio de nombres aniéado en System: aspects System Din bp As Oraving.siteap “eént ico a systen.ceawing Bitmap Puede acaber por tener problemas sia escrito distntas instrucciones Imports que hagan referencia a espacios de nombre que contengan clases que tengan el mismo nombre. Por ejemplo, suponga que el espacio de nombres Animales. Mamiferos yel espacio de nombres Equipos.Accesoias exponen una clase <éenominada Raton, En esa situacién, el igo siguiente no se compilaré porque la referencia Raton es ambigua, Imports Anieaies Yast fecse Imports Sgitpoa. Accession sub Testinporte Bins ae facon Incluso en este caso, podré ulizar Ia nstuceidn Tinponts para failitar su labor sn més que espeiticar un alias para uno de los espacios de nombres coaflictvos: Inporte Aninales sani teros inports Ace = Squipar Accesorios a restampocts Bin whe Patée — ‘édncico & Aninale.Menséercs.tovse Din m2 ha Ace-Mouse 'Esentico a Bouipos.hecessriow-tause ‘Aunque podré utilizar la instrucci6n Imports para abreviar las referencias raaizadas a los espacios de ‘nombres contendos dentro de un archivo fuente, o podré acortar los nombres de los espacio de nombre ontenidos dentro de una insruecién Imports. Por ejemplo, suponga que cuenta con las dos siguientes Instrueciones Imports: Imports Syrten.Runtine Serialisaticn.fomatters Tal vex piense que podeé sbreviar Ia segunda instrucién Impors sin més que jgnorar la pat inicil del "omibe del espacio de nombres porque es el argumento de Is primera instrccion Imports, til y como se Imuesta a contauacién: Imports system: ant Sin embargo, el e6digo anterior no se compilaré porque la insteuceién Imports raquiere una referencia completa a espacio de nombres. Este detlle resulta de gran importancia cuando desee utilizar Ia instruc- «ién Imports para crear atajos a Tos espacios de nombres definidos en cualquier lugar de su proyecto, ©0088 SOHO 8OH9HGHHHHHHHHHHHOHEHOEEE e @ e e @ e @ e@ e e@ e@ e e@ @ e e e e 64 rogremaciénavancada oon Microsoft Visual Basic.NET Por ejemplo, consider la siguiente jerarqua de espacios de nombres definida en una apicacién cuyo ‘espacio de nombres dela ralz es ModulesDemo: ‘Supongamos que desea simplificar el acceso al espacio de nombres Animales Memiferos para que otras partes de la misma aplicacién pucdan acceder a Ios elementos contenidos dentro de dicho espacio de ombres uilizando una sintaxis més concisa, Tal vez piense que la siguiente instrucci6n Imports reaizaré cesta Labor: ‘Sin embargo, se provocard um error de compilacién «No se puede encontrar el espacio de nome 0 tipo ‘Mamifers” para importa “Animales Mamifers’» El problems radica en que todos los espacios de nom bres definidos dentro del proyecto actual se encuentran anidados dentro del espacio de nombres raiz Demo, ‘Veamos cudl sera la instruecién Imports corecta nports Moduleebens.Aninates. Mas foros ‘Recuerde que solo podeé utilizar la instrucciéa Impors sla apicacién actual éispone de una referencia al espacto de nombres destino y, po tanto, e espacio de nombres aparece en el Examinador de objets, Los nuevos proyectos de Visual Basic NET eventa con una referencia alas clases mis importantes de Frame- work, pero no todas. Siel espacio de nombres por el que estf interesado no se encuentra listado en el Exploredor de slaciones deberdagregir una referencia al mismo haciendo clic, con el botsn derecho del ratbn, en el nado References del Explorador de sluciones y haciendo clic en Agregar referencia contenido fn el mend contextual (véase la Figura 2-2) También podré utilizar el comando Agregar referencia conte ido enel mend Proyecto. El cuadro de dilogo Agregar referencia (Figura 2-3) lista todos los componentes INET asf como los componentes del Modelo de Objetos Componentes (COM) registrados en el sistema, “Visual Basic le permite especfiear el nombre de una clase en cualquier instruceién Imports, gracias 210 aque pod acceder& los miembros estitieos de una clase sin tener que afar el prefjo del nombee de Ia ase, Imagines la siguiente clase definda en el espacio de nombres dela rafz de ModulesDemo: Figura 2-2. SubhtolRefarenoes det Explorar de solucona. Captule 2: Médulosy varanes 65 Figura 2. Cuatro de dogo Agregar ceterencl ‘Veamos cémo podré accede su aplicacia a Ins das constantes como si hubieran sido definidas Yom a hubieran sido definidas deforma Die va nd ode Importaciones a nivel proyecto “ay como se puede imaginal mayor parte de los proyectos Visa Basic NET estar celconaos Uricaente con slgunotesicios de nombre de NEF Framework, les como el espacio de nombres System, qu conan odo ls pos de dot sco, expla de nombres Miso Visuals gue ier occ aces ots de Vil Bass ingore yo ee es fortuna, no tendré que hacerlo. pe alan La aplccone de Vise Basie NET pusden desir on ceo nimer de : cieno mimero de imporscones a nivel project. Prd cai ata de portions pede, oo tiga hs ue ese, vad de dogo Paginas de ropiedaes del proyecto (ate a Figsta 24), VARIABLES Los programas de Visual Basic NET declaran yatilizan variables de uns forma muy similar as versiones previa. Sin embargo, debajo dela superficie exsten diferencias muy importantes y necesitard ser cons fiente de todas ellas para poder obtener el maximo partido de .NET y no quedar atrapado en los sutles problemas de conversidn cuando comience a converir su e6digo desde Visual Basic 6 65 Programacin avawaca con Mlrosot Visual Basic NET seecel_ et Figura 2-4, Podré defini importaciones a nvel proyecto eno cuadr de dogo Paginas de propedades del proyecto Declaraciones odd declarar una variable wilizando las palabras clave Dir, Private, Public o Static, Las regles de émbito son sencilla y similares a las reglas de Ambito de Visual Basic 6: 1M Deberd utilizar Dim dentro de un procedimiento pera éelarar una variable local (dingmica), que slo serd visible dentro de dicho procedimient, [M Deer uslizar Dim o Private fuera de los bloques de procedimiento, pero dentro de un bloque Class ‘© Module, para crear variables a ls que pueda acceder desde cualquier lugar dentro dela clase o del ‘mBdulo pero no desde cualquier lugar del proyecto (sin embargo, la insirucién DIM dentro de una estructura tendrd un dmbito Public). 'm Podeé utilizar Public dentro de un blogue Module para crear variables globules (es decir, variables ‘que existan durante todo el tipo de vide del programa y alas que pueda acceder desde cualquier parte del proyecto actual) PPodré uilizar Public dentro de un blogue Class para crear un campo piblico para dicha clase ‘M Poses utilizar la palabra clave Static para declarar variables estiticas dentro de un procedimiento (observe que no podré utilizar Ia palabra clave Static dentro de wna deelaracin de procedimiento ra hacer que tades as varies contend ene procedimiento sean estas, aly eomo lo haa en Visual Basie 6), El lisado siguiente muestra los cinco tipos de variables: Medute ninedste ‘sta variable global co vieisia para toda 1s eplicactén ‘Public mivaclebal As tcing “Estas variables aio son visibles 2entzo dsl mitulo actual private Minosulovar Re 2 Din Misodulovar? As Seeing 12 dante de este procadinionts, lntdtice mantiene 2 valor ante + las’ Lasadas consscutivas a ante procedinfons Captule 2 Modulos y varables 67 La documentacén y heramientas de Visual Basic NET —tales como el Intermediate Language Disas- sembler (LDASM), que descrbiré en el Capfulo 14— hacen distineién entre ls propiedades de clase ‘mplementadas como variables Public (conocides como campos) y as propiedades implementadas como ‘rocedimienios Proper (as popiedades reales). Aunque, en general, poded ignorar esas diferencias y Utlzar Ios campos como si fueran propiedades de primera clase (tal y como sucedia en las versiones anteriores de Visual Basic), en algunas ocasiones ls diferencias en la implementacién explican los sutles 'matices observables en su comportamiento. Si desea obtener més informaciGn sobre estas suilezas,consul- tel Capitulo, Directrices de denominacién La documentaciéa NET contiene una serie de reglas claras sobre la denominacién de procedimientos, variables, argumeno y dems entidades de programacin Se trata simplemente de recomendaciones, pot Jo que podrd observa 0 ignorarlas. Veamos un breve resumen: 'MNo vile ia denominada notaciGn Hingara para variables y parémetos. Visual Studio .NET le Permittéexaminar la declaraciGn de una variable sin mds que situa el cursor del ratén sobre ella, ‘por o que wo necestaré utilizar un prefijo en el nombre de la variable para declarer expliitamente 5 tio, como suced= con LngValor. ' Los parkmetos se escrifen en mindsculas o con alguna maylscula intermedia, por ejemplo: pila: Nombre o valorAetual. ‘Los varabesprivadas deberin escribirse con mayisculas intermedia, mientras que los campos pblicos de las clases que aparezean como propiedades para clientes debersn escriirse al estilo. Pascal, Exe tema puede provocarsituaciones enrevesadas, como se muesia en el eédigo siguiente: ible NomeePiis a2 Sering veriabie Global 0 campo piblice a Din prinecipeliido as string PPersonalmente, me gusian estas recomendaciones porque son similares a aquellas que he estado tilizando ‘durante fos dimes aos y las he adoptado en los ejemplos de c6digo contenido en este libro. Por ejemplo, ‘nunca he sido muy paridario de Ia notacién Huingara, ya que pienso qu dificult la legbilidad de su +2 €6digo (por elo, mi desagrado pore uso de prefjos en los nombres de variable me ha permitido pasar el 6digo de Visual Basic 6 @ INET sin tener que cambiar los prefjos para las variables Integer, Long y ‘Varian. Sin embargo, siempre que desee llamar Ia atencign del lector sobre el tipo de una determinada variable uilizaré la otacién Hengara. Las instrucciones Option Explicit y Option Compare ‘Visual Basic NET permite el empleo dela instrucein Option Explicit, pero su sintaxs es distinta de la que {parece versions anteriores del lengua porqe ahora puede psponerse a nstuceon el ealifiador Onw Off: Estar instracciones sbligan a 1a declaracién erplicita de todes las « varimies cestenine an ef abduio. Option sxelieie on ptton Betiete Se puede onttix 1s eidueula ca a siguisate instrucciéa hace que an ol aédilo ctu! las dectarectonss Seas opclonaten Option Eiete oft ‘Visual Basic.NET contnéa siendo compatible con la instrucein Option Compare, cuya sintaxis no ha ‘cambiado con respecto a las versiones anteriores del lengusje: {Mace que las comparaciones de cadena realizadss on el néule éistingan "el emplec de sajlsculae y nindasstan. © 06S OO SOOO OOOO 90OH OHH OOH O88OHOKO8ORE $00 0S88 00888808900 0OO980O9H8080008888 68 Propramacionavazads con Mirosof Visal Base NET re ee a st sae weno w so SS teen ee ii pu eterna n a RRS ep vg ot erect pte

1234567890 Iniciadores En Visual Basic NET pods clara e iniciar una variable uilizando ta misma insruccin Esta funciGn, largamente esperada, le permitir simplificar su e6digo y mejorar su leg \ Dos ejemplos de inicielisagores de vartables Dim anchura As Single = 1800 Dis lonbre As string = =ranceaco™ {Las lineas anteriores son funcionalmente equivalents al siguiente c6digo de Visual Basic 6: ‘Rim Nore Ae string! nonbre s "rranceacot Observe que slo pode inicalizar una variable sies la Gnica variable declarada en la intruccién Dim, Public o Private: Sr ta siguiente 1ines no ae compite Din x yf As bong = 2 Una earactert 2 de los Ini tres es gue los valores qu se asignen no necesitan ser constants Din Fechatntolal As Date = nowt) ‘Cédigo mas breve con los iniciadores Los iniiadoresresutn especimente les para ls variables de nivel clas y ls variables gloales, Por ciemplo, pense en la siguiente clase de Visual Basic, que contiene una propiedad Public que ae inilalica en el suceso Class_liialize: {ste es cédige VE6~ no 20 afecstark en VB WET uédulo de ta clase Persone pastie fais As String Caphulo 2 Modulos y varabes 75 Private fib clase toitializet ‘"Propoccicna in valor predeterninago para 1a propledad Pate ot Sib Pod logrr el mismo resultado en Visual Basic .NET con una tnicainstruccién: Public Pais As string = cusa* De forma similar, piense en el. c6digo que tendrfa que utilizar en Visual Base 6 par nici de forma correcta una variable global definida en un médulo: 5 sv» pato as cddigo VBE - no 0 efecutard en ve wer. Public Fechazcicial Ar Date sub tata) ‘ Froperciona un valor inicial para ie variable Fechatnicie’, a Sab e Los iniiadores de Visual Basic .NET le permitirin fusionar la declaraciGn y le asignacién en una snismainsiucién: Nogute woduloprineipal Public Pechalnicis! As Date = now!) od Hale Finalmente os inisiadoresresultan especialmente dies con variables de blogue para garantzar que la variable se reinicia de la forma correcta adoptando un determinado valor siempre queel fj del programa ‘yeelvaa entrar en el Bloque, Este es el nico caso en el que tiene sentido utilizar iniciadores para asignar a ‘una variable su valor predterminado (0 para admeros, cadenas vacis para variables String, et) Forze ited * Garantiaa que 1a ¥ aanpre contenza deste cero. piny Ae lao = 0 ext! Inictadores y variables Object ‘Los inciadoes también trabajan con variables que almacenen referencias a objeto Por ejemplo, las sic ‘vente insucciones declaran y crean un objeto DaraSet de ADO.NET: Din és As syoten.bete.oavaset (48's ow syaven batecoaeasee Pdr abreviar el eigen Ia siguiente forma: Dim de As Syoten.Data.Dacasar = Hew Syste Data.Dataset, Inclaso mejores que Visual Basic INET permite el empleo de uns siti epecial con la que podeé lina nombre repetigo de una case: Di ds As now syaten.Date ©0080 08S0HOHOOH8HOGHHOHHHOOHHHBOOHOOOE ©0800 F89S0H8O9HOSO8O0OHOO8SSOH8888 76 Programacin avarcaa con Mirosoft Visual Basie NET La instucein anterior recuerda las declaraciones de Visual Basic 6, pero no deje que el parecio le onfands, En as versiones aro de lengua I sntxis AS New een ana vale de ajo ou instanciada el compilador genera c6digo que comprucba esta variable ante de hacer referencia ala misma {era automécieamente un objeto del tio correspondiente si se comprucba que et valor dela variable es Nothing ‘Como consecuencia, no se crear un objeto si no se ega a hacer referencia ala variable durant ef flujo de ejecucin. En Visual Basie NET la anterior instruccin es. simplemente, una forma especial de iniciador de variable y siempre se cearé un objeto cuando se ejecue la instraccién Dim, Visual Basic NET no permite tlempleo dela sintxis que se coresponde con ia autoinstanciacin de variables uilizada en Visual Ba- sic 6. {Los inieiadores también permiten el empleo de consructores de objetos que acepten parémetros (anali- zargel tema de los constructores en el Capitulo 4). Por ejemplo, el constructor del objeto DataSet permite tlempleo de un ergumento de cadena al que le pod pasar el nombre del propio objeto DataSet: Dim as As tow systen. Data, atasee(“RAitores") Asignaciones En genera asignt valores «ls wasabies ly como to haa en Visual Base yen lt verone “anteriores del lenguaje. Sin embargo, I forma en que tended que realizar las conversionesenite ls dstin~ tos tpos y le forma en que debert asignar variables de objeto han cambiado dristicamente bajo Visual Basie NET. La Instruccién Option Strict ‘Un defecto de Visual Basie que muchos detratores han mencionado era la ausencia total de control en as conversiones realizadar sobre los ditintos tipos. Por ejemplo, en Visual Basic 6 el siguiente igo es perfectamente legal: ins As Single, & As double 3 Et problema relacionado con el eédigo anterior es que cuando asigna una expresin o una variable Double a tuna variable Single, estardperdiendo precisién y puede, incluso, provocar un eror de desbordamiento. Este tipo de conversion tambign recibe el nombre de conversin de resricidn. Otros ejemplos de conversiones de restriceién son de Long a Integer 0 a Byte, o desde Double a Long. Una conversién en la direccién ‘opuesta (por ejemplo, desde Single a Double) recibe el nombre de conversin por ampliacén,y siempre se permite porque no puede penler precsién ni eausar erores de desbordamiento, ‘Visual Basic NET permite el empleo de Ia aveva diectiva de compitador Option Strict, que pods definie como On para desactivar ls canversiones implicitas de restrieciGn. Por ejemplo, el eédig siguiente no se compilars: option 5: Modute aixdute Sra. Gsnveesién de restriesiéa que provoca un error de conpLlacién Captle 2: Méduos y varies 77 ‘Observe que puede omit la palabra clave On porque Option Strict es suiciente para activar esta caracte- istic, No necesitard inclur esta drectiva en todos sus médulos porque podeé configurar esta opcién a ive proyecto wtlizando el cuadco de didlogo Pigina de propiedades del proyecto (vEase la Figura 2-5). De forma predeterminada, Option Strict se encuentea definida a nivel proyecto como Off, presumible- mente para faciltar laimportaciGn de los proyectos de Visual Basic 6. Sin embargo, le sugiero encerecida- ‘mente que active esta opci, al menos para todos Sus nuevos proyectos, con el fn de que pueda aprovechie al méximo esta nueva caractristca. Deberd gastar més tiempo escribiendo e6digo porque tended que 0 Then Consote.Weltatine(*intVaicr es < 0°) Finalmente, podré configurar el valor predeterminado de Option Stic cuando esté compilando desde el slimbolo del sistema, Podtd utilizar el modificador /OPTIONSTRICT+ pata forza la funciéa y /OPTIONS- TTRICT- para desactivarie: vee /eptionstrtees fuente. vi Asignacién de valores Object no de los mayores cambios sinécticos que se ha producido en Visual Basic NET es que no tendeé que solver a utilizar Ia palabra clave Set para asignar una referencia de objeto a una variable de objeto. de hecho Ia palabra clave St no es vida ya en asignaciones de variables, Para entender los motives que han provocado este cambio, deberd considerarel porgué era necesario el empleo de Ie palabra clave Set en las ‘versiones anteriores de este lenguaje. ‘Todas ls versiones de Visual Basic hen soportado la noci6a de miembros predeterminados de objetos. {La mayorfa de ls contrles de Visual Basie 6 exponen una propiedad predeterminada (por ejemplo, la ‘propiedad Text en el aso de los cntroles TextBox), el objeto Collection expone el metodo predeterminas do Item, ec, La propiedad predeterminaéa hacfa posible la siguiente instruccin: SGoptar 1 contenido de enti en Tow? texed s bextl ‘que en realidad, era un atajo para la instruccién ms detllada: . {Las propiedades y métodos predeterminados también funcionan con las clases que defina en su aplica- cin. Por ejemplo, el eédigo siguiente utiliza una clase Persona que expone Nombre como su propiedad predeterminads pil siancesco Bal *copiar el nonbee on Din p2 aa Kew Person Observe que el eédigo anterior copia una propiedad de cadena desde un objeto a otro. Pero, qué ocumird si desea almacenar una referencia a p/ en la vasable p2? La respuesta en Visual Basie 6 4'en versiones anteriores es la palabra clave Set JaSi0g putz orceccarente une roferencta a pl en 52 en Visual Basic €. Set pz = at La palabra clave Ser es una de esas peculiaridades de Visual Basic que no podré encontrar en otros Jenguajes y que tend aconfundir a muchos novatos, ror an, muchos dsefadores(incluyendo los exper. tes) suelen omic por error ta palabra clave Set cuando asignan referencias de objetos Por desgrcis, olvidarse de esta palabra clave no se marcard como un eror del compiador si el objeto fuente dispone de tun miiembro predeterminado. En este cas, el compilador de Visual Basie 6 supone que el usuario esté Captule 2 Modulos y vaales 79 ssignando la propiedad predeterminada 0 el resultado del método predeterminado, en lugar del propio ‘objeto al que se hace referencia: + asignaciée # p2 de una referencia a pi on Visual Basic & ‘bap pe ae Persona Sst tata insteacelén no funclonazé porque se he olvigads 1a palabra cl ual Basic NET resvelve esta ambigledad de un modo completamente dstinto y més radical: los? ‘miembros predeterminados no se encuentran soportados en NET, punto. En otras palabras, ni ls clases de INET, ni as clases que dena en el cio podtin exponer una propiedad o un método predeterminado, Por cll, no necesitaré utilizar una palabra clave especial para poder manejar esos valores predeterminados en las asignacionesy deberdasignar los valores escalars y as referencias a bjetos en la misma forms, Aségnar a p2 ona referencia Din pf As Hew Perrona Din fae he Ferere * Copiac Ya propiedad Nombre Ge pl a p2. pasvenbce = plc fonbes * copiae una referene Dim po he Povason Bape pi en visuat masse ne. Tcluso podréasignar referencias a objeto uilizando Iniiadores. Por ejemplo, podrs susttuir las dos ‘ikimasinstcciones del céigo anterior por lo siguiente: ‘Dim pi as persona = ot ‘Aunque el signo igual funciona correctamente para ssignar objetos,deberé seguir utilzando el operadar Is ara proba si dos variables objeto apuntan al mismo objeto en memoria, Seiha agregado-estarestriccién (ya que Viswal Basic permite la sobrecarga de operadores) para que el eSdigo exstente basado en ef ‘perador de comparacidn (=) no fale porque el cégigo haya llamado a una version sobrecargada en lugat elimitarse comparar ls instancias de un objeto, ‘Veammos una excepcin aI rela que dice que la cases no puedes tener un miembro predeterminado: tuna propiedad 0 método puede ser el miemibro predeterminado de su clase si éstaacepta uno © ms argu ‘mentos. Veamos un ejemplo con el objeto Collection: sub Protercolecesenee() ‘eraiéa VEE Sel objeto Collection Din col As New taczoroft.Visuaibasic.collection|) " horagar dos elenenton, eshiadgt"Feancesco™, soxbre*) eeisdaat Salen, shpettice™) “Lis dos siguientes snstrucciones son equivalentes (3ten es el alexbro coneote. tet ven (onesie. net eeti icon. teeat2)) > reaccesca esti) coe ee envole. tr itezinet cot ten(*Ape12ido")) = natene (ensole eitetine col (rapallees"}) 3 hie ea Bue El motivo de esta excepcn ala rela general es que la presencia de argumentos hace que la sintaxis no Sea ambigua, Por ejemplo, la siguiente instruccién Bin 9 as cbject oF eats © 8880S COOH8OH9000800008000809800008 ©0080 OHSO8HOOBHOHHOHOHOHOHOOOOOEHAOE {80 Programacin avanzada con Mirosot Visual asi NET sélo puede indicar que estd sczediendo al método Tem predeterminado, mientras que significa que ests asignando una referencia al objeto Colletion. ‘Abreviatura para las operaciones comunes ‘Visual Basic INET permite el empleo de una ampliavariedad de operaciones de asignacién eténdar, qe NEST tsar cuando ete eaizand ura operas maemdca o de cadena sobre uns vais W429 roe ad cout ena propia arable, Estas abreviaturso atajosresutanespeialmente dies can- do exté sumentando o disminuyendo el valor de une variable: Bin y As Souble = 6.8 ccemanta x en una unidad (idinties @ Ethel meteetsnetsy © => 19 Seen Ya abs Uniaatertiaincies ays y= 2 buptica x Uasaeico axe De 20 Eatboleweieetinetx) pivide x por dine (4¢éatico ax x #10) Eodlote ncutetineba © => 2 pivice y por cuatso (idéntico ay ty / 4 testinety) 12 © gteva y ab cubs Uaéntics ay sy 3! Finalmente, pode utilizar fos opeadores ra anexac wn valor a una variable de cadena: elgh Soe Shean wn cateea (iadgeico ae = 9 6 *AI) 4 uilieac el operador = con variables de pt oun tit zon cualquier tipo de variable velvet aor Dol) ‘i Option Strict se encuentra activado, no (debido 2 que el opetaor \ converte sus operandos a Long ni el operador Cairo con aqueltas que sean del tipo Double (debido a que el operador ‘Tipos de valor y tipos por referencia ode agrupar todos los tpos de datos que soport ique cree el programador) en dos tipos de ca 1. NET Framework (tanto Tos tipos nativos como fs tips ria: tpos por referencia y ipos de valor. En pocas pala iG tpss gor referencia se comporan como objelos, senzas que 1s Spas por alors comporan ep excalares (integer o Single), Tend que concce ycomprender las diferencias exsetes ene seipos upos 0, en easo coniraro, seguro que intoducid eres sutles en su eSdigo re eee Framework, cualquier cosa es un objeto y la mayoria de Tos tips de datos son tipos por referencia Cusndo decare una variable de un tipo po referencia, estar asignando una variable punto Tear enero de 32 bits en las actuals platforms de Windows) que apuns al objsto real. FI opis (ase cnc almacened en es Ge mei denominala mont admiisrade (ranean Pet) Sere Se cusnen bajo la supervsin del untime de NET Framework, mienea que Ia variable pumtero se Capita 2: Madues y vaables 81 1 ejemplo, en la pila si se tata de una variable dinmica Todas las variables puntezo que apunten a un deter ses jes se selgan fuera del dmbitoo se Bayan definigoexplitamente como Nothing el objeto ena en Tn proceso devominado Recoleccion de elementos ro uilicados que Woeraré la memoria asignage al mon- wee hiesencts de Io que sucedta en Visual Basic 6 y en los objetos COM. la memoria asignad a tos (hjeos NET no se ibe de manera inmediata despues de dest las variables puntero debido aque Ie seinen de elementos no utlizados solo se efecla cuando el runtime de NET se queda sin memoria en creer adminisuado, Exe fenémeno resibe también el nombre de fnalizacién no determinia y Yo Snalizaré en mayor detalle en el Capitulo 4 os tipos Je Valor herecan de System ValueType, Esta clase hereda de System.Object (Como lo hacen todas in elses definidas en NET Framework, de forma directa 0 indiecta) pero vuelve a definir sus’ res foe Los pos de valor no se encuentran asignados en el montéa adminstrado y la variable comespon-. lente olmacens el valor ea lager de apuntaral mismo. La ubicacién real en ls que se almacena un tipo d= a dependers desu dbo: por ejemplo, Ins variables locales de ipo valor Se encwenzan asignadas en lt ‘ile Tedos los tipos numéicos de NET son tipos de valor, como sucede con los Eaums los tipos ave eating con un logue Strucure.End Structure; por elconraio as cadenas y matrices de ‘NET son tipos Gor refereela, como son tdos los objees que dena con un blogue Cass..End Class. Si dud stun peterainado ipo. NET es una clase o una esructure, tan slo tendré que ler la documentacin 0 ver dicho fipoen el Examinador de objeto (que muesira diferentes ieonos para class y estructura. ‘Stel Calle 8 le proporsionaré més informacioa sobre lo tipos de valor, pero necesita conocer estos rineipios generles para comprender algunos texas ratados en ste y en el pro capt ‘ee gendral fos tpos de vlor son ms elpidos que Tos tpos por referencia de similares earacrrisias, [Esto sono! por dos motives: ao necesita analizar el puntero para obtener el dat realy, lo mas important, rae ee siatignary-posteriormente,liberar memoria en el montSn administado, i una variable de tipo Te delos se encuentra almacerada en Te pila (como puede ver ea Ia siguiente llustraciGn) 1a variable se Sees sutemdticamentey no se necesitaré ninguna operacin de limpieza (que leva su tiempo) cuando salga dl procedimiento, podré almacenar en cualquier otro Luger (po feclarada derico de un procedimiento). Una vez que (owos 608 ‘de obit) spite crore be (Walon uszado ‘ela pa) ila dt programs Monin admiisvad| sindose aun tipo por efzrencia 0 aun tipo de valor por ment, [a operacin de asigaaciga funciona de forma ape ma en ambos casos. Cuando asigne un tipo por refeencis w una varable, en realidad estar asignando Sl umtere poo cu a variable destino no er aputando a valor evignal. Nose duplican dss y pods coertcae dato original através del original y de la queva variable, Se trata de un comporamieno pico (de objetos inclaye os objetos que instaneia desde las clases finda en su apis Debecs prestaratenci y saber st ests entre dos motives distintas. En primer lugar, y principal sina clase datinida en ta apliceciée 82 Programaciénavarada con Microsoft Visual Basie NET platomre = *Psencescot Din pike persone * Poded nodificar ei objeto origina mediante ta queve variable Console. Weisel ne pt Rontre) > 08 Ata lven, con age an po ero ool po ao umd) a un ih del Io tip, est asgnando wna copia del dato oi, prt dao original) neve vase ‘serdn independientes. ae — ‘Un dete imporant:ta clase NET Swing es un tipo por cefeencia, como se muestaen as sgventes Jineas de c6digo: * pee s Dim el As sering » "Francesco" epustan al mien objeto string En segundo lugar, deberd prestarstencin ala natraleza de los dstos que estéprocestndo (i referencia o tipo de val) pore afeta il rendimiento. Como ya he coment, Tos os de vale oeton Ser mis répdos. Ademés, en ccasions, un tipo de valor se converte aun po por referencia y voles ¢ ‘scuperar stip original sa queef usuario Sea conciecte de esta conversa nema qu leacoveae sg talentiza el eétigo, ‘ara deallar mds esta explicacén tenga en cuenta ue sirmpre que pase un pode valor aun método «ve tome como argumento un objeto, l valor econverrdaun po por eferenci el ranime NET adore unbogue de memoria enel montinalminsrao, copa el valor en ete sreay pasa al miedo svpuneon ‘cha ubicacin de memoria. Esta opercion se conoce como Boxing. Por ejemplo, cada ez gue pve oe mero al méiodo Debug Writes etardproduciendo una operaién de bong sca porque co eed Sélo puede tomar un objeto una eadena come arguments El ejemplo mis secillo de una operacn boxing se produce cadaver que asigna un tipo de valor (on ‘eer, por ejemplo) a una variable Object: Din & as taceger = 1234 4 siguiente inatruccisn peavocs 1a siguiente secuencia de operaciones: 1 10) "Se astgna un sioque de pencria al sontsny (2) ef valor entero original se copia on #1 bloque de manoeie (5) las Girecciones del blogue ee asigran'a la variable Coject, ino AG object = 1 ‘Como puede adivinar, apicar una operacién de boxing sobre un valor es una actividad que consume tiempo. Del mismo modo, también desperdiciaré tiempo de la CPU cada vez que reasigne un valor Boxed & ‘una variable de tipo valor (una opersci6n conocida como unboxing): {consinuacién de esenpie anterior) ia siguiente inseruccian proveca Le sugilente sacvencia de cpereciones: (iy el puntero de ta variable 20 utilize para losallsas et aavsr " (2) fe Gopia el entero on in varcable. destino, (Gi of soneén'utilisade por In variable ore Tacolecte copa elemento no vtslizado Wo. general, algin thonpo éespude Se us In vasisile o have aise definids cose sua ete pin ina integers 8 conplla el se ha activade option seztct). Observe gue igo amr stofenconard si Option St se encuentra desactvado; si Option ‘Strict estd activado tendré que rescribir la ditima instruccién de la siguiente forma: " Din 42 As Integer = cxnt(o) Ceptlo 2 Mdduls y vaabes 83 ‘Veamos fs conchsin final: wie siempre tipos de valor en lugar de tipos por referencia, si tiene ‘oportunidad. Por ejemplo, alice variables Charen lugar de variables Stings esté trabajando con cadenas <6 un nico carter. Y ative Option Swit nivel apliccién para que la operaciones de unboxing no pasen desapercbidas. ‘Veremos mis deals sobre los tipos po referencia, tips de valor, boxing y unboxing, en el Capitulo 8 Operador CType ‘Como ya sbe, a insracidn Option Strict On impide que el programador escriba e6digo que pueda falar cen Hemp de eecucén debido a una conversin fllida. Por este motivo, cuando realice una operacin de unboxing de un valor (de una variable Object a uns variable de tipo valor) necesitard utilizar una funcin de conversion explicit (Int en la siguiente instrucei6n} sand Sl tger selec ‘Minas qu siempre podré asignar un objeto Persona a una variable Object sin tomar precauciones particulars (porque esta asignacion nunca podréfallar en tiempo de ejecucién) Ia asignacign opuesta ued fllar sie objeto no es compatible con el tipo de la variable destino. Como esta asignacin es una conversioa de restecgn, deberd decir al compilador que sabe pereciamente lo que esté haciendo si Op- tion Strict se encuentra activado, Reslizard esta operaci6n convitiendo (la operacin de conversin tam bia recite los nombres en inglés de coercing o cating) manualmente el objeto enel tipo destino, vlan {do el operador CType: * he oe una vaciahle object DiS pare Se Persona = CRYp@(SbS, Pessona) Observe que el segundo argumento del operador CType es ef nombre de a clase destino y este nombre n0 ‘est encerado entre coils Sil argumento n0 se puede convertir directamente al tipo destino, CType intenta converte. Por «ejemplo, i siguiente istruceién convierte con éxito la cadena en un ener, incluso aunque esto signfique climina a parte decinal del nimero original incluida en Ia cadena in sxe Ag Tage = Copel "229.45, snsager) Si el argumento nose puede conver al tipo destino, CType provoca un objeto InvalidCastException, Enel exso de que se estépreguntando el motivo de haber clasifieado a CType como un operador en lugar de como una funién, ef motivo estéen que el compilador de Visual Basic NET conviere, en la ayoria de los casos, Type al lengusje MSIL, ta y como lo hace con ottos operadores, ules como + y El operador DirectCast 1a palabra clave DireeCastofrece otra forma de conversa entre tipos. Esta palabra clave tiene la misma sintaxis que CType peo difiere tambien en algunos detalles importantes. En prime Inga, DirectCas slo funciona con argumertos de tipos por referencia y Ios intentos de pasar tipos de valor se convieren en ‘ores de compilacién (CType funciona corectamente con ambos tpos, por referencia de valor), En segundo lugar, CType siempceintenta convert el argumento al tipo destino y, portato, es capaz 4s converts una cadena ea un tipo numérico (si, naturalmente, la cadena contene un nimero) DireetCast Slo funciona x el argument origen se puede conver en el tipo destino y provecard un objeto Invalid- (CastExeepton en caso conrario (DirectCast es incapsz incluse de realizar conversiones por ampliseign de ‘Shor a lmtegero de Single 2 Double). En tercer lugar, DtetCast es ligeramente més ripido que CType por fo que deberd utilizar el primero sempre que pueda. En la prictica podri(y deberd) uiliar la palabra clave Direetast en tres ocasions: M Cuando reatice una operacén de unboxing sobre wn tipo de valor que fuera previamente bosed (acerado) dena de usa variable Object. 090800 0S OOOO 009000000 H00 00000000590 208000 G88 O98 0890006808000 0800R8868 84 Programacién avarzaéa con Microsoft Visual Basic.NET 1m Coando convierta una variable de una clase base a una variable de una clase derivada (por ejemplo, tine variable Persona a una variable Empleado o una variable Object otro tipo de referencia). ‘m Cuando convierta una variable objeto a una variable de interfaz. Constantes y Enums |A diferencia de lo que sucedia en las ‘pueden exponer constants pdbicas que serén conte fectura. Salvo por este deal, so sntais es si versiones anteriores del lengua, las clases de Visual Basic NET rmpladas desde fuera dela clase como campos de s6lo ‘la utilizada en Visual Basic 6: + nace instrucciéa e6to funciona ai option HxpLictt ae encuentse desactivida pulse Conse contvazemspreseterainads = “afcont™ ‘i Option Explicit se encuentra etivada, las constntesrequerirén una declaracién explicita de tipos de In aintaxts secomendaca, ets instesccidn funciona siempre y 0 tee Dublis Conse contrasesseredaterninace As 5 Los bloques Enum pueden apereceren cualquier lugar dentro de un archivo fuente, un mule interno, tuna clase, blogues 0, diectament, @ nivel del espacio de nombres. ‘yefanauto fete tora un valor silo. Euaacase : cleewle 3 Sebcsnccide = -399 Go nace fatea ordanar tos valores.) + variabte a 1a que ee puede asignar un tipo Eni. ‘otra diferencia con respecto Visual Basic 6, que siempre utlizaba impicitamente enters de 32 bits para los valores Enum, es gue pod lege entre Ios tpos de datos Bye, Shor Integer y Long, siendo Tucger el tipo de dato predeterminado en caso de que se omitera el tipo de dato (la documentacién det SD sugiete que debordublizarIneger salvo que tenga un buen mativo para hacer otra cosa). No podrs Smite el aombre de Enum cuando est utilizando una constante enumerada: © 46 bics aon autictontes para este Bren, por to gue podanos utilizar Short + ta Lines siguiente 22 s0 compllaré poraue Soper ueiiear el sonbre eoapleto Forma, Cu Dis spores Ae eros = Suadeeds ‘Si no se proporciona un valor explicito se asignac el valor 0 al pimer miembro del bloque Enum, al segundo miembros le asignardel valor I, ee Incluso augue ls valores Enum se almacenen iternamen- fe como eateros, de forma predeterminada no pode asignar un ndmero a una variable Exum si Option Strict (Steentra actvada y deberd convertrel nimero al tipo Enum adecuado antes de poder asignrle una variable Enum: arorna = Chypait rosea) ‘antulo 2: Mbduos y varables 85 Las matrices han sufrido numerosos cambios en su migracin a Visual Basie INET. En primer lugar, Ias matrices siempre debersn estar basadas en cer: ives seta instruccide stenore declare uns matriz da LL elenentos pin acc(io) ae integer Como el primer elemento de todas las matrices tiene indice ceo no pode utilizar a palabra clave'To dentro (de una lastuccion Dim y tampoco pode utlizar la instrascién Option Base La instruccién ReDim Como sucedia en Visual Basie 6y versiones anteriores, podré declarar una matizwilizando la instruccin ‘Dimy asignar memoria ullizanda una posterior instrucei6n ReDim. Sin embargo, en Visual Basic NET no podrd utlar la instccciGn ReDim para declaar una matciz (en otras palabras, no podrd eseribir una Fatracién ReDim sia su corespondienteinsrueciSn Dim para una determinada mariz), Como ReDim 00 puede declararel tipo de una mattz, no podré utilizar Ia clgasula As: pectarar 18 natets pin netsie() A Eatoase cveae is mazes sebum savess (00! | observe que en eate cago oo se sriiive la cliusule As Un problema con el que ten que enfentarse el compilador de Visual Basic 6 es que Ia instuecion ReDim poda modifica el mero de dimensiones de una mati; esta caratersticaimpedia que el comp Tedor produers el e6digo més eficaz porgue debta comprobar anes cusntas dimensiones tenfa una maiz antes Ge poder acceder asus elementos. Por ejemplo, el siguiente e6digoes legal en las versiones anteriores e Visual Basi: | see gaze eltign funciona en WBE pero no en Visual Baste .NET ibeed declares ia gatris co una inetruscién Din Cena una nateis unidinanatonai y ia utiliza sepig vareistio) Ar Untesee pecetsti) #12) oeres una actriz bidioeratonal y ta utiliza nebie saeriz(io, 10) AS Tacegee Para pesmitr que el compilador produzca un cédigo mis efesz, Visual Basic NET introduce el con- cepto de rango: el nimero de dimensiones de una matriz, Las nuevas reglas sincteas permiten que ReDim cambie el nimero de elementos contenido en una matriz pero no podré modificar el rango de la propia matriz Pod indicar el ango de ura mati en una instracei6n Dim insertando el nimeroapropiado fe comas denro det paréness peclarae una aatcis bidisenstonst nonsions Pepin pateiz3{10, 30, 20) Pdr redimensiona la matrix as veces que necesite, siempre que no intente modificar el rango de la mati, También pour uilizarlainstruceién ReDim Preserve si desea mantener intactos ls valores previs- 86 Programacién avanzada con Microsoft Visual Baie NET ‘os para la matriz, Como sucede en Visual Basic 6 yen las versiones anteriores, ReDim Preserve le periti- 6 modifcar Snicamente el nlmero de elementos contend en la dima dimeasisn: Icontinuacién 402 oédigo ancestor! Aedin Proveres mesess (29) 19, 20) 1+ tas siguiantes Snatrucelones provocen una ‘Stcepcisn Arsayzypenismacentnsestion en tiemoo de ejccvelde opin preserve natsias20. 10) ReDim Preserve meteis}(10, 20, 20) Inicladores de una matriz: Los iniciadores también funcionan con las matrices y pod inicalizar los valores de una matriz una lista de valores (delimitados por comas) encerdos ene Ilnves: Dectara y area una nateis Ge 5 enterce pin nateiely Ae tasager © (00, 330 a) Deberé omitir el nimero de elementos en la instuccién Dim si utli2a un inicializador. Sin embergo, ‘cuando eree matrices multidimensionales deberdindiarelrango dela matrizy tended que utilizar bloqves de llaves anidados: Declare y exen une matcie Bidinensional de caden bin mateia2(q) Ar geting © 1 (98 ae) sD) Copia de matrices En Visual Basic 6 pose asignar wna matrie a otra « 71 cidigo de visual Basic 6 bin mertsti) ae inept faueisu(i) + atte maerist@) = 2220 atesa1(9) = 333 natrisai) = nesses) Visual Basic NET también permite Ia asignacién de matrices, pero el resultado seré distint del que cabria esperar porque las matrices en Visual Basic NET son de tio por referencia (en otras palabras, se parscen més aun jt que tuna maiz al viejo exo. Vea eu distina puede eat ase natraleea Por referencia de una matea: ssrcéaigo ae views santc NEP Bin mateiaii) Ar integer = (6. 11. 222, 333) Conprobar gle ae ba wodificade ta ascris orieinel console weieeutoetmsteisl ()) see Eso significa que Visuel Basic NET no es eapsz de copiar matrices? Naturalmente que no, pero tended que uizar une sintaxis dstint, Al serobjtos, las matrices exponen varios métodos. tno de extos Captlo 2 Modulos y variables, 87 smétodos #5 Clone, que crea una copia dela matin original y devuelve una referencia adicha copia. Varnos a rescribi el ejemplo anterior para utilizar ef método Clone: ‘big matrla3() ao Integer = (0, 122, 222, 993) (ste eédige rupone que Option serict ee encuentra desactivega) Maceist = satel clone odificar un elemento Ge 1a nueva natriz nateiatda) = 9999 VYerittear que 10 sacriz aziginal no ae ha visto afectsds console. teseeuineInatrie3 10) ud Si Option Sct se encuentra sctivada, el cédigo anterior fallaré porque el método Clone devuelve on valor Object y Ia asignacibn produce una convesién de restriccién. Observe que debe utilizar un par de paréntesisvacoen el segundo argumento dl aperador CType o DiretCast cuando redlice la conversin @ ‘una matriz etpes: (ste cédigo funciona con Sndepandencta del valor seignado a option stsiet} rateint © birectenstinateas3 clon, ineegest? ‘osisicar un slonanco en la sueva nasty En general, si esti conviriendo un valor en una matriz el segundo argument del operador CType DirectCastdeterdespecificar el rango de la matriz destino, lo que pod hacer utlizando ninguna o més comas dentro dl par de parétess: copia una saeris bidinensional Din nateiest.) AS Znteger = ((0, 4, 2, 31, (9. 39, 29. 309) Din macrisets) AP Sneorer Crear umn cipia Ge ia natesz hisinenaionst snetring » Chypelmatesas.Clone. Iaeepert1) Sila Option Surict se encuentra desactivada, también podré asignar una matriz a una variable Object y acceder al elemento de la natriz mediante enlaces en tiempo de ejecucin: tCentinsando con et eS8igo anterior! « idate ctdige supsne gue Option surice etd daractsvads) Din o as Gaject = maceres Consstenieigeting ot). )) vei De forma srprendente, tiene una matriz de objetos (en oposicié a tipos de valor, tals como nde: 48 y estas) por, neluso,asignar la matriz 2 una mati2 Object. Por ejemplo, debido a que el tipo String de Visual Basic NET es un cpo objeto, el siguiente c6digo se ejecutard sin problemas Dim wateiscadena(} Ae String © (*90¢, 1M", 122%, °3 Di vatrisibjetoe() az object Waeriscadena (Console. neitasine wateszo5jet0e(2)) > a2 er Se rata del caso particular de una regla més general qu dice que: se puede asigna una matrie de tipo X 4 una maniz de tipo ¥ siel tipo X deriva del tipo Y. Debido a que todas ls clases heredan de Object, sempre pots asgnar una matrz de tipos de objetos a una matriz Object (no necesita desactivar Option Stict para que esa asignacin se realice con éxito). Sin embargo, este tipo de aignacién funcionard slo st ‘X es un tipo por referencia Por ejemplo, funcionaré con cadenas y con clases definidas pero fallaré con ‘matrices mumsicasy con matrices detipos Structure definidos por el usuario (sigaleyendo para saber més etalles sobre as ips Structure). Er objeto Amay cuenta con muchos otros interesantes métodos, como veréen el Capitulo 9 e e @ @ e e e e e p e e e@ e ¢ e e e e e e e e e e e e e e e 0980680608080 089008880008 008800H9008 88 Programacdn avarada con Microsoft Visual Basic NET Matrices como miembros pdbilcos de una clase Una interesante novedad de las matrices es que podcé exponerlas como miembros pblicos de una clase Esto signifies que el siguiente cédigo (que provocarfa un eror de compilacién en las versiones anteriores del lenguaj) es pertectamente legal en Visual Basic NET: clase Peceona * peagcectonsr hasta 4 Lnsae pare 1a éireectén, Public Biveccson(é) as Seziny En Visual Basic 6 deberia creer un pa de procedimientos Property Let y Property Get que tomar un argumento numérico y definiean o devolvieran el elemento correspondiente de una matiz privada, La soluein de Visual Basie NET es mis concisay eficiente, Estructuras ‘Ya no poded utilizar el bloque Type..End Type en Visual Basic NET. Este ha sido susttuido porel blogue Siructure.End Structure, que offece muchas quevas caractersticas y se parece més alas clases que los Antiguos tipos definidos por el wsuario (0 UDT) utilzados en las versiones anteriores del lengusje. Pods {ener una estructura a nivel del espacio de nombres, dentro de un bloque Class o Module block e, incluso, dentro de otra estructura. Las miembros contenidos dentro de una estructura debern venir prefijados por un calificador de asce~ ibilidad (vsibilidad, como sucede en el eédigo siguiente: + pin equivale ¢ fubile en arte caso Ruble Direccise As seziog Pelvace 1S az Seeing La declaracin de los miembros de datos de fa estructura no pode incluir iniciadores ni uiizar Ya simazis dela declaraci6n As New. Como sugieren los comentarios contenidos en el ejemplo anterior. el nivel de accesibildad predeterminado pat las estracturas (que es el nivel de visbiidad implicado por una palabra clave Dim) es Public (a diferencia de lo que sucede con las clases cuyo nivel predeterminado es Drivate), Visual Basic NET unifca la sntaxis dels laces y de las estuctura, y Ia estructrassoportan la ‘mayor parte de las caractersticas de ls clases, ineluyendo los métodos: ao az seeieg pubiie Siveccton Aa Sertng Pelvace nes Ae Serceg onbesconpleto() As Steing Wosbee to 8 Apeliigs [Al igual que sucede con fas clases, las estructuras pueden incluir propiedates (si desea obtener més informacin, consult Ia seecin denominada «Propiedades» del Capitulo 4, Sin embargo, a diferencis de fo que sucede con las clases, las extructuras son tipos de valor en lugar de tipos por referencia. Entre otras cosas, esto signifies que Visual Basic NET iniciali2a automsticamente una estructura cuando declare una variable de est tipo: en otras palabras, a siguiente linea Capiulo 2: Mdauios y variables 89 Es equivalente a una de ls siguientes instrucciones: + tnictatizador descriptive Din p As EstrucPecsona < new Ratructeraona() Cada estrectura define implicitamente un constructor sin parémetrs, que inicializa cada miembeo dela estructura a su valor predeterminado (0 para miembeos quméricos,cadenas nulas para miembros String y Nothing para miembros de objetos) Resulailega definirexplicitamente un constructor sin pardimettos 0 un deg pra a est Peo pode fins un od eons Ne con rgmeno, tl como se indica a continuacin: Din Honbre as Seeing Big Apellido. aS string Pubic Dizeccion As Stetng Private #55 Ae Sering saheelSyial nbee ns Seciog, yal Apel2do A s8eing) Ne.apeiiias " Apellige (Consultee Captulo 4 pare obtener més informacisn sobee los métodos consrsctors) El métado cons tnucor es especialmente importante porgue le permit iniilizarcomectamente los miembros dela es teucura. Que pueda administra esta trea resila Vial, poe ejemplo, cuando laestuctua contenga cadenas de longi ja o, con mis pevsio, su aproximaciéa mis cerana a-NET Framework ‘im Konbre Aa. steing Bin Apetlido ag Seeing Zittiar sna cadena de lorgitud £138. Dim CodPostal Ax Microsofe. Visual5asic. Compatibility. ¥B5.Flxedtengthstcing fb Mew(OyVal Worbce As String, ByVal ApelLido Ax Stzing! Ne.apeiiige + Apeliigo codrostal lw tnd gan MOFOUEEWisuntnase. compas sbSty.Wa6.Fixdtangehsteigt39) {et cédigo reacante cons en a1 case anterior! {Una ver dich esto, deters pensar en Is cadens de longitu fs como se imo eecurso porque resulta bastante peer convrias en cadenasnomales cuando ei conven un spieai6a esa nua ‘ern anerie dees lenge Un conecuecia del pode valor presente ens variables Stractre es gu los datos se copirin cuando sign una variable de esac oa variable, mientras ue to eeopa tn pte cuando se tsign un valor por referencia 4 tna variable, También ceber ener en coe gi no ods wile e 980 Frogramacién avanzada con Mierosot Visual Besic NET operadorigualdad con las esructures El siguiente codigo resume las diferencias exstents entre clases y nissa‘erteucture gus ta entroctora Eoteuefocsosa te Sub conpacaztecrvcturasveiaseet) a creacidn 6 similar, pero las estructures no reaiferen Kew Din eters as New Fersonall Din srere As EateucPorsona + ten 08 opcionat pit,safaacsen a tos miensror os sdéntica spare Apeigs «e+ CPaEE.Apellige = "Boe ta Manage a nétodo y a a propiedad Console. lriteline chess tonbeetonstecs )) Congote.meitetine apers obretorpietst| | "un astanecién a una varsable det Samo tipo tlene efectos dietintos. las clases son tipor de referencia, sor allo te nueva variabio recibe Un puntero al objeto sriginel crezel nombres Sana Seb agectaze a1 chjeto original console ltritetine crers hen) he Copia de la escrictura seigin = Gensote.ueitersne{abers-itabre > 0 En Visual Basic NET, las estractoras no son compatibes con algunas otra caracteriticas de las clases For cjempo, las esructuras heredan de manera implicta todos los métodos dela clase Object, pro no eeden heredarios explicitamente de otra estructura, ni tampoeo pueden ser heredados Después de esta primera exposicién de los cambios sntécticns més importantes celacionados con la {hima en que se declaran yutlizan jos méduos, las clases ls variables, etardpreparado part ere ‘98 conceptos han cambiado en el lenguaje y cémo podrd controlar el flujo de cjecuetn en Visual Bane mas igvale y emo pr vo.deejecucin en Visual B Control de flujo y manejo de errores ‘A pesarde los mumerosos cambios que se han producido en la sintanis bési del lenguale, el e6digo de Visual Basic INET sigue pareciendo Visual Basic. La mayor parte de las diferencias se encuentran eh los

You might also like