ASP.NET的Session.Remove(key)'v / s'Session(key)= nothing'

时间:2010-06-02 14:07:09

标签: asp.net session

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

1)Session.Remove(key)

2)会话(关键)=没有

上述两种方法的最佳方法是什么? Session.Remove会自动处理存储的对象吗?

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

编辑: 谢谢你们的回应。看起来像Session.Remove是正确的方法。但是,如果Session.Remove不保证对象的处理,那么当我们不需要它时,处理会话中存储的对象的最佳方法是什么?

感谢。

4 个答案:

答案 0 :(得分:19)

如果您将对象设置为null或者没有设置,则即使值为null,该密钥仍然存在于会话中。

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

如果要从Session中完全删除对象,则应使用Session.Remove("key")方法。

如果会话中没有密钥,它不会抛出异常。

答案 1 :(得分:4)

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

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

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

答案 2 :(得分:1)

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

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

正如其他人所指出的那样,如果该值实际上已从会话中删除,因为它不再需要被引用,至少目前是这样,那么你应该只是为了清理而调用Remove方法启动Session对象的内部存储机制。这两种方法都没有明确地处理先前用该密钥存储的对象。

答案 3 :(得分:0)

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

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