0

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

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

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

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

提前致谢。

4

3 回答 3

8

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

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

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

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

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

于 2009-10-29T19:50:22.023 回答
0

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

于 2009-10-29T19:47:05.553 回答
0

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

于 2009-10-29T19:47:13.130 回答