如何初始化结构上的列表类型属性?在vb.net中
这就是我尝试使用的结构:如何初始化结构上的列表类型属性?在vb.net中,vb.net,properties,initialization,structure,Vb.net,Properties,Initialization,Structure,这就是我尝试使用的结构: Public Structure Point Public Property id As Integer Public Property x As Integer Public Property y As Integer Public Property Points As List(Of Point) Public ReadOnly Property key As String
Public Structure Point
Public Property id As Integer
Public Property x As Integer
Public Property y As Integer
Public Property Points As List(Of Point)
Public ReadOnly Property key As String
Get
Return x & "," & y
End Get
End Property
Public Sub Add(t As Point)
If Points Is Nothing Then
Points = New List(Of Point)
End If
Points.Add(t)
End Sub
End Structure
以下代码是尝试使用点结构的代码:
Dim l = New List(Of Point)
Dim t = new Point 'test point
l.Add(t)
l(l.Count - 1).Add(t)
查看“局部变量”窗口中的l(0).点,该属性始终为空
为什么会这样
已解决:以下代码似乎有效:
Public Structure Point
Public Property id As Integer
Public Property x As Integer
Public Property y As Integer
Private _points As List(Of Point)
Public ReadOnly Property Points() As List(Of Point)
Get
If _points Is Nothing Then
_points = New List(Of Point)
End If
Return _points
End Get
End Property
Public ReadOnly Property key As String
Get
Return x & "," & y
End Get
End Property
Public Sub Add(t As Point)
If _points Is Nothing Then
_points = New List(Of Point)
End If
_points.Add(t)
End Sub
End Structure
用法:
Dim l = New List(Of Point)
Dim t = new Point 'test point
t.add(t)
l.Add(t)
我猜您提到的错误是
NullReferenceException
,解决方案是在使用New
关键字访问之前创建一个实例
您已经在Add
方法中这样做了,但是您应该在构造函数中创建实例
此外,如果您没有充分的理由使用可变的结构,那么您可能应该使用类
回应您的编辑:
查看“局部变量”窗口中的l(0).点,属性始终为
没什么
为什么会这样
这就是为什么我说如果没有充分的理由,不要使用可变的结构
如果调用l.Add(t)
,则t
的副本将添加到l
当您通过l(l.Count-1).Add(t)
访问点
项时,您将创建点
的另一个副本,然后将t
的另一个副本添加到第二个副本中
在t
的第二个副本上调用Add
。当您查看l(0)
时,实际上会看到t
的第一个副本
如果这不是您想要的行为,请使用类
我猜您所说的错误是NullReferenceException
,解决方案是在使用New
关键字访问之前创建一个实例
您已经在Add
方法中这样做了,但是您应该在构造函数中创建实例
此外,如果您没有充分的理由使用可变的结构,那么您可能应该使用类
回应您的编辑:
查看“局部变量”窗口中的l(0).点,属性始终为
没什么
为什么会这样
这就是为什么我说如果没有充分的理由,不要使用可变的结构
如果调用l.Add(t)
,则t
的副本将添加到l
当您通过l(l.Count-1).Add(t)
访问点
项时,您将创建点
的另一个副本,然后将t
的另一个副本添加到第二个副本中
在t
的第二个副本上调用Add
。当您查看l(0)
时,实际上会看到t
的第一个副本
如果这不是您想要的行为,请在每次访问point属性时使用类
检查它是否与您在add函数中所做的完全不同
最好的方法是放置一个构造函数来初始化列表(您可能需要将其更改为类)。您还可以有一个初始化函数,该函数在每次创建新实例时都是类
Public Structure Point
Public Sub Initialize()
Points = New List(Of Point)
End Sub
...
End Structure
我只是注意到另一个评论。如果私有变量仍然是空的,那么可以使用一个属性来初始化它
Private _points As List(Of Point)
Public ReadOnly Property Points() As List(Of Point)
Get
If _points Is Nothing Then
_points = New List(Of Point)
End If
Return _points
End Get
End Property
每次访问point属性时,都需要检查它是否与add函数中的操作完全不同
最好的方法是放置一个构造函数来初始化列表(您可能需要将其更改为类)。您还可以有一个初始化函数,该函数在每次创建新实例时都是类
Public Structure Point
Public Sub Initialize()
Points = New List(Of Point)
End Sub
...
End Structure
我只是注意到另一个评论。如果私有变量仍然是空的,那么可以使用一个属性来初始化它
Private _points As List(Of Point)
Public ReadOnly Property Points() As List(Of Point)
Get
If _points Is Nothing Then
_points = New List(Of Point)
End If
Return _points
End Get
End Property
奇怪的是,尝试使用这种结构时,我调用add方法将一些点添加到点列表中。调试器中的本地窗口总是返回Points=nothing我需要每个点都是可变的。i、 e.将P作为新点进行调整,并且调整T=P如果我将T.x=0,则不得影响P。x@CharlesO如果您创建一个点实例,那么当您执行T=P时,它们都将具有相同的列表实例。true…但即使在调用Add之后,也始终为空。不要相信我的话。。。把它放在你的本地窗口中,看看我的意思。这就是为什么我说如果你没有充分的理由,不要使用可变的结构。如果调用l.Add(t)
,则t
的副本将添加到l
。当您通过l(l.Count-1).Add(t)
访问点
项时,您将创建点
的另一个副本,然后将t
的另一个副本添加到第二个副本中<在t
的第二个副本上调用code>Add
。当您查看l(0)
时,实际上会看到t
的第一个副本。如果这不是您想要的行为,请使用类
。奇怪的是,尝试使用此结构时,我调用add方法将一些点添加到点列表中。调试器中的本地窗口总是返回Points=nothing我需要每个点都是可变的。i、 e.将P作为新点进行调整,并且调整T=P如果我将T.x=0,则不得影响P。x@CharlesO如果您创建一个点实例,那么当您执行T=P时,它们都将具有相同的列表实例。true…但即使在调用Add之后,也始终为空。不要相信我的话。。。把它放在你的本地窗口中,看看我的意思。这就是为什么我说如果你没有充分的理由,不要使用可变的结构。如果调用l.Add(t)
,则t
的副本将添加到l
。当您通过l(l.Count-1).Add(t)
访问点
项时,您将创建点
的另一个副本,然后将t
的另一个副本添加到第二个副本中<在t
的第二个副本上调用code>Add
。当您查看l(0)
时,实际上会看到t
的第一个副本。如果