0

我有一些代码,如下所示。我想这是Singleton模式。为什么我需要一个静态构造函数。还有这个有什么好处?感谢您的回复 ...

  public sealed class Myclass
  {
    static Myclass()
    {
        Myclass.Application = new Myclass();
    }

    protected Myclass()
    {

    }

    static Myclass _application;

    public static Myclass Application
    {
        get { return Myclass._application; }
        protected set { Myclass._application = value; }
    }

    string _name;

    public string Name
    {
        get { return _name}
        protected set { _name= value; }
    }
 }
4

6 回答 6

6

首先,这个类有一个受保护的构造函数有点奇怪。考虑到它是密封的,这不是一个致命的缺陷,但它显然很奇怪。

此代码与静态变量初始化器的几乎等效使用之间存在潜在的时序差异:

static readonly Myclass _application = new Myclass();

(当然,在这种情况下不需要二传手。)

但是,您不能使用自动实现的属性来做到这一点。

以某种形式使用静态初始化可以让你“自由”线程安全——你不需要做任何锁定来获得延迟初始化。

您可能会发现我的单例实现文章对更多选项很感兴趣。

于 2012-05-28T08:48:33.570 回答
0

您必须在某处创建类的实例,这可以在静态构造函数中,也可以在获取实例的属性中。

无论如何,这不是您找到的一个好的代码示例。

  • protected即使它是,它也有成员sealed,这只会使代码混乱。他们应该是private
  • 如果您查看该Name属性,您会发现无法设置它,所以它始终是null.
于 2012-05-28T08:56:26.323 回答
0

除了 Jon Skeet 的回答指出的线程安全之外,静态构造函数与 get 方法的惰性实例化相比没有直接的优势。尽管您没有指定任何内容,但这可能与您的情况相关,也可能不相关。它只是使代码看起来不同,但会产生相同的功能。

单例模式的“优点”是允许轻松访问类的单个实例,基本上是一种“全局”可访问的类实例。

我说“优势”,因为有很多关于单例模式是反模式的讨论。我在篱笆上。在小型应用程序中,这可以正常运行,并且大多数建议的替代解决方案都涉及依赖注入框架(通常有时具有“单例”的生命周期!),这在较小的应用程序上可能不切实际。

请注意,拥有一个sealedprotected成员的类是没有意义的——密封的类不能被继承。

于 2012-05-28T08:45:35.907 回答
0

如果您以这种方式编写,您可以使用 auto属性而不实际实现它。

像这样说:

 public sealed class Myclass
 {
        static Myclass()
        {
            Myclass.Application = new Myclass();
        }

       .....
        public static Myclass Application {get;set;}
        ...


}

基本上,如果不是这样,就没有任何实际优势:代码风格。

于 2012-05-28T08:46:18.607 回答
0

在这里使用类型 ctor 可以保证单例实例将被初始化一次。在实现惰性单例初始化时,双重检查锁模式更简单,但它有同样的缺点 - 创建单例可能非常昂贵,并且在应用程序生命周期内可能永远不会使用单例。

于 2012-05-28T08:48:33.567 回答
-1

在加载程序集期间调用它的静态构造函数...

编辑: 谢谢乔恩我错了......现在我明白C#中的静态构造函数被指定为仅在创建类的实例或引用静态成员时执行..

于 2012-05-28T08:48:57.050 回答