Прежде всего, давайте приведем терминологию в порядок. XmlReader.Create
является , а не статическим конструктором. Это просто статический метод, который (как правило) возвращает новые экземпляры объектов; это обычно называется «фабричным методом». «Статический конструктор» - это конструктор, объявленный с ключевым словом static
, используемым для инициализации статических членов класса:
class MyClass {
static MyClass() { ... } // static constructor
}
Теперь о том, почему фабричный метод может быть предпочтительнее. Причин может быть несколько.
Во-первых, конструктор (вызывается через new
) всегда должен либо предоставить новый экземпляр объекта, либо выдать исключение. Фабричный метод может возвращать null
, если это имеет смысл, или он может поддерживать некоторый кэш объектов и избегать постоянного создания нового (например, когда объекты неизменны).
Другая причина в том, что когда вы делаете new T()
, вы всегда получаете конкретно экземпляр T
. Вместо этого фабричный метод может создать экземпляр некоторого подкласса T
, в зависимости от входных параметров и других факторов. В случае XmlReader
это именно то, что происходит - XmlReader
само по себе является abstract
, так что не может быть никаких примеров этого; однако есть несколько подклассов, которые служат различным целям (валидация / не валидация, потоковый бэкэнд / резервная копия DOM и т. д.), и XmlReader.Create
выбирает правильный на основе перегрузки и аргументов, которые вы ему предоставляете.