2013-06-21 4 views
0

Я работаю в vb.net, где у меня есть класс, как показано ниже:Как проверить пустой массив

Public Class vertex 
    Public wasVisited As Boolean 
    Public name, type As String 
    Public x_pos, y_pos As Double 

    Public Sub New(ByVal x_pos As Double, ByVal y_pos As Double, ByVal name As Integer, ByVal type As String) 
     Me.x_pos = x_pos 
     Me.y_pos = y_pos 
     Me.name = name 
     Me.type = type 
     wasVisited = False 
    End Sub 
End Class 

У меня есть объект какого-то другого класса с именем, как «графа», где в конструктор класса графов Я звоню конструктор вершинного класса.

У меня есть массив класса вершины: Public вершин() в качестве вершины

И Redim вершин (2000): изменение размера массива снова по какой-то причине.

Теперь, когда я цикл массив, чтобы проверить пустое значение, которое он выдает ошибку:

объекта не задана ссылка на экземпляр объекта. (Поскольку значение не содержит «ничего»)

даже если я проверить, как это,

If (vertices(i).name) Is Nothing Then 
      Exit For 
     End If 

Как я могу проверить пустой элемент массива?

ответ

1

Поскольку вы, кажется, хотите, чтобы ваша коллекция будет динамичным, список (из вершины) будет служить вам лучше. что наряду с конструктором New() по умолчанию, и вы можете добавлять, удалять, сортировать, искать, что вам нужно. Для проверки пустого значения вы можете использовать If Vertices(i).name = "" then

Public Class vertex 
    Public wasVisited As Boolean 
    Public name, type As String 
    Public x_pos, y_pos As Double 
    Public Sub New() 
     wasVisited = False 
     name = "" 
     type = "" 
     x_pos = 0 
     y_pos = 0 
    End Sub 

    Public Sub New(ByVal x_pos As Double, ByVal y_pos As Double, ByVal name As String, ByVal type As String) 
     Me.x_pos = x_pos 
     Me.y_pos = y_pos 
     Me.name = name 
     Me.type = type 
     wasVisited = False 
    End Sub 
End Class 

Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
    Dim Vertices As New List(Of vertex) 
    For I = 0 To 99 
     Vertices.Add(New vertex()) 
     Vertices(I).name = "Test" + I.ToString 
    Next 
End Sub 
0

Вы пробовали:

If Not vertices Is Nothing AndAlso Not vertices(i) Is Nothing _ 
      AndAlso Not vertices(i).name Is Nothing Then 

    Dim value as string= vertices(i).name 

End If 
1

Что размер vertices() перед операцией Redim? Если он меньше 2000, то добавленные элементы будут Nothing сразу после расширения массива, поэтому, когда вы пытаетесь получить доступ к свойству namevertices(i) для значений i, выходящих за пределы начального размера массива, вы на самом деле пытаетесь разыменовать нулевой ссылка на объект.

Вы либо должны проверить, что vertices(i)IsNotNothing перед испытанием для значения его свойств или убедитесь, что каждый элемент массива присваивается new vertex объект.

If vertices(i) Is Nothing OrElse vertices(i).name Is Nothing Then 
    Exit For 
End If 

Вот нить на vbforums о подобной проблеме: http://www.vbforums.com/showthread.php?546668-RESOLVED-Redim-array-of-objects