在很多地方,我看到了以下模式。考虑一下代码:
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
答案 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。