VB.NET Gli ARRAY Gli array a una dimensione Gli array, o vettori, sono spazi di memoria in cui vengono immagazzianti in massa più variabili dello stesso tipo, accessibili tramite un indice. Prendiamo un problema semplice che capita spesso: la struttura del programma richiede che siano utilizzate moltissime variabili dello stesso tipo. Quello che verrebbe spontaneo scrivere a una persona che non conosce gli array è: Il programmatore navigato, invece, dichiara un array, molto più semplice, molto più sicuro, molto più maneggevole. La sintassi con cui si dichiara in generale un array è questa: 1
Il tipo Array Si può dichiarare e inizializzare un array usando questo costrutto: Dim frase() as String={ Buongiorno, a, tutti } Il Visual basic.net consente di definire gli array in diversi modi. È possibile dichiarare un array come variabile di tipo Array: Dim arr as Array Questa potrebbe essere definita come un array non tipizzato: ogni elemento d questo array può contenere dati di qualsiasi tipo,e in effetti è possibile assegnare a questo array un array di qualsiasi tipo.per esempio, il codice che segue assegna all array un array di valore di tipo Integer: Dim arr as Array Dim a() as Integer={12,16,20} arr=ctype(a,array) Gli array È possibile invece definire un array che contiene solo dati di un tipo definito. Per esempio: Dim nome() as String={ pino, mario, giovanni } Dim valore(3) as Integer Dim miscdata() as Object={ this,12d, a c} Dim objarray() as Object miscdata e objarray sono array di tipo Object;i singoli membri possono essere di qualsiasi tipo di dati, ma si possono assegnare loro solo array di tipo riferimento. Per esempio, l assegnazione: objarray=valore mi genera un errore perché l array valore è di tipo intero e un integer non è un tipo riferimento. Invece l assegnazione objarray=nome è esatta perchè il tipo String è di riferimento 2
La classe System.Array (1/2) La classe System.Array (2/2) Nota: alcuni metodi comprendono argomenti molto avanzati come i Generics e i Delegate che studieremo nelle prossime dispense 3
Le matrici Le matrici in VB.net vengono rappresentate in questo modo: Dim A( 3,4) dove 3 e 4 sono le dimensioni dell array. Esempio: Dim a(, ) as Object Matrice non inizializzata a due dimensioni Dim b(200,2) as Object Matrice non inizializzata a due dimensioni con 201 e 3 elementi Tutte le matrici di Vb.net sono derivate dal tipo System.Array nella libreria del framework.net. Esempio: Dim mioarr as Array mioarr=array.createistance(gettype(integer),10) Il Redim In Vb.net gli array sono già dinamiche, ossia è possibile modificarne il numero di elementi in una determinata dimensione, senza dover specificare in anticipo che l array è di tipo dinamico. Per esempio in V6 per creare un array dinamico si doveva dichiarare un array non inizializzato, con un codice come questo: Dim arr() as Integer Index=10 Redim preserve arr(index) Invece con Vb.net, non occorre dichiarare un array non inizializzata;per cui il codice semplificato è: Dim index as Integer=10 Dim arr(index) as Integer index=20 Redim preserve arr(index) 4
La struttura For Each Il For Each è una struttura iterativa studiata per iterare attraverso array e collection di elementi in modo semplice. Sintassi: Gli array come campi struttura Gli array dichiarati come campi di strutture non possono avere un indice specificiato, ma devono rimanere del tutto indeterminati. L'unico modo in cui è possibile determinare le dimensioni dell'array è ridimensionarlo successivamente alla dichiarazione di una variabile struttura: 5
La classe arraylist (1/2) L'arraylist è una classe, pertanto si istanzia come tale con la consueta sintassi: Come l'array, possiamo accedere a ogni suo elemento tramite un indice: La classe arraylist (2/2) 6
Esempio HashTable L'Hashtable lavora quasi allo stesso modo, ma, invece di avere ogni elemento contraddistinto da un indice (numerico), ha ogni elemento contraddistinto da una chiave (stringa) che bisogna specificare come secondo parametro nella procedura Add e come unico parametro in Remove. Tuttavia ci sono alcuni metodi non presenti in un ArrayList, tra i quali troviamo: ContainsKey(x) / ContainsValue(x) : restituisce vero se la chiave o il valori specificati sono presenti nell'hashtable Keys / Values : restituisce un collezione di tutte le chiavi o di tutti i valore presenti nell'hashtable. Quindi non è possibile modificare nè inserire alcun valore da queste collezioni, ma solo leggerne 7
SortedList La potenza delle SortedList sta nel fatto che possono mantenere la lista degli elementi ordinata secondo la chiave: come l'hashtable, anche sortedlist supporta due array di chiavi e valori associati. Usa gli stessi metodi di hashtable e ne implementa altri: GetByIndex(I) / GetKey(I) : restituisce il valore o la chiave posizionati all'indice I IndexOfKey(O) / IndexOfValue(O) : restituisce l'indice della chiave O o del valore O La SortedList ordina gli elementi confrontando le chiavi in modo Case-Sensitive, quindi le maiuscole e le minuscole vengono considerate lettere differenti. Conversione di dati Il Framework.Net è in grado di eseguire conversioni automatiche a runtime verso tipi di ampiezza maggiore, per esempio è in grado di convertire Int16 in Int32, Char in String, Boolean in Byte e via dicendo. Queste operazioni di conversione vengono dette widening (dall'inglese wide = largo), ossia che depongo un valore contenuto in una variabile che occupa dello spazio in una che ne occupa di più. Fin qui nessun problema. Gli operatori di conversione servono per eseguire conversioni che vanno nella direzione opposta, e che sono quindi, narrowing (dall'inglese narrow = stretto). Queste ultime possono comportare la perdita di dati e perciò generano un errore se implicite. 8
L operatore Ctype (1/2) CType è l'operatore di conversione universale e permette la conversione di qualsiasi tipo in qualsiasi altro tipo, almeno quando questa è possibile. La sintassi è molto semplice: L operatore Ctype (2/2) Questa lista riporta alcuni casi in cui è bene usare esplicitamente l'operatore di conversione CType: Per convertire un valore intero o decimale in un valore booleano Per convertire un valore Single o Double in Decimal Per convertire un valore intero con segno in uno senza segno Per convertire un valore intero senza segno in uno con segno della stessa ampiezza (ad esempio da UInt32 a Int32). Oltre a CType, esistono moltissime versioni più corte di quest'ultimo che convertono in un solo tipo: CInt converte sempre in Int32, CBool sempre in booleano, CByte in byte, Cshort in Int16, etc..è inopportuno utilizzare CStr poichè ci si può sevire della funzione ToString ereditata da ogni classe da System.Object; allo stesso modo, è meglio evitare CDate, a favore di Date.Parse, come si vedrà nella lezione relativa alle date. 9
Type of TypeOf serve per controllare se una variabile è di un certo tipo, deriva da un certo tipo o implementa una certa interfaccia, ad esempio: 10