Разница заключается в том, как реализуется метод Close для каждого класса. Несмотря на сходство функций и внешнего вида, System.Windows.Forms.Form и System.Windows.Window представляют собой два совершенно разных класса, построенных на основе двух разных архитектур.
System.Windows.Forms.Form существует с .NET 1.0 и в основном представляет собой просто тонкую, удобную в использовании оболочку вокруг собственной предварительной (то есть, не объектно-ориентированной) библиотеки Windows UI.
System.Windows.Window является частью WPF, который был представлен в .NET 3.0, был попыткой создать современную инфраструктуру пользовательского интерфейса поверх CLI (а не просто обертывать старую библиотеку Windows UI). Таким образом, реализация System.Windows.Window может быть совершенно иной, чем реализация System.Windows.Forms.Form. Кроме того, хотя операции, доступные в этих классах, могут быть внешне похожими, они не могут быть семантически идентичными. В этом смысле Form.Close и Window.Close не обязательно имеют точно такой же смысл.
Теперь, в этом конкретном случае, согласно документации (http://msdn.microsoft.com/en-us/library/system.windows.forms.form.close(v=vs.110).aspx), вы получаете это исключение, потому что «Форма была закрыта при создании дескриптора». Если вы немного распакуете этот оператор, это значит, что вы сделали вызов метода Close до того, как дескриптор окна (HWND) был создан. Это фактически не имеет ничего общего с тем фактом, что вы закрываете окно в конструкторе: конструктор класса Form уже завершен на этом этапе. Объект Form в .NET представляет собой собственное окно в ОС Windows, которое идентифицируется дескриптором окна (или HWND, который является именем типа, используемым в C/C++). Однако, поскольку создание дескриптора окна является дорогостоящим процессом, объект Form фактически не создает дескриптор, пока он ему не понадобится. Таким образом, дескриптор окна для объекта формы не существует, пока вы не вызываете Form.Show, Form.HWND или какой-либо другой метод, который заставляет его создавать. Если вы вызвали this.Show() прямо перед этим.Close(), исключение не будет выбрано.
Почему это не так в System.Windows.Window? Я предполагаю, что метод Close в System.Windows.Окно немного «умнее» и просто пропускает шаг распоряжения дескриптором, если он еще не существует. Или, возможно, дескриптор окна создается с нетерпением, в отличие от реализации Форм.
Невозможно ли это различие полностью преднамеренно. Не совсем ясно, имеет ли смысл «закрывать» Окно, которое никогда не было показано в первую очередь, и если попытка сделать это должна вызвать исключение. Его выбор дизайна. Возможно, что программисты Microsoft теперь предпочитают семантику System.Windows.Window.Close над менее прощающим System.Windows.Forms.Close, но такое внесение такого изменения не будет обратно совместимым. Или, его возможности никто не замечал и не думал о разнице.
В WinForms, рекомендуется использовать InitializeControls/FormLoaded вместо создания элементов управления (и особенно пытается закрыть ту же форму) в конструкторе. – user2864740
В WPF вы закрываете Window или UserControl? –
Вы видели http://stackoverflow.com/questions/3067901/c-sharp-closing-a-form-during-a-constructor – grantnz