VB.NET参考/指向变量的引用

3

我知道我不能动态地引用一个变量(例如,“var&var.Close()”)。 我能否以某种方式拥有一个变量,可以根据名称指向另一个变量?

我的当前代码是(其中func()需要一个数组):

Dim playerNum As String = “P1”
Select Case playerNum
  Case “P1”
    Func(P1(x, xx))
  Case “P2”
    Func(P2(x, xx))
  .........
End Select

这种方式是否可行?

Dim playerNum As varNameRef = P1(,)
Func(playerNum(x, xx))

非常希望能有任何方法来阻止如此多的重复,感激不尽。 谢谢。


2
你可以使用反射来实现这个,但是除非你有数百个类似的方法,否则可读性/可维护性成本不值得。 - Joel Etherton
谢谢您的回复。我相信您的话 - 我只有20个案例。 - Ben Mate
你可以将适当函数的委托存储在字典中。这样,你只需要一行代码就能通过键引用函数。 - Nico Schertler
你能详细说明一下为什么“动态引用变量”对你的应用程序操作至关重要吗?我不禁想,通过重构代码更好地利用引用、类、索引器等,你会省去很多麻烦。例如,SteveDog提出使用字典将“playerNum”连接到适当的“PlayerData”是朝着正确方向迈出的一步。 - rskar
@rskar 不是这样的。我只是在项目开始时进行了一些试验。SteveDog的答案解决了我的直接问题,并且从长远来看肯定会使事情更有效。 - Ben Mate
2个回答

1
你需要的是一个引用类型(类),而不是值类型(结构体)。例如,如果你创建了一个类来存储你的数组作为属性,就像这样:
Public Class PlayerData
    Public Data(10, 30) As Object
End Class

这也使您能够轻松扩展有关每个玩家存储的数据的优势。然后,您可以使用多个变量引用相同的PlayerData对象:
Dim player1 As New PlayerData()
Dim player2 As New PlayerData()
Dim player As PlayerData = Nothing
Select Case playerNum
    Case “P1”
        player = player1
    Case “P2”
        player = player2
End Select
Func(player.Data(x, xx))

然而,将它们存储为键值对的字典会更好,例如:

Dim players As New Dictionary(Of String, PlayerData)()
players("P1") = New PlayerData()
players("P2") = New PlayerData()

然后,您可以像这样访问您的播放器:

Func(players(playerNum).Data(x, xx))

1
你可以通过反射实现这个功能,但出于性能、可读性和可维护性的考虑,我建议不要使用。
如果你真的想要,你可以使用 Actions(Of T),例如:
Class Player
    Public Name As String
End Class

Sub play(player As Player)
    Console.WriteLine(player.Name & " plays now")
End Sub

创建一些玩家以进行演示:

Dim playerList As New List(Of Player)
For i As Int32 = 1 To 10
    Dim p = New Player() With {.Name = "P" & i}
    playerList.Add(p)
Next

playerList.ForEach(AddressOf play)    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接