static ArrayList将值存储在内存中?

时间:2012-10-23 06:10:40

标签: c# asp.net

我是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 => first,1 => second)

我试图在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结果刷新吗? 我只是想了解这个的逻辑。

谢谢你们!。

1 个答案:

答案 0 :(得分:3)

  

为什么会这样?

这是一个静态变量。只要AppDomain它是生命的一部分,它就会存在 - 这几乎总是比单个请求长得多,这似乎是你假设的生命周期。在ASP.NET中,相同的AppDomain服务于许多请求 - 您不会为每个请求获得单独的进程。

我建议:

  • 您可以避免使用单例模式开始;这是一个很好的主意
  • 除了对于实际有效的数据(甚至可能是......)
  • 之外,你可以避免使用静态变量
  • 您避免使用ArrayList等非通用集合,而是偏向List<T>
  • 等通用集合

此外,如果您是C#的新手,我建议您先放弃Web部件 - Web和富客户端GUI框架都有自己的怪癖需要了解;如果你想试验语言和基础核心库(例如集合和IO),我发现为此目的使用控制台应用程序会更有效率。