我在C#中有一些使用结构的代码:
ArrayList addrs = new ArrayList();
byte[] addr = new byte[8];
while (oneWire.Search_GetNextDevice(addr))
{
addrs.Add(addr);
}
在此示例中,ArrayList
中的每个元素都与找到的最后一个设备相同,因为它看起来好像是addr
通过引用传递出来而我只是将该引用复制到ArrayList
。
有没有办法“取消引用”addr
只提取它的价值?
我也可能对情况的评估不正确,如果情况确实如此,请告诉我
谢谢!
答案 0 :(得分:5)
如果addr
是一个类变量(而不是结构),那么它就算了。
在这种情况下,Search_GetNextDevice()
将一遍又一遍地填充同一个实例。
您可以使用类似
的方法解决问题byte[] addr = new byte[8];
while (oneWire.Search_GetNextDevice(addr))
{
addrs.Add(addr);
addr = new byte[8];
}
使用byte[]
信息
答案 1 :(得分:4)
您可能需要addrs.Add(addr.Clone());
这样的内容来创建addr
的副本(或克隆)以放入列表中。
答案 2 :(得分:0)
如果addr是一个结构,那么可能会出现多个问题。
首先,addr不会改变,如果必须改变,那么你需要将Search_GetNextDevice
声明为ref。
如果要更改addr.something
中Search_GetNextDevice
的值,那么您将不会看到您拥有的副本中的值。由于结构按值传递给方法,因此会丢失。
答案 3 :(得分: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);
}