Code di Array in C#

lunedì 09 agosto 2010 - 12.15
Tag Elenco Tags  C#  |  .NET 3.0  |  .NET 3.5  |  .NET 4.0  |  Windows XP  |  Visual Studio 2005

SuperMarioMS Profilo | Newbie

Salve a tutti,
essendo un newbie di C# vorrei farvi una banale domanda:

Come posso impostare una coda i cui elementi sono dei vettori?

Il problema che ho riscontrato è il seguente, assegnando dei valori differenti allo stesso vettore (diciamo "dati[]") ed effettuando un inserimento nella coda, il primo elemento(vettore) inserito nella coda viene modificato dal valore del secondo vettore inserito la volta successiva:

esempio:

public Queue<byte[]> coda = new Queue<byte[]>(100); public byte[] dati = new byte[3]; dati[0] = 1; dati[1] = 1; dati[2] = 1; /*vettore di 3 elementi di tipo byte*/ coda.Enqueue(dati); /*accodo il vettore */ dati[0] = 2; dati[1] = 2; dati[2] = 2; /*cambio il contenuto di dati[] */ coda.Enqueue(dati);
/*accodo il nuovo dati[]*/

RISULTATO: coda[0] contiene il valore [2, 2, 2] che è lo stesso di coda[1].
la risposta che mi sono dato è che la memorizzazione dei vettori viene fatta per indirizzo e non per valore.
Un'altra prova che ho fatto è stata quella di inserire il vettore all'interno di una struct. Il risultato è lo stesso.

Qualcuno si è già scontrato con questa problematica?
Grazie e a presto.
mario.

aiedail92 Profilo | Expert

Ciao

Gli array sono delle classi a tutti gli effetti, e come tutte le classi sono gestiti per riferimento, quindi la tua teoria è giusta

Il problema lo risolvi molto semplicemente: invece che accodare lo stesso array ogni volta, ne accodi una copia, in questo modo:

public Queue<byte[]> coda = new Queue<byte[]>(100); public byte[] dati = new byte[3]; dati[0] = 1; dati[1] = 1; dati[2] = 1; /*vettore di 3 elementi di tipo byte*/ coda.Enqueue(dati.Clone() as byte[]); /*accodo il vettore */ dati[0] = 2; dati[1] = 2; dati[2] = 2; /*cambio il contenuto di dati[] */ coda.Enqueue(dati.Clone() as byte[]);

Luca

SuperMarioMS Profilo | Newbie

Grazie mille Luca.

problema risolto
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5