Vb.net vb2005中数组作为字段成员的正确使用

Vb.net vb2005中数组作为字段成员的正确使用,vb.net,arrays,visual-studio-2005,Vb.net,Arrays,Visual Studio 2005,我通常使用C#,我试图通过让qbasic程序员轻松地使用VB 2005,将其转变为面向对象编程的乐趣 下面是我试图完成的一个极其简化的版本。它成功编译,但卡对象数组中的所有成员都设置为“无”。测试行抛出NullReferenceException。我做错了什么 Sub Main() Dim deck1 As New Deck Console.WriteLine("Test: " & deck1.cards(2).face) End Sub

我通常使用C#,我试图通过让qbasic程序员轻松地使用VB 2005,将其转变为面向对象编程的乐趣

下面是我试图完成的一个极其简化的版本。它成功编译,但卡对象数组中的所有成员都设置为“无”。测试行抛出NullReferenceException。我做错了什么

    Sub Main()
        Dim deck1 As New Deck
        Console.WriteLine("Test: " & deck1.cards(2).face)
    End Sub

    Class Card
        Public face As String
        Sub New()
            face = "Blank"
        End Sub
    End Class

    Class Deck
        Public cards(51) As Card
    End Class

是的,当您在.NET中创建数组时,数组的每个元素都被设置为元素类型的默认值-对于类,该值为null/Nothing

您需要在使用数组之前填充它(或者期望它充满空引用)

请注意,这与C#中的行为完全相同

编辑:由于目前还没有人实际发布过有效的人口代码,这里是:

Class Deck
    Public cards(51) As Card

    Public Sub New()
        For i As Integer = 0 To cards.Length-1
            cards(i) = New Card()
        Next
    End Sub
End Class

你需要做点什么

For Each currentItem As String in Me.face
 currentItem = "Blank"
End

抱歉如果for each的语法不正确,我通常是C#guy。但是最基本的问题是你没有初始化数组中的每个元素。

很好地将51设置正确:大多数C#程序员都会将52设置在那里。或者,VB将其设置得如此模糊,这是一个糟糕的工作;)(但是,是的,我不会发现它…)我的希望是使用卡片的空构造函数,但显然它被忽略了。是的,它会被忽略。正如我所说,VB和C都是一样的——创建数组永远不会填充它,你总是会得到默认值。现在我已经关注了足够长的时间,这是有意义的。在声明期间,您永远不能直接或间接初始化字段成员。感谢您的帮助对于v4来说已经太晚了,但是我希望看到为.Net 5中内置的数组中的每个元素自动调用构造函数的选项:可能使用类似于:Public cards(51)的语法作为新卡