Условный делегат? - PullRequest
       4

Условный делегат?

3 голосов
/ 13 мая 2011

После того как пользователь завершит работу с формой "f", форма сохранит значение, которое я хочу проверить перед запуском doStuff ().Например, если f.value> 0, тогда запустите doStuff (), иначе не запускайте doStuff ().Как я могу максимально кратко изменить свой код, чтобы разрешить эту проверку?Я не совсем понимаю, когда делегат назначен, если я передам f.value, он примет значение, когда я добавляю делегата или когда он запускает делегат?

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

Спасибо!

Ответы [ 7 ]

7 голосов
/ 13 мая 2011

Вы можете зафиксировать значение ссылки при создании делегата:

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

Когда происходит событие, оно проверяет текущее значение захваченной ссылки f и, если условие соответствует, продолжает выполнение.

1 голос
/ 13 мая 2011

Вы можете использовать обычный синтаксис для его реализации

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();
   }
}
1 голос
/ 13 мая 2011

Я бы так не поступил. Я бы позволил форме справиться со всем этим. Просто запустите форму ...

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.
        }
    }
}
1 голос
/ 13 мая 2011

Насколько я понимаю, лямбды запускаются в той области, в которой они определены, поэтому ...

form f = new form();
f.Show();
f.FormClosing += delegate
{
   if(f.Value > 0)
      doStuff();
};
1 голос
/ 13 мая 2011

Что-то вроде этого?

        form f = new Form();
        f.Show();
        f.FormClosing += (s, a) =>
                             {
                                 if (f.Value > 0)
                                 {
                                     doStuff();
                                 }
                             };
1 голос
/ 13 мая 2011
form f = new form();
f.Show();
f.FormClosing += delegate{if(f.Value>0){doStuff();}};

Я полагаю, что оно использует значение во время выполнения, а не во время его назначения. Таким образом, он будет использовать значение f.Value, когда событие FormClosing инициирует

0 голосов
/ 13 мая 2011

Если f.Value является членом формы, он будет проверен при запуске делегата, и вы получите значение, назначенное в тот момент, а не в тот момент, когда вы назначили делегат.

...