当我尝试更改Structs的ArrayList中的一个值时,我收到了一个后期绑定错误。当我尝试更改SetDistance()成员中的Distance值时。请告诉我如何成功更改此值。非常感谢。
Public Class ClientClass
Private Structure Client
Public Address As String
Public Distance As Double
End Structure
Private ClientList As ArrayList
Public Sub New()
ClientList = New ArrayList
End Sub
Public Sub Add(Address As String)
Dim NewClient As Client
NewClient.Address = Address
NewClient.Distance = 0.0
ClientList.Add(NewClient)
End Sub
Public Sub SetDistance(Address As String, Distance As Double)
Dim Index As Integer = GetIndexOf(Address)
If Index <> -1 Then ClientList(Index).Distance = Distance 'ERROR
End Sub
Public Function GetIndexOf(Address As String) As Integer
If ClientList.Count = 0 Then Return -1
Dim Index As Integer
For Index = 0 To ClientList.Count - 1
If ClientList(Index).Address = Address Then Return Index
Next
Return -1
End Function
End Class
答案 0 :(得分:0)
第一个问题是您使用的是ArrayList
。别。自.NET 2.0以及List(Of T)
类的引入以来,它们已经过时了。如果您想要一组Client
值,请使用List(Of Client)
。然后Item
属性将返回Client
值而不是Object
引用。 Object
类没有Distance
属性,因此是后期绑定问题。
但这只会突出另一个问题。这不起作用:
ClientList(Index).Distance = Distance
即使ClientList
是List(Of Client)
。那是因为Client
是一个值类型,因此ClientList(Index)
将返回集合中值的COPY,而不是实际值。该代码将修改副本,然后立即丢弃它,因此在执行此操作时不会执行任何有用的操作。出于这个原因,它甚至不被允许。您需要做的是获取副本,将其分配给变量,进行更改,然后将副本推回到集合中:
Dim client = ClientList(Index)
client.Distance = Distance
ClientList(Index) = client
问题是,如果你允许编辑属性,那么你真的应该使用类而不是结构。您不必遵循此规则,但最好使结构不可变,即一旦创建就无法修改。