代码之家  ›  专栏  ›  技术社区  ›  David Basarab

ASP.NET是否从会话中删除项?

  •  54
  • David Basarab  · 技术社区  · 15 年前

    首选哪种方法?

    Session.Remove("foo");
    
    Session["foo"] = null;
    

    有什么区别吗?

    5 回复  |  直到 10 年前
        1
  •  116
  •   vegemite4me    10 年前

    有什么区别吗?

    有。 Session.Remove(key) 删除字典中的条目(键和值),同时 Session[key] = null 为键赋值(恰好为空)。前一次呼叫后,密钥不会出现在 Session#Keys 收集。但在后一种情况下,仍然可以在密钥集合中找到密钥。

        2
  •  26
  •   JakubRi    13 年前

    我知道这是旧线,但一定要坚持 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();
    
        3
  •  9
  •   dove    15 年前

    我会同意撤职,但不能诚实地说如果有区别。可能仍然有一个空键保留为该空值,但不确定。如果你想这样做的话 读得更好 在代码中也一样。

        4
  •  8
  •   splattne    11 年前

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

    这里有一些链接指向有关msdn的文档:

    “httpsessionstate.item属性:

    财产价值 类型:System.Object

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

        5
  •  4
  •   FlySwat    15 年前

    最大的区别是你如何从课时中阅读。

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

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

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

    如果使用第二个方法,可以将值设置为空。