Есть ли в 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
параметра).