【问题标题】:ASP.NET 'Session.Remove(key)' v/s 'Session(key) = nothing'ASP.NET 'Session.Remove(key)' vs 'Session(key) = nothing'
【发布时间】:2017-10-21 16:47:22
【问题描述】:

我看到开发人员在完成会话对象时使用了两种方法。

1) Session.Remove(key)

2) 会话(键)= 无

以上两种方法中更好的方法是什么? Session.Remove 是否自动处理存储的对象?

第二种方法是否依赖垃圾收集器来实际释放内存?

编辑: 谢谢你们的回应。似乎 Session.Remove 是正确的方法。但是,如果 Session.Remove 不保证对象的处置,那么当我们不再需要存储在 session 中的对象时,最好的处置方式是什么?

谢谢。

【问题讨论】:

    标签: asp.net session


    【解决方案1】:

    如果您将对象设置为null 或不设置任何内容,即使值为null,该键仍然存在于会话中。

    此行为与 CLR 中的任何其他字典类型类相同。

    如果你想从 Session 中完全移除一个对象,你应该使用Session.Remove("key") 方法。

    如果 Session 中不存在密钥,则不会抛出异常

    【讨论】:

    • 感谢您补充说,如果密钥不存在,它不会抛出异常!
    【解决方案2】:

    我更喜欢 Session.Remove(key) 因为它也会删除会话字典中用于键的内存;使用第二种方法时,对值的引用被解除关联,但是键仍然存在于 Session 字典中。

    这两种方法都不会在对象上调用 dispose,这必须手动完成。

    这两种方法都依赖于垃圾收集器来释放内存,在第一种方法中,关键对象的内存也可以用于收集。还要记住,仅仅因为您从会话字典中删除了对该对象的引用,并不意味着它在您的应用程序的其他任何地方都没有被引用。

    【讨论】:

      【解决方案3】:

      在这两种情况下执行的实际逻辑由实现位于 System.Web.SessionState 命名空间中的 ISessionStateItemCollection 接口的类型的实现决定。实现该接口的具体类型由配置的会话存储提供程序确定。

      内置提供程序(In-Proc、State Server 和 SQL Server)都使用位于 System.Web.SessionState 命名空间中的 SessionStateItemCollection 类,因此这是将在绝大多数情况下使用的实现,因为大多数人没有实现自定义会话存储提供程序。

      正如其他人指出的那样,如果该值确实从会话中删除,因为它不需要再被引用,至少目前,那么您可能应该调用 Remove 方法只是为了清理建立 Session 对象的内部存储机制。这两种方法都没有显式处理之前使用该键存储的对象。

      【讨论】:

        【解决方案4】:

        Session.Remove(key) 一般来说,如果您想从缓存中实际删除对象,这是一种更安全的方法。请记住,如果您使用 inproc 会话管理,则对象不会被序列化,因此它有可能被会话管理器以外的其他对象引用,因此垃圾收集器不一定会清理它。 如果您使用 out of proc 会话管理,那么对象将被序列化,因此,没有对象的“内存中”表示,因此垃圾收集器实际上不需要“清理它”

        设置 Session(key) = nothing 实际上并没有从会话中删除密钥,它只是将其设置为 null。同样,关于垃圾收集的相同规则也适用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-10
          • 2016-01-20
          • 2012-04-18
          • 2022-01-27
          • 2020-06-25
          • 2018-10-14
          • 2017-08-17
          • 2012-12-21
          相关资源
          最近更新 更多