C#中的“取消引用”变量

时间:2011-01-15 18:25:31

标签: c# .net

我在C#中有一些使用结构的代码:

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

在此示例中,ArrayList中的每个元素都与找到的最后一个设备相同,因为它看起来好像是addr通过引用传递出来而我只是将该引用复制到ArrayList

有没有办法“取消引用”addr只提取它的价值?

我也可能对情况的评估不正确,如果情况确实如此,请告诉我

谢谢!

4 个答案:

答案 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.somethingSearch_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);
        }