在C#中,如果在按钮上单击创建对象,则在单击事件结束时,该对象不再在范围内。如何在单击按钮时创建对象,但在单击另一个按钮时释放它。这是我想要做的:
构建一个接受用户数据并将其添加到数据库的应用程序。该应用程序包含两个类:个人信息和雇主信息。按下“启动应用程序”按钮时,应创建个人信息类对象。然后,应用程序打开一个请求个人信息的选项卡。如果选择“添加雇主”按钮,则会创建雇主实例。在最后按提交后,它应关闭一个或两个对象并返回主菜单。当下一个人按下按钮时,它应该再次完成该过程。
我可以在点击或类本身中创建对象,但是如何限制按钮按下之间对象的生命周期?
谢谢!
答案 0 :(得分:2)
使用类范围的数据成员。很快的例子:
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)
}
}
答案 1 :(得分:1)
您可以通过在另一个事件处理程序中匿名定义一个事件处理程序来完成此操作:
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;
}
请注意,我们需要做一些额外的工作,以确保在此处单击时删除事件处理程序。如果您不需要这样做,那么它确实简化了代码。
这里匿名方法正在关闭局部变量,这将在匿名方法的生命周期内扩展该变量的生命周期。与使用字段的方法不同,这种方法实际上创建了一个变量,其寿命持续到单击下一个按钮为止,并且在单击第一个按钮之前或单击第二个按钮之后不会留下具有无意义值的变量。 / p>
答案 2 :(得分:0)
听起来你想要使用属性?
这是MSDN的链接,但如果您只是Google'C#properties',那就有很多
答案 3 :(得分:0)
可悲的是,你几乎把它放在了课堂上。没有简单的方法可以将对象的范围限制为类中的几个方法。如果您的2个事件处理程序可以访问您的雇主,那么该类中的所有其他方法也是如此。你只需要不使用它。我可以在点击或类本身中创建对象,但是如何限制按钮按下之间对象的生命周期?
然而,出于好奇,我设法乱砍并产生你想要的效果。我做了一个有2个事件处理程序的类,每个按钮一个,以及一个私有的Employer变量。
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并手动更改了button.Click事件处理程序从默认的this.btnLoadPlaylist_Click
到我上面的ButtonHandler类中的函数。这个问题是每次Visual Studio重新生成Designer.CS时它都会被删除。所以效果是可能的,只是不方便我们给出的工具。