【问题标题】:C# Objects (Creating and Using)C# 对象(创建和使用)
【发布时间】:2014-01-08 21:41:07
【问题描述】:

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

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

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

谢谢!

【问题讨论】:

  • 你需要在你的类中添加一个字段。
  • 如果个人信息有一个属性(或字段)称为雇主,您可以在单击第二个按钮时设置该数据。
  • 仅供参考“对象”不是“范围内”或“超出范围”。 “范围”是一个纯粹的编译时属性;命名实体的范围程序文本的区域,在该区域中该实体可以被该名称引用。您的问题实际上是关于 lifetime,它与范围有关,因为其最后一个引用保存在局部变量中的对象的生命周期长于、短于或等于该范围的范围多变的。如果您仔细阅读并想知道我刚才是否说过范围和生命周期实际上是不相关的,那是正确的。

标签: c# button scope out


【解决方案1】:

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

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)
    }
}

【讨论】:

    【解决方案2】:

    您可以通过在另一个事件处理程序中匿名定义其中一个事件处理程序来做到这一点:

    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;
    }
    

    请注意,我们需要做一些额外的工作,以确保在单击此处时删除事件处理程序。如果您不需要这样做,那么它确实会简化代码。

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

    【讨论】:

      【解决方案3】:

      听起来您想使用属性?

      这里有一个指向 MSDN 的链接,但如果您只是 Google 'C# 属性',那里有很多

      【讨论】:

        【解决方案4】:

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

        遗憾的是,您几乎无法将其放在课堂范围内。没有简单的方法可以将对象的范围限制为类中的几个方法。如果您的 2 个事件处理程序可以访问您的 Employer,那么该类中的所有其他方法也可以。你只需要不使用它。

        但是,出于好奇,我设法破解并产生了您想要的效果。我做了一个有 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 时它都会被删除。所以效果是可以的,只是用我们给的工具不方便。

        【讨论】:

        • 如果你没有把它放在designer.cs文件中,而是把你的handlers改成指向这个类,当设计器被重置时它不会被吹走。
        • "There is no simply way to limit the scope of an object to just a few methods within a class." Oh really.
        猜你喜欢
        • 2013-09-22
        • 1970-01-01
        • 2023-03-30
        • 1970-01-01
        • 1970-01-01
        • 2011-02-14
        • 2015-07-03
        • 1970-01-01
        • 2014-06-15
        相关资源
        最近更新 更多