Переменные приложения asp.net передаются по ссылке или по значению? - PullRequest
4 голосов
/ 15 июля 2009

Недавно я обнаружил, что при использовании объектов Session или Application в приложении ASP.net он передает значения по ссылке.

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

Мне также известно о настройке переменных в корне приложения, эффективно создающих глобальные переменные приложения, которые имеют немного лучшую производительность и устраняют все сумасшествие при кастинге объектов Session / Application.

Кто-нибудь знает, передаются ли переменные приложения по ссылке или по значению? Кажется, я не могу выкопать какие-либо данные по теме и хотел бы исключить код, который мне в настоящее время приходится «копировать» данные из объекта Application в новую переменную для обработки.

Ответы [ 3 ]

4 голосов
/ 15 июля 2009

Это не феномен ASP.NET как таковой ... он присущ CLI во всех .NET Framework. Вы должны взглянуть на классическую статью Джона Скита о передаче параметров .

Предполагая, что вы имеете дело со ссылочными типами, если вы хотите клонировать объект, а не просто скопировать ссылку на объект, вам придется вручную клонировать его. Вот хорошая статья , которая объясняет, как глубоко копировать объект и почему метод MemberwiseClone создает только поверхностную копию объекта.

3 голосов
/ 15 июля 2009

На самом деле, по умолчанию (если у вас есть ссылочный тип, а не тип значения), он передает копию ссылки .

Итак, у вас есть другая переменная, но она указывает на один и тот же объект.

0 голосов
/ 15 июля 2009

Переменная «Application» - это обычная переменная-член. Он работает так же, как и любая другая переменная, только его область действия больше, чем у большинства.

Если значение переменной копируется или нет, зависит от того, является ли переменная типом значения или нет.

Если это тип значения, например int, значение всегда копируется.

Если это ссылочный тип, например List<int>, вы получите копию ссылки на объект. Сам объект не копируется.

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

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