C# 是否初始化在if条件下工作的组件?

C# 是否初始化在if条件下工作的组件?,c#,winforms,idisposable,C#,Winforms,Idisposable,我正在尝试创建由2个项目组成的新解决方案。解决方案启动项目是“主组件”项目,另一个项目是“登录功能”项目 解决方案启动时,基本上在“主组件”中MainForm,在“登录函数”中调用LoginForm。我在MainForm构造函数中编写了一个条件,用于调用LoginForm并正常工作,但当从LoginForm中转义时,我在Program.cs中收到如下错误。因为initializeComponent()部分在条件为true时工作。我不知道还有没有别的办法 我知道解决方案正在运行,但如何解决此问题

我正在尝试创建由2个项目组成的新解决方案。解决方案启动项目是“主组件”项目,另一个项目是“登录功能”项目

解决方案启动时,基本上在“主组件”中MainForm,在“登录函数”中调用LoginForm。我在MainForm构造函数中编写了一个条件,用于调用LoginForm并正常工作,但当从LoginForm中转义时,我在Program.cs中收到如下错误。因为initializeComponent()部分在条件为true时工作。我不知道还有没有别的办法

我知道解决方案正在运行,但如何解决此问题

Program.cs

namespace Main_Component
{
    static class Program
    {
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            using (var mainForm = new MainForm())
            {
                Application.Run(mainForm);
            }
        }
    }
}
无法访问已释放的对象。\r\n对象名称:“MainForm”


您的主要问题是没有正确处理IDisposable组件。 您需要有一个更好的组件结构,这样您就不会手动更新组件。 但您可以使用以下
用法来修复现有conde:

public MainForm()
    {
        try
        {
            using(var _lForm=new LoginForm())
            {
                _lForm.ShowDialog();
                if (LoginForm._loginSuccess)
                {
                    InitializeComponent();
                }
                else
                {
                    this.Close();
                }
            }
        }
        catch (Exception err)
        {
            MessageBox.Show(err.Message.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }

与其启动
MainForm
不如从
Main()启动
LoginForm
,然后启动
MainForm()
在成功登录时。这意味着我将更改为startup proect作为登录函数,当然,如果我像你说的那样,但我不想隐藏startup project,我应该隐藏loginform并显示mainform。@Okan不,它不是。让
Main
使用自己的应用程序循环,将登录表单作为自己的主表单启动。当它结束时,用一个新的应用程序循环启动一个新的主窗体。@Servy我完全明白你的意思。我尝试在mainform构造函数中使用runlogin表单,但mainform initializeComponent在开始时运行,如您所知。我正在尝试阻止在loginform之前显示mainform。我试着这么做,但我没想到how@Okan因此,不要在主窗体的构造函数中创建登录窗体,在主窗体被构造之前,在主方法中创建并显示它。是的@klashar,您关于“使用”用法的看法完全正确,但结果是一样的。仍在接收“无法访问已处理的对象”。\r\n对象名称:“MainForm”
public MainForm()
    {
        try
        {
            using(var _lForm=new LoginForm())
            {
                _lForm.ShowDialog();
                if (LoginForm._loginSuccess)
                {
                    InitializeComponent();
                }
                else
                {
                    this.Close();
                }
            }
        }
        catch (Exception err)
        {
            MessageBox.Show(err.Message.ToString(), "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
        }
    }