首选哪种方法?
Session.Remove("foo");
Session["foo"] = null;
有区别吗?
答案 0 :(得分:119)
有区别吗?
有。
Session.Remove(key)
从字典中删除条目(键和值),而Session[key] = null
为键分配值(恰好为空)。在前一次调用之后,密钥将不会出现在Session#Keys
集合中。但是在后者之后,钥匙仍然可以在钥匙系列中找到。
答案 1 :(得分:26)
我知道这是旧线程,但绝对坚持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();
答案 2 :(得分:10)
我会选择删除,但不能诚实地说是否存在差异。猜测可能仍然有一个为空值保留的空键但不确定。删除会给我一点疑问,如果这是你想要做的,在代码中读得更好。
答案 3 :(得分:9)
它具有相同的效果。我个人认为Session.Remove
方法确实更好地表达了程序员的意图。
这里有一些指向MSDN文档的链接:
“HttpSessionState.Item属性:
属性值
类型:System.Object
具有指定名称的会话状态值,如果该项不存在,则为null引用(在Visual Basic中为Nothing)。“
答案 4 :(得分:4)
最大的区别在于你如何阅读会话。
if(Session.ContainsKey["foo"]) { return Session["foo"]; }
或
if(Session["foo"] != null) { return Session["foo"]; }
如果使用第一种方法,则将值设置为null将不起作用,您应该使用remove。
如果使用第二种方法,则可以将值设置为null。