ASP.NET «Session.Remove (ключ)» v / s «Сессия (ключ) = ничего» - PullRequest
15 голосов
/ 02 июня 2010

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

1) Session.Remove (ключ)

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

Каков лучший подход из двух выше? Располагает ли Session.Remove объект, сохраненный автоматически?

Зависит ли второй подход от сборщика мусора, чтобы фактически освободить память?

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

Спасибо.

Ответы [ 4 ]

19 голосов
/ 02 июня 2010

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

Это поведение такое же, как и у всех других классов словарных типов в CLR.

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

Это не вызовет исключения, если ключ отсутствует в сеансе.

4 голосов
/ 02 июня 2010

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

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

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

1 голос
/ 02 июня 2010

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

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

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

0 голосов
/ 02 июня 2010

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

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

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