2017-01-02 2 views
1

Я занимаюсь рефакторингом в своем приложении, и хочу собрать глобальные инициализации в app.xaml.cs.В чем разница между конструктором приложений и app.Onstartup?

У меня были некоторые из них в конструкторе и другие в OnStartup.

OnStartup, кажется, называется сразу после конструктора.

В чем разница между двумя методами? Где я должен поместить весь свой код?

+0

Существует тонкое различие, ctor всегда будет самым первым и является «правильным» местом для инициализации всего, что уместно для класса, но это не зависит от структуры WPF. Обычно ничего. OnStartup - это то место, где Fx говорит «настроиться». В случае сомнений используйте OnStart. –

+0

@HenkHolterman конструктор не первый в этом случае, см. Мой ответ, пожалуйста. Заказ: base ctor> onstartup> собственный ctor. –

+1

Да, но я бы предпочел рассмотреть эту «деталь реализации». Возможны изменения. Но вы правы, не можете инициализировать что-либо в ctor, если OnStart этого требует. –

ответ

2

Нет большой разницы, как вы можете видеть от the source of System.Windows.Application.

Метод OnStartup - последний метод, вызываемый из конструктора.

Если вы реализуете свой собственный конструктор, то уже был запущен OnStartup. Кроме того, в уникальном случае вы переопределяете собственную реализацию OnStartup, можете отменить реализацию, которую вы уже имели (если вы не вызываете base).

Лично я все равно поеду за OnStartup, но я думаю, это не имеет большого значения. Смешивание двух вместе, хотя может быть опасно, если вы не знаете настоящего порядка выполнения.

+0

Могу ли я, например, разместить глобальный обработчик исключений в ctor и остальных в onstartup? –

+0

Вы можете, но обработчик исключений будет эффективен только после * 'OnStartup', как заметил Хенк, эта« деталь реализации »довольно значительна. –

+0

Стоит отметить, что существуют рекомендации против вызова виртуальных методов из конструктора. класс Application нарушает все правила. –

Смежные вопросы