Использование 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
не может иметь никакого эффекта.