2011-01-15 5 views
1

У меня есть некоторый код в C#, который использует структуру, как, например:«разыменовать» переменный в C#

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

В этом примере каждый элемент в ArrayList такой же, как последнее устройство, который был найден потому, что он как будто addr передается по ссылке, и я просто копирую эту ссылку в ArrayList.

Есть ли способ «разыменовать» addr, чтобы извлечь только его ценность?

Это также возможно, моя оценка ситуации является неправильным, если это, кажется, так, пожалуйста, дайте мне знать

Спасибо!

+0

Просьба показать объявление var addr и его класса/структуры. –

+0

Извините, я забыл упомянуть, что это байт [8] – chris12892

+0

Правильно, 'byte []' не является структурой. –

ответ

3

Чтобы создать копию (или клон) addr, вам, возможно, понадобится что-то наподобие addrs.Add(addr.Clone());.

+0

Большое спасибо, что исправил это! :) Я отвечу на ваш ответ, как только StackOverflow позволит мне. – chris12892

3

Если addr - переменная класса (а не структура), она будет отображаться.

В таком случае Search_GetNextDevice() будет заполнять тот же экземпляр снова и снова.

Вы можете быть в состоянии решить ее с чем-то вроде

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

Но смотрите мой комментарий о более подробной информации.

0

if addr - это структура, то могут возникнуть многочисленные проблемы.

Прежде всего, addr не изменится, и если это необходимо изменить, вам необходимо объявить Search_GetNextDevice в качестве ссылки.

Если вы меняете значения addr.something на номер Search_GetNextDevice, то вы не укажете эти значения в копии, которые у вас есть. Они будут потеряны, так как структуры передаются по значению методам.

0

Преобразование в массив, а затем цикл, копирование:

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

Или лучше, если вы знаете, что элементы в вашем списке, используйте общий список. Лучше читать, меньше подвержено ошибкам:

List<whateverYourItemTypeIs> addrs = new List<whateverYourItemTypeIs>(); 
     while (oneWire.Search_GetNextDevice(addr.ToArray())) 
     { 
      addrs.Add(addr); 
     } 
Смежные вопросы