Winforms 如何中断窗口窗体的构造函数?

Winforms 如何中断窗口窗体的构造函数?,winforms,Winforms,我有一个简单的应用程序: static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompa

我有一个简单的应用程序:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }
}

我知道我可以在申请前检查一些条件。运行,但很难更改(相信我)。我需要检查Form1构造函数中的一些条件。如果某个_条件==true且答案为否-->应用程序将关闭。

在表单加载事件中更容易实现这一点。您只需调用Close()


在构造函数中调用Close()将导致问题,因为窗口尚未打开。您将得到一个仍在尝试打开的已释放窗口。

构造函数的目的是创建对象的实例。因此,它不应该失败,除非对象的某个前提失败。在这种特殊情况下,您唯一的选择是抛出异常

换句话说:你调用一个对象的构造函数来创建这个对象的实例,所以这是一个原子函数,除非你有技术问题,否则不应该失败

现在,您要做的是避免表单在某些条件下显示。有一些方法可以做到这一点。首先,让我们看一下代码:

Application.Run(new Form1());
这个代码段做了两件事:创建
Form1
的实例并显示它(通过将其提供给
Application.Run
)。因此,一个选择是:

// snippet at program.cs
Form1 mainForm = new Form1();
if (mainForm.IsValid)
{
     Application.Run(new Form1());        
}

// snippet at Form1.cs
public bool IsValid
{
    get 
    {
        // evaluate all conditions that should determine if the form is to be showed.
        return condition;   
    }
}
在program.cs中添加代码以检查表单是否有效。一种方法是将其作为表单中的属性公开。当然,如果您正在跟踪,这可能是您域的一个方法/属性,但将其放在何处取决于您的调用

此方法/属性(在我的代码中称为“IsValid”)负责检查表单是否可以在当时显示

请记住在程序中将逻辑与表示分离


那就行了

把逻辑放在一个静态的形式方法中。所以你甚至可以在创建表单之前调用它。对不起,这么长时间以来,我一直认为我检查了你的答案是有用的。@alexander:嘿,没问题!谢谢,我希望答案是有用的。
// snippet at program.cs
Form1 mainForm = new Form1();
if (mainForm.IsValid)
{
     Application.Run(new Form1());        
}

// snippet at Form1.cs
public bool IsValid
{
    get 
    {
        // evaluate all conditions that should determine if the form is to be showed.
        return condition;   
    }
}