2011-01-15 14 views
1

Ich habe einige Codes in C#, die eine Struktur als solche verwendet:„Dereference“ var in C#

  ArrayList addrs = new ArrayList(); 
        byte[] addr = new byte[8]; 
     while (oneWire.Search_GetNextDevice(addr)) 
     { 
      addrs.Add(addr); 
     } 

In diesem Beispiel jedes Element in der Arraylist ist das gleiche wie das letzte Gerät, das, weil es gefunden wurde Es würde so aussehen, als würde addr als Referenz ausgegeben, und ich kopiere diesen Verweis einfach in die ArrayList.

Gibt es eine Möglichkeit zur "Dereferenzierung" von Addr, um nur seinen Wert zu extrahieren?

Es ist auch möglich, meine Einschätzung der Situation nicht richtig ist, wenn das der Fall zu sein scheint, mir

Dank wissen, lassen Sie es!

+0

Bitte zeigen Sie die Deklaration der Variablen addr und ihrer Klasse/Struktur an. –

+0

Sorry, ich habe vergessen zu erwähnen, dass es ein Byte ist [8] – chris12892

+0

Richtig, 'byte []' ist keine Struktur. –

Antwort

3

Sie benötigen wahrscheinlich etwas wie addrs.Add(addr.Clone());, um eine Kopie (oder einen Klon) von addr zu erstellen, die Sie in Ihre Liste einfügen können.

+0

Vielen Dank, das hat es behoben! :) Ich werde Ihre Antwort akzeptieren, sobald StackOverflow es mir erlaubt. – chris12892

3

Wenn addr eine Klassenvariable (und keine Struktur) ist, würde es sich ergeben. In diesem Fall würde Search_GetNextDevice() dieselbe Instanz immer wieder ausfüllen.

Sie könnten in der Lage sein, es wie

while (oneWire.Search_GetNextDevice(addr)) 
{ 
    addrs.Add(addr); 
    addr = new Addr(); 
} 

Aber siehe meinen Kommentar über weitere Details mit etwas zu lösen.

0

Wenn addr eine Struktur ist, dann können mehrere Probleme auftreten.

Zunächst wird Adr nicht ändern und wenn es sich ändern muss, müssen Sie Search_GetNextDevice als ref. Wenn Sie Werte von addr.something in Search_GetNextDevice ändern, werden Sie diese Werte in der Kopie, die Sie haben, nicht sehen.

0

zu Array konvertieren, dann Schleife, die zu kopieren:

ArrayList addrs = new ArrayList(); 
     while (oneWire.Search_GetNextDevice(addr.ToArray((whateverTypeYourItemsHave[])typeof(whateverTypeYourItemsHave)))) 
     { 
      addrs.Add(addr); 
     } 

Oder besser, wenn Sie wissen, was die Elemente in der Liste sind, verwenden Sie generische Liste. Besser zu lesen, weniger fehleranfällig:

List<whateverYourItemTypeIs> addrs = new List<whateverYourItemTypeIs>(); 
     while (oneWire.Search_GetNextDevice(addr.ToArray())) 
     { 
      addrs.Add(addr); 
     }