Я не уверен на 100%, но я думаю, что проблема в этом разделе:
Dim sMyArray as Array()
For i As Integer = 0 to 3
sMyArray = Nothing ' resetting the array before refilling it
Массивы технически являются ссылочными типами, но, как и строки, есть некоторая дополнительная магия компилятора, чтобы они иногда воспринимались как типы значений, и у меня есть ощущение, что в этом случае использовалась фактическая ссылка sMyArray
(возможно, из-за ParamArrays
оптимизация), так что установка на Nothing
сломала вещи. Более идиоматический способ написать этот код для .Net это так:
For i As Integer = 0 to 3
Dim sMyArray as Array()
.Net имеет гораздо более сложный сборщик мусора, чем был доступен для VB6. Мы уже не часто устанавливаем переменные на Nothing
, но вместо этого просто переназначаем их или позволяем им выпадать из области видимости. Фактически, установка переменной на Nothing
может в редких случаях быть активно вредной. Более того, мы хотим видеть ключевое слово Dim
внутри цикла, поэтому вы работаете с различной переменной на каждой итерации с наименьшей возможной областью действия.
Пока я здесь, в .Net мы в значительной степени никогда не используем базовый тип Array
. Вместо этого:
Private sArr As Array()
Вы в значительной степени всегда делаете это:
Private arr As String()()
или это для истинных двумерных (не зубчатых) массивов:
Private arr As String(,)
или, что лучше всего, это:
Private arr As New List(Of String())
Поскольку VB.Net имеет больше типов коллекций, чем просто массив.
Кроме того, у меня нет удобной ссылки, но руководящие принципы Microsoft по кодированию теперь прямо просят вас , а не использовать венгерские бородавки для имен переменных и классов (поэтому sArr
может быть просто arr
) , Это изменение эпохи VB6 из-за изменений в языке, где тип, скорее всего, неявно связан с переменной, и улучшений в инструментах, где префиксы обычно больше не добавляют много полезности и, как было показано, ухудшают читабельность.