#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)
не с массивом.