需要澄清Session实际如何运作?

时间:2010-09-24 15:35:29

标签: session caching pass-by-reference

在很多地方,我看到了以下模式。考虑一下代码:

Customer cust = (Customer) Session["Customer"]; 

//Do something to the object cust

Session["Customer"] = cust

和代码:

Customer cust = (Customer) Cache["Customer"];

//do something to object cust
Cache["Customer"] = cust;

现在,在第二种情况下,不需要将cust对象放回Cache,因为引用是相同的,对cust对象的任何更改都应反映在缓存中。

但我不认为在Session的情况下就是这种情况,必须将cust对象明确地放回Session中。但是,我不确定。如果我没有明确指定上述变更,那么变化是否会反映在会话中?

如果需要明确地完成,为什么与Cache对象的行为有所不同?这两个地方我们似乎都在做参考传递。

这适用于C#,ASP.NET

2 个答案:

答案 0 :(得分:2)

字符串是不可变的。为什么要担心数据类型以及是否需要重新分配数据类型?只需重新分配它就可以安全,清楚地表达您的意图。

要了解我的意思,请运行此选项并检查值。你会看到它在会话中没有改变。 x的值将是“bar”。

        Session["foo"] = "bar";

        var s = Session["foo"];
        s = "baz";

        var x = Session["foo"];

        Debugger.Break();

答案 1 :(得分:0)

您无需将对象显式重新分配回Session。对从Session中检索的对象所做的任何更改都将在会话中反映并保留。缓存是不同的,因为它可能会过期。如果您需要任何进一步的帮助,请告诉我。

另一件事,InProc Session比Cache更快,因为Cache必须在返回对象之前检查过期。

存储在Session和Cache中的对象只是指向对象的指针,因此对对象所做的任何更改都将被保留,而不需要将对象显式重新分配回它来自的Session或Cache。