Подтвердить что ты не робот

Почему нет необходимости указывать ByVal/ByRef?

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

1) В любом случае, я могу настроить эту опцию до того, как она была раньше?

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

4b9b3361

Ответ 1

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

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:

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

Ответ 2

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

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 немного более совместимым с С# и избегает ненужных "шумов" (он уже достаточно подробный).

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

Private Sub test(ByVal test As String)
End Sub

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

Private Sub test(test As String)
End Sub

Ответ 3

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