2011-10-06 48 views
0

當在頁面屬性中包裝我的會話變量時,是否有意義將值保存到本地變量中並且傾向於從那裏調用值?會話調用的成本?

private Foo MySessionFoo 
{ 
    get 
    { 
     if (_localFoo == null) 
      _localFoo = Session["MySessionFoo"] as Foo; 
     return _localFoo; 
    } 
    set 
    { 
     Session["MySessionFoo"] = _localFoo = value; 
    } 
} 

假設我使用InProc會話模式,而不是基於SQL的,這有什麼區別noticable或做額外的儲蓄和實際檢查傷害了我的表現超過了它幫助?

應該我寧願做

private Foo MySessionFoo 
{ 
    get 
    { 
     return Session["MySessionFoo"] as Foo; 
    } 
    set 
    { 
     Session["MySessionFoo"] = value; 
    } 
} 

回答

1

這將是更有效的和麪向未來的使用局部變量/緩存。但是,除非您訪問IMO數十或數百次,否則這種差異不會很大。

我可以建議:

return this._localFoo ?? (this._localFoo = Session["MySessionFoo"] as Foo); 

this是可選的,但是這是一個小整潔,又剛剛IMO。

注意:很好地使用了coalesce運算符??,並且賦值表達式的result與被賦值的值相同。

+1

如果您在同一回發期間訪問該變量,將工作正常,否則每次都會執行查找! – abatishchev

0

我不認爲有很大的差異,我們可以發現,因爲兩者都在服務器端執行。

如果可能,我們應該避免使用Session本身。 :)

+0

也許這是爲什麼這被標記下來的解釋? –

+0

另外,您應該解釋爲什麼我們應該避免使用會話,以便我們可以更好地說明您爲什麼錯誤/正確。 –