C#对象(创建和使用)

C#对象(创建和使用),c#,button,scope,out,C#,Button,Scope,Out,在C#中,如果在单击按钮时创建对象,则在单击事件结束时,该对象不再在范围内。如何在单击按钮时创建对象,但在单击另一个按钮时释放它。以下是我试图做的: 构建一个接受用户数据并将其添加到数据库的应用程序。该应用程序包含两类:个人信息和雇主信息。当按下“启动应用程序”按钮时,应创建个人信息类对象。然后,应用程序打开一个选项卡,请求个人信息。如果选择“添加雇主”按钮,将创建雇主的实例。在最后按submit后,它应关闭一个或两个对象并返回主菜单。当下一个人按下按钮时,它应该再次执行该过程 我可以单击或在类

在C#中,如果在单击按钮时创建对象,则在单击事件结束时,该对象不再在范围内。如何在单击按钮时创建对象,但在单击另一个按钮时释放它。以下是我试图做的:

构建一个接受用户数据并将其添加到数据库的应用程序。该应用程序包含两类:个人信息和雇主信息。当按下“启动应用程序”按钮时,应创建个人信息类对象。然后,应用程序打开一个选项卡,请求个人信息。如果选择“添加雇主”按钮,将创建雇主的实例。在最后按submit后,它应关闭一个或两个对象并返回主菜单。当下一个人按下按钮时,它应该再次执行该过程

我可以单击或在类本身中创建对象,但是如何将对象的寿命限制在按按钮之间


谢谢

使用类范围的数据成员。非常简单的例子:

public class MyClass
{
    private Foo foo;

    private void Button1_Click(object sender, EventArgs e)
    {
        this.foo = new Foo();
    }

    private void Button2_Click(object sender, EventArgs e)
    {
        // I can access this.foo here. I can also dispose of it
        // if it is IDisposable and/or I can set it to null.
        // To check if button 1 was pressed, check to see if the object
        // is null (if it is, button 1 wasn't pressed)
    }
}

听起来你想使用属性

这里有一个指向的链接,但是如果你只是在谷歌上搜索“C#properties”,就会发现很多东西

我可以单击或在类本身中创建对象,但是如何将对象的寿命限制在按按钮之间

可悲的是,你几乎被困于把它放在类范围内。没有简单的方法将对象的范围限制为类中的几个方法。如果您的两个事件处理程序可以访问您的雇主,那么类中的其他每个方法也可以访问。你只要不用它就行了

然而,出于好奇,我设法四处闯荡,产生了你想要的效果。我做了一个有2个事件处理程序的类,每个按钮一个,还有一个私有雇主变量

public class ButtonHandler
{
    private Employer employerData;

    public void button1_Click(object sender, EventArgs e)
    {
        employerData = "set data here";
    }

    public void button2_Click(object sender, EventArgs e)
    {
        employerData = "use / clear data here";
    }
}

然后我转到我的Form.Designer.cs并手动更改了按钮。单击事件处理程序,从默认的
this.btnLoadPlaylist\u单击
到上面ButtonHandler类中的我的函数。问题是,每当Visual Studio重新生成Designer.CS时,它都会被删除。因此,这种效果是可能的,只是使用我们提供的工具并不方便。

您可以通过在另一个事件处理程序中匿名定义其中一个事件处理程序来实现:

void button1_Click(object sender, EventArgs e)
{
    Foo data = new Foo();
    EventHandler handler = null;
    handler = (s, args) =>
    {
        //Use Foo here
        DoStuff(data);
        button2.Click -= handler;
    };
    button2.Click += handler;
}
请注意,我们需要做一些额外的工作,以确保在单击此处时删除事件处理程序。如果您不需要这样做,那么它确实可以简化代码


这里,匿名方法关闭局部变量,这将在匿名方法的生存期内延长该变量的生存期。与使用字段的方法不同,这种方法实际上创建了一个变量,该变量的生命周期将持续到单击下一个按钮为止,并且不会在单击第一个按钮之前或第二个按钮之后留下一个无意义的值。

您需要在类中添加一个字段。如果personalinfo具有属性(或字段)称为雇主,您可以在单击第二个按钮时设置该数据。仅供参考,“对象”不是“范围内”或“范围外”。“范围”是纯编译时属性;命名实体的范围是程序文本的区域,在该区域中该实体可以通过该名称引用。您的问题实际上是关于生存期的,它与作用域有关,因为其最后一个引用保存在局部变量中的对象的生存期大于、小于或等于该变量的作用域。如果您正在仔细阅读,并且想知道我刚才是否说过作用域和生存期实际上是不相关的,这是正确的。如果您没有将其放入designer.cs文件中,并将处理程序更改为指向此类,则当设计器重置时,它不会被吹走。
“没有简单的方法将对象的范围限制为类中的几个方法。”