【问题标题】:Does Static class create an instance? msdn says i doesn't, but why constructor then?静态类是否创建实例? msdn 说我没有,但是为什么要构造函数呢?
【发布时间】:2013-10-07 21:12:22
【问题描述】:

我试图理解单例对象和静态类之间的区别

我在各处看到的最简单的信息是静态类不创建实例,而单例则需要

但是为什么我可以从静态类中获得静态构造函数呢?这意味着什么?它不创建一个实例吗?

如果你在静态类构造函数上运行带有断点的简单代码,你会看到它到达它

我很困惑,有人吗?

【问题讨论】:

  • 非静态类也可以有静态构造函数。重点是它只运行一次,你不知道何时或如何。

标签: c# .net static singleton


【解决方案1】:

但是为什么我可以从静态类中获得静态构造函数呢?这意味着什么?它不创建一个实例吗?

没有。静态构造函数允许您初始化类的 static 成员(基本上,该类的静态状态)。

对于单例模式,静态构造函数(或静态内联初始化程序)通常会创建一个实例,但该实例仍是通过普通的非静态构造函数创建的。然后将其存储在一个静态变量(单个“实例”变量)中。

延迟初始化的单例会避免这种情况,并按需初始化静态变量。

static class 是另一回事 - 静态类永远不会作为单例工作,因为您无法创建静态类的实例。静态类专门用于您永远不会创建实例的情况。

单例将(通常)通过非静态类创建,但使用私有构造函数(因此只能在该类中创建实例)。将有一个静态属性用于检索该类的单个实例。类实例可以按需创建,也可以在静态构造函数中创建。

【讨论】:

  • 但这仍然留下了静态字段存储在哪里的问题。
  • @ThePoet - 在堆上,他们需要在里面。就像在一个实例中一样。
  • @HenkHolterman 这不是问题的一部分,据我所知......?
  • @ReedCopsey - 不,这是我对标题的第一次解释。但不是 OP 想要的。
【解决方案2】:

静态构造函数只是一个可以初始化静态成员变量的地方。您不需要静态构造函数 - 您可以内联初始化静态成员变量,但我认为将它们放在静态构造函数中更整洁。

请记住,即使您不实例化静态类,您实例化它的静态成员,而且有一个地方可以这样做是件好事。这是对您必须在 C++ 中执行此操作的方式的改进。

请注意,您的类不需要是静态的才能拥有静态构造函数。您可以拥有一个同时提供普通构造函数和静态构造函数的非静态类。同样的规则也适用。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-13
    • 2020-10-03
    • 2017-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-25
    • 1970-01-01
    相关资源
    最近更新 更多