Имеет ли VB.NET прямой эквивалент параметрам функции С# out
, где переменная, переданная в функцию, не нуждается в инициализации?
Есть ли эквивалент VB.NET для параметров С#?
Ответ 1
Нет, нет эквивалента ключевого слова 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-взаимодействия или вызова платформы.)
Ответ 2
Нет, нет эквивалентной конструкции, которая позволяет передавать не инициализированную переменную методу без предупреждения, но, как упоминалось в моем вопросе и ответе указав атрибут <Out()>
в определении параметра ByRef
, хотя VB игнорирует его, обрабатывается С# как параметр out
.
Итак, я бы предварительно инициализировал ссылочные переменные до Nothing
и указал <Out()> ByRef
для обозначения намерения (что будет работать, если пользователи С# когда-либо получат доступ к вашим методам).
Если вы чувствуете, что знаете, когда собираетесь нажимать по умолчанию Nothing
в других неназначенных ссылочных переменных, вы можете установить "Конфигурация предупреждения" "Использовать переменную до назначения" до "None" на уровне проекта (Project Properties > Compile, и вы, вероятно, захотите установить Configuration на "All Configurations" перед изменением этого параметра) или, в VS2015 (VB.NET 14), вы можете использовать #Disable Warning BC42030
.
Ответ 3
Версия на С#
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
Обновление
Как указано в комментарии, не забудьте инициализировать свой параметр, который будет использоваться в выходном слоте
Ответ 4
Вы можете использовать метод pass by reference в VB.NET.
Вам нужен механизм параметров Out в С#, потому что он не позволяет вам использовать любую переменную без ее инициализации.
VB.NET не требует специального ключевого слова, поскольку оно автоматически делает это самостоятельно.
Просто используйте ByRef.
Ответ 5
У меня была проблема в VB.NET, которую я назвал функцией "по ref", которая передала массив назад.
Несмотря на то, что компилятор отметил это как предупреждение, все было в порядке. Исправление очень простое и, вероятно, хорошая практика программирования.
Я изменил
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
Ответ 6
Используйте ключевое слово ByRef перед переменной.