静态初始化模式

时间:2012-05-30 18:45:21

标签: c# initialization

通过静态 init 方法初始化静态字段的最佳方法是什么,然后确保永远不再调用该方法? (在计划的整个生命周期内不超过一次)

这是我目前想到的一个例子,对我来说似乎很简单,但我找不到任何类似模式的例子来解决这个问题:

class Entity
{
    static Manager manager;
    static bool isInitialized;

    public static void Initialize(Manager manager)
    {
        if (isInitialized)
            throw Exception("Class Entity already initialized."
                 + "Do not call Entity.Initialize() twice.");
        isInitialized = true;
        Entity.manager = manager;

    }
}

6 个答案:

答案 0 :(得分:6)

  

通过静态init方法初始化静态字段的最佳方法是什么,然后确保永远不再调用该方法?

你真的这样做吗?为什么你不想创建Manager的实例并使其可用于通过依赖注入依赖它的代码?这将使您的代码更清晰:

  • 您可以使用不同的初始化路径来测试它
  • 您不需要检查“错误”重复初始化
  • 您不需要构造调用代码来为此类指定单个初始化点。 (当然,你可能需要为IoC容器做类似的事情......)
  • 您允许依赖它的代码更易于测试
  • 依赖于Manager的代码将以更清晰的方式表达依赖性

我怀疑你没有找到任何类似的例子,因为它是一种反模式。

如果您采用当前的方法,那么您应该尝试使其线程安全......

答案 1 :(得分:1)

不要过度思考,如果这种模式适合你,那就去吧。并不总是有一个“正确”的答案,并且只是为了坚持它们而试图坚持僵硬的模式和做法也不是一个好主意。 IMHO。

答案 2 :(得分:1)

很抱歉显而易见,但您可以使用对象初始化程序或静态构造函数。除此之外,你可以不要调用方法。认真。为什么有人会调用一个名为 initialize 的方法。

你可以做的是this。您可以使用此属性隐藏IntelliSense中的方法。阻止它使下拉列表变得混乱

答案 3 :(得分:0)

您的实现不是线程安全的,但在其他方面是合理的。如果它打算在多线程环境中使用,请添加锁定。

在您的示例中,如果多个调用者(可能来自多个线程)使用不同的参数调用初始化方法,则应该发生的问题是打开的问题。这就是使您的模式不正常的原因,并阻止您使用明显的静态构造函数或对象初始化程序。

答案 4 :(得分:0)

你不能只使用静态构造函数吗?

当然,您无法控制何时调用此构造函数,但不知道这是否是必需的。

http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx

答案 5 :(得分:0)

您可能希望使用带参数的单例模式仅显示Manager变量的某些功能。

class Entity
{
    private Manager _manager = null;

    public Manager manager
    {
        get
        {
            return _manager;
        }
        set
        {
            if (manager == null)
            {
                _manager = value;
            }
        }
    }
    /* rest of class */
}

现在您可以将manager对象用作任何变量,但重复的集合不会修改该值。

this.manager = new Manager(0); // sets the manager
this.manager = new Manager(1); // does nothing

现在要在构造函数中的某处或某些重置函数中完成模式,您可能需要执行

this._manager = null;