Winforms 我对表单感到困惑。Close()

Winforms 我对表单感到困惑。Close(),winforms,delegates,formclosing,Winforms,Delegates,Formclosing,因此,我将Form2中的委托链接到Form1中的这个函数,然后将Form3中的委托链接到Form2中的委托(正如我所说,它链接到Form1中的函数),但我感到困惑的是,尽管在创建Form3实例时Form2是关闭的,但它仍然工作。如果Form.Close()方法关闭Form2并对其进行处理,那么来自Form3的委托如何仍然可以调用来自Form2的函数(委托) namespace TestingMachine { public delegate void FxDele

因此,我将Form2中的委托链接到Form1中的这个函数,然后将Form3中的委托链接到Form2中的委托(正如我所说,它链接到Form1中的函数),但我感到困惑的是,尽管在创建Form3实例时Form2是关闭的,但它仍然工作。如果Form.Close()方法关闭Form2并对其进行处理,那么来自Form3的委托如何仍然可以调用来自Form2的函数(委托)

    namespace TestingMachine
    {
        public delegate void FxDelegate();

        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {


            }

            private void button1_Click(object sender, EventArgs e)
            {
                Form2 fr2 = new Form2();
                fr2.Delegate_Father_Hide = new FxDelegate(This_Hide);
                fr2.Show();
            }

            public void This_Hide()
            {
                this.Hide();
            }
        }
    }

    namespace TestingMachine
    {
        public partial class Form2 : Form
        {
            public FxDelegate Delegate_Father_Hide;

            public Form2()
            {
                InitializeComponent();
            }

            private void Form2_Load(object sender, EventArgs e)
            {


            }

            private void button1_Click(object sender, EventArgs e)
            {
                Form3 fr3 = new Form3();
                fr3.Delegate_Hide_Grandfather = new FxDelegate(Hide_Grandfather);
                fr3.Show();
                this.Close();

            }

            public void Hide_Grandfather()
            {
                Delegate_Father_Hide();
            }
        }
    }

    namespace TestingMachine
    {
        public partial class Form3 : Form
        {
            public FxDelegate Delegate_Hide_Grandfather;

            public Form3()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                Delegate_Hide_Grandfather();
            }
        }
    }

处理表单会清理正在使用的资源。但是,通过将回调方法
Hide\u-grander
附加到委托
delegate\u-Hide\u-grander
Form3
对象持有对
Form2
对象的引用,因此无法将其标记为GC清理,该对象将保留在内存中并工作(取决于您在内存中的操作)。但我建议清理代码。处理表单会清理正在使用的资源。但是,通过将回调方法
Hide\u-grander
附加到委托
delegate\u-Hide\u-grander
Form3
对象持有对
Form2
对象的引用,因此无法将其标记为GC清理,该对象将保留在内存中并工作(取决于您在内存中的操作)。但是我建议清理你的代码。