ASP.NET 'Session.Remove(ключ)' v/s 'Session (key) = nothing'
Я видел, как разработчики используют два подхода, когда они выполняются с объектом сеанса.
1) Session.Remove(ключ)
2) Сессия (ключ) = ничего
Каков лучший подход двух выше? Запускает ли Session.Remove объект автоматически?
Зависит ли второй подход от сборщика мусора, чтобы фактически освободить память?
EDIT:
Спасибо за ответы, ребята. Похоже, Session.Remove - правильный путь. Однако, если Session.Remove не гарантирует удаление объекта, то каков наилучший способ распоряжаться объектом, хранящимся в сеансе, когда он нам не нужен?
Спасибо.
Ответы
Ответ 1
Если вы установите для объекта значение null
или ничего, ключ все еще существует в сеансе, хотя значение null
.
Это поведение аналогично любому классу классов словаря в среде CLR.
Если вы хотите полностью удалить объект из сеанса, вы должны использовать метод Session.Remove("key")
.
Он не будет генерировать исключение, если ключ не присутствует в сеансе.
Ответ 2
Я бы предпочел Session.Remove(key), потому что он также удаляет память, используемую для ключа в словаре сеанса; при втором подходе ссылка на значение отключается, однако ключ все еще присутствует в словаре сеанса.
Ни один из подходов не будет вызывать dispose на объекте, который должен выполняться вручную.
Оба подхода зависят от сборщика мусора для освобождения памяти. В первом подходе память для ключевого объекта может также стать доступной для сбора. Также помните, что только потому, что вы удалили ссылку на объект из словаря сеанса, это не означает, что он не упоминается нигде в вашем приложении.
Ответ 3
Фактическая логика, которая выполняется в любом случае, определяется реализацией типа, реализующего интерфейс ISessionStateItemCollection, расположенный в пространстве имен System.Web.SessionState. Конкретный тип, реализующий этот интерфейс, определяется настроенным поставщиком хранилища сеансов.
Встроенные поставщики (In-Proc, State Server и SQL Server) используют класс SessionStateItemCollection, расположенный в пространстве имен System.Web.SessionState, поэтому это реализация, которая будет использоваться в подавляющем большинстве случаев, так как большинство людей не реализует пользовательский магазин хранилища сеансов.
Как указывали другие, если значение действительно удаляется из сеанса, потому что на него больше не нужно ссылаться, по крайней мере, на данный момент, то вы, вероятно, должны называть метод Remove только ради очистки для внутренних механизмов хранения объекта Session. Ни один из методов явно не удаляет объект, который ранее был сохранен с этим ключом.
Ответ 4
Session.Remove(key), вообще говоря, более безопасный способ пойти, если вы хотите удалить объект из кеша. Имейте в виду, что если вы используете управление сеансом inproc, тогда объект не будет сериализован, поэтому есть вероятность, что на него может ссылаться что-то другое, кроме диспетчера сеансов, поэтому сборщик мусора не обязательно очистит его.
Если вы используете управление сеансом proc, тогда объект сериализуется и, как результат, нет представления "в памяти" объекта, и поэтому сборщику мусора действительно не нужно "очищать его".
Установка сеанса (key) = ничего на самом деле не удаляет ключ из сеанса, он просто устанавливает значение null. Опять же, применяются те же правила в отношении сбора мусора.