关于C#:整个应用程序中使用的单个对象应该是静态的吗?

Should a single object used throughout the app be static?

我正在编写一个C应用程序,它基于历史价格分析股票。我有一个保存数据的对象(历史价格)。所有的数据都保存在这个对象中——我只需要它的一个实例,并且数据在整个应用程序中被许多其他对象使用。

考虑到上面的内容,使这个对象静态化不是更容易(也是更好的设计)吗?因为另一种选择是我目前正在做的——在对象之间传递对同一个实例的数十个引用。

我之所以犹豫不决,是因为我知道应该认真对待static对象,因为我已经读过这个答案。在我的例子中,对象不是简单的实用程序对象,也不是无状态的。数据正在被加载到对象中并对其进行更改,但我的想法是,这些更改仍然需要在所有其他对象之间共享,而且我知道我不需要拥有此数据对象的两个不同实例。

在我的案例中,你认为最好的方法是什么?有没有其他解决方案我没有考虑?


您可以将其设置为静态的或使用单例设计模式。我会用单件的。

不需要传递引用,singleton提供全局访问点。

例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Singleton
{
    private static Singleton instance;

    private Singleton()
    {}

    public static Singleton GetInstance()
    {
        if(instance == null)
           instance = new Singleton();

        return instance;
    }
}

私有构造函数和GetInstance()函数确保对象只有一个实例。

如果需要获取对对象的引用以调用对象内部的函数,只需使用以下命令:

1
Singleton.GetInstance().FunctionName();

此外,这是一个懒惰的实例,而不是线程安全的(多线程程序),但您可以自己了解更多,应该很有趣!


如果您的对象有一个状态,那么我建议使用依赖注入设计模式,而不是使其为静态或单体。

这样,你可以用不同的对象来替换这个对象或类,这取决于环境,例如生产代码的一个类,另一个用于测试。

实例可以在各种依赖注入样式中解决,例如

  • 构造注入

  • 属性注入

  • 控制容器反转(如CommonServiceLocator)

  • 配置文件

在所有这些选项中,您使用要使用的公共契约定义接口或基类,然后确定在使用代码之外实现接口的实际类/实例,这样您就可以在不更改该代码的情况下更改决策。


为了你想要的,我会说"单身"。一切都取决于个人喜好。static使其成为无法实例化类的对象,因此使用classname.mymethod()。如果您的数据检索不是在构造器中完成的,并且您使用一个方法来提取数据,那么这很好。如果您的构造函数有连接凭据,您需要将其移到可以调用的新方法中。单实例可以限制为单个实例。你可以测试两者,看看哪一个最适合你。


使用单例模式怎么样?http://en.wikipedia.org/wiki/singleton_模式不必传递引用。这可能有助于更容易地再次更改设计。