无法弄清楚基于类制作数组

Can't figure out making an Array based off of a Class

提问人:ecit 提问时间:11/10/2021 最后编辑:halferecit 更新时间:11/26/2021 访问量:106

问:

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

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

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 中,因此可以在任何 sub 中调用它:

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

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

例:

尝试将条目写入 CharPowers(GVar.Pcount)(其中 PCount 当前为 0,并且“txt.PowerName.Text“是任何字符串):

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

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

在使用该类型(不是作为数组,而只是一个简单的对象)在子中定义一个新对象时,我没有遇到任何重大的挂断,所以我猜是该对象是一个数组。我只是不知道如何或为什么。它显然存在,它是在启动时定义的。

数组 vb.net NullReferenceException

评论

1赞 Joel Coehoorn 11/10/2021
fwiw,你几乎永远不应该使用 .它是 pre-.Net 2.0 泛型创建的,今天仍然存在,专门用于向后兼容性和一些 powershell 支持,但在新代码中根本没有位置。即使你真的不知道你会用这个集合做什么,你仍然应该倾向于喜欢。ArrayListList(Of Object)
0赞 Mary 11/10/2021
为什么要吃掉 PowerArray 字段的所有成员而不是 Properites?

答:

0赞 ecit 11/10/2021 #1

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

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

评论

0赞 Edward 11/10/2021
您需要先初始化数组 GVar.CharPowers,然后使用它。检查 learn.microsoft.com/en-us/dotnet/visual-basic/programming-guide/...GVar.CharPowers = Array.CreateInstance(GetType(PowerArray), 19)
0赞 djv 11/10/2021
@Edward您评论中的 19 应该是 100?
0赞 Edward 11/11/2021
@djv 19 是数组大小。似乎主题启动器应该使用字典(Of <key_type>,PowerArray)
0赞 Mary 11/10/2021 #2

数组 in 是一个元素数组,类型为 ,值为 。必须先创建元素的实例并将其分配给元素(数组),然后才能设置对象的字段。GVarPowerArrayNothingPowerArrayPowerArray

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

你打算递增吗?如果您使用 .PCountList(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

评论

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