【问题标题】:ASP.NET removing an item from Session?ASP.NET 从会话中删除项目?
【发布时间】:2010-09-20 16:30:00
【问题描述】:

首选哪种方法?

Session.Remove("foo");

Session["foo"] = null;

有区别吗?

【问题讨论】:

    标签: c# asp.net .net session session-variables


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      "HttpSessionState.Item 属性:

      属性值 类型:System.Object

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

      【讨论】:

        【解决方案3】:

        有区别吗?

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

        【讨论】:

        • InProc 会话状态在负载下非常不稳定。如果它被滥用(一直发生),那么 Session["foo"] = null 将比 Session.Remove["foo"] 执行得更好。垃圾收集器应该清理过多的会话变量。
        【解决方案4】:

        最大的不同是你从会话中读取的方式。

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

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

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

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

        【讨论】:

        • HttpSessionState 没有 ContainsKey
        【解决方案5】:

        我知道这是旧线程,但绝对坚持使用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();
        

        【讨论】:

        • 会话中有 1000 个项目有什么理由吗?
        • @zgnilec 我同意你的观点,但我认为 JakubRi 只是想比较两者的速度并向我们展示,除了我认为编程世界很大,没有人能明确地谈论编码方式。这个答案与我当前的项目无关,但我认为它值得 +1。
        • @zgnilec 每个会话不太可能有这么多项目,但这是一种测试超过 1000 个会话的过程的方法,每个会话属于不同的用户。
        猜你喜欢
        • 2011-04-02
        • 2016-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多