Guida Vb.net

download Guida Vb.net

of 519

description

Visual Basic

Transcript of Guida Vb.net

  • A1. IntroduzioneBenvenuti, aspir anti pr ogr ammator i! In questa guida dalla lunghezza chiolemtr ica impar er ete cosa significa e cosacompor ta pr ogr ammar e, e tutti i tr ucchi e gli espedienti per costr uir e solide e sicur e applicazioni.

    Una veloce panoramica sulla programmazioneLa pr ogr ammazione quella disciplina dell'infor matica che si occupa di idear e, costr uir e e mantener e il softwar e.Queste sono le tr e pr incipali divisioni che si possono oper ar e all'inter no di questa speciale e affascinante br ancadell'ingegner ia. Infatti, un buon pr ogr ammator e deve pr ima di tutto analizzar e il pr oblema, quindi pensar e a unapossibile soluzione, se esiste, e costr uir e mentalmente un'ipotetica str uttur a del softwar e che dovr impegnar si ascr iver e: questa par te della pr ogettazione si chiama analisi. Successivamente, si viene alla fase pi tecnica, e cheimplica una conoscenza dir etta del linguaggio di pr ogr ammazione usato: in questa guida, mi occuper di descr iver e ilVisual Basic .NET. Una volta sviluppato il pr ogr amma, lo si deve testar e per tr ovar e eventuali malfunzionamenti (bugs)- che, per inciso, si manifestano solo quando non dovr ebber o - e, come ultima oper azione, bisogna attuar e unamanutenzione per iodica dello stesso, od or ganizzar e un efficiente sistema di aggior namento. Inutile dir e che l'ultimafase necessar ia solo nel caso di gr andi applicazioni commer ciali e non cer tamente nel contesto di piccoli pr ogr ammiamator iali.Pr ima di iniziar e, una br eve sintesi di alcuni dettagli tecnici: i ter mini da conoscer e, e gli ambienti di sviluppo dausar e.

    Alcuni termini da conoscereCodice sorg ente o sorg ente: l'insieme di tutte le istr uzioni che il pr ogr ammator e scr ive e fa eseguir e alpr ogr amma. Il file testuale che contiene tali istr uzioni viene esso stesso chiamato sor genteCompilatore: il softwar e utilizzato per cr ear e il pr ogr amma finito (un eseguibile *.ex e) a par tir e dal solo codicesor genteDebug g er : il softwar e usato per l'analisi e la r isoluzione degli er r or i (bugs) all'inter no di un pr ogr amma;Parole r iservate o keywords: di solito vengono evidenziate dai compilator i in un color e diver so e sono par olepr edefinite intr inseche del linguaggio, che ser vono per scopi ben pr ecisi.

    Ambiente di sviluppoL'ambiente di sviluppo che pr ender come r ifer imento per questa guida Visual Basic Ex pr ess 2008 (scar icabile dalSito Ufficiale della M icrosoft; se si ha un pr ofilo Passpor t.NET possibile r egistr ar e il pr odotto e ottener e unaver sione completa). Potete comunque scar icar e Shar pDevelop da qui (vedi sezione downloads), un pr ogr amma gr atis emolto buono (tr over ete una r ecensione nella sezione Sofwtar e di Pier oTofy.it r edatta da me e HeDo qui). Dato che lever sioni pr ecedenti della guida, dalle quali r ipr esa la maggior anza dei sor genti pr oposti, sono state r edattepr endendo come esempio Visual Basic Ex pr ess 2005, potete scar icar e anche quello da qui.

  • A2. Classi, Moduli e Namespace

    Object Oriented ProgrammingI linguaggi .NET sono orientati agli oggetti e cos lo anche VB.NET. Questo appr occio alla pr ogr ammazione ha avutomolto successo negli ultimi anni e si basa fondamentalmente sui concetti di astr azione, oggetto e inter azione fr aoggetti. A lor o volta, questi ultimi costituiscono un potente str umento per la modellizzazione e un nuovo modo diavvicinar si alla r isoluzione dei pr oblemi. La par ticolar e mentalit che questa linea di sviluppo adotta favor evole allar appr esentazione dei dati in modo ger ar chico, e per questo motivo il suo paradig ma di pr ogr ammazione - ossial'insieme degli str umenti concettuali messi a disposizione dal linguaggio e il modo in cui il pr ogr ammator e concepiscel'applicativo - definito da tr e concetti car dine: l'ereditar iet, il polimorfismo e l'incapsulamento. Molto pr estoar r iver emo ad osser var e nel par ticolar e le car atter istiche di ognuno di essi, ma pr ima vediamo di iniziar e conl'intr odur r e l'entit fondamentale che si pone alla base di tutti questi str umenti: la classe.

    Le ClassiCome dicevo, una car atter istica par ticolar e di questa categor ia di linguaggi che essi sono basati su un unicoimpor tantissimo concetto fondamentale: gli og g etti, i quali vengono r appr esentati da classi. Una classe non altr o chela rappresentazione - ovv iamente astratta - di qualcosa di concreto, mentr e l'oggetto sar una concr etizzazionedi questa r appr esentazione (per una discussione pi appr ofondita sulla differ enza tr a classe e oggetto, veder e capitoloA7). Ad esempio, in un pr ogr amma che deve gestir e una videoteca, ogni videocassetta o DVD r appr esentato da unaclasse; in un pr ogr amma per la fattur azione dei clienti, ogni cliente e ogni fattur a vengono r appr esentati da unaclasse. Insomma, ogni cosa, ogni entit, ogni r elazione - per fino ogni er r or e - tr ova la sua r appr esentazione in unaclasse.Detto questo, viene spontaneo pensar e che, se ogni cosa astr atta da una classe, questa classe dovr anche contener edei dati su quella cosa. Ad esempio, la classe Utente dovr contener e infor mazioni sul nome dell'utente, sulla suapasswor d, sulla sua data di nascita e su molto altr o su cui si pu sor volar e. Si dice che tutte queste infor mazioni sonoesposte dalla classe: ognuna di esse, inoltr e, r appr esentata da quello che viene chiamato membro. I membr i di unaclasse sono tutti quei dati e quelle funzionalit che essa espone.Per esser e usabile, per , una classe deve venir e pr ima dichiar ata, mediante un pr eciso codice. L'atto di dichiar ar e unaqualsiasi entit le per mette di iniziar e ad "esister e": il pr ogr ammator e deve infatti ser vir si di qualcosa che gi statodefinito da qualche par te, e senza di quello non pu costr uir e niente. Con la par ola "entit" mi r ifer isco a qualsiasi cosasi possa usar e in pr ogr ammazione: dato che le vostr e conoscenze sono limitate, non posso che usar e dei ter minigener ici e piuttosto vaghi, ma in br eve il mio lessico si far pi pr eciso. Nella pr atica, una classe si dichiar a cos:

    dove [NomeClasse] un qualsiasi nome che potete decider e ar bitr ar iamente, a seconda di cosa debba esser er appr esentato. Tutto il codice compr eso tr a le par ole sopr a citate inter no alla classe e si chiama corpo; tutte leentit esistenti nel cor po sono dei membr i. Ad esempio, se si volesse idealizzar e a livello di codice un tr iangolo, siscr iver ebbe questo:

    Nel cor po di Tr iangolo si potr anno poi definir e tutte le infor mazioni che gli si possono attr ibuir e, come la lunghezza

    1.2.3.

    Class [NomeClasse]...End Class

    1.2.3.

    Class Triangolo...End Class

  • dei lati, la tipologia, l'ampiezza degli angoli, ecceter a...

    I ModuliNonostante il nome, i moduli non sono niente altr o che dei tipi speciali di classi. La differ enza sostanziale tr a i dueter mini ver r chiar ita molto pi avanti nella guida, poich le vostr e attuali competenze non sono sufficienti a uncompleto appr endimento. Tuttavia, i moduli sar anno la tipologia di classe pi usata in tutta la sezione A.

    I NamespacePossiamo definir e classi e moduli come unit funzionali: essi r appr esentano qualcosa, possono esser e usate,manipolate, istanziate, dichiar ate, ecceter a... Sono quindi str umenti attivi di pr ogr ammazione, che ser vono ar ealizzar e concr etamente azioni e a pr odur r e r isultati. I namespace, invece, appar tengono a tutt'altr o gener e dicategor ia: essi sono solo dei r aggr uppamenti "passivi" di classi o di moduli. Possiamo pensar e a un namespace come aduna car tella, entr o la quale possono star e files, ma anche altr e car telle, ognuna delle quali r aggr uppa un par ticolar etipo di infor mazione. Ad esempio, volendo scr iver e un pr ogr amma che aiuti nel calcolo geometr ico di alcune figur e, sipotr ebbe usar e un codice str uttur ate come segue:

    Come si vede, tutte le classi che r appr esentano tipologie di tr iangoli (Scaleno, Isoscele, Equilater o) sono all'inter no delnamespace Tr iangoli; allo stesso modo esiste anche il namespace Quadr ilater i, che contiene al suo inter no un altr onamespace Par allelogr ammi, poich tutti i par allelogr ammi sono quadr ilater i, per definizione. In quest'ultimo esiste laclasse Par allelogr amma che r appr esenta una gener ica figur a di questo tipo, ma esiste ancor a un altr o namespaceRombi: come noto, infatti, tutti i r ombi sono anche par allelogr ammi.Dall'esempio si osser va che i namespace categor izzano le unit funzionali, dividendole in insiemi di per tinenza. Quandoun namespace si tr ova all'inter no di un altr o namespace, lo si definisce nidificato: in questo caso, Par alleloogr ammi eRombi sono namespace nidificati. Altr a cosa: al contr ar io della classi, gli spazi di nomi (italianizzazione dell'inglesename-space) non possiedono un "cor po", poich questo ter mine si pu usar e solo quando si par la di qualcosa di attivo;

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.

    Namespace TriangoliClass Scaleno'...End Class Class Isoscele'...End Class Class Equilatero'...End ClassEnd Namespace

    Namespace QuadrilateriNamespace ParallelogrammiClass Parallelogramma'...End Class Namespace RombiClass Rombo

    '...End Class Class Quadrato'...End ClassEnd NamespaceEnd NamespaceEnd Namespace

  • per lo stesso motivo, non si pu neanche par lar e di membr i di un namespace.

  • A3. Panoramica sul Framework .NETCome ho spiegato nel pr ecedente capitolo, il concetto pi impor tante della pr ogr ammazione ad oggetti la classe.Quindi, per scr iver e i nostr i pr ogr ammi, utilizzer emo sempr e, bene o male, queste entit. Ma non possibile pensar eche si debba scr iver e tutto da zer o: per i pr ogr ammator i .NET, esiste un vastissimo inventar io di classi gi pr onte,r aggr uppate sotto una tr entina di namespace fondamentali. L'insieme di tutti questi str umenti di pr ogr ammazione ilFramework .NET, l'ossatur a pr incipale su cui si r eggono tutti i linguaggi basati sulla tecnologia .NET (di cui Vb.NET solo un esponente, accanto al pi usato C# e agli altr i meno noti, come J#, F#, Delphi per .NET, ecceter a...). Sar ebbetuttavia r iduttivo descr iver e tale piattafor ma come un semplice agglomer ato di libr er ie (vedi oltr e), quando essacontempla meccanismi assai pi complessi, che sovr intendono alla gener ale esecuzione di tutte le applicazioni .NET.L'inter a str uttur a del Fr amewor k si pr esente come str atificata in diver si livelli:

    1. Sistema operativoIl Fr amewor k .NET pr esenta una str uttur a str atificata, alla base della quale r isiede il sistema oper ativo, Windows. Pipr ecisamente, si consider a il sistema oper ativo e l'API (Application Pr ogr amming Inter face) di Windows, che esponetutti i metodi r esi disponibili al pr ogr ammator e per svolger e un dato compito.

    2. Common Language RuntimeUn gr adino pi in su c' il Common Language Runtime (CLR), r esponsabile dei ser vizi basilar i del Fr amew or k, quali lagestione della memor ia e la sua liber azione tr amite il meccanismo di Gar bage Collection (vedi capitolo r elativo), lagestione str uttur ata delle eccezioni (er r or i) e il multithr eading. Nessuna applicazione inter agisce mai dir ettamentecon il CLR, ma tutte sono allo stesso modo contr ollate da esso, come se fosse il lor o super visor e. Pr opr io per questo sidefinisce il codice .NET Managed o Safe ("Gestito" o "Sicur o"), poich questo str ato del Fr amewor k gar antisce che nonvengano mai eseguite istr uzioni dannose che possano mandar e in cr ash il pr ogr amma o il sistema oper ativo stesso. Alcontr ar io, il codice Unmanaged o Unsafe pu eseguir e oper azioni r ischiose per il computer : sor genti pr odotti in Vb6 oC++ possono pr odur r e tale tipo di codice.

    3. Base Class LibraryLo str ato successivo denominato Base Class Libr ar y (BCL): questa par te contiene tutti i tipi e le classi disponibili nelFr amewor k (il che cor r isponde in numer o a diver se migliaia di elementi), r aggr uppati in una tr entina di file pr incipali(assembly). In questi ultimi compr esa la definizione della classe System.Object, dalla quale der iva pr essoch ogni altr aclasse. I dati contenuti nella BCL per mettono di svolger e ogni oper azione possibile sulla macchina.

    4. XMLSuccessivamente tr oviamo i dati, le r isor se. Per salvar e i dati viene usato quasi sempr e il for mato XML (eXtensibleMar kup Language), che utilizza dei tag spesso nidificati per contener e i campi necessar i. La str uttur a di questo tipo difile, inoltr e, adatta alla r appr esentazione ger ar chica, un metodo che nell'ambiente .net impor tantissimo. I file diconfigur azione e quelli delle opzioni impostate dell'utente, ad esempio, vengono salvati in for mato XML. Anche la nuovatecnologia denominata Windows Pr esentation Foundation (WPF), intr odotta nella ver sione 3.5 del Fr amewor k, cheper mette di cr ear e contr olli dalla gr afica accattivante e str avagante, si basa su un linguaggio di contr assegno (dimar kup) sur r ogato dell'XML.

  • 5. Windows Forms e ASP.NETAl livello super ior e tr oviamo ASP.NET e Windows For ms, ossia le inter facce gr afiche che r icopr ono il codicedell'applicazione ver a e pr opr ia. La pr ima una tecnologia pensata per lo sviluppo sul Web, mentr e la seconda for niscesostanzialmente la possibilit di cr ear e una inter faccia gr afica (Gr aphical User Inter face, GUI) in tutto e per tuttouguale a quella classica, a finestr e, dei sistemi oper ativi Windows. La costr uzione di una Windows For m (ossia unasingola finestr a) semplice e avviene come nel Vb classico, e chi sta leggendo questa guida per passar e dal VB6 alVB.NET lo sapr bene: si pr endono uno o pi contr olli e li si tr ascinano sulla super ficie della finestr a, dopodich si scr iveil codice associato ad ognuno dei lor o eventi.

    6. Common Language Spec ificationsIl penultimo stadio della str atificazione del Fr amewor k coincide con le Common Language Specifications (CLS), ossia uninsieme di specifiche che definiscono i r equisiti minimi r ichiesti a un linguaggio di pr ogr ammazione per esser equalificato come .NET. Un esempio di tali dir ettive: il linguaggio deve saper e gestir e tipi base come str inghe e numer iinter i, vettor i e collezioni a base zer o e deve saper pr ocessar e un'eccezione scatenata dal Fr amewor k.

    7. Linguaggi .NETIn cima alla str uttur a ci sono tutti i linguaggi .net: Vb, C#, J#, ecceter a.

    Versioni del FrameworkCon il passar e degli anni, a par tir e dal 2002, Micr osoft ha r ilasciato ver sioni successive del Fr amewor k .NET e ognunadi queste r elease ha intr odotto nuovi concetti di pr ogr ammazione e nuove possibilit per lo sviluppator e.Par allelamente all'uscita di queste nuove ver sioni, sono state cr eate anche edizioni successive del linguaggio VB.NET,ognuna delle quali stata natur almente accostata alla ver sione del Fr amewor k su cui si r eggeva. Ecco una r apidapanor amica dell'evoluzione del linguaggio:

    VB2002: si basa sulla ver sione 1.0 del Fr amewor kVB2003: si basa sulla ver sione 1.1 del Fr amewor kVB2005: si basa sulla ver sione 2.0 del Fr amewor k. Questa la ver sione maggior mente utilizzata in questaguida, sebbene cer ti capitoli si concentr er anno sull'intr oduzione di alcuni nuovi aspetti por tati da VB2008VB2008: si basa sulla ver sione 3.5 del Fr amewor k. La ver sione 3.0 si fondava ancor a sulla 2.0 del CLR e per ci lemodifiche consistevano sostanzialmente nell'aggiunta di alcuni componenti e nell'appor to di diver se miglior ie ecor r ezioniVB2010: si basa sulla ver sione 4.0 del Fr amewor k

  • A4. Utilizzo base dell'IDE

    IDE? Me lo sono dimenticato a casa...Non vi pr eoccupate: se avete seguito tutti i capitoli fino a questo punto, siete gi un possesso di un IDE: Visual Basic2005 (o 2008) Ex pr ess. L'acr onimo IDE significa Integr ated Development Envir onment ("ambiente di sviluppo integr ato")ed indica un softwar e che aiuta il pr ogr ammator e nella stesur a del codice. Il softwar e che vi ho consigliato for nisce,sebbene sia la ver sione fr ee, un numer o molto alto di str umenti e tools. In pr imis, contiene, ovviamente, un editor dicodice sor gente, pr ogettato in modo da evidenziar e in modo differ ente le keywor ds e da suppor tar e molte funzioni dir icer ca e r aggr uppamento che vedr emo in seguito. Accanto a questo, i pr incipali componenti che non possono mancar ein un IDE sono il compilator e ed il debugger , di cui ho dato una veloce definizione nel capitolo intr oduttivo. Il pr imo halo scopo di legger e il sor gente scr itto dal pr ogr ammator e e pr odur r e da questo un eseguibile: i passi che vengonopor tati a ter mine dur ante un pr ocesso di compilazione sono in r ealt pi di uno (di solito compilazione e linking), mamolto spesso si semplifica il tutto par lando semplicemente di compilazione. Il secondo, invece, il pr ogr amma che vidar pi filo da tor cer e, anche se in r ealt sar il vostr o miglior e aiutante (diciamo che vi sfinir a fin di bene): ildebugger ha la funzione di analizzar e e segnalar e i bugs (bachi, er r or i) che si ver ificano dur ante l'esecuzione; assiemead un r appor to dettagliato del tipo di er r or e ver ificatosi, segnala par allelamente anche il punto del codice che ha datopr oblemi, in modo da r ender e molto pi semplice individuar e e cor r egger e la falla.

    Funzionamento del compilatore .NETIl compilator e , come gi detto, quel softw ar e necessar io a "tr asfor mar e" il codice sor gente scr itto in un deter minatolinguaggio in un pr ogr amma eseguibile. Nor malmente, un compilator e pr odur r ebbe un applicativo tr aducendo leistr uzioni testuali intr odotte dal pr ogr ammator e in linguaggio macchina, ossia una ser ie di bit univocamenteinter pr etabile dal pr ocessor e. I compilator i .NET, invece, hanno un compor tamento differ ente, in quanto il lor o outputnon un "nor male pr ogr amma" scr itto in linguaggio macchina, ma si tr atta di una ser ie di istr uzioni codificate in unaltr o linguaggio speciale, chiamato IL (Inter mediate Language). Come sugger isce il nome, esso si tr ova ad un livellointer medio tr a la macchina e l'astr azione: super ior e r ispetto al pur o codice binar io, ma allo stesso tempo ungr adino pi sotto r ispetto ai linguaggi .NET. Venendo a conoscenza di queste infor mazioni, dovr ebbe sor ger espontaneamente una domanda: come fa allor a un pr ogr amma .NET ad esser e eseguito? La r isposta semplice: lostesso Fr amewor k che si occupa di inter pr etar ne le istr uzioni e di eseguir le, sempr e sotto la super visione del CLR. Perquesto motivo, si hanno tr e impor tanti conseguenze:

    Non possibile far cor r er e un'applicazione .NET su una macchina spr ovvista del Fr amewor k;Il codice .NET sempr e sicur o;Un pr ogr amma .NET sempr e disassemblabile: su questo punto mi soffer mer in seguito.

    Creare una Console ApplicationNei pr ossimi capitoli inizer ad intr odur r e la sintassi del linguaggio, ossia le r egole da r ispettar e quando si scr ive uncodice. Per tutti gli esempi della sezione A, far uso di applicazioni console (avete pr esente la finestr ella con lo sfondoner o?), che lavor ano in DOS. Per cr ear e una Applicazione Console bisogna selezionar e dal men File del compilator e, lavoce New Pr oject, e quindi sceglier e il tipo di applicazione desider ata. Dopodich, il compilator e scr iver aumaticamente alcune r ighe di codice pr eimpostate, che possono esser e simili a queste:

    Module Module1

  • Sub Main() End SubEnd Module

    Nello scr eenshot pr oposto qui sopr a si possono veder e le tr e ar ee in cui solitamente divisa l'inter faccia delcompilator e: non vi pr eoccupate se la vostr a appar e differ ente, poich, essendo modificabile a piacimento, la miapotr ebbe esser e diver sa dal layout pr eimpostato del compilator e. Per or a, le finestr e impor tanti sono due: quella delcodice, dove andr emo a scr iver e le istr uzioni, e quella degli er r or i, dove potr ete tener e costantemente sott'occhio seavete commesso degli er r or i di sintassi. Nello scr eenshot la seconda di queste non visibile, ma la si pu por tar e inpr imo piano tenendo pr emuto Ctr l e digitando in successione "\" ed "E".Per quanto r iguar da il codice che appar e, ho gi specificato in pr ecedenza che i moduli sono dei tipi speciali di classe, efin qui vi baster saper e questo. Quello che potr este non conoscer e la par te di sor gente in cui appaiono le par ole Subed End Sub: anche in questo caso, la tr attazione par ticolar e di queste keywor ds sar r imandata pi in l. Per or apossiamo consider ar e la Sub Main() come il pr ogr amma inter o: ogni cosa che viene scr itta tr a "Sub Main()" ed "End Sub"ver r eseguita quando si pr emer il pulsante Star t (il tr iangolino ver de in alto sulla bar r a degli str umenti), o inalter nativa F5.

    Compilazione del programma finitoUna volta finito di scr iver e il codice e di testar lo usando le funzioni dell'IDE (ivi compr esa l'esecuzione in modalit debugpr emendo F5), sar necessar io cr ear e il pr ogr amma finito. Quello che avete eseguito fin'or a non er a altr o che unaver sione pi lenta e meno ottimizzata del softwar e scr itto, poich c'er a bisogno di contr ollar e tutti gli er r or i e i bugs,impiegando tempo e spazio per memor izzar e le infor mazioni r elative al debug, appunto. Per cr ear e l'applicazioner eale finita, necessar io compilar e il codice in modalit r elease. Apr ite la scheda delle pr opr iet di pr ogetto, dal menpr incipale Pr oject > [NomePr ogetto] Pr oper ties (l'ultima voce del sottomen); selezionate la scheda Compile e cambiateil campo Configur ation su Release, quindi pr emete Build > Build Pr oject (Build sempr e una voce del men pr incipale).

  • Tr over ete l'eseguibile compilato nella car tella Documenti\Visual Studio 2008\Pr ojects\[Nome pr ogetto]\bin\Release.

  • A5. Variabili e costanti

    Le variabiliUna var iabile uno spazio di memor ia RAM (Random Access Memor y) in cui vengono allocati dei dati dal pr ogr amma, ed possibile modificar ne od ottener ne il valor e facendo r ifer imento ad un nome che si definisce ar bitr ar iamente. Questonome si dice anche identificatore (o, pi r ar amente, mnemonico), e pu esser e costituito da un qualunque insieme dicar atter i alfanumer ici e under scor e: l'unica condizione da r ispettar e per cr ear e un nome valido che questo non puiniziar e con un numer o. Per esempio "Pippo", "_Pluto", "Mar io78" o anche "_12345" sono identificator i validi, mentr e"0Luigi" non lo . Il pr incipale scopo di una var iabile contener e dati utili al pr ogr amma; tali dati possono r isieder e inmemor ia per un tempo pi o meno lungo, a seconda di quando una var iabile viene cr eata o distr utta: ogni var iabile,comunque, cessa di esister e nel momento in cui il pr ogr amma viene chiuso. Essa, inoltr e, pu contener e unagr andissima var it di tipi di dato diver si: dai numer i alle str inghe (testo), dalle date ai valor i booleani, per allar gar sipoi a tipi pi ampi, in gr ado di r appr esentar e un inter o file. Ma pr ima di ar r ivar e a spiegar e tutto questo, bisognaanalizzar e in che modo si dichiara una var iabile. La dichiar azione, tanto di una costante quanto di una classe, l'attodefinitivo con cui si stabilisce l'esistenza di un'entit e la si r ende disponibile o accessibile alle altr i par ti delpr ogr amma. Ogni cosa, per esser e usata, deve pr ima esser e dichiar ata da qualche par te: questa oper azione equivale,ad esempio, a definir e un concetto in matematica: la definizione impor tantissima.Ecco un semplice esempio:

    Facendo cor r er e il pr ogr amma avr emo una scher mata ner a su cui viene visualizzato il numer o 80. Per ch? Or avediamo.Come avr ete notato, le var iabili si dichiar ano in un modo specifico, usando le keywor ds Dim e As:

    Dove [nome] l'identificator e con cui ci si r ifer isce ad una var iabile e [tipo] il tipo di dato contenuto nella var iabile.Esistono molteplici tipi di var iabile fr a cui possibile sceglier e. Ecco un elenco dei tipi base (che sono consider atikeywor ds):

    Byte: inter o a 8 bit che pu assumer e valor i da 0 a 255;Char : valor e a 8 bit che pu assumer e i valor i di ogni car atter e della tastier a (compr esi quelli speciali);Int16 o Short: inter o a 16 bit che pu assumer e valor i da -32768 a +32767;Int32 o Integ er : inter o a 32 bit da -2147483648 a +2147483647;Int64 o Long : inter o a 64 bit da cir ca -922000000000000000 a +9220000000000000000;Sing le: decimale da cir ca -3,4e+38 a +3,4e+38, con un inter vallo minimo di cir ca 1,4e-45;Double: decimale da cir ca -1,79e+308 a +1,79e+308, con un inter vallo minimo di cir ca 4,9e-324;Boolean: dato a 4 bytes che pu assumer e due valor i, Tr ue (ver o) e False (falso). Nonostante la limitatezza delsuo campo di azione, che concettualmente potr ebbe r estr inger si ad un solo bit, il tipo Boolean occupa 32bit dimemor ia: sono quindi da evitar e gr andi quantit di questo tipo;Str ing : valor e di minimo 10 bytes, composto da una sequenza di car atter i. Se vogliamo, possiamo assimilar lo ad

    01.02.03.04.05.06.07.08.09.

    Module Module1Sub Main()Dim Ciao As Int16Ciao = 78Ciao = Ciao + 2Console.WriteLine(Ciao)Console.Readkey()End SubEnd Module

    1. Dim [nome] As [tipo]

  • un testo;Object: r appr esenta un qualsiasi tipo (ma non un tipo base).

    I tipi base vengono detti anche atomici o pr im itiv i, poich non possono esser e ulter ior mente scomposti. Esistono,quindi, anche tipi der ivati, appar tenenti a svar iate tipologie che analizzer emo in seguito, fr a cui si annover ano anchele classi: ogni tipo der ivato scomponibile in un insieme di tipi base.Or a, quindi, possiamo estr apolar e delle infor mazioni in pi dal codice pr oposto: dato che segue la keywor d Dim, "Ciao" l'identificator e di una var iabile di tipo Int16 (infatti dopo As stato specificato pr opr io Int16). Questo significa che"Ciao" pu contener e solo numer i inter i che, in valor e assoluto, non super ino 32767. Ovviamente, la scelta di un tipo didato piuttosto che un altr o var ia in funzione del compito che si intende svolger e: maggior e la pr ecisione e l'or dine digr andezza dei valor i coinvolti e maggior e sar anche l'uso di memor ia che si dovr sostener e. Continuando a legger e,si incontr a, nella r iga successiva, un'assegnazione, ossia una oper azione che pone nella var iabile un cer to valor e, inquesto caso 78; l'assegnazione avviene mediante l'uso dell'oper ator e uguale "=". L'istr uzione successiva simile a questa,ma con una sostanziale differ enza: il valor e assegnato alla var iabile influenzato dalla var iabile stessa. Nell'esempiopr oposto, il codice:

    ha la funzione di incr ementar e di due unit il contenuto di Ciao. Questa istr uzione potr ebbe sembr ar e algebr icamentescor r etta, ma bisogna r icor dar e che si tr atta di un comando (e non di un'equazione): pr ima di scr iver e nella cella dimemor ia associata alla var iabile il numer o che il pr ogr ammator e ha designato, il pr ogr amma r isolve l'espr essione adestr a dell'uguale sostituendo ad ogni var iabile il suo valor e, e ottenendo, quindi, 78 + 2 = 80. Le ultime due r ighe,invece, fanno visualizzar e a scher mo il contenuto di Ciao e fer mano il pr ogr amma, in attesa della pr essione di unpulsante.Come si visto dall'esempio pr ecedente, con le var iabili di tipo numer ico si possono eseguir e oper azioni ar itmetiche.Gli oper ator i messi a disposizione dal Fr amewor k sono:

    + : addizione;- : sottr azione;* : pr odotto;/ : divisione;\ : divisione tr a inter i (r estituisce come r isultato un numer o inter o a pr escinder e dal tipo degli oper andi, chepossono anche esser e decimali);Mod : r estituisce il r esto di una divisione inter a;= : assegna alla var iabile posta a sinistr a dell'uguale il valor e posto dopo l'uguale;& : concatena una str inga con un numer o o una str inga con un'altr a str inga.

    1. Ciao = Ciao + 2

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.

    Module Module1Sub Main()'InteriDim Intero, Ese As Int16'DecimaleDim Decimale As Single'BooleanoDim Vero As Boolean'StringaDim Frase As String

    Intero = 90Ese = Intero * 2 / 68Intero = Ese - Intero * InteroDecimale = 90.76Decimale = Ese / InteroVero = TrueFrase = "Ciao."'L'operatore "+" tra stringhe concatena due stringhe. Dopo la

  • Esistono poi degli speciali oper ator i di assegnamento, che velocizzano l'assegnazione di valor i, alcuni sono:

    Le fr asi poste dopo un apice (') sono dette commenti e ser vono per spiegar e cosa viene scr itto nel codice. Il contenutodi un commento NON influisce in nessun modo su ci che scr itto nel sor gente, ma ha una funzione ESCLUSIVAMENTEesplicativa.

    Le costantiAbbiamo visto che il valor e delle var iabili pu esser e modificato a piacimento. Ebbene quello delle costanti, come ilnome sugger isce, no. Esistono per semplificar e le oper azioni. Per esempio, invece di digitar e 3,1415926535897932 peril Pi g reco, possibile dichiar ar e una costante di nome Pi che abbia quel valor e ed utilizzar la nelle espr essioni. Lasintassi per dichiar ar e una costante la seguente:

    Ci sono due lampanti differ enze r ispetto al codice usato per dichiar ar e una var iabile. La pr ima , ovviamente, l'usodella keywor d Cons t al posto di Dim; la seconda consiste nell'assegnazione posta subito dopo la dichiar azione. Infatti,una costante, per esser e tale, deve contener e qualcosa: per questo motivo obblig ator io specificar e sempr e, dopola dichiar azione, il valor e che la costante assumer . Questo valor e non potr mai esser e modificato.Esempio:

    21.22.23.24.25.26.27.28.29.

    'prossima istruzione, la variabile Frase conterr:' "Buon giornoCiao"Frase = "Buon giorno" + "Ciao"'L'operatore "&" pu concatenare qualsiasi dato e'restituisce una stringa. Dopo la prossima istruzione, la'variabile Frase conterr:' "Il valore decimale : -0,0003705076"Frase = "Il valore decimale : " & DecimaleEnd SubEnd Module

    01.02.03.04.05.06.07.08.09.10.

    Module Module1Sub Main()Dim V, B As Int32

    V += B 'Equivale a V = V + BB -= V 'Equivale a B = B - VV *= B 'Equivale a V = V * BB /= V 'Equivale a B = B / VEnd SubEnd Module

    1. Const [nome] As [tipo] = [valore]

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.

    Module Module1Sub Main()Const Pi As Single = 3.1415926535897932Dim Raggio, Area As Double

    'Questa istruzione scrive sul monitor il messaggio posto tra'virgolette nelle parentesiConsole.WriteLine("Inserire il raggio di un cerchio:") 'Questa istruzione legg un valore immesso dalla tastiera e'lo deposita nella variabile RaggioRaggio = Console.ReadLineArea = Raggio * Raggio * Pi

    Console.WriteLine("L'Area : " & Area) 'Questa istruzione ferma il programma in attesa della pressione'di un pulsanteConsole.ReadKey()End SubEnd Module

  • N.B.: a causa della lor o stessa natur a, le costanti NON possono esser e inizializzate con un valor e che dipenda da unafunzione. Scr ivo questo appunto per pur a utilit di consultazione: anche se or a potr non r isultar e chiar o, vi capiter pi avanti di imbatter vi in er r or i del gener e:

    Sqr t2 dovr ebbe esser e una costante numer ica decimale che contiene la r adice quadr ata di due. Sebbene il codicesembr i cor r etto, il compilator e segnaler come er r or e l'espr essione Math.Sqr t(2), poich essa una funzione, mentr edopo l'uguale r ichiesto un valor e sempr e costante. Il codice cor r etto

    Le istruzioniTutti i comandi che abbiamo impar tito al computer e che abbiamo gener icamente chiamato con il nome di istr uzioni(come Console.Wr iteLine()) hanno dei nomi pi specifici: sono procedure o funzioni, in sostanza sottopr ogr ammi giscr itti. Pr ocedur e e funzioni possono esser e globalmente indicate con la par ola metodo. I metodi accettano deiparametr i passatigli tr a par entesi: se i par ametr i sono di pi di uno vengono separ ati da vir gole. I par ametr iser vono per comunicar e al metodo i dati sui quali questo dovr lavor ar e. La differ enza tr a una pr ocedur a e unafunzione r isiede nel fatto che la pr ima fa semplicemente eseguir e istr uzioni al computer , mentr e la seconda r estituiseun valor e. Ad esempio:

    Anche i metodi ver r anno tr attai successivamente in dettaglio.

    1. Const Sqrt2 As Single = Math.Sqrt(2)

    1. Const Sqrt2 As Single = 1.4142135

    01.02.03.04.05.06.07.08.09.10.11.12.

    Module Module1Sub Main()Dim F As Double

    'Questa una funzione che restituisce la radice quadrata di 56F = Math.Sqrt(56)

    'Questa una procedura che scrive a video un messaggioConsole.WriteLine("La radice di 56 " & F)Console.ReadKey()End SubEnd Module

  • A6. Tipi Reference e tipi Value

    Tutti i tipi di var iabile che possono esser e cr eati si r aggr uppano sotto due gr andi categor ie: Refer ence e Value. I pr imisi compor tano come oggetti, mentr e i secondi r appr esentano tipi scalar i o numer ici, ma vediamo di metter e un po'or dine in tutti questi concetti.P.S.: per una miglior e compr esione di questo capitolo, consiglio solo a chi ha gi esper ienza nel campo dellapr ogr ammazione (in qualsiasi altr o linguaggio) di legger e questo ar ticolo sull'utilizzo della memor ia da par te di unpr ogr amma.

    Differenza tra Classi e OggettiAll'inizio della guida mi sono soffer mato ad elogiar e le classi e la lor o enor me impor tanza nell'ambiente .NET.Successivamente ho fatto menzione al tipo System.Object e al fatto che ogni cosa sia un oggetto. La differ enza tr aog g etto e classe di vitale impor tanza per capir e come vanno le cose nell'ambito della pr ogr ammazione OO. Unaclasse r appr esenta l'astr azione di qualcosa di concr eto; un oggetto, invece, qualcosa di concr eto e viener appr esentato da una classe. Per far e un esempio banale, sappiamo benissimo che esiste il concetto di "uomo", ma ogniindividuo sul pianeta, pur mantenendo alcune car atter istiche simili e costanti, differ ente r ispetto agli altr i. Facendoun par allelismo con la pr ogr ammazione, quindi, il singolo individuo, ad esempio io stesso, un oggetto, mentr e ilgener ale concetto di "uomo" che ognuno di noi conosce la classe. Se qualcuno dei lettor i ha studiato filosofia,r iconoscer in questa differ enza la stessa che Platone identificava nella discr epanza tr a mondo sensibile e Iper ur anio.Avendo ben chiar i questi concetti, si pu or a intr odur r e un po' di ger go tecnico. Ogni oggetto anche detto istanzadella classe che lo r appr esenta (voi siete istanze della classe Uomo XD) e is tanziare un oggetto significa cr ear lo.

    O1 e O2 sono entr ambe istanze della classe Object, ma sono diver si fr a di lor o: in comune hanno solo l'appar tenenza allostesso tipo.N.B.: come si notato, "tipo" e "classe" sono ter mini spesso equivalenti, ma non gener alizzate questa associazione.

    Tipi ReferenceOgni cosa nel Fr amew or k un oggetto e la maggior par te di essi sono tipi r efer ence. Si dicono tipi reference tuttiquei tipi che der ivano dir ettamente dalla classe System.Object (la "der ivazione" appar tiene a un concetto che spiegher pi avanti): questa classe dichiar ata all'inter no di una libr er ia della Base Class Libr ar y, ossia l'ar chivio di classi delFr amewor k. Nel capitolo pr ecedente si visto come sia possibile assegnar e un valor e ad una var iabile utilizzandol'oper ator e uguale "=". Con questo meccanismo, un deter minato valor e viene depositato nella casella di memor ia che lavar iabile occupa. Ebbene, facendo uso dei tipi r efer ence, questo non avviene. Quando si utilizza l'uguale per assegnar eun valor e a tali var iabili, quello che effettivamente viene r iposto nella lor o par te di memor ia un puntator e inter o a32bit (su sistemi oper ativi a 32bit). Per chi non lo sapesse, un puntator e una speciale var iabile che, invece dicontener e un pr opr io valor e, contiene l'indir izzo di un'ar ea di memor ia contenente altr i dati. Il puntator e vienememor izzato come al solito sullo stack , mentr e il ver o oggetto viene cr eato e deposto in un'ar ea di memor iadiffer ente, detta heap manag ed, dove esiste sotto la super visione del CLR. Quando una var iabile di questo tipo vieneimpostata a Nothing (una costante che vedr emo tr a poco), la par te dell'heap managed che l'oggetto occupa viener ilasciata dur ante il pr ocesso di g arbag e collection ("r accolta dei r ifiuti"). Tuttavia, ci non avviene subito, poich ilmeccanismo del Fr amewor k fa in modo di avviar e la gar bage collection solo quando necessar io, quindi quando la

    1.2.3.

    'New serve per creare fisicamente degli oggetti in memoriaDim O1 As New ObjectDim O2 As New Object

  • memor ia comincia a scar seggiar e: supponendo che un pr ogr amma abbia r elativamente pochi oggetti, questipotr ebber o "viver e" indistur bati fino alla fine del pr ogr amma anche dopo esser e stati log icamente distrutti, il chesignifica che stato eliminato manualmente qualsiasi r ifer imento ad essi (vedi par agr afo successivo). Datal'impossibilit di deter minar e a pr ior i quando un oggetto ver r distr utto, si ha un fenomeno che va sotto il nome difinalizzazione non deterministica (il ter mine "finalizzazione" non casule: veder e il capitolo sui distr uttor i permaggior i infor mazioni).

    NothingNothing una costante di tipo r efer ence che r appr esenta l'assenza di un oggetto piuttosto che un oggetto nullo. Infatti,por r e una var iabile oggetto uguale a Nothing equivale a distr ugger la logicamente.

    La distr uzione logica non coincide con la distr uzione fisica dell'oggetto (ossia la sua r imzione dalla memor ia), poich,come detto pr ima, il pr ocesso di liber azione della memor ia viene avviato solo quando necessar io. Non possibileassegnar e Nothing a un tipo value, ma possibile usar e speciali tipi value che suppor tano tale valor e: per ulter ior idettagli, veder e "Tipi Nullable".

    Tipi ValueOgni tipo value der iva dalla classe System.ValueType, che der iva a sua volta da System.Object, ma ne r idefinisce imetodi. Ogni var iabile di questo tipo contiene effettivamente il pr opr io valor e e non un puntator e ad esso. Inoltr e,esse hanno dei vantaggi in ter mini di memor ia e velocit: occupano in gener e meno spazio; data la lor o posizione sullostack non vi bisogno di r efer enziar e un puntator e per ottener e o impostar ne i valor i (r efer enziar e un puntator esignifica r ecar si all'indir izzo di memor ia puntato e legger ne il contenuto); non c' necessit di occupar e spazio nelloheap managed: se la var iabile viene distr utta, cessa di esister e all'istante e non si deve attuar e nessuna oper azione dir ilascio delle r isor se. Notar e che non possibile distr ugger e logicamente una var iabile value, fatta eccezione per cer titipi der ivati.

    Is e =Nel lavor ar e con tipi r efer ence e value bisogna pr estar e molta attenzione a quando si utilizzano gli oper ator i diassegnamento. Come gi detto, i r efer ence contengono un puntator e, per ci se si scr ive questo codice:

    quello che O2 conter r non sar un valor e identico a O1, ma un puntator e alla stessa ar ea di memor ia di O1. Questopr ovoca un fatto str ano, poich sia O1 che O2 puntano alla stessa ar ea di memor ia: quindi O1 e O2 sono lo stessoog g etto, soltanto r ifer ito con nomi difer si. In casi simili, si pu utilizzar e l'oper ator e Is per ver ificar e che duevar iabili puntino allo stesso oggetto:

    La scr itta che appar ir sullo scher mo sar "Tr ue", ossia "Ver o". Utilizzar e Is per compar ar e un oggetto a Nothingequivale a ver ificar e che tale oggetto sia stato distr utto.Questo NON avviene per i tipi value: quando ad un tipo value si assegna un altr o valor e con l'oper ator e =, si passa

    1.2.

    Dim O As New Object 'L'oggetto viene creatoO = Nothing 'L'oggetto viene logicamente distrutto

    1.2.3.

    Dim O1, O2 As Object'...O1 = O2

    1.2.3.

    'Scrive a schermo se vero oppure no che'O1 e O2 sono lo stesso oggettoConsole.WriteLine(O1 Is O2)

  • effettivamente una copia del valor e. Non possibile utilizzar e Is con i tipi value poich Is definito solo per ir efer ence.

    Boxing e UnboxingConsider iamo il seguente codice:

    I un tipo value, mentr e O un tipo r efer ence. Quello che succede dietr o le quinte semplice: il .NET cr ea un nuovooggetto, per ci un tipo r efer ence, con il r ispettivo puntator e, e quindi gli assegna il valor e di I: quando il pr ocesso finito assegna il puntator e al nuovo oggetto a O. Questa conver sione spr eca tempo e spazio nello heap managed e vienedefinita come boxing . L'oper azione inver sa l'unboxing e consiste nell'assegnar e un tipo r efer ence a un tipo value. Leoper azioni che si svolgono sono le stesse, ma al contr ar io: entr ambe spr ecano tempo e cpu, quindi sono da evitar e senon str ettamente necessar ie. Quando si pu sceglier e, quindi, sono meglio di tipi value.

    Una pr ecisazione: in tutti i pr ossimi capitoli capiter fr equentemente che io dica cose del tipo "la var iabile X unoggetto di tipo Str ing" oppur e "le due var iabili sono lo stesso oggetto". Si tr atta solo di una via pi br eve per evitar e ilfor malismo tecnico, poich, se una var iabile dichiar ata di tipo r efer ence, essa pr opr iamente un riferimentoall'oggetto e non un oggetto. Gli oggetti "vivono" indistur bati nell'heap managed, quel magico posto che nessuno conosce:noi possiamo solo usar e r ifer imenti a tali oggetti, ossia possiamo solo indicar li ("eccolo l! guar da! l'hai visto? ma s,pr opr io l! non lo vedi?").

    1.2.3.

    Dim I As Int32 = 50Dim O As ObjectO = I

  • A7. Il costrutto If

    Capita spessissimo di dover eseguir e un contr ollo per ver ificar e se vigono cer te condizioni. possibile attuar e taleoper azione tr amite un costrutto di controllo, la cui for ma pi comune e diffusa il costr utto If. Questo per mette dicontr ollar e se una condizione ver a. Ad esempio: in un pr ogr amma che calcoli l'ar ea di un quadr ato si deve impor r e divisualizzar e un messaggio di er r or e nel caso l'utente immetta una misur a negativa, poich, come noto, non esistonolati la cui misur a un numer o negativo:

    Come sicur amente avr ete intuito, questo contr ollo si pu associar e al costr utto italiano "Se avviene qualcosa Allor a faiquesto Altr imenti fai quell'altr o". Si pu eseguir e qualsiasi tipo di compar azione tr a If e Then utilizzando i seguentioper ator i di confr onto:

    > : maggior e< : minor e= : uguaglianza : diver so>= : maggior e o uguale

  • Se il numer o inser ito da tastier a compr eso fr a 0 e 5, estr emi esclusi, allor a l'utente ha indovinato il numer o,altr imenti no. Si pu tr ovar e un numer o illimitato di If nidificati, ma meglio limitar ne l'uso e, piuttosto, far e utilizzodi connettiv i log ici.

    I connettivi logic iI connettivi logici sono 4: And, Or , Xor e Not. Ser vono per costr uir e contr olli complessi. Di seguito un'illustr azione dellor o funzionamento:

    If A And B : la condizione r isulta ver ificata se sia A che B sono ver e contemporaneamenteIf A Or B : la condizione r isulta ver ificata se ver a almeno una delle due condizioniIf A Xor B: la condizione r isulta ver a se una sola delle due condizioni ver aIf Not A: la condizione r isulta ver ificata se falsa

    Un esempio pr atico:

    Continuare il controllo: ElseIfNei pr ecedenti esempi, la seconda par te del costr utto sempr e stata Els e, una par ola r iser vata che indica cosa far e senon si ver ifica la condizione pr oposta dalla pr ima par te. Il suo valor e , quindi, di pur a alter nativa. Esiste, tuttavia,una var iante di Else che consente di continuar e con un altr o contr ollo senza dover r icor r er e ad If nidificati (a cui sempr e meglio supplir e con qualcosa di pi or dinato). Ammettiamo, ad esempio, di aver e un codice 'autocr itico' simile:

    06.07.08.09.10.11.12.13.14.15.16.17.18.

    Console.WriteLine("Inserisci un numero:")Numero = Console.ReadLine

    If Numero > 0 ThenIf Numero < 5 ThenConsole.WriteLine("Hai indovnato il numero!")End IfElse

    Console.WriteLine("Numero errato!")End If

    Console.ReadKey()End SubEnd Module

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.

    Module Module1Sub Main()Dim a, b As Double

    Console.WriteLine("Inserire i lati di un rettangolo:")a = Console.ReadLineb = Console.ReadLine

    'Se tutti e due i lati sono maggiori di 0If a > 0 And b > 0 Then

    Console.WriteLine("L'area : " & a * b)ElseConsole.WriteLine("Non esistono lati con misure negative!")End If

    Console.Readkey()End SubEnd Module

    01.02.03.04.05.06.

    Module Module1Sub Main()Dim Voto As Single

    Console.WriteLine("Inserisci il tuo voto:")

  • E' abbastanza disor dinato... La var iante ElseIf molto utile per miglior e la leggibilit del codice:

    Notate che tutti gli ElseIf fanno par te dello s tes s o costr utto: mentr e nell'esempio ogni If nidificato er a un blocco a sstante, dotato infatti di un pr opr io End If, in questo caso ogni alter nativa-selettiva fa comunque par te dell'unico Ifiniziale, pr otr atto solamente un poco pi a lungo.

    Blocchi di istruzioniFino a questo punto, gli esempi pr oposti non hanno mai dichiar ato una var iabile dentr o un costr utto If, ma soloall'inizio del pr ogr amma, dopo Sub Main(). possibile dichiar ar e var iabili in altr i punti del codice che non siano all'iniziodella Sub? Cer tamente s. A differ enza di altr i, i linguaggi .NET per mettono di dichiar ar e var iabili in qualunque puntodel sor gente, dove occor r e, evitando un gigantesco agglomer ato di dichiar azioni iniziali, for temente disper sive per chilegge. Questo un gr ande vantaggio, ma bisogna far e attenzione ai blocchi di codice. Con questo ter mine ci si r ifer iscea par ti del sor gente compr ese tr a due par ole r iser vate, che in VB di solito sono accoppiate in questo modo:

    07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.

    Voto = Console.ReadLine If Voto < 3 Then

    Console.WriteLine("Sei senza speranze!")ElseIf Voto < 5 ThenConsole.WriteLine("Ancora un piccolo sforzo...")ElseIf Voto < 7 Then

    Console.WriteLine("Stai andando discretamente")ElseIf Voto < 9 ThenConsole.WriteLine("Molto bene, continua cos")ElseConsole.WriteLine("Sei praticamente perfetto!")End IfEnd IfEnd IfEnd If

    Console.ReadKey()End SubEnd Module

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.

    Module Module1Sub Main()Dim Voto As Single

    Console.WriteLine("Inserisci il tuo voto:")Voto = Console.ReadLine

    If Voto < 3 ThenConsole.WriteLine("Sei senza speranze!")ElseIf Voto < 5 ThenConsole.WriteLine("Ancora un piccolo sforzo...")ElseIf Voto < 7 ThenConsole.WriteLine("Stai andando discretamente")ElseIf Voto < 9 ThenConsole.WriteLine("Molto bene, continua cos")ElseConsole.WriteLine("Sei praticamente perfetto!")End If

    Console.ReadKey()End SubEnd Module

    1.2.3.

    [Keyword]'Blocco di codiceEnd [Keyword]

  • Ad esempio, tutto il codice compr eso tr a Sub ed End Sub costituisce un blocco, cos come lo costituisce quello compr esotr a If ed End If (se non vi un Else), tr a If ed Else o addir ttur a tr a Module ed End Module. Facendo questa distinzionesar facile intuir e che una var iabile dichiar ata in un blocco non v isibile al di fuor i di esso. Con questo voglio dir eche la sua dichiar azione vale solo all'inter no di quel blocco. Ecco una dimostr azione:

    Se in questo codice, pr ima del Console.ReadKey(), finale pr ovassimo a usar e una fr a le var iabili x , x 1 o x 2, otter r emmoun er r or e:

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.52.53.54.55.56.57.

    Module Module1Sub Main()'a, b e c fanno parte del blocco delimitato da Sub ...'End SubDim a, b, c As Single

    'Semplice esempio di risoluzione di equazione di'secondo gradoConsole.WriteLine("Equazione: ax2 + bx + c = 0")Console.WriteLine("Inserisci, in ordine, a, b e c:")a = Console.ReadLineb = Console.ReadLinec = Console.ReadLine

    If a = 0 ThenConsole.WriteLine("L'equazione si abbassa di grado")Console.ReadKey()'Con Exit Sub si esce dalla Sub, che in questo caso'coincide con il programma. Equivale a terminare'il programma stessoExit SubEnd If

    'Anche delta fa parte del blocco delimitato da Sub ...'End SubDim delta As Single = b ^ 2 - 4 * a * c

    'Esistono due soluzioni distinteIf delta > 0 Then

    'Queste variabili fanno parte del blocco di If ...'ElseIfDim x1, x2 As Single' possibile accedere senza problemi alla variabile'delta, poich questo blocco a sua volta'all'interno del blocco in cui dichiarato deltax1 = (-b + Math.Sqrt(delta)) / (2 * a)x2 = (-b - Math.Sqrt(delta)) / (2 * a)Console.WriteLine("Soluzioni: ")Console.WriteLine("x1 = " & x1)Console.WriteLine("x2 = " & x2)

    'Esiste una soluzione doppiaElseIf delta = 0 Then

    'Questa variabile fa parte del blocco ElseIf ... ElseDim x As Singlex = -b / (2 * a)Console.WriteLine("Soluzione doppia: ")Console.WriteLine("x = " & x)

    'Non esistono soluzioni in RElse

    Console.WriteLine("Non esistono soluzioni in R")End If

    Console.ReadKey()End SubEnd Module

  • Questo succede per ch nessuna var iabile dichiar ata all'inter no di un blocco accessibile al di fuor i di esso. Con questoschemino r udimentale sar pi facile capir e:

    Le fr ecce ver di indicano che un codice pu acceder e a cer te var iabili, mentr e quelle r osse indicano che non vi puacceder e. Come salta subito agli occhi, sono per messe tutte le r ichieste che vanno dall'inter no di un blocco ver sol'ester no, mentr e sono pr oibite tutte quelle che vanno dall'ester no ver so l'inter no. Questa r egola vale sempr e, inqualsiasi cir costanza e per qualsiasi tipo di blocco: non ci sono eccezioni.

  • A8. Il costrutto Select Case

    Abbiamo visto nel capitolo pr ecedente come si possa far pr ocessar e al computer un contr ollo per ver ificar e cer tecondizioni. Supponiamo, or a, di aver e 20 contr olli di uguaglianza del tipo:

    In questo caso il costr utto If diventa non solo noioso, ma anche ingombr ante e disor dinato. Per eseguir e questo tipo dicontr olli multipli esiste un costr utto apposito, Select Case, che ha questa sintassi:

    Questo tipo di contr ollo r ende molto pi linear e, semplice e veloce il codice sor gente. Un esempio:

    Molto semplice, ma anche molto efficace, specialmente utile nei pr ogr ammi in cui bisogna consider ar e par ecchi valor i.Anche se nell'esempio ho utilizzato solamente numer i, possibile consider ar e var iabili di qualsiasi tipo, sia base(str inghe, date), sia der ivato (str uttur e, classi). Ad esempio:

    01.02.03.04.05.06.07.08.09.10.11.

    '...If A = 1 Then'istruzioniEnd IfIf A = 2 Then'istruzioniEnd IfIf A = 3 Then'istruzioniEnd If

    'eccetera

    01.02.03.04.05.06.07.08.09.

    '...Select Case [Nome variabile da analizzare]Case [valore1]'istruzioniCase [valore2]'istruzioniCase [valore3]'istruzioniEnd Select

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.

    Module Module 1Sub Main()Dim a, b As DoubleDim C As Byte

    Console.WriteLine("Inserire due numeri: ")a = Console.ReadLineb = Console.ReadLineConsole.WriteLine("Inserire 1 per calcolare la somma, 2 per la differenza, 3 per il

    prodotto, 4 per il quoziente:")C = Console.ReadLine

    Select Case CCase 1Console.WriteLine(a + b)Case 2Console.WriteLine(a - b)Case 3Console.WriteLine(a * b)Case 4Console.WriteLine(a / b)End Select

    Console.ReadKey()End SubEnd Module

    1.

  • Varianti del costruttoAnche in questo caso, esistono numer ose var ianti, che per mettono non solo di ver ificar e uguaglianze come nei casipr ecedenti, ma anche di contr ollar e disuguaglianze e analizzar e insiemi di valor i. Ecco una lista delle possibilit:

    Uso della v irg olaLa vir gola per mette di definir e non solo uno, ma molti valor i possibili in un solo Case. Ad esempio:

    Il codice sopr a pr oposto con Select equivale ad un If scr itto come segue:

    Uso di ToAl contr ar io, la keyw or d To per mette di definir e un range di valor i, ossia un inter vallo di valor i, per il quale lacondizione r isulta ver ificata se la var iabile in analisi r icade in tale inter vallo.

    Questo cor r isponde ad un If scr itto come segue:

    Uso di IsIs usato in questo contesto per ver ificar e delle condizioni facendo uso di nor mali oper ator i di confr onto(meggior e, minor e, diver so, ecceter a...). L'Is usato nel costr utto Select Case non ha assolutamente niente a cheveder e con quello usato per ver ificar e l'identicit di due oggetti: ha lo stesso nome, ma la funzione completamente differ ente.

    2.3.4.5.6.7.8.

    Dim S As String'...Select Case SCase "ciao"

    '...Case "buongiorno"'...End Select

    01.02.03.04.05.06.07.08.09.10.

    Dim A As Int32'...Select Case ACase 1, 2, 3

    'Questo codice viene eseguito solo se A'contiene un valore pari a 1, 2 o 3Case 4, 6, 9'Questo codice viene eseguito solo se A'contiene un valore pari a 4, 6 o 9End Select

    1.2.3.4.5.

    If A = 1 Or A = 2 Or A = 3 Then'...ElseIf A = 4 Or A = 6 Or A = 9 Then'...End If

    1.2.3.4.5.6.7.8.

    Select Case ACase 67 To 90'Questo codice viene eseguito solo se A'contiene un valore compreso tra 67 e 90 (estremi inclusi)Case 91 To 191'Questo codice viene eseguito solo se A'contiene un valore compreso tra 91 e 191End Select

    1.2.3.4.5.

    If A >= 67 And A

  • Il suo equivalente If:

    Uso di ElseAnche nel Select lecito usar e Else: il Case che include questa istr uzione solitamente l'ultimo di tutte lealter native possibili e pr escr ive di eseguir e il codice che segue solo se tutte le altr e condizioni non sono statesoddisfatte:

    Uso delle precedenti alternative in com binazioneTutti i modi illustr ati fino ad or a possono esser e uniti in un solo Case per ottener e potenti condizioni dicontr ollo:

    02.03.04.05.06.07.08.09.10.11.

    Select Case ACase Is >= 6'Questo codice viene eseguito solo se A'contiene un valore maggiore o uguale di 6Case Is > 1'Questo codice viene eseguito solo se A'contiene un valore maggiore di 1 (e minore di 6,'dato che, se si arrivati a questo Case,'significa che la condizione del Case precedente non' stata soddisfatta)End Select

    1.2.3.4.5.

    If A >= 6 Then'...ElseIf A > 1 Then'...End If

    01.02.03.04.05.06.07.08.09.10.11.12.

    Select Case ACase 1, 4'Questo codice viene eseguito solo se A'contiene 1 o 4Case 9 To 12'Questo codice viene eseguito solo se A'contiene un valore compreso tra 9 e 12Case Else'Questo codice viene eseguito solo se A'contiene un valore minore di 9 o maggiore di 12,'ma diverso da 1 e 4End Select

    1.2.3.4.5.6.7.8.

    Select Case ACase 7, 9, 10 To 15, Is >= 90'Questo codice viene eseguito solo se A'contiene 7 o 9 o un valore compreso tra 10 e 15'oppure un valore maggiore o uguale di 90Case Else'...End Select

  • A9. I costrutti iterativi: Do Loop

    Abbiamo visto che esistono costr utti per ver ificar e condizioni, o anche per ver ificar e in modo semplice e veloce molteugualiglianze. Or a vedr emo i cicli o costr utti iter ativi (dal latino iter , itiner is = "viaggio", ma anche "per la secondavolta"). Essi hanno il compito di r ipeter e un blocco di istr uzioni un numer o deter minato o indeter minato di volte. Ilpr imo che analizzer emo , appunto, il costr utto Do Loop, di cui esistono molte var ianti. La pi semplice ha questasintassi:

    Il suo compito consiste nel r ipete delle istr uzioni compr ese tr a Do e Loop un numer o infinito di volte: l'unico modo peruscir e dal ciclo usar e una speciale istr uzione: "Ex it Do", la quale ha la capacit di inter r omper e il ciclo all'istante eduscir e da esso. Questa semplice var iante viene usata in un numer o r idotto di casi, che si possono r icondur r esostanzialmente a due: quando si lavor a con la gr afica e le libr er ie Dir ectX, per disegnar e a scher mo i costanticambiamenti del mondo 2D o 3D; quando necessar io ver ificar e le condizioni di uscita dal ciclo all'inter no del suo bloccodi codice. Ecco un esempio di questo secondo caso:

    Le altr e ver sioni del costr utto, invece, sono le seguenti:

    Esegue le istr uzioni specificate fintanto che una condizione r imane valida, ma tutte le istr uzioni vengonoeseguite almeno una volta, poich While si tr ova dopo Do. Esempio:

    1.2.3.

    Do'istruzioniLoop

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.

    Module Module1 Sub Main()Dim a, b As Single Do

    'Pulisce lo schermoConsole.Clear()'L'underscore serve per andare a capo nel codiceConsole.WriteLine("Inserire le misure di base e altezza " & _

    "di un rettangolo:")a = Console.ReadLineb = Console.ReadLine

    'Controlla che a e b non siano nulli. In quel caso, esce'dal ciclo. Se non ci fosse questo If in mezzo al codice,'verrebbe scritto a schermo il messaggio:' "L'area del rettangolo : 0"'cosa che noi vogliamo evitare. Se si usasse un'altra'variante di Do Loop, questo succederebbe sempre. Ecco'perch, in questa situazione, meglio'servirsi del semplice Do LoopIf a = 0 Or b = 0 ThenExit DoEnd If

    Console.WriteLine("L'area del rettangolo : " & (a * b))Console.ReadKey()LoopEnd Sub

    End Module

    1.2.3.

    Do'istruzioniLoop While [condizione]

  • Il codice scr iver a scher mo "2".

    Esegue le istr uzioni specificate fintanto che una condizione r imane valida, ma se la condizione non validaall'inizio, non viene eseguita nessuna istr uzione nel blocco. Esempio:

    Il codice scr iver a scher mo "0". Bisogna notar e come le stesse condizioni del caso pr ecedente, spostate da dopoLoop a dopo Do, cambino il r isultato di tutto l'algor itmo. In questo caso, il codice nel ciclo non viene neppur eeseguito per ch la condizione nel While diventa subito falsa (in quanto a = 0, e la pr oposizione "a < 0" r isultafalsa). Nel caso pr ecedente, invece, il blocco veniva eseguito almeno una volta poich la condizione di contr ollo sitr ovava dopo di esso: in quel caso, a er a or mai stato incr ementato di 1 e per ci soddisfaceva la condizioneaffinch il ciclo continuasse (fino ad ar r ivar e ad a = 2, che er a il r isultato visualizzato).

    Esegue le istr uzioni specificate fino a che non viene ver ificata la condizione, ma tutte le istr uzioni vengonoeseguite almeno una volta, poich Until si tr ova dopo Do. Esempio:

    A scher mo appar ir "2".

    01.02.03.04.05.06.07.08.09.10.11.12.

    Module Module1Sub Main()Dim a As Int32 = 0 Do

    a += 1Loop While (a < 2) And (a > 0)Console.WriteLine(a)

    Console.ReadKey()End SubEnd Module

    1.2.3.

    Do While [condizione]'istruzioniLoop

    01.02.03.04.05.06.07.08.09.10.11.12.

    Module Module1Sub Main()Dim a As Int32 = 0 Do While (a < 2) And (a > 0)

    a += 1LoopConsole.WriteLine(a)

    Console.ReadKey()End SubEnd Module

    1.2.3.

    Do'istruzioniLoop Until [condizione]

    01.02.03.04.05.06.07.08.09.10.11.12.

    Module Module1Sub Main()Dim a As Int32 = 0 Do

    a += 1Loop Until (a 1)Console.WriteLine(a)

    Console.ReadKey()End SubEnd Module

    1.2.3.

    Do Until [condizione]'istruzioni

  • Esegue le istr uzioni specificate fino a che non viene soddisfatta la condizione, ma se la condizione validaall'inizio, non viene eseguita nessuna istr uzione del blocco. Esempio:

    A scher mo appar ir "0".

    Un piccolo esempio finale:

    SuggerimentoPer impostar e il valor e di Default (ossia il valor e pr edefinito) di una var iabile si pu usar e questa sintassi:

    Funziona solo per una var iabile alla volta. Questo tipo di istr uzione si chiama in izializzazione in-line.

    Loop

    01.02.03.04.05.06.07.08.09.10.11.12.

    Module Module1Sub Main()Dim a As Int32 = 0 Do Until (a 1)

    a += 1LoopConsole.WriteLine(a)

    Console.ReadKey()End SubEnd Module

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.

    Module Module1Sub Main()Dim a, b, c As Int32Dim n As Int32

    Console.WriteLine("-- Successione di Fibonacci --")Console.WriteLine("Inserire un numero oltre il quale terminare:")n = Console.ReadLine

    If n = 0 ThenConsole.WriteLine("Nessun numero della successione")Console.ReadKey()Exit SubEnd If

    a = 1b = 1Console.WriteLine(a)Console.WriteLine(b)Do While c < n

    c = a + bb = aa = cConsole.WriteLine(c)Loop

    Console.ReadKey()End SubEnd Module

    1. Dim [nome] As [tipo] = [valore]

  • A10. I costrutti iterativi: For

    Dopo aver visto costr utti iter ativi che eseguono un ciclo un numer o indeter minato di volte, ar r ivato il momento dianalizzar ne uno che, al contr ar io, esegue un deter minato numer o di iter azioni. La sintassi la seguente:

    La var iabile I, usata in questo esempio, viene definita contatore e, ad ogni step, ossia ogni volta che il blocco diistr uzioni si r ipete, viene automaticamente incr ementata di 1, sicch la si pu usar e all'inter no delle istr uzioni comeun ver o e pr opr io indice, per r ender e conto del punto al quale l'iter azione del For ar r ivata. Bisogna far notar e che iltipo usato per la var iabile contator e non deve sempr e esser e Int32, ma pu var iar e, spaziando tr a la vasta gamma dinumer i inter i, con segno e senza segno, fino anche ai numer i decimali. Un esempio:

    Ovviamente il valor e di par tenza r imane del tutto ar bitr ar io e pu esser e deciso ed inizializzato ad un qualsiasivalor e:

    Intr oduciamo or a una piccola var iante del pr ogr amma pr ecedente, nella quale si devono scr iver e solo i numer i par i dab a b+20. Esistono due modi per r ealizzar e quanto detto. Il pr imo abbastanza intuitivo, ma meno r affinato, econsiste nel contr ollar e ad ogni iter azione la par it del contator e:

    1.2.3.4.5.

    Dim I As Int32 For I = 0 To [numero]'istruzioniNext

    01.02.03.04.05.06.07.08.09.10.11.12.13.

    Module Module1Sub Main()Dim a As Int32

    'Scrive 46 volte (da 0 a 45, 0 compreso, sono 46 numeri)'a schermo 'ciao'For a = 0 To 45

    Console.WriteLine("ciao")Next Console.ReadKey()End SubEnd Module

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.

    Module Module1Sub Main()Dim a, b As Int32

    Console.WriteLine("Inserisci un numero pari")b = Console.ReadLine

    'Se b non pari, ossia se il resto della divisione'b/2 diverso da 0If b Mod 2 0 Then

    'Lo fa diventare un numero pari, aggiungendo 1b += 1End If

    'Scrive tutti i numeri da b a b+20For a = b To b + 20

    Console.WriteLine(a)Next Console.ReadKey()End SubEnd Module

    1.

  • Il secondo, invece, pi elegante e usa una ver sione "ar r icchita" della str uttur a iter ativa For , nella quale vienespecificato che l'incr emento del contator e non deve pi esser e 1, ma bens 2:

    Infatti, la par ola r iser vata Step posta dopo il numer o a cui ar r ivar e (in questo caso b+20) indica di quanto deve esser eaumentata la var iabile contator e del ciclo (in questo caso a) ad ogni step. L'incr emento pu esser e un valor e inter o,decimale, positivo o negativo, ma, cosa impor tante, deve sempr e appar tener e al r aggio d'azione del tipo delcontator e: ed esempio, non si pu dichiar ar e una var iabile contator e di tipo Byte e un incr emento di -1, poich Bytecompr ende solo numer i positivi (invece possibile far lo con SByte, che va da -127 a 128). Allo stesso modo non sidovr ebber o specificar e incr ementi decimali con contator i inter i.

    SuggerimentoSe non si vuole cr ear e una var iabile apposta per esser e contator e di un ciclo for , si pu inzializzar e dir ettamente unavar iabile al suo inter no in questo modo:

    2.3.4.5.

    For a = b To b + 20If a Mod 2 = 0 ThenConsole.WriteLine(a)End IfNext

    1.2.3.

    For a = b To b + 20 Step 2Console.WriteLine(a)Next

    1.2.3.4.5.6.7.

    For [variabile] As [tipo] = [valore] To [numero]'istruzioniNext

    'Che, se volessimo descrivere con un esempio, diverrebbe cos:For H As Int16 = 78 To 108'istruzioniNext

  • A11. Gli Array - Parte I

    Array a una dimensioneFino a questo momento abbiamo avuto a che far e con var iabili "singole". Con questo voglio dir e che ogni identificator edichiar ato puntava ad una cella di memor ia dove er a contenuto un solo valor e, leggibile e modificabile usando il nomespecificato nella dichiar azione della var iabile. L'esempio classico che si fa in questo contesto quello della scatola, doveuna var iabile viene, appunto, assimilata ad una scatola, il cui contenuto pu esser e pr eso, modificato e r eimmessosenza pr oblemi.

    Allo stesso modo, un array un insieme di scatole, tutte una vicina all'altr a (tanto nell'esempio quando nella posizionefisica all'inter no della memor ia), a for mar e un'unica fila che per comodit si indica con un solo nome. Per distinguer eogni "scompar to" si fa uso di un numer o inter o (che per convenzione un inter o a 32 bit, ossia Integer ), detto indice.Tutti i linguaggi .NET utilizzano sempr e un indice a base 0: ci significa che si inizia a contar e da 0 anzich da 1:

    La sintassi usata per dichiar ar e un ar r ay simile a quella usata per dichiar ar e una singola var iabile:

    La differ enza tr a le due r isiede nelle par entesi tonde che vengono poste dopo il nome della var iabile. Tr a queste

    1. Dim [nome]([numero elementi - 1]) As [tipo]

  • par entesi pu anche esser e specificato un numer o (sempr e inter o, ovviamente) che indica l'indice massimo a cui si puar r ivar e: dato che, come abbiamo visto, gli indici sono sempr e a base 0, il numer o effettivo di elementi pr esenti nellacollezione sar di un'unit super ior e r ispetto all'indice massimo. Ad esempio, con questo codice:

    il pr ogr ammator e indica al pr ogr amma che la var iabile A un ar r ay contenente questi elementi:

    che sono per la pr ecisione 6 elementi. Ecco un listato che esemplifica i concetti fin'or a chiar iti:

    Il codice potr ebbe non appar ir e subito chiar o a pr ima vista, ma attr aver so uno sguar do pi attento, tutto si far pilimpido. Di seguito scr itto il flusso di elabor azione del pr ogr amma ammettendo che l'utente immetta due voti:

    Richiede un voto da tastier a: l'utente immette 5 (Mar k = 5)Mar k maggior e di 0

    Inser isce il voto nell'ar r ay: Mar ks(Index ) = Mar ks(0) = 5Incr ementa Index di 1: Index = 1

    1. Dim A(5) As String

    1. A(0), A(1), A(2), A(3), A(4), A(5)

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.

    Module Module1Sub Main()'Array che contiene 10 valori decimali, rappresentanti votiDim Marks(9) As Single'Questa variabile terr traccia di quanti voti'l'utente avr immesso da tastiera e permetter di'calcolarne una mediaDim Index As Int32 = 0

    'Mark conterr il valore temporaneo immesso'da tastiera dall'utenteDim Mark As SingleConsole.WriteLine("Inserisci un altro voto (0 per terminare):")Mark = Console.ReadLine 'Il ciclo finisce quando l'utente immette 0 oppure quando'si raggiunto l'indice massimo che 'possibile usare per identificare una cella dell'arrayDo While (Mark > 0) And (Index < 10)

    'Se il voto immesso maggiore di 0, lo memorizza'nell'array e incrementa l'indice di 1, cos da'poter immagazzinare correttamente il prossimo voto nell'arrayMarks(Index) = MarkIndex += 1 Console.WriteLine("Inserisci un altro voto (0 per terminare):")Mark = Console.ReadLineLoop

    'Decrementa l'indice di 1, poich anche se l'utente'ha immesso 0, nel ciclo precedente, l'indice era stato'incrementato prevedendo un'ulteriore immissione, che,'invece, non c' stataIndex -= 1

    'Totale dei votiDim Total As Single = 0'Usa un ciclo For per scorrere tutte le celle dell'array'e sommarne i valoriFor I As Int32 = 0 To Index

    Total += Marks(I)Next

    'Mostra la mediaConsole.WriteLine("La tua media : " & (Total / (Index + 1)))Console.ReadKey()End SubEnd Module

  • Entr ambe le condizioni non sono ver ificate: Mar k 0 e Index < 9. Il ciclo continuaRichiede un voto da tastier a: l'utente immette 10 (Mar k = 10)Mar k maggior e di 0

    Inser isce il voto nell'ar r ay: Mar ks(Index ) = Mar ks(1) = 10Incr ementa Index di 1: Index = 2

    Entr ambe le condizioni non sono ver ificate: Mar k 0 e Index < 9. Il ciclo continuaRichiede un voto da tastier a: l'utente immette 0 (Mar k = 0)Mar k uguale a 0: il codice dentr o if non viene eseguitoUna delle condizioni di ar r esto ver ificata: Mar k = 0. Il ciclo ter minaDecr ementa Index di 1: Index = 1Somma tutti i valor i in Mar ks da 0 a Index (=1): Total = Mar ks(0) + Mar ks(1) = 5 + 10Visualizza la media: Total / (Index + 1) = 15 / (1 + 1) = 15 / 2 = 7.5Attende la pr essione di un tasto per uscir e

    anche possibile dichiar ar e ed inizializzar e (ossia r iempir e) un ar r ay in una sola r iga di codice. La sintassi usata laseguente:

    Ad esempio:

    Questa sintassi br eve equivale a questo codice:

    Un'ulter ior e sintassi usata per dichiar ar e un ar r ay la seguente:

    Quest'ultima, come vedr emo, sar par ticolar mente utile nel gestir e il tipo r estituito da una funzione.

    Array a pi dimensioniGli ar r ay a una dimensione sono contr addistinti da un singolo indice: se volessimo par agonar li ad un ente geometr ico,sar ebber o assimilabili ad una r etta, estesa in una sola dimensione, in cui ogni punto r appr esenta una cella dell'ar r ay.Gli ar r ay a pi dimensioni, invece, sono contr addistinti da pi di un indice: il numer o di indici che identificaunivocamente un elemento dell'ar r ay di dice rang o. Un ar r ay di r ango 2 (a 2 dimensioni) potr , quindi, esser epar agonato a un piano, o ad una gr iglia di scatole estesa in lunghezza e in lar ghezza. La sintassi usata :

    Ecco un esempio che consider a un ar r ay di r ango 2 come una matr ice quadr ata:

    1. Dim [nome]() As [tipo] = {elementi dell'array separati da virgole}

    1. Dim Parole() As String = {"ciao", "mouse", "penna"}

    1.2.3.4.

    Dim Parole(2) As StringParole(0) = "ciao"Parole(1) = "mouse"Parole(2) = "penna"

    1. Dim [nome] As [tipo]()

    1.2.

    Dim [nome]( , ) As [tipo] 'array di rango 2Dim [nome]( , , ) As [tipo] 'array di rango 3

    01.02.03.04.05.06.07.08.09.10.

    Module Module1Sub Main()'Dichiara e inizializza un array di rango 2. Dato che'in questo caso abbiamo due dimensioni, e non una sola,'non si pu specificare una semplice lista di'valori, ma una specie di "tabella" a due entrate.'Nell'esempio che segue, ho creato una semplice'tabella a due righe e due colonne, in cui ogni cella' 0.

  • Rappr esentando gr aficamente l'ar r ay M, potr emmo disegnar lo cos:

    Ma il computer lo pu anche veder e in questo modo, come un ar r ay di ar r ay:

    11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.

    Dim M(,) As Single = _{{0, 0}, _{0, 0}}

    'Bisogna notare il particolare uso delle graffe: si'considera l'array di rango 2 come un array i cui'elementi sono altri array

    Console.WriteLine("Inserire gli elementi della matrice:")For I As Int32 = 0 To 1For J As Int32 = 0 To 1

    Console.Write("Inserire l'elemento (" & I & ", " & J & "): ")M(I, J) = Console.ReadLineNextNext

    Dim Det As SingleDet = M(0, 0) * M(1, 1) - M(0, 1) * M(1, 0)Console.WriteLine("Il determinante della matrice : " & Det)

    Console.ReadKey()End SubEnd Module

  • Come si vede dal codice di inizializzazione, seppur concettualmente diver si, i due modi di veder e un ar r ay sonocompatibili. Tuttavia, bisogna chiar ir e che solo e soltanto in questo caso, le due visioni sono conciliabili, poich unar r ay di r ango 2 e un ar r ay di ar r ay sono, dopo tutto, due entit ben distinte. Infatti, esiste un modo per dichiar ar ear r ay di ar r ay, come segue:

    E se si pr ova a far e una cosa del gener e:

    Si r iceve un er r or e esplicito da par te del compilator e.

    Ridimensionare un arrayPu capitar e di dover modificar e la lunghezza di un ar r ay r ispetto alla dichiar azione iniziale. Per far e questo, si usa lapar ola r iser vata ReDim, da non confonder e con la keywor d Dim: hanno due funzioni totalmente differ enti. Quando sir idimensiona un ar r ay, tutto il suo contenuto viene cancellato: per evitar e questo inconveniente, si deve usar el'istr uzione ReDim Pres erve, che tuttavia ha pr estazioni molto scar se a causa dell'eccessiva lentezza. Entr ambe leistr uzioni der ivano dal Visual Basic classico e non fanno par te, per tanto, della sintassi .NET, sebbene continuino adesser e molto usate, sia per comodit, sia per abitudine. Il metodo pi cor r etto da adottar e consiste nell'usar e lapr ocedur a Ar r ay.Resize. Eccone un esempio:

    La r iga Ar r ay.Resize(A, n) equivale, usando ReDim a:

    Per r idimensionar e un ar r ay a pi dimensioni, la faccenda si fa abbastanza complessa. Per pr ima cosa, non si puutilizzar e Ar r ay.Resize a meno che non si utilizzi un ar r ay di ar r ay, ma anche in quel caso le cose non sono semplici.Infatti, possibile stabilir e la lunghezza di una sola dimensione alla volta. Ad esempio, avendo un ar r ay M di r ango 2con nove elementi, r aggr uppati in 3 r ighe e 3 colonne, non si pu semplicemente scr iver e:

    1. Dim [nome]()() As [tipo] 'array di array

    1.2.3.4.

    Dim A(,) As Int32Dim B()() As Int32'...A = B

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.

    Module Module1Sub Main()Dim A() As Int32Dim n As Int32

    Console.WriteLine("Inserisci un numero")n = Console.ReadLine

    'Reimposta la lunghezza di a ad n elementiArray.Resize(A, n)

    'Calcola e memorizza i primi n numeri pari (zero compreso)For I As Int16 = 0 To n - 1

    A(I) = I * 2Next

    Console.ReadKey()End SubEnd Module

    1. ReDim A(n - 1)

    1. ReDim M(2, 2)

  • per ch, cos facendo, solo la r iga 2 ver r r idimensionata a 3 elementi, mentr e la 0 e la 1 sar anno vuote. Il codice dausar e, quindi, :

    In questo modo, ogni "r iga" viene aggiustata alla lunghezza giusta.

    1.2.3.

    ReDim M(0, 2)ReDim M(1, 2)ReDim M(2, 2)

  • A12. Gli Array - Parte II

    Il costrutto iterativo For EachQuesto costr utto iter ativo simile al nor male For , ma, invece di aver e una var iabile contator e numer ica, ha unavar iabile contator e di var io tipo. In sostanza, questo ciclo iter a attr aver so una ar r ay o una collezione di altr o gener e,selezionando, di volta in volta, l'elemento che si tr ova alla posizione cor r ente nell'ar r ay. Il suo funzionamento intr inseco tr oppo complesso da spiegar e or a, quindi lo affr onter solamente nei capitoli dedicati alle inter facce, in par ticolar epar lando dell'inter faccia IEnumer able. La sintassi la seguente:

    Ovviamente anche in questo caso, come nel nor male For , possibile inizializzar e una var iabile contator e all'inter no delcostr utto:

    Esempio:

    Per aver e un ter mine di par agone, il semplicissimo codice pr oposto equivale, usando un for nor male, a questo:

    Gli array sono un tipo referenceDiver samente da come accade in altr i linguaggi, gli ar r ay sono un tipo r efer ence, indipendentemente dal tipo di datida essi contenuto. Ci significa che si compor tano come ho spiegato nel capitolo "Tipi r efer ence e tipi value": l'ar ea dimemor ia ad essi associata non contiene il lor o valor e, ma un puntator e alla lor o posizione nell'heap managed. Questosignifica che l'oper ator e = tr a due ar r ay non copia il contenuto di uno nell'altr o, ma li r ende identici, ossia lo stessooggetto. Per lo stesso motivo, anche lecito distr ugger e logicamente un ar r ay ponendolo uguale a Nothing: questaoper azione pu salvar e un discr eto ammontar e di memor ia, ad esempio quando si usano gr andi ar r ay per la lettur a difile binar i, ed sempr e bene annullar e un ar r ay dopo aver lo usato.

    1.2.3.4.

    Dim A As [tipo]For Each A In [array/collezione]'istruzioniNext

    1. For Each A As [tipo] in [array/collezione] ...

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.

    Module Module1Sub Main()Dim Words() As String = {"Questo", "", "un", "array", "di", "stringhe"} For Each Str As String In Words

    Console.Write(Str & " ")Next 'A schermo apparir la frase:' "Questo un array di stringhe "

    Console.ReadKey()End SubEnd Module

    1.2.3.4.5.

    'Words.Length restituisce il numero di elementi'presenti nell'array WordsFor I As Int32 = 0 To Words.Length - 1

    Console.Write(Words(I) & " ")Next

    01.02.03.

    Module Module1Sub Main()

  • Ecco come appar e la memor ia dopo l'assegnazione A = B:

    Ed ecco come appar e dopo l'assegnazione B = C:

    04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.

    'A e B sono due array di interiDim A() As Int32 = {1, 2, 3}Dim B() As Int32 = {4, 5, 6}

    'Ora A e B sono due oggetti diversi e contengono'numeri diversi. Questa riga stamper sullo'schermo "False", infatti A Is B = FalseConsole.WriteLine(A Is B)'Adesso poniamo A uguale a B. Dato che gli array'sono un tipo reference, da ora in poi, entrambi'saranno lo stesso oggettoA = B'Infatti questa istruzione stamper a schermo''"True", poich A Is B = TrueConsole.WriteLine(A Is B)'Dato che A e B sono lo stesso oggetto, se modifichiamo'un valore dell'array riferendoci ad esso con il nome'B, anche richiamandolo con A, esso mostrer'che l'ultimo elemento lo stessoB(2) = 90'Su schermo apparir 90Console.WriteLine(A(2))

    Dim C() As Int32 = {7, 8, 9}B = C'Ora cosa succede?

    Console.ReadKey()End SubEnd Module

  • Come si vede, le var iabili contengono solo l'indir izzo degli oggetti effettivi, per ci ogni singola var iabile (A, B o C) pupuntar e allo stesso oggetto ma anche a oggetti diver si: se A = B e B = C, non ver o che A = C, come si vede dal gr afico.L'indir izzo di memor ia contenuto in A non cambia se non si usa esplicitamente un oper ator e di assegnamento.Se state leggendo la guida un capitolo alla volta, potete fer mar vi qui: il pr ossimo par agr afo utile solo perconsultazione.

    Manipolazione di arrayLa classe System.Ar r ay contiene molti metodi statici utili per la manipolazione degli ar r ay. I pi usati sono:

    Clear (A, I, L) : cancella L elementi a par tir e dalla posizione I nell'ar r ay AClone() : cr ea una coppia esatta dell'ar r ayConstr ainedCopy(A1, I1, A2, I2, L) : copia L elementi dall'ar r ay A1 a par tir e dall'indice I1 nell'ar r ay A2, a par tir edall'indice I2; se la copia non ha successo, ogni cambiamento sar annullato e l'ar r ay di destinazione non subir alcun dannoCopy(A1, A2, L) / CopyTo(A1, A2) : il pr imo metodo copia L elementi da A1 a A2 a par tir e dal pr imo, mentr e ilsecondo fa una copia totale dell'ar r ay A1 e la deposita in A2Find / FindLast (A, P(Of T)) As T : cer ca il pr imo elemento dell'ar r ay A per il quale la funzione gener ic Of Tassegnata al delegate P r estituisce un valor e Tr ue, e ne r itor na il valor eFind(A, P(Of T)) As T() : cer ca tutti gli elementi dell'ar r ay A per i quali la funzione gener ic Of T assegnata aldelegate P r estituisce un valor e Tr ueFindIndex / FindLastIndex (A, P(Of T)) As Int32 : cer ca il pr imo o l'ultimo elemento dell'ar r ay A per il quale lafunzione gener ic Of T assegnata al delegate P r estituisce un valor e Tr ue, e ne r itor na l'indiceFor Each(A(Of T)) : esegue un'azione A deter minata da un delegate Sub per ogni elemento dell'ar r ayGetLength(A) : r estituisce la dimensione dell'ar r ayIndex Of(A, T) / LastIndex Of(A, T) : r estituisce il pr imo o l'ultimo indice dell'oggetto T nell'ar r ay ARever se(A) : inver te l'or dine di tutti gli elementi nell'ar r ay ASor t(A) : or dina alfabeticamente l'ar r ay A. Esistono 16 ver sioni di questa pr ocedur a, tr a le quali una accetta

  • come secondo par ametr o un oggetto che implementa un'inter faccia ICompar er che per mette di decider e comeor dinar e l'ar r ay

    Molti di questi metodi, come si visto, compr endono ar gomenti molto avanzati: quando sar ete in gr ado dicompr ender e i Gener ics e i Delegate, r itor nate a far e un salto in questo capitolo: scopr ir ete la potenza di questimetodi.

  • A13. I Metodi - Parte I

    Anatomia di un metodoIl Fr amewor k .NET mette a disposizione dello sviluppator e un enor me numer o di classi contenenti metodi davver o utili,gi scr itti e pr onti all'uso, ma solo in pochi casi questi bastano a cr ear e un'applicazione ben str uttur ata ed elegante.Per questo motivo, possibile cr ear e nuovi metodi - pr ocedur e o funzioni che siano - ed usar li comodamente nelpr ogr amma. Per lo pi, si cr ea un metodo per separ ar e logicamente una cer ta par te di codice dal r esto del sor gente:questo ser ve in pr imis a r ender e il listato pi leggibile, pi consultabile e meno pr olisso, ed inoltr e ha la funzione dir acchiuder e sotto un unico nome (il nome del metodo) una ser ie pi o meno gr ande di istr uzioni.Un metodo costituito essenzialmente da tr e par ti:

    Nome : un identificator e che si pu usar e in altr e par ti del pr ogr amma per invocare il metodo, ossia pereseguir e le istr uzioni di cui esso consta;Elenco dei par ametr i : un elenco di var iabili attr aver so i quali il metodo pu scambiar e dati con il pr ogr amma;Cor po : contiene il codice effettivo associato al metodo, quindi tutte le istr uzioni e le oper azioni che esso deveeseguir e

    Ma or a scendiamo un po' pi nello specifico...

    Procedure senza parametriIl caso pi semplice di metodo consiste in una pr ocedur a senza par ametr i: essa costituisce, gr osso modo, unsottopr ogr amma a s stante, che pu esser e r ichiamato semplicemente scr ivendone il nome. La sua sintassi moltosemplice:

    Cr edo che vi sia subito balzato agli occhi che questo esattamente lo stesso modo in cui viene dichiar ata la Sub Main:per tanto, or a posso dir lo, Main un metodo e, nella maggior par te dei casi, una pr ocedur a senza par ametr i (ma sitr atta solo di un caso par ticolar e, come vedr emo fr a poco). Quando il pr ogr amma inizia, Main il pr imo metodoeseguito: al suo inter no, ossia nel suo cor po, r isiede il codice del pr ogr amma. Inoltr e, poich facenti par ti del nover odelle entit pr esenti in una classe, i metodi sono membr i di classe: devono, per ci, esser e dichiar ati a livello di clas s e.Con questa locuzione abbastanza comune nell'ambito della pr ogr ammazione si intende l'atto di dichiar ar e qualcosaall'inter no del cor po di una classe, ma fuor i dal cor po di un qualsiasi suo membr o. Ad esempio, la dichiar azione seguente cor r etta:

    mentr e la pr ossima SBAGLI ATA:

    1.2.3.

    Sub [nome]()'istruzioniEnd Sub

    01.02.03.04.05.06.07.08.09.

    Module Module1Sub Esempio()'istruzioniEnd Sub

    Sub Main()'istruzioniEnd SubEnd Module

    1.2.3.

    Module Module1Sub Main()

  • Allo stesso modo, i metodi sono l'unica categor ia, oltr e alle pr opr iet e agli oper ator i, a poter contener e delleistr uzioni: sono str umenti "attivi" di pr ogr ammazione e solo lor o possono eseguir e istr uzioni. Quindi astenetevi dalloscr iver e un abominio del gener e:

    E' totalmente e concettualmente sbagliato. Ma or a veniamo al dunque con un esempio:

    4.5.6.7.8.

    Sub Esempio()'istruzioniEnd Sub

    'istruzioniEnd SubEnd Module

    1.2.3.4.5.6.

    Module Module1Sub Main()'istruzioniEnd Sub

    Console.WriteLine()End Sub

    01.02.03.04.05.06.07.08.09.10.11.12.13.14.15.16.17.18.19.20.21.22.23.24.25.26.27.28.29.30.31.32.33.34.35.36.37.38.39.40.41.42.43.44.45.46.47.48.49.50.51.

    Module Module1'Dichiarazione di una procedura: il suo nome "FindDay", il'suo elenco di parametri vuoto, e il suo corpo 'rappresentato da tutto il codice compreso tra "Sub FindDay()"'ed "End Sub".Sub FindDay()Dim StrDate As String

    Console.Write("Inserisci giorno (dd/mm/yyyy): ")StrDate = Console.ReadLine

    Dim D As Date'La funzione Date.TryParse tenta di convertire la stringa'StrDate in una variabile di tipo Date (che un tipo'base). Se ci riesce, ossia non ci sono errori nella'data digitata, restituisce True e deposita il valore'ottenuto in D; se, al contrario, non ci riesce,'restituisce False e D resta vuota.'Quando una data non viene inizializzata, dato che un'tipo value, contiene un valore predefinito, il primo'Gennaio dell'anno 1 d.C. a mezzogiorno in punto.If Date.TryParse(StrDate, D) Then

    'D.DayOfWeek contiene il giorno della settimana di D'(luned, marted, eccetera...), ma in un'formato speciale, l'Enumeratore, che vedremo nei'prossimi capitoli.'Il ".ToString()" converte questo valore in una'stringa, ossia in un testo leggibile: i giorni della'settimana, per, sono in ingleseConsole.WriteLine(D.DayOfWeek.ToString())ElseConsole.WriteLine(StrDate & " non una data valida!")End IfEnd Sub

    'Altra procedura, simile alla primaSub CalculateDaysDifference()Dim StrDate1, StrDate2 As String

    Console.Write("Inserisci il primo giorno (dd/mm/yyyy): ")StrDate1 = Console.ReadLineConsole.Write("Inserisci il secondo giorno (dd/mm/yyyy): ")StrDate2 = Console.ReadLine

    Dim Date1, Date2 As Date If Date.TryParse(StrDate1, Date1) And _Date.TryParse(StrDate2, Date2) Then

    'La differenza tra due date restituisce il tempo'trascorso tra l'una e l'altra. In questo caso noi'prendiamo solo i giorniConsole.WriteLine((Date2 - Date1).Days)

  • In questo pr imo caso, le due pr ocedur e dichiar ate sono effettivamente sottopr ogr ammi a s stanti: non hanno nulla incomune con il modulo (eccetto il semplice fatto di esser ne membr i), n con Main, ossia non scambiano alcun tipo diinfor mazione con essi; sono come degli ingr anaggi sigillati all'inter no di una scatola chiusa. A questo r iguar do, bisognainser ir e una pr ecisazione sulle var iabili dichiar ate ed usate all'inter no di un metodo, qualsiasi esso sia. Esse si diconolocali o temporanee, poich esistono solo all'inter no del metodo e vengono distr utte quando il flusso di elabor azionene r aggiunge la fine. Anche sotto questo aspetto, si pu notar e come le pr ocedur e appena stilate siano par ticolar mentechiuse e r estr ittive. Tuttavia, si pu benissimo far inter agir e un metodo con oggetti ed entit ester ne, e questoappr occio decisamente pi utile che non il semplice impacchettar e ed etichettar e blocchi di istr uzioni in locazionidistinte. Nel pr ossimo esempio, la pr ocedur a attinge dati dal modulo, poich in esso dichiar ata una var iabile a livellodi classe.

    52.53.54.55.56.57.58.59.60.61.62.63.64.65.66.67.68.69.70.71.72.73.74.75.76.77.78.79.80.81.82.83.84.85.86.87.88.89.90.91.92.93.94.95.

    ElseConsole.WriteLine("Inserire due date valide!")End IfEnd Sub

    Sub Main()'Command una variabile di tipo char (carattere) che'conterr una lettera indicante quale compito eseguireDim Command As Char

    DoConsole.Clear()Console.WriteLine("Qualche operazione con le date:")Console.WriteLine("- Premere F per sapere in che giorno " & _

    "della settimana cade una certa data;")Console.WriteLine("- Premere D per calcolare la differenza tra due date;")Console.WriteLine("- Premere E per uscire.")'Console.ReadKey() la funzione che abbiamo sempre'usato fin'ora per fermare il programma in attesa della'pressione di