Programmazione.it v6.4
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Forum
Forum :: Programmazione.it :: C# :: ArrayList
Scritto da Matteo Pidalà a.k.a. teatrodelsogno il 05-07-2009 ore 14:20
Intel Parallel Studio XE
Ciao a tutti...
Trovo sempre complessità inutili tra java e c#
cmq in breve il punto è questo:

ipall (è un array list di interi) ipall[];

faccio:

ipall[1]=5;
array.add(ipall);

ipall[1]=10;
array.add(ipall);


Ecco.. perchè se scorro l'arraylist trovo entrambe le entry uguali all'ultimo inserimento? cioè a ipall[1]=10???

grazie
ciao!
Precedente: [Java]
Successiva: programmare client/server senza uccidersi
Intervento di Filippo P a.k.a. lieutenant del 05-07-2009 ore 16:58, Treviglio (BG)
Cavaliere
Cavaliere
(143 interventi)
Iscritto il 11-01-2006
L'array viene passato al metodo "add" come riferimento, quindi in pratica stai aggiungendo due volte lo steso oggetto.

Se provi a cambiare di nuovo il valore di ipall[1] anche senza aggiungere nuovamente con il metodo "all" il tuo array alla lista, scoprirai che nella lista c'è il nuovo valore.
Intervento di Matteo Pidalà a.k.a. teatrodelsogno del 05-07-2009 ore 21:07, Casaletto lodigiano (LO)
Plebeo
Plebeo
(7 interventi)
Iscritto il 02-07-2009
lieutenant ha scritto:
L'array viene passato al metodo "add" come riferimento, quindi in pratica stai aggiungendo due volte lo steso oggetto.

Se provi a cambiare di nuovo il valore di ipall[1] anche senza aggiungere nuovamente con il metodo "all" il tuo array alla lista, scoprirai che nella lista c'è il nuovo valore.

mmm non ho capito bene dalla tua frase..
riesci a farmi un esempio??

Perchè stavo anceh provando con clone...
ma è un casino in quanto ho a che fare con cicli... :S

Cmq intanto grazie per la risposta..
a presto
ciao!
Intervento di Pierpaolo Cira a.k.a. pierpaoloc del 06-07-2009 ore 11:16
Marchese
Marchese

(1372 interventi)
Iscritto il 17-01-2006
Ciao, mi permetto di intervenire.

La cosa fondamentale che devi tenere in testa è che in Java non esistono puntatori (come in C) perché in realtà è come se fossero tutti puntatori (in realtà fanno eccezione i tipi primitivi com int... e poi String... ma considerala una buona approssimazione).

In generale se con Java tu dici:
int a = 1;
lista.add(a);
a = 2;
lista.add(a);
saprai che la tua lista conterrà i valori 1 e 2.

Questo avviene perché i tipi di valori che fanno eccezione di cui ti parlavo prima vengono passati, come si dice, per copia.
Ossia al metodo .add arriva direttamente il valore 1 (e dopo il valore 2) e quello li memorizza.

Tutti gli oggetti (tranne le String, come dicevo), però, sono simili ai puntatori e quindi vengono passati "per riferimento".
Questo vuol dire che al metodo .add viene passato l'indirizzo della cella di memoria che contiene il valore che vuoi passare.
Anche gli array[] sono passati per riferimento.

Per esempio (non uso il wrapping automatico di Java 5 per fare l'esempio):
Integer a = new Integer(1);
lista.add(a);
a = new Integer(2);
lista.add(a);

In questo esempio alla lista passi nel primo caso l'indirizzo della locazione di memoria (il puntatore implicito) di "a2 che contiene 1. Poi stai riassegnando "a", quindi essa punterà ad un'ulteirore cella di memoria contenente il 2... e quello è il riferimento che verrà passato alla seconda chiamata di add.
Idem, quindi, se lavori con gli array[]: se nel secondo esempio avessi detto solo:
a = 2;
allora avresti modificato il valore presente nella cella di memoria di "a". E quindi dato che la lista contiene il riferimento a quella cella di memoria, avresti due volte il puntatore allo stesso elemento... e quindi due volte lo stesso valore facendo un .get().

Questo è come funziona in Java... e, a meno che tu non gli dica di fare diversamente, anche C# si comporta così di default.
Quindi il problema non era un cattivo porting tra i due linguaggi...
In ogni modo, se vuoi migliorare le tue conoscenze su C#, ti consiglio di guardare la documentazione sulle parole chiave byVal e ref... può esserti molto interessante fare qualche esempio e poi avrai le idee chiarissime... ;)
Intervento di Matteo Pidalà a.k.a. teatrodelsogno del 06-07-2009 ore 11:51, Casaletto lodigiano (LO)
Plebeo
Plebeo
(7 interventi)
Iscritto il 02-07-2009
Grzie per la chiarissima risposta,
in effetti quelle parole chiavi non le ho usate! in quanto stavo usando "come funzionalità" java in c# :D

Dici che grazie a quelle cose risolvo anche la mia questione??



grazie ancora
buona giornata
Copyright Programmazione.it™ 1999-2013. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.272 secondi.