56

首选哪种方法?

Session.Remove("foo");

Session["foo"] = null;

有区别吗?

4

5 回答 5

123

有区别吗?

有。 Session.Remove(key)从字典中删除条目(键和值),同时Session[key] = null将值(恰好为空)分配给键。在前一次调用之后,密钥将不会出现在Session#Keys集合中。但是在后者之后,仍然可以在密钥集合中找到密钥。

于 2008-11-04T15:12:08.197 回答
25

我知道这是旧线程,但绝对坚持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();
于 2010-11-09T11:55:53.657 回答
11

它具有相同的效果。我个人认为该Session.Remove方法确实更好地表达了程序员的意图。

这里有一些 MSDN 上文档的链接:

“HttpSessionState.Item 属性:

属性值类型:System.Object

具有指定名称的会话状态值,如果该项不存在,则为空引用(在 Visual Basic 中为无)。”

于 2008-11-04T14:07:47.173 回答
10

我会选择删除,但不能老实说是否有区别。猜测可能仍然为该空值保留一个空键,但不确定。删除会让我毫无疑问,如果这就是你想要做的,它在代码中也能更好地阅读。

于 2008-11-04T13:48:12.953 回答
4

最大的区别是你如何从会话中阅读。

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

或者

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

如果使用第一种方法,将值设置为null将不起作用,您应该使用remove。

如果使用第二种方法,则可以将值设置为 null。

于 2008-11-04T15:17:35.050 回答