2010-09-24 4 views
0

Во многих местах я видел следующий рисунок. Рассмотрим код:Нужно уточнить, как работает сеанс?

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 должен быть явно помещен обратно в сеанс. Однако я не уверен. Будет ли изменение отражать в Сессии, если я не укажу явное указание, как указано выше?

И если это необходимо сделать явно, почему разница в поведении с объектом Cache? Оба места, на которые мы, похоже, делаем ссылку.

Это для C#, ASP.NET

+0

Возможно, вы захотите указать язык и рамки, о которых вы спрашиваете. – kwatford

+0

спасибо, что указали это! – shashi

ответ

0

Вы не должны явно передать объект обратно к сессии. Любые изменения, сделанные на объекте, полученном с сеанса, будут отражаться и сохраняться в сеансе. Кэш отличается тем, что он может истечь. Если вам нужна дополнительная помощь, дайте мне знать.

Еще одна вещь, сеанс InProc быстрее, чем кэш, поскольку кэш должен проверять истечение срока действия перед возвратом объекта.

Объект, хранящийся в сеансе и в кеше, является указателем на объект, поэтому любые изменения, внесенные в объект, будут сохраняться БЕЗ необходимости явно переназначить объект обратно на сеанс или кеш, из которого он был получен.

+0

Если это не неизменный тип, такой как строка. – Nikki9696

2

Строки неизменяемы. Зачем беспокоиться о типе данных и нужно ли его переназначать? Просто перепишите его, чтобы быть в безопасности и ясно о ваших намерениях.

Чтобы узнать, что я имею в виду, запустите это и проверьте значения. Вы увидите, что он не изменился в сеансе. Значение x будет «bar».

 Session["foo"] = "bar"; 

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

     var x = Session["foo"]; 

     Debugger.Break(); 
Смежные вопросы