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

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

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

Предыстория: перенос некоторого старого кода и попытка максимально сохранить ту же структуру.


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

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

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

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

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

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


person Connor Albright    schedule 10.11.2010    source источник
comment
Заголовок и ваш вопрос не совпадают. Я предполагаю, что вы хотите передать ParamArray по ссылке? По значению — это параметр по умолчанию (и единственный) в VB.NET. Пожалуйста, проверьте заголовок вопроса.   -  person Cody Gray    schedule 10.11.2010
comment
Это не имеет никакого смысла. Вы ожидаете, что вызываемый объект создаст новый массив параметров и передаст его обратно вызывающему?   -  person Hans Passant    schedule 10.11.2010
comment
Символ объявления типа % означает Integer в VB6; Я предполагаю, что это то же самое в TurboBasic? Если да, то мне кажется проще всего просто передать функции Input массив типа Integer. Где находятся переменные, которые заполняются методом Input, объявленным в коде, — имеют ли они глобальную область видимости или они определены ранее в том же методе, который вызывает Input? Или это один из тех языков, которые автоматически создают экземпляр переменной, когда я делаю вид, что он существует?   -  person Cody Gray    schedule 10.11.2010
comment
Похоже, что TurboBasic очень похож на VB6. Input() также должен принимать строки. Большинство переменных имеют глобальную область видимости.   -  person Connor Albright    schedule 10.11.2010
comment
Я почти уверен, что это невозможно.   -  person SLaks    schedule 10.11.2010


Ответы (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 потребует еще больше усилий.

person MarkJ    schedule 10.11.2010
comment
Спасибо! Это, пожалуй, самое простое решение на данный момент. - person Connor Albright; 10.11.2010
comment
@Oak Спасибо, что приняли мой ответ! Я думаю, что единственным ответом на ваш первоначальный вопрос было то, что это невозможно. Я воспользовался вашей справочной информацией, чтобы дать совет по конкретной проблеме с кодом, которая вызвала ваш первоначальный вопрос. - person MarkJ; 11.11.2010

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

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

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

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

person SLaks    schedule 10.11.2010
comment
Да, проблема в том, что имя_параметра = что-то действительно происходит. - person Connor Albright; 10.11.2010
comment
Тогда это не должно быть ParamArray. Как это называется? Вы можете сделать ParamArray версию с другим именем. - person SLaks; 10.11.2010
comment
Я дал еще несколько объяснений в своем первоначальном вопросе. - person Connor Albright; 10.11.2010

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

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

person Cody Gray    schedule 10.11.2010
comment
Хотя я подозреваю, что вы правильно догадались, что хочет сделать ОП (эффективно передать каждый из переменного числа аргументов ByRef), я думаю, стоит отметить, что это все равно невозможно, если вы передаете массив, сгенерированный из ParamArray параметра ByRef — только сама переменная массива может быть установлена ​​в новое значение (что, как указал SLaks, было бы бессмысленным); вы по-прежнему не могли проникнуть внутрь этого массива и найти ссылки на локальные переменные из области действия вызывающего метода. - person Dan Tao; 10.11.2010
comment
На самом деле я портирую с TurboBasic (когда-либо слышал об этом, я никогда не слышал). К сожалению, многие встроенные функции использовали возможность передачи по ссылке (другого пути не было). Я надеялся обойтись без серьезного переписывания раздела, чтобы принять такое поведение, но, похоже, мне не повезло. - person Connor Albright; 10.11.2010
comment
@Oak: Определенно слышал об этом, но это не значит, что я это знаю. :-) Возможно, мы сможем придумать другие менее сложные обходные пути, если вы опубликуете раздел кода, который в настоящее время работает только с ParamArray переданным ByRef. Мне, например, любопытно, что вызываемый делает с массивом параметров. - person Cody Gray; 10.11.2010
comment
Я спросил о ParamArray, так как это был лучший эквивалент, который я смог найти. Я изменил свой вопрос выше, чтобы привести пример того, что я пытаюсь сделать. - person Connor Albright; 10.11.2010