Initializer或Static Initiliazer之间的区别?

Tar*_*rik 0 c# object-initializers

当我XmlDOM在Asp.Net 中工作时,有一个这样的模式:`XmlReader reader = XmlReader.Create()".

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

我想知道Static Constructor和"new ClassName()"构造函数之间有什么区别(我不确定我是否使用正确的术语来描述我的意思).

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

提前致谢.

Pav*_*aev 8

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

class MyClass {
   static MyClass() { ... } // static constructor
}
Run Code Online (Sandbox Code Playgroud)

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

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

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