有条件的代表?

时间:2011-05-13 13:52:35

标签: c# delegates conditional

用户填写表单“f”后,表单将保留一个我要在运行doStuff()之前检查的值。比如,如果f.value> 0,然后运行doStuff(),否则,不要运行doStuff()。我怎样才能最简洁地修改我的代码以允许进行此项检查?我不太明白分配委托的时间,如果我传递f.value,它会在我添加委托时,或者当它运行委托时取值吗?

form f = new form();
f.Show();
f.FormClosing += delegate{doStuff();};

谢谢!

7 个答案:

答案 0 :(得分:6)

您可以在创建委托时捕获引用的值:

f.FormClosing += delegate { if(f.value > 0) doStuff(); };

当事件发生时,它将检查捕获的引用f的当前值,如果条件匹配,则继续执行。

答案 1 :(得分:1)

form f = new form();
f.Show();
f.FormClosing += delegate{if(f.Value>0){doStuff();}};

我相信它会在运行时使用值,而不是在分配时使用。因此,当FormClosing事件触发时,它将使用f.Value的值

答案 2 :(得分:1)

这样的东西?

        form f = new Form();
        f.Show();
        f.FormClosing += (s, a) =>
                             {
                                 if (f.Value > 0)
                                 {
                                     doStuff();
                                 }
                             };

答案 3 :(得分:1)

我的理解是lambdas在他们定义的范围内运行,所以......

form f = new form();
f.Show();
f.FormClosing += delegate
{
   if(f.Value > 0)
      doStuff();
};

答案 4 :(得分:1)

我不会这样做。我让表单处理这一切。只需运行表单......

public void showMyForm()
{
    form f = new form();
    f.Show();
}

...然后在.cs文件格式中定义表单结束事件,并在表单中链接事件......

public partial class form : Form
{

    //Link the event in the IDE and let InitializeComponent() add it. Then perform the
    //the things you want in the form itself based on your condition
    private void doStuff(object sender, FormClosingEventArgs e) //Think that's the right args
    {
        if (this.value > 0)
        {
            //code you want to execute.
        }
    }
}

答案 5 :(得分:1)

您可以使用常规语法来实现它

form f = new form();
f.FormClosing += FormClosingHandler; // Add unanonaymous delegate to the event handler
f.Show();

private void FormClosingHandler(object sender, FormClosingEventArgs e)
{
   var form = (form)sender;
   form.FormClosing -= FormClosingHandler; // Unsubscribe from the event to prevent memory leak

   if(form.value > 0)
   {
      doStuff();
   }
}

答案 6 :(得分:0)

如果f.Value是表单的成员,则会在委托运行时检查它,并且您将获得当时分配的值,而不是在您指定委托时的那一刻。