初始化器和静态初始化器之间的区别?

时间:2009-10-29 19:42:10

标签: c# object-initializers

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

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

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

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

提前致谢。

3 个答案:

答案 0 :(得分:8)

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

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

现在为什么工厂方法可能更可取。可能有几个原因。

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您可以在两个构造函数中执行相同的操作。没有区别。但是,静态构造函数在程序的生命周期中仅被称为 ONCE ,并且仅允许具有静态成员的类。它可以在使用之前初始化私有静态变量。

相关问题