Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
复制引用VB.NET_.net_Vb.net_Reference_Copy - Fatal编程技术网

复制引用VB.NET

复制引用VB.NET,.net,vb.net,reference,copy,.net,Vb.net,Reference,Copy,我想保留对变量的引用,但我不知道如何在.NET中保存 首先,我收到一个对这样一个对象的引用 Public Function Subscribe(ByRef var As Object) As Integer MyGlobalVar = var End Function 我希望将此引用保留在全局变量中,以便以后可以访问它并更改原始对象 但是每次我这样做的时候.NET都会创建一个副本,所以它不起作用 我找到的唯一解决方案是传递一个对象数组,但这很难看,我正在寻找其他解决方案

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

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

Public Function Subscribe(ByRef var As Object) As Integer  

    MyGlobalVar = var   

End Function
我希望将此引用保留在全局变量中,以便以后可以访问它并更改原始对象

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

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


谢谢

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

既然你看起来需要活动,那就用它们吧

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)

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

既然你看起来需要活动,那就用它们吧

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)

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

你是对的,使用一个单一的项目数组作为它的易变性是一种攻击。您可以使用
get
set
操作来更改引用类中的对象,从而构建自己的“可变引用”类。您还可以使该类对其所持有的对象的类型进行泛型

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

我在DLL中,希望用户向我传递任何类型变量的引用,以便我可以每秒更新它

您应该从下面更改向用户提供的API

Public Function Subscribe(ByRef var As Object) As Integer
为此:

Public Function Subscribe(callback As Action(Of Object) ) As Integer
当您想要更新感兴趣的值时,代码的用户将传递一个委托给您调用。然后由他们将您传递给他们的值分配给他们可能选择的任何变量


您可以存储
操作(对象)
委托,并在每次需要更新值时调用它。由您决定是否每秒更新一次,或者在值不需要更改时跳过更新。总的来说,这将在您的代码和调用者的代码之间实现更好的分离。

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

你是对的,使用一个单一的项目数组作为它的易变性是一种攻击。您可以使用
get
set
操作来更改引用类中的对象,从而构建自己的“可变引用”类。您还可以使该类对其所持有的对象的类型进行泛型

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

我在DLL中,希望用户向我传递任何类型变量的引用,以便我可以每秒更新它

您应该从下面更改向用户提供的API

Public Function Subscribe(ByRef var As Object) As Integer
为此:

Public Function Subscribe(callback As Action(Of Object) ) As Integer
当您想要更新感兴趣的值时,代码的用户将传递一个委托给您调用。然后由他们将您传递给他们的值分配给他们可能选择的任何变量


您可以存储
操作(对象)
委托,并在每次需要更新值时调用它。由您决定是否每秒更新一次,或者在值不需要更改时跳过更新。总的来说,这将在您的代码和呼叫者的代码之间实现更好的分离。

这里有点不清楚您想要什么。您是否希望以后能够通过重新分配来更改
MyGlobalVar
,并让它更改最初作为
var
传递的值?您将值类型值传递给此方法的可能性很高。是的,这不起作用,值被装箱。您需要一个指针,但VB.NET不支持它们。只向这个方法传递一个对象,如果需要的话,创建你自己的类。是的,这正是我想要做的,如果不清楚,很抱歉,这里有点不清楚你想要什么。您是否希望以后能够通过重新分配来更改
MyGlobalVar
,并让它更改最初作为
var
传递的值?您将值类型值传递给此方法的可能性很高。是的,这不起作用,值被装箱。您需要一个指针,但VB.NET不支持它们。只向这个方法传递一个对象,必要时创建你自己的类。是的,这正是我要做的,抱歉,如果不清楚,我在dll中,希望用户向我传递任何类型变量的引用,以便我可以每次更新它second@Maxime:接受回调并每秒使用更新的值调用它。如果我理解您关于事件的说法,它将不起作用,因为许多用户将订阅不同的变量。@Maxime:您可以保留一个
列表(操作(对象))
或其他什么。我在一个dll中,希望用户向我传递他任何类型变量的引用,以便我可以每次更新它second@Maxime:接受回调,并使用每秒钟更新的值调用它