首先,让我们按顺序获取术语。XmlReader.Create不是静态构造函数。它只是一个静态方法,(通常)返回对象的新实例;这通常称为“工厂方法”。“静态构造函数”是用关键字声明的构造函数static,用于初始化类的静态成员:
class MyClass {
static MyClass() { ... } // static constructor
}
现在至于为什么工厂方法可能更可取。可能有几个原因。
一方面,构造函数(通过调用new)总是必须要么提供一个新实例化的对象,要么抛出一个异常。null如果有意义,工厂方法可以返回,或者它可以维护一些对象缓存,并避免一直创建一个新的(例如,当对象是不可变的时)。
另一个原因是当你这样做时new T(),你总是会得到一个特定的T. T工厂方法可以根据输入参数和其他因素创建某个子类的实例。在 的情况下XmlReader,这正是发生的事情——XmlReader它本身就是abstract,所以不可能有它的任何实例;但是,有几个子类用于不同的目的(验证/非验证、流后端/DOM 支持等),并XmlReader.Create根据您提供给它的重载和参数选择正确的子类。