I capitoli di questa ultima parte non riguardano strettamente il codice o le tecniche da usare, ma si occupano di descrivere l'ambiente di
sviluppo, in particolare il compilatore Visual Basic Express 2005/2008/2010. Ecco uno screenshot del mio schermo con aperto il progetto che uso per
scrivere gli esempi della guida:
Panoramia dell'IDE
Nel capitolo prenderò in esame quegli strumenti che possono essere utili nello sveltire le operazioni e aiutare il programmatore nella
stesura del codice.
Solution Explorer
Nella finestra del Solution Explorer vengono visualizzati tutti i file che compongono il progetto corrente, o, in caso si tratti di una soluzione,
anche tutti i suoi progetti. Da qui è possibile accedere in modo rapido ad ogni risorsa possibile. Tutti i sorgenti (quindi tutti i file
con estensione *.vb) riportati sono raggiungibili mediante un doppio click e, per i form, con il menù contestuale. Sul lato superiore
della finestra sono visibili cinque pulsanti, nell'ordine:
- Proprietà del progetto: una scorciatoia che porta direttamente alle proprietà di progetto
- Show All Files : visualizza tutti i file realmente esistenti nella cartella, fra cui le risorse, i riferimenti e i codici di design
dei form. Ad esempio:
Show All Files
Come si può facilmente notare dall'immagine, ci sono molte più cose di quante ce ne se aspettasse:
- My Project : sotto questa voce vengono raggruppati tutti i sorgenti che formano il namespace My nelle sue classi modificabili. Infatti
nella figura si osservano Application.myapp (che forma My.Application), Resources.resx (che forma My.Resources) e Settings.settings (che
forma My.Settings). Il file manifest usa la sintassi XML per comunicare al sistema operativo altre informazioni sottaciute all'utente, quali
i permessi concessi, la versione minima richiesta e altri dati sulla sicurezza
- References: contiene tutti i riferimenti aggiunti
- bin : questo elemento è solo una riproduzione della vera cartella bin presente nella cartella del progetto. Per mezzo di questa
si possono vedere i file contenuti in Debug e Relase, ma non è niente di più che un semplice browser
- obj : contiene file con l'elenco delle risorse associate a ogni form o controllo. Inoltre contiene anche un indice di tutti i file
inclusi nel progetto e necessari al suo funzionamento
- Resources : cartella delle risorse. Bisogna evidenziare che è colorata in giallo. Cartelle di questo tipo sono creabili anche
dal programmatore per mezzo del menù contestuale [Nome progetto]->Add->New folder e servono per organizzare meglio l'applicazione
- View Code : se il file selezionato è un sorgente, visualizza il codice relativo
- View Designer : se il file selezionate è un form o un controllo, visualizza l'anteprima di design
Proprietà di progetto
Questa sezione permette di impostare tutte le specifiche possibili e immaginabili riguardanti il progetto corrente, dallo splash screen
iniziale, agli aggiornamenti, alle informazioni dell'assembly. Ecco una panoramica di tutte le schede non ancora esaminate:
Proprietà - Application
La scheda "Application" permette di selezionare i comportamenti dell'applicazione. Ecco una lista dei campi con annessa spiegazione:
- Assembly name : il nome dell'assembly generato. Se il progetto è una libreria di classi, si riferisce al nome che la DLL
di output dovrà avere, altrimenti si riferisce al nome dell'eseguibile (sia nella cartella Release che in quella Debug)
- Root namespace : il namespace del progetto. Di default, è composto prendendo il nome iniziale dato al progetto in fase di salvataggio
e "normalizzandolo", ossia eliminando tutti quei caratteri che non possono comporre un identificatore Visual Basic (ossia una variabile).
Può essere utile cambiarlo anche solo per un fatto estetico: una volta modificata la textbox, il compilatore esegue una ricerca nei
sorgenti e sostituisce tutte le occorrenze, senza quindi dare alcun fastidio durante la sostituzione del nome
- Application type : il tipo di assembly prodotto in output. Si possono scegliere tre valori: Windows Application, Class Library e
Console Application
- Icon : l'icona dell'eseguibile prodotto (se il progetto è di tipo Class Library, non si potrà cambiare l'icona associata
alla DLL). È valido qualsiasi file *.ico compatibile, preferibilmente di dimensioni ridotte, come 32x32 o 48x48
- Enable XP Visual Style : abilita la visualizzazione in stile Windows XP su sistemi operativi compatibili
- Save My.Settings on shutdown : determina se salvare le impostazioni definite in My.Settings quando l'applicazione è in chiusura.
Equivale a impostare My.Application.SaveMySettingsOnExit
- Shutdown mode : indica quando terminare l'applicazione, se alla chiusura del primo form (ossia del form principale), oppure alla chiusura
dell'ultimo form visibile, indipendentemenete dal suo ruolo
- Splash screen : imposta lo splash screen dell'applicazione. È valido un qualsiasi form definito nel progetto: esso viene
visualizzato prima di ogni altra cosa all'avvio dell'applicazione per alcuni secondi
Proprietà - Compile
La finestra compile permette di impostare alcuni settaggi riguardanti la compilazione. La prima casella di testo in alto specifica dove salvare
l'assembly compilato. Le tre combobox appena sotto, invece, impostano le opzioni di compilazione, già esposte nel capitolo relativo.
Il DataGridView centrale, invece, fa stabiliare all'utente come comportarsi in alcuni casi particolari: definisce se una certa situazione
debba essere segnalata oppure no, e se sì in forma di errore o di semplice warning. Queste azioni sono, nell'ordine, dall'alto in
basso:
- Conversioni implicite fra tipi. Ad esempio:
Dim I As Int32 = 34.78
- Late binding, ossia richiamare membri da una variabile Object. Ad esempio:
Private Click(ByVal sender As Object, ByVal e As EventArgs)
'sender è un generico Object: non si è sicuri che
'a runtime possa risultare proprio di tipo Control
sender.Enabled = False
End Sub
- Dichiarazioni di variabili senza la specificazione del tipo (nelle versioni 2005 e anteriori, si assume che siano Object). Ad esempio:
Dim S
- La variabile viene usate prima che gli sia stato assegnato un valore. Vale sia nel caso di valori Value che Reference:
Dim I As Int16
'I non è inizializzata: sarà 0 e produrrà un errore
Dim K As Int16 = 10 / I
'...
Dim Str As StringBuilder
'L'oggetto Str non è inizializzato, poiché manca il suo
'costruttore nella dichiarazione. Questo codice produrrà un
'errore NullReferenceException a runtime
Str.Append("Ciao")
Il compilatore riesce ad individuare anche i casi in cui una struttura di controllo impedisce a un valore di essere sempre assegnato con
certezza. Il seguente codice produce un warning in compilazione e potrebbe produrre un errore a runtime:
Dim I As Int16
If K >= 26 Then
I = 2 * K + 1
End If
'Se K < 26, I varrà 0
K /= I
- Dichiarazione di funzioni od operatore che non restituiscono alcun tipo. Ad esempio:
Public Function GetName(ByVal Text As String)
'...
End Function
'Oppure
Public Shared Operator +(ByVal P1 As Person, ByVal P2 As Person)
'...
End Operator
- Variabile locale non utilizzata
- Si accede a un campo statico attraverso un'istanza di classe anziché attraverso la classe stessa. Ad esempio:
Dim S, K As String
'...
'IsNullOrEmpty è una funzione statica del tipo String.
'Poiché è pur sempre un membro pubblico, diventa
'accessibile anche dai singoli oggetti. Ma, come già
'ripetuto molte volte, non costituisce un membro appartenente
'all'istanza, ma alla classe in sé. Qualsiasi valore di S,
'pertanto, verrà trascurato. La versione corretta è
'If String.IsNullOrEmpty(K) Then ...
If S.IsNullOrEmpty(K) Then
'...
End If
- Il compilatore ha rilevato una chiamata ricorsiva, ossia che fa riferimento a se stessa. Errori del genere potrebbero portare a
loop e crash del programma durante l'esecuzione. Ecco un esempio:
Private _Name As String
Public ReadOnly Property Name() As String
Get
'Questo statement deve ottenere il valore della
'proprietà Name, della quale si sta definendo ora
'il corpo. In questo modo si richiederà il blocco
'Get, che a sua volta richiamerà se stesso un
'numero infinito di volte
Return Name
End Get
End Property
- Blocchi Catch uguali
Le due checkbox in fondo, invece, permettono o di sopprimere ogni warning, oppure di trattare ogni warning come se fosse un errore.
La scheda Debug ha pochissime funzionalità. La prima textbox permette di inserire dei parametri da riga di comando direttamente all'avvio
per testare l'applicazione, mentre la seconda stabilisce la directory in cui lavora il programma.
Proprietà - References
La schermata dei riferimenti consente al programmatore di importare velocementi componenti COM o assembly .NET. La listview centrale visualizza
tutti i riferimenti attualmente presenti nel progetto, mentre la CheckedListBox in basso è una scorciatoia per aggiungere velocemente
assembly .NET provenienti dalla Global Assembly Cache. Il pulsante Refrence Paths aggiunge un'intera cartella, dalla quale si inseriranno tutti
i componenti ivi contenuti. Il pulsante di fianco, invece, "Unused refrences", trova nei sorgenti i riferimenti inutilizzati e permette di
rimuoverli.
La scheda Security stabilisce se il programma debba essere considerato una Full Trust Application ("Applicazione completamente affidabile")
o una Partial Trust Application ("Application non completamente affidabile"): la prima garantisce una sicurezza massima, non interferisce in
meccanismi delicati e perciò ottiene dal sistema operativo tutti i permessi necessari a operare sulla macchina; la seconda agisce su
parti sensibili del sistema e potrebbe causare errori, perciò Windows non gli concede tutti i permessi. La DataGridView appena sotto
definisce quali permessi siano richiesti e quali no, mentre il pulsante Properties apre una finestra in cui si possono definire i permessi
R-W delle variabili d'ambiente.
Proprietà - Publish
La scheda Publish consente di pubblicare il programma come setup eseguibile: questo viene costruito dal compilatore sulla base delle informazioni
immesse. Una volta avviato, installa il programma in una locazione sconosciuta e non modifica il menù Installazione Applicazioni. In
questo modo l'utente non può disinstallarlo e se si verificano problemi, non può ricorrere a nessun supporto poiché i
file necessari sono nascosti chissà dove. Per tutti i motivi appena esposti, sconsiglio vivamente la creazione del setup con l'editor
predefinito: maggiori informazioni saranno fornite nel capitolo sui pacchetti d'installazione. Ecco una lista dei campi:
- Publishing location : percorso della cartella dove depositare il setup
- Installation URL : percorso della cartella dove installare il software
- Application files : apre una finestra di dialogo che permette di selezionare quali file includere nel setup
- Prerequisites : seleziona i prerequisiti ed eventualmente la locazione o il sito da dove scaricarli se non presenti sul computer dell'utente
- Updates : imposta le modalità di controllo degli aggiornamenti, il periodo di tempo ogni quanto eseguire un controllo per
verificarne l'esistenza, la versione minima richiesta all'aggiornamento e, ovviamente, l'indirizzo dove controllare
- Options : opzioni dell'assembly
- Publish version : versione di pubblicazione del programma
- Publish wizard : uno wizard guida il programmatore attarverso la creazione del setup. Vengono proposte le stesse opzioni che è
possibile impostare nella scheda
- Publish Now : crea immediatamente il setup
Object Browser
L'Object browser è una versione molto (ma molto!) più sofisticata e dettagliata del nostro Browser per Assembly, scritto
nell'ultimo capitolo sulla Reflection. Permette di navigare tra gli assembly del progetto, sia quelli creati dall'utente (controlli utente,
form, moduli, classi, namespace), sia quelli generati dal compilatore (namespace My e relative sottoclassi) sia quelli depositati nella
GAC (ad esempio System.Data o System.Xml). Visualizza tutte le proprietà, i metodi, i campi, gli enumeratori, le strutture, le
interfacce, le classi, i costruttori, i distruttori e gli operatori creati, ossia ogni possibile informazione su un dato tipo. Il riquadro
in basso mostra anche la dichiarazione del membro e, se si tratta di una procedura o di una funzione, anche la signature, la descrizione del
funzionamento e di ogni singolo parametro.
Object Browser
Dopo aver navigato un pò per i tipi, si sarà notato che queste informazioni
non sono disponibili per gli oggetti creati dal programmatore, ma la spiegazione è semplice: non si è creata una documentazione
adatta per quei membri. Consultare il capitolo relativo per maggiori dettagli.Si può osservare che:
- I membri statici non vengono riportati, tranne i moduli
- Tutta la documantazione viene trasferita correttamente nel riquadro della descrizione
- I tipi vengono esposti fuori dalla classe con l'operatore punto (ad esempio Documentazione.Struttura)
- Strutture, delegate, interfacce ed enumeratori, poiché derivati dalle classi basi System.Structure, System.Delegate e
System.Enumerator, espongono molti metodi addizionali
- I membri privati hanno una piccola icona a forma di lucchetto in basso a destra
- I membri friend hanno una piccola icona a forma di rombo azzurro in basso a sinstra
IntelliSense
C'è un altro modo per raggiungere velocemente la documentazione di un membro, ed è usare l'IntelliSense. Questa tecnologia
legge quello che il programmatore ha digitato nel codice e, in corrispondenza di certi simboli (come lo spazio o il punto), fornisce dei
suggerimenti tramite un menù a cascata. Ecco un esempio:
IntelliSense in azione!
Oltre a visualizzare informazioni sulla classe selezionata, permette di scorrere velocemente tutti i membri con le frecce direzionali: per
attivare l'autocompletamento, basta digitare il carattere punto (se ci si deve addentrare più all'interno nella gerarchia), spazio (se
si deve continuare l'espressione) o invio (se una volta completato, si termina l'espressione). Così facendo, dichiaro un nuovo
StringBuilder digitando questi tasti:
dim Str as new sys.te.s[Invio]
E ottengo lo stesso risultato in un tempo notevolmente inferiore. Usando questa tecnica si possono indagare anche i parametri dei metodi
aprendo le parentesi:
IntelliSense in azione!
Oltre ad ottenere la descrizione del parametro e il tipo richiesto, è possibile vedere anche tutte le versioni modificate con
overloading scorrendole con le freccette direzioni indicate (anche da tastiera).
Un altro pregio dell'IntelliSense consiste nel poter rilevare la dichiarazione di una variabile quando il mouse ci passa sopra.
Altri strumenti utili
In questo paragrafetto cito due strumenti di minor importanza, ma molto utili. Il primo è il Code Snippet, che permette di inserire
all'interno del sorgente frammenti di codice già scritti. Per inserire un frammento esistente, basta selezionare "INSERT IGNORE Snippet"
dal menù contestuale dell'editor di codice. Dopodiché apparirà una lista contenente delle cartelle con nomi in inglese:
sono le categorie di codice disponibili. Ad esempio, per creare in modo veloce una proprietà, si seleziona questo:
Code Snippet
Il compilatore genererà un codice in cui sono evidenziate delle parti in verde: se se ne modifica una, quelle corrispondenti vengono
modificate a loro volta con lo stesso valore.
L'altro strumento è un tool di rinominazione. Se si clicca col destro su un indentificatore e si sceglie "Rename", lo si può rinominare e il compilatore
rinomina anche tutti i suoi riferimenti altrove.