【问题标题】:Can't figure out making an Array based off of a Class无法弄清楚基于类制作数组
【发布时间】:2021-12-22 08:46:58
【问题描述】:

我想做的是从一个包含信息列表的类创建一个数组。

到目前为止我尝试过的是 - 首先,创建类:

Public Class PowerArray
    Public Name As String
    Public Action As String
    Public Cost As Integer
    Public Pool1 As String
    Public Pool2 As String
    Public Range As String
    Public Duration As String
    Public Tags As ArrayList = New ArrayList
    Public Desc As String
End Class

然后,定义一个使用 PowerArray 作为类型的新对象,包含在公共类中,以便可以在任何子类中调用它:

Public Class GVar
    Public Shared CharPowers(100) As PowerArray
    Public Shared PCount As Integer = 0
End Class

但是当我尝试写入该对象时,它不断抛出空引用异常。

例子:

尝试向 CharPowers(GVar.Pcount) 写入条目(其中 PCount 当前为 0,“txt.PowerName.Text”为任意字符串):

GVar.CharPowers(GVar.PCount).Name = txtPowerName.Text

...抛出异常。无论我尝试写入哪个值,都会发生这种情况。

在使用该类型(不是数组,而只是一个简单的对象)在 sub 中定义新对象时,我没有遇到任何重大的挂断,所以我猜它是一个数组的对象投掷适合。我只是无法弄清楚如何或为什么。它显然存在,它是在启动时定义的。

【问题讨论】:

  • fwiw,你应该从不使用ArrayList。它是在 .Net 2.0 泛型之前创建的,并且在今天专门用于向后兼容和一些 powershell 支持,但 在新代码中根本没有位置。即使你真的不知道你会用这个集合做什么,你仍然应该倾向于List(Of Object)
  • 为什么吃掉PowerArray字段的所有成员而不是Properites?

标签: arrays vb.net nullreferenceexception


【解决方案1】:

GVar 中的数组是一个元素数组,类型为 PowerArray,值为 Nothing。您必须创建PowerArray 的实例并将其分配给数组元素,然后才能设置PowerArray 对象的字段。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim PA As New PowerArray
    GVar.CharPowers(GVar.PCount) = PA
    GVar.CharPowers(GVar.PCount).Name = TextBox1.Text
    MessageBox.Show(GVar.CharPowers(GVar.PCount).Name)
End Sub

您是否打算增加PCount?如果您使用List(Of PowerArray),则无需跟踪您在数组中的位置。

编辑

Public Class PowerArray
    Public Property Name As String
    Public Property Action As String
    Public Property Cost As Integer
    Public Property Pool1 As String
    Public Property Pool2 As String
    Public Property Range As String
    Public Property Duration As String
    Public Property Tags As New List(Of Object)
    Public Property Desc As String
End Class

Public Class GVar
    Public Shared Property CharPowers As New List(Of PowerArray)
End Class

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim PA As New PowerArray
    PA.Name = TextBox1.Text
    GVar.CharPowers.Add(PA)
    For Each item As PowerArray In GVar.CharPowers
        MessageBox.Show(item.Name)
    Next
End Sub

【讨论】:

  • 我只是在想类似的事情,然后开始在 List 周围闲逛。但是,遇到了一个新问题 - 无法弄清楚如何从 PowerArray 的 List 对象中的特定变量中添加或删除项目。示例:设置一个新对象 - Public Shared ChrTester As New List(Of PowerArray) - 然后尝试向其中的特定值添加一个条目:GVar.ChrTester.Add(GVar.ChrTester.Name "steve") - 我是List 的工作原理肯定会遗漏一些东西,但它对我来说还是很新的。
  • 查看我对答案的编辑。我对类进行了一些修改,并演示了如何添加和检索属性。
  • 非常好!假设多个添加(PA.Name = x,PA.Cost = x 等)是否正确,然后执行 GVar.CharPowers.Add(PA) 将添加分配给 PA 的所有值?
  • 无法编辑之前的评论,但是:回答了我自己的问题,是的!使用此设置从列表加载也容易得多,感谢您解释列表。这件事改变了生活
  • @ecit 我同意。阵列位于后视镜中。如果我需要一个数组,我可以随时在List(Of T) 上调用ToArray
【解决方案2】:

似乎我被一个答案绊倒了。特别是:

Public Class GVar
    Public Shared CharPowers(100) As PowerArray
    Public Shared PCount As Integer = 0
    Shared Sub New()
        For i = 0 To CharPowers.GetUpperBound(0)
            CharPowers(i) = New PowerArray
        Next
    End Sub
End Class

【讨论】:

猜你喜欢
  • 2013-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-11
  • 1970-01-01
  • 2014-08-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多