Анонимный делегат C # эффективность / безопасность - PullRequest
2 голосов
/ 27 октября 2010

У меня есть форма прогресса, делегат:

    // in ProgressForm thread
    public delegate void executeMethod(object parameters);      
    private executeMethod method;
    public object parameters;
    // ...
    private void ProgressForm_Shown(object sender, EventArgs e)
    {
         method.Invoke(parameters);
    }

Какой способ лучше (более эффективный или безопасный) подать заявку - делегаты анонимуса звонят так:

// in other thread
ProgressForm progress = new ProgressForm();
progress.ExecuteMethod = delegate
{
   // to do
}

или используя отдельный метод, подобный этому:

// in other thread
private void myMethod(object par)
{
     // to do
}

progress.ExecuteMethod = this.myMethod;

Ответы [ 2 ]

6 голосов
/ 27 октября 2010

В конечном итоге они удивительно похожи;просто компилятор создает скрытый метод для анонимного случая.Нет особой разницы в производительности, хотя бывают случаи, когда он может создать статический метод (если он не использует this или какие-либо захваченные переменные) - это может помочь незначительно (но этого недостаточночтобы быть в восторге)

Я бы использовал анонимный метод, когда:

  • он короткий и логически связан с кодом, который inits анонимный метод
  • возможно, он использует дополнительный контекст (захваченные переменные), которые сложно передать в myMethod

Главное, на что стоит обратить внимание - пресловутая foreach (обычно) захваченная переменная gotcha,но в некоторых случаях также возможно использовать ссылку на анонимный метод, неожиданно увеличивая срок службы большого объекта.

Для более длительной работы я бы использовал myMethod apprach.

2 голосов
/ 27 октября 2010

Производительность идентична.Анонимный делегат преобразуется компилятором в обычный метод, как и любой другой.Если вы используете код ILDSM, вы увидите, что для анонимного метода генерируется настоящее (но скрытое) имя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...