【问题标题】:static ArrayList stores values in memory?静态 ArrayList 将值存储在内存中?
【发布时间】:2012-10-23 06:10:40
【问题描述】:

我是 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();

如果我刷新网站一次,我得到与 php 相同的结果......但是,如果我刷新它 3 次返回......:

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

为什么会这样?如果我使用静态方法,我可以清除 ArrayList 结果刷新吗? 我只是想了解一下其中的逻辑。

谢谢大家!

【问题讨论】:

标签: c# asp.net


【解决方案1】:

为什么会这样?

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

我建议:

  • 您避免使用单例模式开始;这很少是一个好主意
  • 您避免使用静态变量,而不是用于有效恒定的数据(甚至可能......)
  • 避免使用像ArrayList 这样的非泛型集合,而是使用像List<T> 这样的泛型集合

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

【讨论】:

  • 我会听从您的建议.. 随着我的前进,我觉得我缺少更多需要理解和学习的东西。顺便说一句,如果我寻求处理来自单个实例的变量,不推荐使用单例模式吗?
  • @Carasuman:单例模式导致代码难以测试,尤其不适合 Web 应用程序中的可变数据。依赖注入通常有助于为多个对象提供相同的实例。这真的取决于你想要做什么。
  • 你建议一本书从零开始用C#?感谢您的帮助
  • @Carasuman: C# in a Nutshell 很好,或者如果您更喜欢 Head-First 风格,Head-First C# 的第二版(或更高版本)也可以。对我来说,它有点侧重于 GUI,但是嘿......
猜你喜欢
  • 2017-10-19
  • 2011-12-09
  • 1970-01-01
  • 1970-01-01
  • 2011-10-03
  • 2011-01-16
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多