Почему больше не нужно указывать ByVal/ByRef?

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

1) Есть ли возможность настроить эту опцию обратно, как это было раньше?

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

3 ответа

Решение

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

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:

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

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

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

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

Другие вопросы по тегам