Почему больше не нужно указывать 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:
Значением ссылочного типа является указатель на данные в другом месте в памяти. Это означает, что когда вы передаете ссылочный тип по значению, код процедуры имеет указатель на данные базового элемента, даже если он не может получить доступ к самому базовому элементу. Например, если элемент является переменной массива, код процедуры не имеет доступа к самой переменной, но может получить доступ к членам массива.
Кажется, что этот пост охватывает ваш вопрос:
Так что нет, нет способа получить старое поведение. Впредь ByVal
это значение по умолчанию (как было раньше), и оно не будет автоматически добавлено к параметрам метода.
На мой взгляд, это хорошее решение, поскольку оно делает VB.NET более совместимым с C# и позволяет избежать ненужных "шумов"(это уже достаточно многословно).
Старое поведение:
Private Sub test(ByVal test As String)
End Sub
Новое поведение
Private Sub test(test As String)
End Sub
Остерегайтесь при передаче подпрограмм в VBA, где по умолчанию ByRef
(см., например, "Метод передачи параметров по умолчанию" внизу этой страницы, автор великого Чипа Пирсона). Это может быть грязно.