1

私はC#が初めてで、もう少し学習しようとしています...今、静的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();

Web サイトを 1 回更新すると、php と同じ結果が得られます...しかし、3 回更新すると返されます..:

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

なぜこれが起こるのですか?静的メソッドを使用した場合、更新で ArrayList の結果をクリアできますか? これの論理を理解したいだけです。

みんなありがとう!。

4

1 に答える 1

3

なぜこれが起こるのですか?

静的変数です。それは人生の一部である限り存続しAppDomainます-これはほとんどの場合、単一のリクエストよりもかなり長くなります。これは、あなたが生涯を想定していたようです。ASP.NET では、同じものAppDomainが多くの要求を処理します。要求ごとに個別のプロセスを取得することはありません。

私はそれを提案します:

  • 最初からシングルトン パターンを使用することは避けます。それが良い考えであることはめったにありません
  • 事実上一定であるデータ以外の静的変数の使用を避けます(そしておそらくそれでも...)
  • のような非ジェネリック コレクションの使用を避けArrayList、代わりに などのジェネリック コレクションを優先します。List<T>

さらに、C# を初めて使用する場合は、最初から Web パーツを破棄することをお勧めします。Web とリッチ クライアントの GUI フレームワークの両方に、学ぶべき独自の癖があります。言語と基本的なコア ライブラリ (コレクションや IO など)を試してみたい場合は、この目的でコンソール アプリを使用する方がはるかに生産的です。

于 2012-10-23T06:13:41.427 に答える