Почему больше не нужно указывать ByVal / ByRef? - PullRequest
30 голосов
/ 09 февраля 2012

Я только что установил пакет обновления для Visual Studio 2010 (предлагается в Центре обновления Windows) и вижу новую функцию в «intellisense», которая означает, что когда я пишу Function или Sub в VB.NET, это не так. • параметры автозаполнения с ByRef или ByVal ...

1) Можно ли как-нибудь настроить эту опцию на прежнюю? ​​

2) Если я не укажу ByX, какой из них используется по умолчанию? (кажется, что это всегда ByRef)

Ответы [ 3 ]

42 голосов
/ 09 февраля 2012

Кажется, что этот пост охватывает ваш вопрос:

http://msmvps.com/blogs/carlosq/archive/2011/03/15/vs-2010-sp1-changing-quot-byval-quot-vb-net-code-editor-experience.aspx

Так что нет, нет способа получить старое поведение.С этого момента ByVal является значением по умолчанию (как было раньше), и оно не будет автоматически добавлено к параметрам метода.

На мой взгляд, это хорошее решение, так как оно делает VB.NET немногоболее соответствует C # и позволяет избежать ненужных «шумов» (это уже достаточно многословно).

Старое поведение:

Private Sub test(ByVal test As String)
End Sub

Новое поведение

Private Sub test(test As String)
End Sub
17 голосов
/ 09 февраля 2012

Тим охватил то, что вы просили напрямую, но следует еще кое-что иметь в виду, что любая переменная ссылочного типа, например, определенный пользователем класс, даже если она передается по значению, позволит вам вносить изменения в свойства этих экземпляров и т.д., которые остаются. Однако это не позволит вам изменить весь объект. Возможно, именно поэтому вам показалось, что по умолчанию используется ссылка

Public Sub (Something As WhateverClass) 
  Something = New WhateverClass 'will result in no changes when outside this method

  Something.Property1 = "Test"  'will result in an updated property when outside this method
End Sub

С MSDN :

Значением ссылочного типа является указатель на данные в другом месте в памяти. Это означает, что когда вы передаете ссылочный тип по значению, код процедуры имеет указатель на данные базового элемента, даже если он не может получить доступ к самому базовому элементу. За Например, если элемент является переменной массива, код процедуры не имеет доступа к самой переменной, но он может получить доступ к массиву члены.

12 голосов
/ 21 ноября 2013

Остерегайтесь при переносе подпрограмм в VBA, где по умолчанию установлено значение ByRef (см., Например, «Метод передачи параметров по умолчанию» в внизу этой страницы , автор великого Чипа Пирсона).Это может быть грязно.

...