Anomalia funzione in una classe

Buongiorno,
ho creato una classe contenete varie funzioni e ho notato che una si comportava in modo anomalo.

Di seguito i dettagli:

La classe che contiene la funzione StoreArray e l’ oggetto CArray si chiama TestFunzione.

La riga di comando ArrayToStore.RemoveAllRows rimuove gli elementi della matrice prima che essa sia memorizzata nella variabile CArray anche se il comando dopo la funzione Test.StoreArray(ArrayToStore).

Eseguendo l’ applicazione step by step funziona.

[code]Public Function StoreArray(Data() as string) as boolean

Try
CArray = Data
Return True
Catch
Return False
End try
End Function
[/code]

Nel tasto della form ho il seguente codice:

Var Test as new TestFunzione Var ArrayToStore() as string Var M as integer Var Result as Boolean Var StringArray as string For M = 0 To 10 ArrayToStore.AddRow(M.ToString) Next Result = Test.StoreArray(ArrayToStore) ArrayToStore.RemoveAllRows

Come possibile ?

Perche’ l’array e’ uno solo: passando un array al metodo non ne viene creato un altro come copia del primo.
Questa cosa e’ stata ampiamente discussa in varie occasioni ed articoli come quello che trovi qui: Working with Arrays: Assignment vs Copy

Ancora un piccolo dubbio…
possiedo un’ array di oggetti che contengono a loro volta delle matrici.
Se copio ogni singolo elemento anche la matrice dell’ oggetto viene copiata come nuovo elemento ?

Il contenuto di un oggetto fa parte dell’oggetto: il suo contenuto dipende dall’esistenza dell’oggetto stesso.

[quote=488339:@Sacha Donati]Se copio ogni singolo elemento anche la matrice dell’ oggetto viene copiata come nuovo elemento ?
[/quote]
Cosa intendi per copia dell’oggetto?
Un nuovo oggetto con lo stesso contenuto? Non credo che tu voglia duplicare gli oggetti e, in ogni caso, Xojo non ha un operatore di copia per gli oggetti.
Presumo tu intenda duplicare il riferimento all’oggetto per evitare che l’oggetto sia distrutto.

Credo che questa cosa dell’operatore di assegnazione che per gli array non duplica il contenuto ma semplicemente crea un nuovo riferimento allo stesso array abbia creato un qualche disagio.
E’ esattamente come per le classi: nulla di diverso.

Dim var1 As new myClass
Dim var2 As myClass = var1

var1 e’ un riferimento ad una istanza di una classe di tipo myClass
var2 e’ un secondo riferimento alla stessa istanza della classe di tipo myClass
Gli array funzionano esattamente allo stesso modo.

Saluti

in pratica se vuoi assegni un oggetto (o vettore) ad una nuova variabile assegni il puntatore (o riferimento) ad esso e i due oggetti saranno in realt uno solo (ogni modifica ad uno si riflette anche all’altro).
Assegnare dopo un riferimento a nil (o cambiare il riferimento) non ha conseguenze sull’oggetto originale a meno che non ci siano pi riferimenti ad esso, in tal caso viene distrutto.

Se vuoi assegnare ad una variabile un oggetto indipendente basato su quello che hai, allora devi implementare una funzione di duplicazione (clone). non esiste automatica perch dipende dalla tua implementazione.
In genere si fa un due modi (a seconda delle necessit o abitudini), come metodo di un oggetto:

class xxx .... function clone as xxx var risposta as new xxx risposta.proprieta =me.proprieta // il me non necessario returno risposta end function .... end class
Oppure come constructor dedicato

class xxx ... sub constructor(origine as xxx) me.proprieta=origine.proprieta end sub ... end class
Poi per ogni propriet puoi fare assegnazioni atomiche solo per valori primitivi, in caso di oggetti o vettori va fatto il clone ovviamente

Grazie Maurizio e Antonio per il vostro aiuto,

Nel primo esempio di Antonio se la “proprieta” fosse un array devo comunque clonaro aggiungendo gli elementi con array.AddRow(Value) oppure array(x) = Valore e non usando = .
E’ corretto ?

fare array=altroarray copia il riferimento (come ho detto array e oggetti si comportano nello stesso modo)
se vuoi fare una copia in modo da averne due indipendenti devi fare un copia riga per riga (per usare la nuova terminologia)
e lo stesso (clone e non assegnazione) devi fare se la riga a sua volta un oggetto-

dimenticavo, vale anche per i dictionary, ovvero per tutte le strutture che non sono dati di base.

Ora tutto pi chiaro.
Grazie !