Я получаю ошибку при доступе к переменной в другом модуле?

#arrays #vb.net #global-variables

#массивы #vb.net #глобальные переменные

Вопрос:

У меня есть модуль, который получает значения из datagrid и помещает теги из каждой строки в массив строк. Я вызываю эту строку массива в другом модуле, но я получаю объект, не установленный для экземпляра объекта. Почему? Чего я пытаюсь достичь, так это объединить весь тег в массив строк или коллекцию и получить к нему доступ в другом модуле.

 'my main module
Public Class myMainModule
   Public Shared myArray() As String

   ......
   .......
   Public sub doSomething()
     Dim myArray As New List(Of String)
     For Each row As DataGridViewRow In mydatagrid.Rows
         If row.Cells("mycheckbox").Value = True Then
             myArray.Add(row.Tag)
         End If
     Next
  End Sub
End Class


'....then i'm calling it from another module:

Public Class myOtherModule
   Public sub doit()
     For Each value As String In myMainModule.myArray
         Debug.Print(value)
     Next
   End Sub
End Class
  

Комментарии:

1. Вы забыли Return myArray.ToArray() в конце. Option Strict Off не вызывает ошибку компиляции, когда вы ее забываете. Всегда включайте его, если можете.

2. @TyCobb, на что вы ссылаетесь в конце?

3. Чего я пытаюсь достичь, так это объединить весь тег в массив строк или коллекцию и получить к нему доступ в другом модуле.

4. Избавьтесь от локальной переменной myArray в doSomething… Также я бы либо 1 сделал это функцией для возврата вам списка, либо 2 создал свойство, к которому вы можете получить доступ, которое дает вам список, не используйте переменные, используйте свойства, так как они для этого и предназначены.

5. Я согласен с @Zaggler в использовании функций и свойств. Я бы настоятельно рекомендовал вам изучить их и собрать небольшую рабочую версию. Затем вы можете взять эту версию и перейти к codereview.stackexchange.com чтобы получить некоторое представление о лучшей структуризации вашего кода.

Ответ №1:

Вам необходимо инициализировать свой массив, прежде чем пытаться его вызвать. В настоящее время это так Nothing .

 Public Class MyMainModule
    Public Shared MyArray() As String

    Public Shared Sub DoSomething()
        Dim myList As New List(Of String)
        For Each row As DataGridViewRow In mydatagrid.Rows
         If row.Cells("mycheckbox").Value = True Then
             myList.Add(row.Tag)
         End If
        Next

        MyArray = myList.ToArray()
    End Sub
End Class

Public Class MyOtherModule
    Public Sub Foo()
        MyMainModule.DoSomething() 
        For Each value As String In MyMainModule.MyArray
            Debug.Print(value)
        Next
    End Sub
End Class
  

Другое дело, что вам нужно следить за именованием. Я полагаю, вы запутались, потому что у вас было вызвано поле myArray , но также была вызвана локальная myArray переменная. Вы работали с локальной переменной, которую вы обновили, а List(Of T) не с массивом.