Поведение аргументов / параметров и переменных внутри общих функций в VB.NET - PullRequest
2 голосов
/ 19 мая 2011

Ну, я новичок в VB.NET, преобразовывая устаревшую систему в мир .NET. Недавно я пересматривал уже существующий код, так как присоединился к проекту довольно поздно в команде.

Итак, я обнаружил, что внутри многих классов есть много общих функций (не общих классов). Я сомневаюсь, что это может создать некоторую проблему, если два запроса (то есть два разных HTTP-запроса к одному и тому же методу, так как это приложение WCF, конечно, открытые методы не являются общими, но методы с внутренним вызовом являются общими) приходят к одному и тому же общему методу, и оба вызова чтобы метод мог иметь разные параметры / аргументы метода, перезаписывая аргументы друг друга.

Короче говоря, если у разделяемого метода есть список аргументов, которые будут обрабатываться, есть ли вероятность несоответствий в свете множественного доступа к разделяемому методу через два http-запроса.

Буду признателен за каждый ответ в теме.

Спасибо, JJ

Ответы [ 2 ]

5 голосов
/ 19 мая 2011

Нет.

Параметры являются локальными для вызова метода и не будут взаимодействовать между потоками.

Однако, если вы используете Shared поля или переменные, у вас будут проблемы.

1 голос
/ 19 мая 2011

Это правда, что параметры являются локальными для вызова метода;однако это не обязательно ограничивает их охват.Переменные класса, отправленные как параметры 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 недоступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...