Использование ParamArray ByRef - PullRequest
0 голосов
/ 10 ноября 2010

Есть ли способ использовать ParamArray ByRef?За исключением того, есть ли обходной путь, который выполняет то же самое?

Я мог бы сделать несколько перегрузок, но я пытаюсь избежать глухоты.

Справочная информация: портирование через какой-то старый код и попытка сохранить как можно большую структуру.


РЕДАКТИРОВАТЬ

Конкретный пример того, что я хочу:

У меня есть некоторый код в TurboBasic, который я портирую на vb.net.В код встроены такие функции, как

Input#1,Data$(I%,1),Data$(I%,2),Data$(I%,3)

Где Input () получает файл # 1, считывает из него три фрагмента данных и присваивает его трем показанным переменным.Я хотел бы повторить это поведение с моей собственной функцией Input ().Чтобы сделать это, как мне взять три (или больше, или меньше) переменных и присвоить им значения?

В идеале я бы достиг этого, изменив только мое собственное определение Input (), чтобы я мог как можно меньше заглядывать в кодовую базу.

Ответы [ 3 ]

2 голосов
/ 10 ноября 2010

Я никогда не использовал TurboBasic, но синтаксис выглядит идентично выражению VB6 Input # , поэтому я предполагаю, что семантика также одинакова

Этот код VB6

Input #1,Data$(I%,1),Data$(I%,2),Data$(I%,3)

эквивалентно этому VB.Net

Input(1,Data$(I%,1))
Input(1,Data$(I%,2))
Input(1,Data$(I%,3))

Мастер обновления VB.Net преобразует оператор VB6 Input # следующим образом. Я бы просто портировал код таким образом, а не реализовывал вашу собственную функцию. Преобразование из VB6 в VB.net требует существенных правок в базе кода, я ожидаю, что TurboBasic будет еще более требовательным.

1 голос
/ 10 ноября 2010

В настоящее время нет способа передать ParamArrays по ссылке в VB.NET. Чтобы передать последовательность указанных значений в метод, который принимает ParamArray, CLR заполняет массив соответствующей длины указанными вами значениями, а затем передает этот массив в вызванный вами метод. Невозможно скопировать все значения из переданного массива и обратно в исходные переменные.

Я предполагаю, что вы переносите код из VB6, где только способ передачи ParamArrays является справочным, но вам не нужна эта функциональность в .NET.

1 голос
/ 10 ноября 2010

Если вы не назначаете параметр новому экземпляру массива и не ожидаете, что вызывающий объект (который передает переменную или поле) увидит новый экземпляр, вам не нужно ByRef.

Даже безByRef, вызывающая сторона все равно увидит изменения содержимого массива.(Массивы являются ссылочными типами).

Если вы не видите parameterName = something в методе, вам не нужно ByRef.

Точка параметра ParamArrayпередать ему неявно созданный массив.
В таких случаях ByRef не может иметь никакого эффекта.

...