2012-11-06 68 views
-7

我有一個c#函數,它返回狀態列表。我希望這個函數只能像靜態變量一樣被調用一次。函數應該只被調用一次

 



    public List GetStateList() 
    { 
     List lstState=new List(); 
     lstState.add("State1"); 
     lstState.add("State2"); 
     lstState.add("State3"); 

     return lstState; 
    } 

,因爲這種狀態列表將是同我打電話是從很多地方這個功能,所以我想這個功能應該被調用一次,當該功能獲取調用它不應該再創造下一次整個名單再次。

我怎麼能在c#中實現這一點。

+1

在每個調用中返回相同的(static?)列表。 –

+0

請上傳你的代碼在這裏............. – andy

+1

這個問題似乎背叛了對「靜態」意味着什麼,或者預期結果是什麼的嚴重誤解。我們真的需要更多關於你真正想要什麼的信息。 –

回答

2

記住它。它仍然會被調用多次,但只有做充分的工作一次:

private List<string> _states; //if GetStateList() doesn't depend on object 
           //state, then this can be static. 
public List GetStateList() 
{ 
    if(_states == null) 
    { 
    List lstState=new List(); 
    lstState.add("State1"); 
    lstState.add("State2"); 
    lstState.add("State3"); 
    _states = lstState; 
    } 
    return _states; 
} 

根據線程問題,您不妨之一:在整個事情

  1. 鎖。保證一次執行。
  2. 將作業鎖定爲_states。早期可能會有一些不必要的工作,但所有的呼叫者都會收到同一個對象。
  3. 允許早期呼叫者相互覆蓋。

雖然最後看起來最浪費的,也可以是從長遠來看是最好的,作爲初始時期,不同的呼叫可能不必要地相互覆蓋後,就變成了簡單,從這一點上更快。這實際上取決於完成了多少工作,以及在分配_states之前可能同時調用的頻率。

+0

您可以使用雙重檢查鎖定,或者更簡單地說,您可以放棄懶惰實例化的麻煩,並且只是預先創建列表。內存或CPU中沒有足夠的開銷來創建狀態列表來保證工作量。 –

1

重複使用列表的一個問題是,調用者可以修改此列表,這將影響對其的任何預先存在的引用。對於如此少量的數據,從長遠來看這不太可能爲您節省很多。我可能會滿足於每次都返回一個新數組。

我當然不會懶得懶惰的實例化;填充它在構造和來完成:

public static class States { 
    static States() { 
     All = Array.AsReadOnly(new string[] { "state1", "state2", "state3" }); 
    } 
    public static readonly ReadOnlyCollection<string> All; 
} 

現在是線程安全的,(相對)防篡改的,並且最重要的,簡單的。