Есть ли в VB.NET прямой эквивалент outпараметров функции C # , где переменная, передаваемая в функцию, не требует инициализации?
Ответы:
Нет, outв VB нет эквивалента ключевому слову.
Однако VB автоматически инициализирует все локальные переменные в методе, поэтому вы можете использовать их ByRefбез необходимости сначала явно инициализировать переменную.
Пример:
Sub Main()
Dim y As Integer
Test(y)
End Sub
Sub Test(ByRef x As Integer)
x = 42
End Sub
(Если вы исследуете код в структуре (например, Double.TryParse ), вы можете увидеть <OutAttribute>добавленные параметры, но это имеет значение только тогда, когда вызов маршалируется для COM-взаимодействия или вызова платформы.)
ByRefпараметров. (Этого не происходит с параметрами типа значения.)
Nothingим избавит от предупреждения, хотя и не изменит результат.
Nothingих назначал . Это просто отнимает много времени, так как мне приходится делать это сотни раз на большом устаревшем веб-сайте. Спасибо за расследование.
Outатрибут не эквивалентен outключевому слову C # .
Нет, не существует эквивалентная конструкция , которая позволяет не инициализирован переменной быть передан методу без предупреждения, но, как уже упоминалось в моем вопросе и ответе указав <Out()>атрибут на ByRefопределение параметров, хотя VB игнорирует его, это лечится C # в качестве outпараметра.
Итак, я бы предварительно инициализировал ссылочные переменные Nothing и указал их <Out()> ByRefдля обозначения намерения (это будет работать, если пользователи C # когда-либо будут обращаться к вашим методам).
Если вы чувствуете, что знаете, когда вы намереваетесь получить доступ к значениям по умолчанию Nothingв неназначенных ссылочных переменных, вы можете установить для параметра «Конфигурация предупреждения» «Использование переменной до назначения» значение «Нет» на уровне проекта (Свойства проекта> Компилировать, и вы, вероятно вы хотите установить для конфигурации значение «Все конфигурации» перед изменением этого параметра) или, в VS2015 (VB.NET 14), вы можете использовать #Disable Warning BC42030.
Версия C #
void TestFunc(int x, ref int y, out int z) {
x++;
y++;
z = 5;
}
Версия Vb.net
Sub TestFunc(ByVal x As Integer, ByRef y As Integer, ByRef z As Integer)
x += 1
y += 1
z = 5
End Sub
Обновить
Как указано в комментарии, не забудьте инициализировать свой параметр, который будет использоваться в выходном слоте.
У меня была проблема в VB.NET: я вызвал функцию «по ссылке», которая вернула массив.
Несмотря на то, что компилятор пометил это как предупреждение, все в порядке. Исправление очень простое и, вероятно, хорошая практика программирования.
Я изменился
Dim m_arr_values() as Integer
fnRetArray(m_arr_values)
к
' Even though 'Nothing' is the default value, setting it
' stops the compiler complaining.
Dim m_arr_values() as Integer = Nothing
fnRetArray(m_arr_values)
Это также помогает при кодировании, если имена переменных описательны ...
Sub fnCreatePalette(ByRef arr_in_pal() As color, ByRef arr_out_pal() as uinteger)
...
End Sub
Вы можете использовать метод передачи по ссылке в VB.NET.
Вам нужен механизм параметров Out в C #, потому что он не позволяет использовать никакую переменную без ее инициализации.
VB.NET не требует специального ключевого слова, так как он делает это автоматически.
Просто используйте ByRef.
VB имеет атрибут, который должен быть таким же, как C #, но сегодня вы все равно получаете предупреждение, даже если вы его используете. Подробности о том, как это исправить, можно найти в разделе vblang на гитхабе. https://github.com/dotnet/vblang/issues/67 .
Используйте ключевое слово ByRef перед переменной.
ByRefэквивалентен refпараметрам в C #, которые необходимо инициализировать перед передачей в функцию.
Object, поэтому ее нельзя использовать в качествеByRef x As Integerпараметра).