也许这是一个很难的问题,但我已经习惯了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或重新分配在它上面会改变原始指针本身)
提前致谢。
答案 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
.....