ASP.NET удаляет элемент из сеанса? - PullRequest
55 голосов
/ 04 ноября 2008

Какой метод предпочтительнее?

Session.Remove("foo");

Session["foo"] = null;

Есть ли разница?

Ответы [ 5 ]

119 голосов
/ 04 ноября 2008

Есть ли разница?

Есть. Session.Remove(key) удаляет запись (и ключ, и значение) из словаря, в то время как Session[key] = null назначает значение (которое оказывается нулевым) для ключа. После первого вызова ключ не появится в коллекции Session#Keys. Но после последнего ключ все еще можно найти в коллекции ключей.

26 голосов
/ 09 ноября 2010

Я знаю, что это старая тема, но определенно придерживайтесь Session["key"] = null - это намного быстрее! Я провел несколько тестов (в состоянии сеанса InProc), удалив 1000 элементов в строке (истекшее время составляет всего 1000 элементов, поэтому, если вы хотите среднее время для одного элемента, просто разделите его на 1000):

Удаление 1000 существующих предметов:

Session[key] = null; - 0.82380000000000009 ms
Session.Remove(key); - 59.960100000000004 ms

Удаление 1000 НЕ существующих предметов:

Session[key] = null; - 1.5368000000000002 ms
Session.Remove(key); - 0.6621 ms

Удаление 500 существующих и 500 несуществующих элементов:

Session[key] = null; - 1.0432000000000001 ms
Session.Remove(key); - 33.9502 ms

Вот фрагмент кода для первого теста:

Session.Clear();

for (int i = 0; i < 1000; i++)
    Session[i.ToString()] = new object();

Stopwatch sw1 = Stopwatch.StartNew();
for (int i = 0; i < 1000; i++)
    Session[i.ToString()] = null;
sw1.Stop();

Session.Clear();

for (int i = 0; i < 1000; i++)
    Session[i.ToString()] = new object();

Stopwatch sw2 = Stopwatch.StartNew();
for (int i = 0; i < 1000; i++)
    Session.Remove(i.ToString());
sw2.Stop();
10 голосов
/ 04 ноября 2008

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

9 голосов
/ 04 ноября 2008

Это имеет тот же эффект. Я лично считаю, что метод Session.Remove лучше выражает намерение программиста.

Вот несколько ссылок на документацию по MSDN:

"Свойство HttpSessionState.Item:

Значение свойства Тип: System.Object

Значение состояния сеанса с указанным именем или пустой ссылкой (Nothing в Visual Basic), если элемент не существует. "

4 голосов
/ 04 ноября 2008

Самая большая разница в том, как вы читаете из сессии.

if(Session.ContainsKey["foo"]) { return Session["foo"]; }

или

if(Session["foo"] != null) { return Session["foo"]; }

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

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

...