Нужно уточнить, как на самом деле работает сессия? - PullRequest
0 голосов
/ 24 сентября 2010

Во многих местах я видел следующую картину. Рассмотрим код:

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 ]

2 голосов
/ 24 сентября 2010

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

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

        Session["foo"] = "bar";

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

        var x = Session["foo"];

        Debugger.Break();
0 голосов
/ 24 сентября 2010

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

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

...