c# - 在静态类中有状态是不好的做法吗?

标签 c# static singleton global-variables

我想做这样的事情:

public class Foo {
    // Probably really a Guid, but I'm using a string here for simplicity's sake.
    string Id { get; set; }

    int Data { get; set; }

    public Foo (int data) {
        ...
    }

    ...
}

public static class FooManager {
    Dictionary<string, Foo> foos = new Dictionary<string, Foo> ();

    public static Foo Get (string id) {
        return foos [id];
    }

    public static Foo Add (int data) {
        Foo foo = new Foo (data);
        foos.Add (foo.Id, foo);

        return foo;
    }

    public static bool Remove (string id) {
        return foos.Remove (id);
    }

    ...

    // Other members, perhaps events for when Foos are added or removed, etc.
}

这将使我能够从任何地方管理 Foo 的全局集合。但是,有人告诉我静态类应该始终是无状态的——您不应该使用它们来存储全局数据。总体而言,全局数据似乎不受欢迎。如果我不应该使用静态类,那么解决这个问题的正确方法是什么?

注意:我确实找到了 similar question ,但给出的答案并不真正适用于我的情况。

最佳答案

谁坚持静态类应该是无状态的?静态表示声明。

只知道静态类在 CLR 中是如何工作的:

  • 您无法控制调用静态构造函数的时间。
  • 静态类对于每个调用程序都有一个单独的状态。

还要注意并发问题。

附带说明一下,令我惊讶的是人们经常说“不要使用 X”。这就像有人走进你的工具棚,指着六个工具说,“那些工具是不好的做法。”这没有意义。

关于c# - 在静态类中有状态是不好的做法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2754089/

相关文章:

java - 最终类用作变量持有者

c++ - C++ 中的全局变量

php - 如何在不使用全局状态的情况下访问我的单例?

c# - autofac 中的条件组件注册

c# - 从 asp.net mvc 站点中的外部站点获取帖子响应

objective-c - 以编程方式在 uitableview 中设置静态单元格

c++ - 在 Singleton 设计模式的情况下,我们如何使析构函数私有(private)化?

c# - ASP.NET : Check for click event in page_load

c# - 指针不在winform上时的鼠标指针位置

c++ - 静态 constexpr 全局变量