ASP.NET如何从Session中移除一个项目?

56

哪种方法更受欢迎?

Session.Remove("foo");

Session["foo"] = null;

有区别吗?

5个回答

123

有区别吗?

有区别。 Session.Remove(key) 会从字典中删除项(包括键和值),而 Session[key] = null 则会将空值分配给键。在前者调用后,该键将不会出现在 Session#Keys 集合中。但在后者调用后,键仍可在键集合中找到。


5
在负载高的情况下,InProc会话状态被认为极不稳定。如果滥用它(这种情况经常发生),那么Session["foo"] = null比Session.Remove["foo"]性能更好。垃圾回收器应该清理过多会话变量造成的混乱。 - Mark Richman

26
我知道这是老帖子,但一定要坚持使用Session["key"] = null - 它更快!我进行了一些测试(在InProc Session State上),连续删除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();

11
有没有理由在会话中保存1000个项目? - apocalypse
1
@zgnilec 我同意你的观点,但我认为JakubRi只是想比较两者的速度并向我们展示,除此之外,我认为编程世界非常广阔,不能有人明确地谈论编码方式。这个答案与我的当前项目无关,但我认为它值得+1。 - QMaster
1
@zgnilec 这个会话中不太可能有那么多的项目,但这是测试过程的一种方式,可以在1000个会话中进行测试,每个会话属于不同的用户。 - Richard Duerr

11
它具有相同的效果。我个人认为,Session.Remove方法更好地表达了程序员的意图。
这里是一些MSDN文档链接: "HttpSessionState.Item属性:

属性值 类型:System.Object

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

10

我会选择使用“Remove”,但是无法确定是否有区别。 猜测可能仍会保留一个空键以存储该空值,但不确定。 如果您想这样做,“Remove”将使我更加确信,并且在代码中表现更好


4
最大的区别在于如何从会话中读取数据。
if(Session.ContainsKey["foo"]) { return Session["foo"]; }

或者

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

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

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


2
HttpSessionState没有ContainsKey方法。 - Dave Amphlett

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接