.net中的对象引用和重新赋值问题

时间:2010-11-17 11:40:42

标签: .net vb.net pointers reference

也许这是一个很难的问题,但我已经习惯了c ++的指针和引用,这让我感到困惑。假设我在VB.net应用程序中有以下场景:

Dim x As New Dictionary(Of String, MyType)
'I add stuff to x
Dim y As MyObject= x("foo1")
'later...
y = New MyType()
'now y and x("foo1") don't point to the same instance anymore

情况是这样的:我有一组对象,并且在执行程序期间,可以从集合中提取任何对象以供程序的另一部分使用/编辑。现在很明显,如果我编辑对象内部的数据就可以了,但是如果我想替换对象怎么办,就像我在第5行上面所做的那样?我只会更改本地引用(y),但不会更改集合中的对象!有没有解决的办法?我怎样才能带上“对象引用的引用”,而不仅仅是引用,所以如果我重新分配它,它还会重新分配集合中的那个?我希望我能让自己清楚,不幸的是英语不是我的母语,要明确:在c ++中,使用指针指针,或者总是通过引用将指针传递给对象,这很容易,所以调用new或重新分配在它上面会改变原始指针本身)

提前致谢。

4 个答案:

答案 0 :(得分:3)

您不能在VB.NET中使用指针(或C#,但通过unsafe代码除外)。

相反,要更改已分配给y的字典中的原始值,您需要通过字典对象本身再次访问 ,而不是通过已删除的引用:

x("foo1") = New MyType()

原因是字典中指定位置的值(“foo1”)被分配给y,而不是字典中对位置本身的引用。我不确定您使用DataObject类的原因,但y在代码中分配时会保留MyType类型的值。为y分配新值只会更改y的值,而不会更改字典中的原始值。它不知道这个价值。想想它本质上就好像你从字典中提取了一个值并将其放在y变量中。没有办法复制字典中页面的引用。

答案 1 :(得分:2)

你会在词典中做到这一点:

C#:

 x["foo1"] = new MyType();
 y = x["foo1"];

VB:

 x("foo1") = New MyType()
 y = x("foo1")

答案 2 :(得分:2)

如果你确实需要“指向指针”的东西(因为你无权访问字典),你需要为你的条目添加一个间接级别:

Class PointerToMyType
    Public Value As MyType
End Class

Dim x As New Dictionary(Of String, PointerToMyType)  

'' add value
x("foo1") = New PointerToMyType() With {.Value = New MyType()}

Dim y As PointerToMyType = x("foo1")  
'' use y.Value

'' later...  
y.Value = New MyType()

'' now y and x("foo1") still point to the same instance

答案 3 :(得分:1)

我不太确定我是否确切地知道你想要实现的目标,但如果我理解正确,你希望新的y对象也能在X集合中被引用。

如果是这种情况,那么应该这样做

Dim y As DataObject = x("foo1")
'later...
.....
y = New MyType()
//Reassign the new y object to the x collection
x("foo1") = y
.....