静态构造函数和私有构造函数的主要区别是什么?

4
我只想知道静态构造函数和私有构造函数之间的主要区别。
我知道静态构造函数用于初始化类的静态成员。静态构造函数无法访问非静态成员。它在类的第一个实例之前执行。我们无法确定执行时间。静态构造函数由CLR而不是类的对象执行。由于CLR而不是对象处理,因此没有参数化的静态构造函数。执行时间可能是在包含程序集的加载时。
然而,私有构造函数用于限制类的实例化和继承。当一个类只包含静态成员时使用私有构造函数。
除此之外,在内存使用和其他方面,这两者有什么区别?应该使用哪个?

2
私有构造函数仅用于当一个类只包含静态成员时。 - 那是完全错误的,您混淆了东西。私有构造函数用于限制类的实例化和继承。这到底是什么意思? - user3079266
3
为什么乌鸦像一张写字桌? - Sergey Kalinichenko
3
写字台是笔的安息处,乌鸦则是云雀的害虫。 - Kapol
在疯狂诗人俱乐部:更有帮助 - 更少机智。 - Amy B
2
也许我误解了静态和私有构造函数的概念,这就是我来到这里澄清疑惑的原因。然而,我没有得到答案,反而收到了负面和错误的评论。谢谢大家。 - Running Rabbit
这可能会有所帮助:https://dev59.com/K3E85IYBdhLWcg3w2HRa - Ghost
2个回答

7

私有构造函数仍然是实例构造函数——它们不是静态的。与公共构造函数没有任何区别,只是它们定义了谁可以调用它们,就像公共和私有常规方法之间的区别。

私有构造函数的一些可能用例是单例模式,一个私有构造函数其功能由多个公共构造函数共享,或者使用静态方法来构建您的类,而不是构造函数。

public class Bar {
     private Bar() { }
     private static readonly Bar _instance = new Bar();
     public static Bar GetInstance() { return _bar; }
}

public class Baz {
    private string _msg;
    private Baz(string msg) { // Not accessible publicly
        _msg = msg;
    }

    // These two are accessible publicly, and both call
    // the private constructor
    public Baz(int i) : this(i + " is an integer") { }
    public Baz(decimal d) : this(d + " is a decimal") { }
}

public class Foo {
    private Foo() { // Not accessible publicly
    }
    public static Foo CreateFoo() {
        // Do some stuff here that you can't normally do in a constructor.
        return new Foo();
    }
}

1
谢谢Joe的回答。这解决了我的问题。至少你关心地给出了一个恰当的回复,而不是批评我的问题。 - Running Rabbit
1
没问题。在静态类出现之前(我想是在C# 2.0中),实用类的常见模式是创建一个只有私有构造函数的抽象类,然后里面的所有方法都是静态的。你偶尔还会看到这种模式 - 这可能是混淆的一部分。 - Joe Enos

1
如果您正在使用私有构造函数来抑制仅包含静态成员的类的自动生成公共构造函数...考虑改为在类本身上使用static关键字以防止任何实例化:
public static class MyMethods
{
  public static void Go()
  {
///TODO
  }
}

1
私有构造函数的目的不是为了防止任何实例化,而是为了防止任何外部实例化,同时允许内部实例化,这是static所不允许的。 - Servy
1
是的,而在类级别上使用 static 关键字的目的是防止实例化。看来我们达成了一致。 - Amy B
@Servy,不是所有的编程语言都有静态关键字,因此Yash对于使用私有构造函数来防止静态类实例化的困惑可能源于在其他语言中使用这个技巧。 - David Arno
@DavidArno 的确。在旧版的 C# 代码中,使用私有构造函数也很常见,因为静态类直到 C# 2 才被引入。 - Mike Zboray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接