1

我想保留对变量的引用,但我不知道如何在 .NET 中

首先,我收到一个对像这样的对象的引用

Public Function Subscribe(ByRef var As Object) As Integer  

    MyGlobalVar = var   

End Function

我想将此引用保存在全局变量中,以便以后可以访问它并更改原始对象。

但是每次我这样做时.NET都会创建一个副本,所以它不起作用。

我找到的唯一解决方案是传递一个 Object 数组,但这很难看,我正在寻找其他解决方案。

谢谢

4

2 回答 2

1

如果您的意思是“实际更改原始变量指向的内容”,不,那是不可能的。一个更干净的方法可能是将它放在一个类中,但这真的取决于你的情况。

但是,由于您看起来需要事件,因此请使用它们!

Public Event SomethingHappened As EventHandler(Of Object) ' Or whatever type

如果你真的喜欢:

Public Sub Subscribe(cb As EventHandler(Of Object))
    AddHandler SomethingHappened, cb
End Sub

每秒一次:

RaiseEvent SomethingHappened(42)
于 2013-07-30T15:04:47.193 回答
0

.NET 中没有引用变量,只有ByRef参数。您可以将对变量的引用传递给方法,但是一旦方法结束,该引用也会消失。

您是正确的,使用单项数组来实现其可变性是一种技巧。您可以构建自己的“可变引用”类,并使用getset操作更改引用类中的对象。您还可以使该类在它所拥有的对象的类型上通用。

但是,很有可能需要使用全局变量是您之前做出的一些糟糕的设计选择的结果。如果没有看到你的设计的其余部分,很难确定,但如果你能想出一种方法来消除这个全局,那么需要存储引用的问题也将得到解决。例如,知道

我在一个 DLL 中,并希望用户将他的任何类型的变量的引用传递给我,这样我就可以每秒更新它

您应该从这里更改您呈现给用户的 API

Public Function Subscribe(ByRef var As Object) As Integer

对此:

Public Function Subscribe(callback As Action(Of Object) ) As Integer

当您想要更新感兴趣的值时,您的代码的用户将传递一个委托供您调用。然后由他们将您传递给他们的值分配给他们可能选择的任何变量。

您可以存储Action(Of Object)委托,并在每次要更新值时调用它。您可以每秒更新一次,或者在不需要更改值时跳过更新。总体而言,这将在您的代码和调用者的代码之间实现更好的分离。

于 2013-07-30T15:11:26.563 回答