JavascriptProva

mercoledì 17 luglio 2013

Studio su come vengono gestiti gli arrays ridimensionati in termini di creazione nello heap.

Che differenza c'è fra un array e un arraylist?
Bene, si possono usare le arraylist quando si devono ridimensionare arrays.
Infatti mi pare di ricordare che un array, quando viene ridimensionato, in realtà viene creato come nuovo array. Mi rifaccio il test che avevo ideato prima...

    Sub Main()
        Dim MyArray As String()
        Dim SecondoArray As String()
        MyArray = {"uno", "due", "tre"}
        SecondoArray = MyArray
        Console.WriteLine(MyArray(0))
        Console.WriteLine(SecondoArray Is MyArray)
        Console.ReadKey()
        ReDim Preserve MyArray(3)
        MyArray(3) = "quattro"
        Console.WriteLine(MyArray(3))
        Console.WriteLine(SecondoArray Is MyArray)
        Console.ReadKey()

    End Sub
Ecco l'output:
uno
True
quattro
False


Questo significa che dopo il ReDim Preserve viene scritto nell'Heap un nuovo array con una locazione diversa.

Ci aggiungo dell'altro codice per vedere invece se la variabile SecondoArray resta sempre quella di prima.
    Sub Main()
        Dim MyArray As String()
        Dim SecondoArray As String()
        MyArray = {"uno", "due", "tre"}
        SecondoArray = MyArray
        Console.WriteLine(MyArray(0))
        Console.WriteLine("la proposizione secondo cui SecondoArray si identifica con MyArray è " & (SecondoArray Is MyArray))
        Console.WriteLine("Lunghezza di MyArray " & MyArray.Length)
        Console.WriteLine("Lunghezza di SecondoArray " & SecondoArray.Length)
        Console.ReadKey()
        ReDim Preserve MyArray(3)
        MyArray(3) = "quattro"
        Console.WriteLine()
        Console.WriteLine(MyArray(3))
        Console.WriteLine("la proposizione secondo cui SecondoArray si identifica con MyArray è " & (SecondoArray Is MyArray))
        Console.WriteLine("Lunghezza di MyArray " & MyArray.Length)
        Console.WriteLine("Lunghezza di SecondoArray " & SecondoArray.Length)
        Console.ReadKey()

    End Sub
Ecco, ci ho aggiunto del codice più "esplicativo", che "parla un po' più chiaro":
uno
la proposizione secondo cui SecondoArray si identifica con MyArray è True
Lunghezza di MyArray 3
Lunghezza di SecondoArray 3

quattro
la proposizione secondo cui SecondoArray si identifica con MyArray è False
Lunghezza di MyArray 4
Lunghezza di SecondoArray 3


Dunque è chiaro che con il ReDim Preserve in realtà non si ridimensiona un bel niente, ma viene creato un nuovo array nello Heap, cui "punta" la variabile presente nello stack.

Nessun commento:

Posta un commento