【问题标题】:Copy a reference VB.NET复制参考VB.NET
【发布时间】:2013-07-30 23:25:08
【问题描述】:

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

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

Public Function Subscribe(ByRef var As Object) As Integer  

    MyGlobalVar = var   

End Function

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

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

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

谢谢

【问题讨论】:

  • 有点不清楚你在这里要求什么。您是否希望稍后能够通过重新分配来更改 MyGlobalVar 并让它更改最初作为 var 传递的值?
  • 您将值类型值传递给此方法的可能性很高。是的,这不起作用,该值被装箱。您需要一个指针,但 VB.NET 不支持它们。仅将对象传递给此方法,如有必要,请创建自己的类。
  • 是的,这正是我想要做的,如果不清楚,抱歉

标签: .net vb.net reference copy


【解决方案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)

【讨论】:

  • 我在一个 dll 中,希望用户将他的任何类型变量的引用传递给我,这样我就可以每秒更新它
  • @Maxime: 接受一个回调并以每秒更新的值调用它。
  • 如果我理解你所说的事件,它不会起作用,因为许多用户会订阅不同的变量。
  • @Maxime:那你可以留个List(Of Action(Of Object))什么的。
【解决方案2】:

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

您是正确的,使用单项数组来实现其可变性是一种 hack。相反,您可以构建自己的“可变引用”类,使用 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) 委托,并在每次要更新值时调用它。您可以每秒更新一次,或者在不需要更改值时跳过更新。总体而言,这将更好地分离您的代码和调用者的代码。

【讨论】:

  • 好的,我明白了,这可以工作。我更喜欢指针,但如果不可能,那么这是我最好的解决方案。谢谢! @minitech 也是
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-30
  • 1970-01-01
  • 1970-01-01
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多