Это правда, что параметры являются локальными для вызова метода;однако это не обязательно ограничивает их охват.Переменные класса, отправленные как параметры ByVal, могут по-прежнему приводить к взаимодействию между потоками.Вы можете прочитать ключевое слово SyncLock
.Использование ключевого слова Shared
не повлияет (т.е. не уменьшит) шансы на такое взаимодействие.
Основная проблема многопоточных приложений заключается в том, что на один и тот же диапазон памяти ссылается более одного потока одновременно, особенно когда любой из этих потоков может выполнять запись в память.
Некоторые вещи для размышления:
(1) Visual Basic (и C #) дихотомизирует переменные (и типы данных) в два вида: «Значение» (или «Структура») и «Справочник»(или «Класс»).
(2) Тип данных «Значение» означает, что делается прямая ссылка на фактическую коллекцию битов, которая представляет целое число, или логическое значение, или даже растровое изображение, иликакой-то другой вид объекта.На языке старой школы это «образ» создания объекта.Это пространство состояний объекта.Это то, что делает сам объект, а не какой-то другой объект, независимо от того, где в памяти он может быть.
(3) Тип данных «Ссылка» означает, что это очень особенная структура, которая каким-то образом указывает тип данныхобъекта и где в памяти он находится.Компьютер интерпретирует «Ссылку» для получения фактического изображения объекта.
(4) Когда параметр «Значение» передается ByVal, это означает, что создается новый объект, который находится в идентичном изображенииисходное выражение передается, и именно на этой копии работает функция или метод.Изображение исходного «значения» не может быть затронуто.
(5) Когда параметр «Значение» передается ByRef, это означает, что создается новая переменная «Ссылка», и эта переменная «Ссылка» будет содержатьинформация, которая будет интерпретирована обратно к изображению оригинальной «Ценности».Теперь изображение исходного «значения» можно изменить.
(6) Когда параметру «Reference» передается ByVal, очень особая структура, которая интерпретируется обратно к реальному изображению объекта, получаетскопировано.Именно на этой копии особой Структуры действует функция или метод.Эта копия все еще указывает на фактическое изображение объекта.Это означает, что объект ссылочной переменной, переданный ByVal, все еще может изменить свое изображение (то есть его «Значение»).Тем не менее, совершенно особая структура самой исходной «ссылки» не может быть изменена.
(7) Обратите внимание, что тип String является странной уткой: он будет вести себя так, как если бы он был параметром «Value», даже еслина самом деле это тип «Ссылка».Следовательно, String, переданный ByVal, не будет затронут так же, как любой другой класс.На самом деле, String является примером неизменяемого типа - это означает, что предпринимаются шаги для предотвращения изменения образа его «Value».(См. http://msdn.microsoft.com/en-us/library/bb383979.aspx и http://codebetter.com/patricksmacchia/2008/01/13/immutable-types-understand-them-and-use-them/ для получения более подробной информации.)
(8) Когда параметр "Reference" передается ByRef, теперь создается новый объект "Reference", которыйуказывает на исходный объект «Reference» (который, в свою очередь, указывает на «Value» какого-либо другого объекта).Использование ByRef для «Reference» позволяет изменить (или создать заново) очень специальную структуру исходного объекта «Reference», передаваемого в качестве параметра.Функция или метод, выполняющий операцию подкачки, будет использовать ByRef для параметров «Reference».
(9) Некоторые люди говорят, что «Reference» совпадает с адресом памяти.Хотя в отдельных случаях это может быть правдой, технически это не так.Совершенно особая структура не обязательно должна быть адресом памяти в каком-либо изображении, которое было бы допустимо для ЦП, хотя в определенный момент компьютер преобразует ее в действительный адрес памяти.
(10) Ключевое слово Me
является автоматической ссылкой на объект, который в данный момент выполняет член класса.Под капотом он также существует в качестве параметра, который отправляется невидимым.КРОМЕ в случае Shared
члена - в этом случае Me
недоступен.