ASP.NET удаляет элемент из сеанса?
Какой метод предпочтительнее?
Session.Remove("foo");
Session["foo"] = null;
Есть ли разница?
5 ответов
Есть ли разница?
Есть.Session.Remove(key)
удаляет запись (и ключ, и значение) из словаря, пока Session[key] = null
присваивает ключу значение (которое оказывается нулевым). После первого звонка ключ не появится в Session#Keys
коллекция. Но после последнего ключ все еще можно найти в коллекции ключей.
Я знаю, что это старая тема, но определенно придерживаться 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();
Это имеет тот же эффект. Я лично думаю, что Session.Remove
Метод лучше выражает намерение программиста.
Вот несколько ссылок на документацию по MSDN:
"Свойство HttpSessionState.Item:
Тип значения свойства: System.Object
Значение состояния сеанса с указанным именем или нулевой ссылкой (Nothing в Visual Basic), если элемент не существует."
Я бы пошел с Удалить, но не могу честно сказать, если есть разница. Возможно, для этого нулевого значения все еще может быть пустой ключ, но он не уверен. Удаление дало бы мне немного сомнений, и если это то, что вы хотите сделать, это лучше читается и в коде.
Самая большая разница в том, как вы читаете из сессии.
if(Session.ContainsKey["foo"]) { return Session["foo"]; }
или же
if(Session["foo"] != null) { return Session["foo"]; }
Если вы используете первый метод, установка значения на ноль не будет работать, и вы должны использовать удалить.
Если вы используете второй метод, вы можете установить значение на ноль.