C# 为什么下面的代码会产生对象处理异常

C# 为什么下面的代码会产生对象处理异常,c#,winforms,C#,Winforms,我在VisualStudio中玩,对C#有了更多的了解。我来自Java的中级背景知识 我制作了一个非常简单的windows窗体应用程序。用户点击一个按钮,该按钮将他们带到另一个屏幕,用户在文本框中键入并按下一个按钮,该按钮将显示用户键入的内容;在形式上。代码如下: 表格1.cs: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.

我在VisualStudio中玩,对C#有了更多的了解。我来自Java的中级背景知识

我制作了一个非常简单的windows窗体应用程序。用户点击一个按钮,该按钮将他们带到另一个屏幕,用户在文本框中键入并按下一个按钮,该按钮将显示用户键入的内容;在形式上。代码如下:

表格1.cs:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
    public partial class Form1 : Form


    {
        Form2 userinputForm;
        public Form2 getSetForm2 {
            get { return userinputForm; }
            set { userinputForm = value; }
        }

        Form1 homeFormObj;
        public Form1 getSetForm1 {
            get { return homeFormObj; }
            set { homeFormObj = value; }
        }



        public Form1()
        {
            InitializeComponent();
            getSetForm2 = new Form2();
            getSetForm1 = this;
            getSetForm2.formOnePublicObj = getSetForm1;
        }

        internal void displayUserInput(string name)
        {
            Label l = new Label();
            l.Text = name;

            panel1.Controls.Add(l);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            userinputForm.Show();
        }
    }
}
表格2.cs:

    using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace WindowsFormsApplication3
{
    public partial class Form2 : Form
    {
        Form1 formOneObj;
        public Form1 formOnePublicObj {
            get { return formOneObj; }
            set { formOneObj = value; }
        }

        public Form2()
        {
            InitializeComponent();
        }

        List<string> userinputs = new List<string>();

        private void button1_Click(object sender, EventArgs e)
        {
            string name = textBox1.Text;
            formOnePublicObj.displayUserInput(name);

        }
    }
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
命名空间Windows窗体应用程序3
{
公共部分类表单2:表单
{
Form1 formOneObj;
公共表格1 formOnePublicObj{
获取{return formOneObj;}
设置{formOneObj=value;}
}
公共表格2()
{
初始化组件();
}
List userinputs=新列表();
私有无效按钮1\u单击(对象发送者,事件参数e)
{
字符串名称=textBox1.Text;
formOnePublicObj.displayUserInput(名称);
}
}
}
当用户第二次按下按钮转到form2时,错误就会发生。它发生在.show()方法上


(p.S我这样编码是为了看看如何将数据从一个windows窗体传递到另一个窗体,从而传递给窗体对象上的getter和setter)。

嗯,
userinputform
从未设置过,因此
null
也从未设置过。因此,我不明白为什么它第一次就可以工作,除非这不是您粘贴的代码

这可能是因为你正在关闭第二个表单,它正在破坏它,因此你不能再次显示它。每次单击form1中的按钮时,请创建一个新form2:

        getSetForm2 = new Form2();
        getSetForm1 = this;
        getSetForm2.formOnePublicObj = getSetForm1;

在表单之间传递数据的更好方法是使用第三个对象作为数据存储,然后将相同的对象传递给两个表单。这就是编码技术背后的逻辑,比如,传递给两种形式的对象都是“模型”。这是有缺陷的,您保留了对死对象的引用。使用Form2的FormClosed事件知道它是一只死鹦鹉,将userinputForm重置回null。或者不允许它消亡,使用FormClosing事件并调用Hide()和e.Cancel=true,使其保持不变。@HansPassant那么当表单关闭时(即用户按下X按钮),整个表单对象将被销毁?@Tarikh Yes。请阅读下面我的答案以了解更多详细信息。是的,也不是部分内容。遵循“自然”的方式,当用户单击“关闭”时,他总是表示“不再需要你了,再见”。覆盖用户的意图是程序员的工作。也许你不应该,这不是一般的.NET方式。只在需要时创建一个对象,并且不必与机器对抗。
userinputform
会在
getsetForm2=new Form2()
处初始化,因为它通过getter/setter初始化它。在你的第二点上,是的,我在想这个。当我实现该代码时,用户可以在Form1中发送垃圾邮件,这会弹出很多Form2。我怎样才能防止这种情况发生?不是在你上面发布的代码中。从未设置userinputform。“垃圾邮件按钮”是什么意思?我的意思是,如果用户在form1上按了5次按钮,那么如何防止form2同时显示多次?