如何初始化结构上的列表类型属性?在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
的第一个副本。如果