静态阵列列表将值存储在内存中



我在C#中进行了新的知识,我想学习更多...现在,我有麻烦理解static 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 => 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次,则返回3次..:

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

为什么会发生这种情况?如果我使用静态方法,我可以清除Arraylist结果刷新吗?我只想了解这一点的逻辑。

谢谢!。

为什么会发生这种情况?

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

我建议:

  • 您避免使用单身模式开始;这很少是一个好主意
  • 您避免使用除了有效恒定的数据以外的静态变量(甚至可能是...)
  • 您避免使用诸如ArrayList之类的非生成集合,而偏爱诸如List<T>
  • 之类的通用集合

此外,如果您是C#的新手,我建议您丢弃以Web的一部分 - Web和Rich Client GUI框架都有自己的怪癖可以学习;如果您想尝试 language 和基本核心库(例如,集合和IO),我发现将控制台应用程序用于此目的更有生产力。

最新更新