ASP.NET 'Сессия. Удалите (ключ)' v/s 'Сессия (ключ) = ничто'

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

1) Сессия. Удалите (ключ)

2) Сессия (ключ) = ничто

Каков лучший подход двух выше? Делает Сессию. Удалите располагают объект, хранивший автоматически?

Второй подход зависит от сборщика "мусора" к на самом деле свободному память?

Править: Спасибо за ответы, парней. Походит на Сессию. Удалите корректный способ пойти. Однако, если Сессия. Удалите не гарантирует избавление от объекта, затем что лучший способ состоит в том, чтобы расположить объект, хранивший на сессии, когда нам не нужен он далее?

Спасибо.

15
задан Srikanth Venugopalan 3 June 2010 в 05:25
поделиться

4 ответа

Если вы установите для объекта значение null или ничего, ключ все еще существует в сессии, даже если значение null.

Такое поведение аналогично любым другим классам словарных типов в CLR.

Если вы хотите полностью удалить объект из сессии, вам следует использовать метод Session.Remove("key").

Он не выбросит исключение, если ключ не присутствует в сессии.

19
ответ дан 1 December 2019 в 03:04
поделиться

Я бы предпочел Session.Remove(key), потому что он удаляет память, используемую для ключа в словаре сессии; при втором подходе ссылка на значение отсоединяется, но ключ все еще присутствует в словаре сессии.

Ни один из подходов не вызовет dispose для объекта, это необходимо сделать вручную.

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

4
ответ дан 1 December 2019 в 03:04
поделиться

Фактическая логика, которая выполняется в любом случае, определяется реализацией типа, реализующего интерфейс ISessionStateItemCollection, расположенный в пространстве имен System.Web.SessionState. Конкретный тип, реализующий этот интерфейс, определяется сконфигурированным провайдером хранилища сессий.

Встроенные провайдеры (In-Proc, State Server и SQL Server) все используют класс SessionStateItemCollection, расположенный в пространстве имен System.Web.SessionState, поэтому именно эта реализация будет использоваться в подавляющем большинстве случаев, так как большинство людей не реализуют пользовательский провайдер хранилища сессий.

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

1
ответ дан 1 December 2019 в 03:04
поделиться

Session.Remove (key), вообще говоря, более безопасный способ, если вы действительно хотите удалить объект из кеша. Имейте в виду, что если вы используете управление сеансом inproc, объект не сериализуется, поэтому есть вероятность, что на него может ссылаться что-то другое, а не диспетчер сеанса, поэтому сборщик мусора не обязательно очистит его. Если вы используете внепроцессное управление сеансом, то объект сериализуется, и в результате отсутствует представление объекта «в памяти», и поэтому сборщику мусора действительно не нужно «очищать его»

Настройка Сессия (ключ) = ничто на самом деле не удаляет ключ из сеанса, а просто устанавливает для него значение null. Опять же, применяются те же правила для сборки мусора.

0
ответ дан 1 December 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: