Использование ParamArray ByRef

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

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

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


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

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

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

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

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

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

3 ответа

Решение

Я никогда не использовал 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 будет еще более требовательным.

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

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

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

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

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

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

Другие вопросы по тегам