2010-01-02 7 views
0

J'ai une propriété qui est un tableau d'éléments, mais quand je viens d'ajouter un élément au tableau, il est dit que je dois utiliser le mot clé new , mais je ne peux pas utiliser un nouveau mot-clé avec une propriété.Impossible d'ajouter au tableau (besoin d'utiliser un nouveau mot clé) dans VB.NET

(item est une classe personnalisée.)

Private itemsvalue As item() 
Public Property Items() As item() 
    Get 
     Return itemsvalue 
    End Get 
    Set(ByVal value As DBPFindexitem()) 
     itemsvalue = value 
    End Set 
End Property 

Sub New(ByVal indexbytes As Byte(), ByVal number as integer) 

    For count As Integer = 0 To number 
     Dim offset As Integer = count * 2 * 4 
     Dim xx As New item 
     xx.Group = BitConverter.ToInt32(indexbytes, offset + 0) 
     xx.ID = BitConverter.ToInt32(indexbytes, offset + 8) 
     Items(count) = xx 
    Next 
End Sub 

Comment puis-je ajouter l'article xx au tableau des éléments?

Répondre

1

Vous devriez utiliser une collection au lieu d'une matrice.
Une collection sera automatiquement redimensionnée pour contenir autant d'éléments que vous y mettez.

Par exemple:

Private itemsvalue As New List(Of item) 
Public Property Items() As List(Of item) 
    Get 
     Return itemsvalue 
    End Get 
    Set(ByVal value As List(Of item)) 
     itemsvalue = value 
    End Set 
End Property 

Sub New(ByVal indexbytes As Byte(), ByVal number as integer) 
    For count As Integer = 0 To number 
     Dim offset As Integer = count * 2 * 4 
     Dim xx As New item 
     xx.Group = BitConverter.ToInt32(indexbytes, offset + 0) 
     xx.ID = BitConverter.ToInt32(indexbytes, offset + 8) 
     Items.Add(xx)  
    Next 
End Sub 

Si vous écrivez une bibliothèque publique, vous devez utiliser un System.Collections.ObjectModel.Collection(Of item) à la place. Cela vous permettra de le remplacer plus tard par une collection héritée avec un comportement spécial, sans casser les clients existants. Voir here.

Si vous ne voulez pas que d'autres personnes modifient la collection, vous devez exposer un System.Collections.ObjectModel.ReadOnlyCollection(Of item).


Si vous voulez vraiment utiliser un tableau, vous devez initialiser le tableau, comme ceci:

Items = New item(number) 
+0

vôtre ne fonctionnerait pas non plus, vous avez besoin Nouveau(), mais vous fixe pendant que je la mienne fixation. ;) J'aime mieux votre solution de toute façon, il devrait vraiment utiliser une collection. En outre, vous utilisez la syntaxe C#, VB.NET utilise '(Of T)' plutôt que ''. – richardtallent

+0

Merci de me rappeler la syntaxe. – SLaks

+0

Désolé, donc il y a des collections, des listes et des tableaux?Quelles sont les diffrences –

0

Vous avez déclaré le tableau privé, mais vous n'instancié.

Dans VB.NET, les tableaux sont des objets.

Private itemsvalue As New item(numItems) 

C'est là la « nouvelle » va ... aussi, vous devrez fournir des limites pour ce tableau, ce qui est pourquoi il est préférable d'utiliser List<Item> générique plutôt qu'un tableau, comme une autre personne a suggéré, mais vous devez toujours instancier la liste.

Private itemsvalue As New System.Collections.Generic.List(Of Item) 

vous pouvez appeler itemsvalue.Add (MyItem) autant de fois que nécessaire sans se soucier des limites du tableau.

+0

Cela ne fonctionnera pas - vous devez spécifier une taille. – SLaks

+0

Je ne peux pas spécifier de taille car un nombre quelconque d'éléments peut être ajouté à la matrice plus tard. Une collection serait-elle meilleure? –

+0

Oui, ce serait beaucoup mieux. Vois ma réponse. – SLaks

2

Encore une chose: à moins que vous voulez être en mesure de remplacer toute la collection Items les uns aux autres, vous voudrez peut-être se débarrasser du compositeur et de faire Items lecture seule:

Private itemsvalue As New List(Of item) 

Public ReadOnly Property Items() As List(Of item) 
    Get 
     Return itemsvalue 
    End Get 
End Property 

De cette façon, Items est initialement une liste vide et ne peut pas être modifiée en une autre collection. Si vous avez besoin d'un nouveau départ, appelez le Items.Clear().

(Cette suggestion est des lignes directrices de conception .NET Framework btw.)