【问题标题】:Private vs Static constructors in .Net.Net 中的私有与静态构造函数
【发布时间】:2012-10-26 05:54:00
【问题描述】:

我搜索了很多,但没有一个答案是明确的(至少对我来说!)。现在我把这个问题放在 SO 中,因为我相信我无法在其他任何地方得到更明确的答案。

什么时候应该在我的类中使用私有/静态构造函数?

我厌倦了通常的答案,所以请帮助我提供一些实时示例以及使用这些构造函数的优点/缺点。

【问题讨论】:

  • 私有构造函数 - 如果你不希望你的对象可以从当前类之外构造。静态构造函数 - 如果您需要初始化静态类的状态。

标签: c# .net static-constructor private-constructor


【解决方案1】:

静态构造函数:用于初始化静态成员。

私有构造函数:当您只希望类在其自己的代码中被实例化时使用(通常在静态方法中)。例如:

public class Thing
{
    static int Number;

    static Thing()
    {
        Number = 42; // This will only be called once, no matter how many instances of the class are created
    }

    // This method is the only means for external code to get a new Thing
    public static Thing GetNewThing()
    {
        return new Thing();
    }

    // This constructor can only be called from within the class.
    private Thing()
    {
    }
}

【讨论】:

  • 您可以通过这种方式实现工厂模式 - 即,如果您的业务对象需要处于某种“状态”,但您想防止第 3 方/其他开发人员使用公共构造函数初始化它们,您可以将构造函数设为私有,并提供一组工厂方法来创建/获取对象。这样他们就无法通过构造函数获得“空白”无状态对象(除非他们真的想要例如反射)
  • 静态构造函数也可以用来调用私有构造函数,进而实例化包含类类型的私有静态成员。静态函数/属性只能返回此成员,因此此类对象始终只有一个实例 - 单例。
【解决方案2】:

我什么时候应该在我的类中使用私有构造函数?

当你想要一个构造函数,但又不想把它暴露给世界时。这可能是因为您有一个调用构造函数的工厂方法(在验证之后),或者因为该构造函数是由 ctor-chaining 调用的(即public Foo(string) : this() { ...})。

此外,请注意反射代码通常能够使用私有构造函数 - 例如序列化或 ORM 库。

此外,在早期的 C# 编译器中,当您编写现在将成为 static 的类时 - 拥有私有构造函数是使其看起来无法创建的唯一方法。

什么时候应该在我的类中使用静态构造函数?

当您需要在实例或静态方法访问该状态之前初始化某个静态状态时。

【讨论】:

    【解决方案3】:

    静态构造函数用于初始化类的静态成员,在创建类的第一个实例或第一次访问静态成员时调用。

    如果您有构造函数的重载,则使用私有构造函数,其中一些只能由其他构造函数使用

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-28
      • 2014-10-12
      • 2013-07-24
      • 2010-09-24
      • 2011-04-19
      相关资源
      最近更新 更多