Session 需要澄清会话实际上是如何工作的吗?

Session 需要澄清会话实际上是如何工作的吗?,session,caching,pass-by-reference,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; 现在,在第

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

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对象放回缓存,因为引用是相同的,对cust对象的任何更改都应反映在缓存中

但是我不认为会话是这样的,在会话中cust对象必须显式地放回到会话中。但是,我不确定。如果我没有像上面那样明确指定更改,那么更改是否会反映在会话中

如果需要显式执行,为什么缓存对象的行为会有所不同?这两个地方我们似乎都在做参考传递


这适用于C#,ASP.NET

,您不必显式地将对象重新分配回会话。对从会话检索到的对象所做的任何更改都将在会话中反映和持久化。缓存不同,因为它可能会过期。如果你需要任何进一步的帮助,请告诉我

另一方面,InProc会话比Cache快,因为Cache必须在返回对象之前检查过期情况


存储在会话和缓存中的对象只是指向该对象的指针,因此对该对象所做的任何更改都将被持久化,而无需显式地将该对象重新分配回它来自的会话或缓存。

字符串是不可变的。为什么要担心数据类型以及是否需要重新分配它?只需重新分配它,以确保安全并明确您的意图

要了解我的意思,请运行此命令并检查值。您将看到它在会话中没有更改。x的值将为“bar”


您可能希望指定所询问的语言和框架。感谢您指出这一点!除非它是不可变类型,例如字符串。
        Session["foo"] = "bar";

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

        var x = Session["foo"];

        Debugger.Break();