2008-12-29 5 views
0

J'utilise normalement C# et je tente de convertir un programmeur qbasic aux joies de la programmation orientée objet en lui facilitant en VB 2005.L'utilisation correcte du tableau en tant que membre de domaine en VB 2005

Voici une très simplifiée la version de ce que j'essaie d'accomplir. Il compile avec succès, mais tous les membres du tableau d'objets de carte sont définis sur "Nothing". La ligne de test lève une exception NullReferenceException. Qu'est-ce que je fais mal?

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 
+0

Bon travail en obtenant le bon 51: la plupart des programmeurs C# mettraient 52 là. –

+0

Alternativement, mauvais travail à VB pour le rendre si obscur;) (Mais oui, je ne l'aurais pas repéré ...) –

Répondre

2

Oui, lorsque vous créez un tableau dans .NET, chaque élément du tableau est réglé sur la valeur par défaut du type d'élément - qui est nulle/Rien pour les classes.

Vous devez remplir le tableau avant de l'utiliser (ou vous attendre à ce qu'il soit plein de références nulles).

Notez que cela aurait eu le même comportement en C#.

EDIT: Comme personne n'est réellement affiché le code de la population qui encore travailler, ici il est:

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 
+0

Mon espoir était que le constructeur vide pour la carte serait employé, mais apparemment il est ignoré. – scottwed

+0

Oui, il serait ignoré. Comme je l'ai dit, c'est la même chose pour VB et C# - créer un tableau ne le remplit jamais, vous vous retrouvez toujours avec les valeurs par défaut. –

+0

Maintenant que je l'ai regardé assez longtemps cela a du sens. Vous ne pouvez jamais initialiser les membres du champ lors de la déclaration directement ou dans ce cas indirectement. Merci pour l'aide – scottwed

0

Vous devez faire une sorte de

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

Toutes mes excuses si la syntaxe du car-chacun est éteint, je suis un gars C# normalement. Mais le problème de base est que vous n'avez pas initialisé chaque élément du tableau.

Questions connexes