【问题标题】:Difference between Initializer or Static Initiliazer?静态初始化器的初始化器之间的区别?
【发布时间】:2010-12-11 09:23:51
【问题描述】:

当我在 Asp.Net 中使用 XmlDOM 时,有这样的模式:`XmlReader reader = XmlReader.Create()"。

然后我多次遇到相同的模式。

我想知道静态构造函数和“new ClassName()”构造函数之间的区别(我不确定我是否使用正确的术语来描述我的意思)。

我不是问XmlReader.Create() 做了什么,我想了解的是为什么我会使用静态构造函数而不是?它会提供什么样的方面?我可以用静态构造函数做什么,但我不能用 new 关键字构造函数做什么。

提前致谢。

【问题讨论】:

  • 您的问题与您的示例不太相符。 XmlReader.Create 不是“静态构造函数”;它是创建实例的(静态)工厂方法,而静态构造函数将是初始化 XmlReader type 本身的私有部分。

标签: c# object-initializers


【解决方案1】:

首先,让我们按顺序获取术语。 XmlReader.Create 不是静态构造函数。它只是一个静态方法,(通常)返回对象的新实例;这通常称为“工厂方法”。 “静态构造函数”是使用关键字static 声明的构造函数,用于初始化类的静态成员:

class MyClass {
   static MyClass() { ... } // static constructor
}

现在谈谈为什么工厂方法可能更可取。可能有多种原因。

首先,构造函数(通过new 调用)总是必须要么提供一个新实例化的对象,要么抛出一个异常。如果有意义,工厂方法可以返回 null,或者它可能会维护一些对象缓存,并避免一直创建新的对象(例如,当对象不可变时)。

另一个原因是,当您执行new T() 时,您总是得到一个具体的T 实例。工厂方法可以改为创建T 的某个子类的实例,具体取决于输入参数和其他因素。在XmlReader 的情况下,这正是发生的情况——XmlReader 本身就是abstract,所以不可能有任何实例;但是,有几个子类服务于不同的目的(验证/非验证、流后端/支持 DOM 等),XmlReader.Create 根据您提供给它的重载和参数选择正确的。

【讨论】:

  • 谢谢,我正在寻找非常清晰易懂的答案。现在一切都说得通了。
【解决方案2】:

静态构造函数用于初始化任何静态数据,或执行只需要执行一次的特定操作。在创建第一个实例或引用任何静态成员之前自动调用。经典构造函数用于初始化实例变量,每次创建对象时都会调用

【讨论】:

    【解决方案3】:

    你可以在两个构造函数中做同样的事情。没有区别。但是,静态构造函数仅在程序的生命周期内调用 ONCE,并且只允许用于具有静态成员的类。它可以在使用私有静态变量之前对其进行初始化。

    【讨论】:

    • “并且只允许用于具有静态成员的类”,任何类都允许使用静态构造函数,无论有无静态成员!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多