Разница между инициализатором и статическим инициализатором? - PullRequest
0 голосов
/ 29 октября 2009

Когда я работал с XmlDOM в Asp.Net, был такой шаблон: `XmlReader reader = XmlReader.Create ()".

А потом я столкнулся с той же моделью несколько раз спустя.

Мне нравится знать, в чем разница между статическим конструктором и конструктором "new ClassName ()" (я не уверен, что использую правильные термины для описания того, что я имею в виду).

Я не спрашиваю, что делает XmlReader.Create(), я хочу узнать, почему я использовал бы статический конструктор, а не чем? Какой аспект это обеспечит? Что я могу сделать со статическим конструктором, но не могу сделать с новым конструктором ключевых слов.

Заранее спасибо.

Ответы [ 3 ]

8 голосов
/ 29 октября 2009

Прежде всего, давайте приведем терминологию в порядок. XmlReader.Create является , а не статическим конструктором. Это просто статический метод, который (как правило) возвращает новые экземпляры объектов; это обычно называется «фабричным методом». «Статический конструктор» - это конструктор, объявленный с ключевым словом static, используемым для инициализации статических членов класса:

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

Теперь о том, почему фабричный метод может быть предпочтительнее. Причин может быть несколько.

Во-первых, конструктор (вызывается через new) всегда должен либо предоставить новый экземпляр объекта, либо выдать исключение. Фабричный метод может возвращать null, если это имеет смысл, или он может поддерживать некоторый кэш объектов и избегать постоянного создания нового (например, когда объекты неизменны).

Другая причина в том, что когда вы делаете new T(), вы всегда получаете конкретно экземпляр T. Вместо этого фабричный метод может создать экземпляр некоторого подкласса T, в зависимости от входных параметров и других факторов. В случае XmlReader это именно то, что происходит - XmlReader само по себе является abstract, так что не может быть никаких примеров этого; однако есть несколько подклассов, которые служат различным целям (валидация / не валидация, потоковый бэкэнд / резервная копия DOM и т. д.), и XmlReader.Create выбирает правильный на основе перегрузки и аргументов, которые вы ему предоставляете.

0 голосов
/ 29 октября 2009

Вы можете сделать то же самое в обоих конструкторах. Нет никакой разницы. Тем не менее, статический конструктор называется только ONCE во время жизни вашей программы и разрешен только для классов со статическими членами. Он может инициализировать приватные статические переменные перед их использованием.

0 голосов
/ 29 октября 2009

Статический конструктор используется для инициализации любых статических данных или для выполнения определенного действия, которое необходимо выполнить только один раз. Он вызывается автоматически перед созданием первого экземпляра или ссылками на любые статические члены. Классический конструктор используется для инициализации переменных экземпляра и вызывается при каждом создании объекта

...