Guida al Visual Basic .NET
Capitolo 12° - Gli Array Parte II
Il costrutto iterativo For EachQuesto costrutto iterativo è simile al normale For, ma, invece di avere una variabile contatore numerica, ha una variabile contatore di vario tipo. In sostanza, questo ciclo itera attraverso una array o una collezione di altro genere, selezionando, di volta in volta, l'elemento che si trova alla posizione corrente nell'array. Il suo funzionamento intrinseco è troppo complesso da spiegare ora, quindi lo affronterò solamente nei capitoli dedicati alle interfacce, in particolare parlando dell'interfaccia IEnumerable. La sintassi è la seguente:Dim A As [tipo] For Each A In [array/collezione] 'istruzioni NextOvviamente anche in questo caso, come nel normale For, è possibile inizializzare una variabile contatore all'interno del costrutto: For Each A As [tipo] in [array/collezione] ...Esempio: Module Module1 Sub 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 Sub End ModulePer avere un termine di paragone, il semplicissimo codice proposto equivale, usando un for normale, a questo: 'Words.Length restituisce il numero di elementi 'presenti nell'array Words For I As Int32 = 0 To Words.Length - 1 Console.Write(Words(I) & " ") Next Gli array sono un tipo referenceDiversamente da come accade in altri linguaggi, gli array sono un tipo reference, indipendentemente dal tipo di dati da essi contenuto. Ciò significa che si comportano come ho spiegato nel capitolo "Tipi reference e tipi value": l'area di memoria ad essi associata non contiene il loro valore, ma un puntatore alla loro posizione nell'heap managed. Questo significa che l'operatore = tra due array non copia il contenuto di uno nell'altro, ma li rende identici, ossia lo stesso oggetto. Per lo stesso motivo, è anche lecito distruggere logicamente un array ponendolo uguale a Nothing: questa operazione può salvare un discreto ammontare di memoria, ad esempio quando si usano grandi array per la lettura di file binari, ed è sempre bene annullare un array dopo averlo usato.Module Module1 Sub Main() 'A e B sono due array di interi Dim 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 = False Console.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 oggetto A = B 'Infatti questa istruzione stamperà a schermo ''"True", poiché A Is B = True Console.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 stesso B(2) = 90 'Su schermo apparirà 90 Console.WriteLine(A(2)) Dim C() As Int32 = {7, 8, 9} B = C 'Ora cosa succede? Console.ReadKey() End Sub End ModuleEcco come appare la memoria dopo l'assegnazione A = B: Ed ecco come appare dopo l'assegnazione B = C: Come si vede, le variabili contengono solo l'indirizzo degli oggetti effettivi, perciò ogni singola variabile (A, B o C) può puntare allo stesso oggetto ma anche a oggetti diversi: se A = B e B = C, non è vero che A = C, come si vede dal grafico. L'indirizzo di memoria contenuto in A non cambia se non si usa esplicitamente un operatore di assegnamento. Se state leggendo la guida un capitolo alla volta, potete fermarvi qui: il prossimo paragrafo è utile solo per consultazione. Manipolazione di arrayLa classe System.Array contiene molti metodi statici utili per la manipolazione degli array. I più usati sono:
C#, TypeScript, java, php, EcmaScript (JavaScript), Spring, Hibernate, React, SASS/LESS, jade, python, scikit, node.js, redux, postgres, keras, kubernetes, docker, hexo, etc...
|