整个应用中使用的单个对象应该是静态的吗?

本文关键字:静态 对象 单个 应用 | 更新日期: 2023-09-27 18:02:54

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

鉴于上述情况,将此对象设置为静态不是更容易(也是更好的设计)吗?因为另一种选择就是我目前正在做的——在对象之间传递对同一单个实例的数十个引用。

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

对于我的情况,你认为最好的方法是什么?有没有我没考虑到的其他解决方案?

整个应用中使用的单个对象应该是静态的吗?

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

不需要到处传递引用,Singleton提供了一个全局访问点。

的例子:

public class Singleton
{
    private static Singleton instance;
    private Singleton()
    {}
    public static Singleton GetInstance()
    {
        if(instance == null)
           instance = new Singleton();
        return instance;
    }
}

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

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

Singleton.GetInstance().FunctionName();

同样,这是延迟实例化,不是线程安全的(多线程程序),但是你可以自己学习更多,应该很有趣!

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

这样,您就可以根据具体情况用不同的对象或类替换该对象或类,例如,一个类用于生产代码,另一个用于测试。

实例可以通过不同的依赖注入方式解析,例如

    构造函数注入
  • 属性注入

  • 控制反转容器(例如CommonServiceLocator)

  • 配置文件

在所有这些选项中,你定义一个接口或基类与你想要使用的公共契约,然后确定实际的类/实例实现的接口之外的使用代码,这样你可以改变决策而不改变代码。

对于你想要的,我会说singleton。这一切都归结为偏好。静态使得你的类不能被实例化,所以你使用className.myMethod()。如果您的数据检索不是在构造函数中完成的,并且您使用一个方法来拉入数据,那么这很好。但是,如果构造函数具有连接凭据,则需要将其移动到可以调用的新方法中。单例可以限制为一个实例。您可以测试两者,看看哪一个最适合您。

如何使用单例模式?http://en.wikipedia.org/wiki/Singleton_pattern不需要传递引用。这可能会使再次更改设计更容易。