it-swarm.com.ru

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

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

77
cspolton

Нет, в VB нет эквивалента ключевого слова out.

Однако 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 или вызова платформы.)

85
Guffa

Нет, не существует эквивалентной конструкции, которая позволяет неинициализированной переменной передаваться методу без предупреждения, но, как упоминалось в моих вопрос и ответ с указанием <Out()> атрибута для определения параметра ByRef , хотя VB игнорирует это, is обрабатывается C # как параметр out.

Итак, я бы предварительно инициализировал ссылочные переменные для Nothingand, указав <Out()> ByRef, чтобы обозначить намерение (это будет работать, если пользователи C # когда-либо получат доступ к вашим методам).

Если вы чувствуете, что знаете, когда намереваетесь получить доступ к Nothing по умолчанию в других неназначенных ссылочных переменных, вы можете установить для параметра «Конфигурация предупреждения» «Использование переменной перед назначением» значение «Нет» на уровне проекта. (Свойства проекта> Компилировать, и вы, вероятно, захотите установить «Конфигурация» на «Все конфигурации» перед изменением этого параметра), или, в VS2015 (VB.NET 14), вы можете использовать #Disable Warning BC42030.

29
Mark Hurd

Версия на 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

нашел ответ здесь

Обновление

Как указано в комментарии, не забудьте инициализировать свой параметр, который будет использоваться в слоте out

7
David

У меня была проблема в 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
1
TheWhitde

VB имеет атрибут, который должен совпадать с C # out, но сегодня вы все равно получите предупреждение, даже если вы его используете. Есть подробности об исправлении этого в vblang области github. https://github.com/dotnet/vblang/issues/67 .

0
Paul Cohen

Вы можете использовать метод передачи по ссылке в VB.NET.

Вам нужен механизм параметров Out в C #, потому что он не позволяет использовать любую переменную без ее инициализации.

VB.NET не нуждается в специальном ключевом слове, поскольку оно автоматически делает это само по себе.

Просто используйте ByRef.

0
Josh