2009-10-14 23 views
5

stack Overflowers:VB.NET cần một tài sản lớp là một mảng danh sách

Tôi đã được racking não của tôi đang cố gắng để có được một danh sách (T) gõ mảng đến là tài sản của một lớp. Tôi biết có phải là một cách đơn giản để làm điều đó và tôi không thể tìm thấy một ví dụ tốt trên google. Mỗi khi tôi tạo một lớp mà tôi nghĩ rằng sẽ làm việc tôi nhận được "tham chiếu đối tượng không được thiết lập để một thể hiện của một đối tượng" lỗi khi tôi cố gắng sử dụng nó. Suy nghĩ của tôi bây giờ là tôi không thể sử dụng nó theo cách tôi mong đợi. Đây là nỗ lực mới nhất của tôi:

Public Class Item 
    Private _itemno As String 
    Public Property ItemNo() As String 
     Get 
      Return _itemno 
     End Get 
     Set(ByVal value As String) 
      _itemno = value 
     End Set 
    End Property 
     //Many more properties in here 
End Class 


Public Class Accessory 
    Private _items as List(of Item) 
    Public Property Items() As List(of Item) 
     Get 
      Return _itemno 
     End Get 
     Set(ByVal value As List(of Item)) 
      _itemno = value 
     End Set 
    End Property 
End Class 

Public Class MasterItem 
    Private _item as Item 
    Public Property PrimaryItem as Item 
     Get 
      Return _item 
     End Get 
     Set(ByVal value As Item) 
      _item = value 
     End Set 
    End Property 

    Private _accessories as Accessory 
    Public Property Accessories() As Accessory 
     Get 
      Return _accessories 
     End Get 
     Set(ByVal value As Accessory) 
      _accessories = value 
     End Set 
    End Property 
End Class 

Tôi cố gắng để trở lại lớp MasterItem từ một chức năng kiểm tra như thế này:

Public Shared Function GetItem() as MasterItem 
    Dim testItem as new MasterItem 

    ReturnItem.PrimaryItem.ItemNo = "TEST123" 

    ReturnItem.Accessories.Items.add(New Item("TESTACC1")) 
    ReturnItem.Accessories.Items.add(New Item("TESTACC2")) 

    Return testItem 
End Function 

Tôi đang làm gì sai ở đây? Cảm ơn trước.

+0

Danh sách không phải là mảng. – recursive

+0

Bạn nói đúng - đó là một bộ sưu tập. Đã muộn khi tôi gõ nó. – NinjaBomb

Trả lời

12

Bạn chưa tạo danh sách danh sách bạn đang cố gắng đưa mục vào.

Khởi tạo nó trong hàm tạo của lớp Phụ kiện của bạn. Một cái gì đó như

Public Sub New() 
    _items = New List(Of Item) 
End Sub 
1

Bạn có 2 lựa chọn để tránh những NullReferenceException:

1) Cách tiếp cận elder_george đề cập, nơi bạn khởi tạo tài sản để một trường hợp mới của lớp:

Dim ReturnItem As New MasterItem 
ReturnItem.PrimaryItem = New Item() 
' or check for null then initialize (optional, depends on your needs) 
If ReturnItem.PrimaryItem Is Nothing Then ReturnItem.PrimaryItem = New Item() 

Các vấn đề với cách tiếp cận này là nếu bạn không khởi tạo nó ở đâu đó mà bạn biết nó sẽ luôn luôn hợp lệ để sử dụng sau này, bạn sẽ phải làm cùng một kiểm tra và/hoặc khởi tạo. Đó là "một nơi nào đó" có thể là trên một tải hình thức hoặc như vậy.

2) Khởi tạo biến cửa hàng sao lưu của thuộc tính. Làm điều này một lần và bạn không cần phải kiểm tra null tất cả các thời gian. Chú ý sự thay đổi trong _item khai dưới đây:

Public Class MasterItem 
    Private _item as Item = New Item() 
    Public Property PrimaryItem as Item 
     Get 
      Return _item 
     End Get 
     Set(ByVal value As Item) 
      _item = value 
     End Set 
    End Property 
End Class 

Với trên tại chỗ, bạn sẽ truy cập trực tiếp như:

Dim ReturnItem As New MasterItem 
ReturnItem.PrimaryItem.ItemNo = "TEST123" 
+0

Tôi biết nó là một cái gì đó đơn giản, tôi chỉ cần giữ lại nhìn. Tùy chọn # 2 sẽ phù hợp với hoàn cảnh của tôi một cách hoàn hảo. Cảm ơn. – NinjaBomb

+0

Đã thay đổi câu trả lời của tôi thành bài đăng của elder_george sau khi thực hiện một số nghiên cứu bổ sung và kiểm tra cả hai đề xuất. – NinjaBomb

0

thử một cái gì đó như thế này ..

Public Class ActiveInfo 
    Private _services As List(Of ActiveService) 

    Public Sub New() 
     _services = New List(Of ActiveService) 
    End Sub 
    Public Property Services() As List(Of ActiveService) 
     Get 
      Return _services 
     End Get 
     Set(ByVal value As List(Of ActiveService)) 
      _services = value 
     End Set 
    End Property 
End Class 

Đó là làm việc tốt với tôi ...

Các vấn đề liên quan