Есть ли эквивалент VB.NET для параметров С#?

Имеет ли VB.NET прямой эквивалент параметрам функции С# out, где переменная, переданная в функцию, не нуждается в инициализации?

Ответ 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 перед переменной.