对于每个像本地var一样的变量?

时间:2011-04-21 13:29:31

标签: vb.net variables foreach

我偶然发现了一些我不太清楚的逻辑。让我们用下面的代码:

For Each ds As DerivedScale In List
    If ds.ScaleID = scaleId Then
        ds.ScaleID = ds.ScaleID + scaleStep
        CType(List(myCounter + scaleStep), DerivedScale).ScaleID = scaleId
        myDerivedScale = ds
        ds = List(myCounter + scaleStep)          <---------------------
        List(myCounter + scaleStep) = myDerivedScale
        Exit For
    End If
    myCounter += 1
Next

这篇文章是为2个记录而改变位置并更改序列号(scaleid)。箭头表示问题发生的位置。项目“ds”由对象1索引号更高/更低替换。但这不会影响List中的该对象。因此,当我检查时,项目ds未设置。

但是,当我查看ds.ScaleId = ds.ScaleID + scaleStep时,这会反映在List中。

所以我想知道的是:“ds”在这里表现得像一个局部变量,我只能对它的属性进行更改吗?

提前致谢。

4 个答案:

答案 0 :(得分:2)

ds是对列表也引用的对象的引用。因此,当您在其上设置属性时,这些更改也会反映在列表中。但是因为ds只是参考,正如你猜测的那样,改变它所引用的内容不会影响列表。

答案 1 :(得分:1)

你需要通过索引而不是枚举器来遍历列表(你所获得的只是一个引用)。然后,您可以按索引交换对象并更改其属性。

答案 2 :(得分:0)

.Net中的对象通过引用传递。

您的列表中只有一个DerivedScale个实例; For Each循环遍历列表中的相同实例 没有复制品;你正在修改对象本身。

答案 3 :(得分:0)

该变量的作用域是声明它的循环。重新分配ds不会改变列表,因为ds和列表都有对某个项的对象引用,您只是在不影响列表的情况下更改ds引用的项。