2012-10-23 78 views
0

即時通訊新的在C#和我想學習更多一點...現在,我有麻煩理解靜態ArrayList。靜態ArrayList存儲內存中的值?

在PHP我可以定義:

Class Singleton{ 
    private static $instance; 
    private static $arrayDemo = array(); 

    private function __construct(){} 

    public static function getInstance(){ 
     if(!isset(self::$instance)) 
      self::$instance = new Singleton(); 
     return self::$instance; 
    } 
    public static addItem($item){ 
     self::$arrayDemo[] = $item; 
    } 

    public static getItems(){ 
     return self::$arrayDemo[]; 
    } 
} 
Singleton::getInstance(); 

Singleton::addItem("first"); 
Singleton::addItem("second"); 
Singleton::getItems(); // returns {0=>first,1=>second} 

如果我重新加載頁面時,我得到相同的結果(0 =>第一,1 =>第二)

進出口試圖實現在c#單例模式得到同樣的事情,但我得到了重複值:

public sealed class Singleton 
{ 
    private static readonly Singleton instance = new Singleton(); 
    private static ArrayList ArrayDemo = new ArrayList(); 

    private Singleton() { } 

    public static Singleton Instance 
    { 
     get 
     { 
      return instance; 
     } 
    } 


    public static void AddItem(string item) 
    { 
     ArrayDemo.Add(item); 
    } 

    public static ArrayList GetItems() 
    { 
     return ArrayDemo; 
    } 
} 

//in cshtml: 
Singleton.AddItem("first"); 
Singleton.AddItem("second"); 
Singleton.GetItems(); 

如果我刷新網站有一段時間,我得到了相同的結果PHP ...但是,如果我刷新3倍的回報..:

0=>first,1=>second,2=>first,3=>second,4=>first,5=>second 

爲什麼會發生這種情況?如果我使用靜態方法,我可以清除ArrayList結果刷新? 我只是想了解這個邏輯。

謝謝你們!

+0

這就是問題:PHP不知道*真實*靜態實例:)請參閱http://stackoverflow.com/questions/468642/is-it-possible-to-create-static-classes-in-php-像在C/468653#468653和http://stackoverflow.com/questions/432192/singleton-in-php –

+1

@AndreasNiedermair當我從C#學到更多,我覺得我失去了5年的PHP世界:( – Carasuman

回答

2

爲什麼會發生這種情況?

這是一個靜態變量。它的存在時間長達AppDomain它是生命的一部分 - 這幾乎總是比單個請求長得多,這看起來像是你所預期的一生。在ASP.NET中,同樣的AppDomain可以處理很多請求 - 您不會爲每個請求獲取單獨的進程。

我的建議是:

  • 您避免使用Singleton模式入手;它很少是個好主意
  • 您避免使用比其實際上是恆定的數據等靜態變量(甚至可能再...)
  • 您避免使用非泛型集合一樣ArrayList,反而有利於泛型集合如List<T>

此外,如果你是新來的C#我建議你放棄Web部件 - 開始,Web和富客戶端GUI框架有自己的怪癖瞭解;如果你想用語言和基礎核心庫(例如集合和IO)進行實驗,我發現使用控制檯應用程序達到此目的的效率更高。

+0

我會遵循你的建議..當我走,我覺得我失去了更多的理解和學習。順便說一句,如果我試圖處理變量從單個實例,不建議單身模式? – Carasuman

+0

@ Carasuman:單身人士模式會導致代碼難以測試,尤其不適合Web應用程序中的可變數據。依賴注入通常有助於爲多個對象提供相同的實例,但這取決於您想要做什麼 –

+0

你建議一本書在C#中從頭開始?感謝您的幫助 – Carasuman