Разница между инициализатором и статическим инициализатором?

StackOverflow https://stackoverflow.com/questions/1646083

  •  22-07-2019
  •  | 
  •  

Вопрос

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

А потом я столкнулся с одним и тем же шаблоном несколько раз спустя.

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

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

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

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top