2014-09-15 2 views
1

Когда я перестраивать решение, которое я получаю предупреждение:переменная используется массив, прежде чем присвоить значение

«Variable„aMyArray“используется до того, как было присвоено значение.»

Функция в VB.NET использует массив, который динамически заполняется.

Пример:

Function MyArray() 
    Try 
     Dim aMyArray() 
     For i = 0 to 100 
      ReDim Preserve aMyArray(i) 
     Next 
    Catch ex As Exception 
    End Try 
End Function 

Как я должен объявить динамически густонаселенный массив, чтобы устранить это предупреждение?

+4

Первое, что вам нужно сделать, это повернуть [Option Strict] (http://msdn.microsoft.com/en-us/library/zcd4xwzs.aspx) ** Вкл. **. Это предотвратит создание таких функций, как «Функция MyArray() As Surprise' и функции, которые должны были быть« Sub ». Затем я предлагаю вам использовать [List (Of T)] (http://msdn.microsoft.com/en-us/library/6sh2ey19 (v = vs.110) .aspx). Если нет: 'Dim aMyArray As Object() = Новый объект (-1) {}'. –

+1

Согласен на 100%, включите опцию Strict On, используйте List, а также НЕ окружайте свой код пустым Try-Catch. –

+1

@ Bjørn-RogerKringsjå, я люблю 'Function MyArray() как сюрприз' !! – Plutonix

ответ

1

Мне нравится использовать CreateInstance, чтобы избежать возможных ошибок:

Dim aMyArray() as string = Array.CreateInstance(GetType(String),0) 
+1

С этого момента я предлагаю вам объявлять и создавать экземпляры массивов * .net way *: 'Dim aMyArray As String() = New String (-1) {}' –

+0

@ Bjørn-RogerKringsjå Я делаю это так, потому что я не знать тип во время разработки. Это дает мне возможность передать ТИП и создать пустой массив (когда это необходимо) во время выполнения. Я уверен, что Array.CreateInstance не существует до .NET. – Steve

+2

Скажите, что? Если вы не знаете тип во время разработки, вы должны использовать 'Object', как показано в моем комментарии. Если вам по-прежнему нужен сильно типизированный массив, то ваш единственный вариант - это такие общие типы, как «Функция MyArray (Of T)() As T()». IMHO, это пахнет плохим дизайном, если вам нужно создать экземпляр своих массивов, используя «CreateInstance». –

2

A. Ваша функция ничего не возвращает, так что вы также должны иметь предупреждение о том

B. Вы серьезно необходимо включить Option Strict и пусть компилятор указывает на другие ошибки, такие как aMyArray не имеет типа.

C. Никогда не используйте и не пускайте Try/Catch; если есть исключение, вы должны знать, когда что-то пойдет не так (и где), чтобы вы могли это исправить.

D. Избегайте массивов, подобных чуме. ReDim Preserve aMyArray(i) создает новый массив, а затем копирует все данные в новую структуру. Это может быть дорогостоящим с точки зрения производительности, если это большой массив из чего-то типа строк. Net имеет несколько очень хороших коллекций, таких как List(of T), которые не должны быть явно изменен:

Private myList As New List(of String) ' or Integer, Decimal or even MyClassObject 
... 
myList.Add("Hello") 
myList.Add("Lists...") 
myList.Add("Goodbye") 
myList.Add("Arrays") 

D (1). Результат использования List будет означать, что вся процедура может быть устранена. Просто добавьте новые вещи в список по мере необходимости.

E. Приведенный код не может привести к предупреждению, потому что вы никогда не добавляете к нему значение. Добавление: aMyArray(2) = 2 после цикла будет привести к предупреждению. Это потому, что вы никогда полностью не объявлен массив (размер и тип), как в:

Dim aMyArray(100) As String 

ReDim просто изменяет размер массива, который разве то же самое.

F. Поскольку в вашем новом массиве нет ничего, нет оснований использовать ReDim Preserve, потому что нечего сохранять. Я предполагаю, что это должен быть какой-то расчет. С другой стороны, если вы : пытается изменить размер существующего массива, он должен быть Sub.

Мы все можем угадать, действительно ли это предназначено для изменения существующего массива (на основе ReDim Preserve) или возврата нового массива материала (учитывая, что массив объявлен в процедуре).

Опять же, ничего не нужно, используя List, Dictionary или другой тип коллекции.

+0

Спасибо за ввод. Мне нравится идея использования коллекции List. Пример не был настоящим кодом, он просто предназначен для передачи идеи и проблемы. Реальный код намного сложнее. Как и вы, мне никогда не нравились массивы и старались избегать их. –

Смежные вопросы