2012-12-28 2 views
3

Может ли кто-нибудь дать мне пример того, как использовать Анонимные методы?Пример и отмена использования Анонимных методов

Убирают ли они спины, как ухудшение качества их использования?

+0

См [что-это-анонимная-метода-в-с] (http://stackoverflow.com/questions/6008097/what-are- anonymous-methods-in-c) Имеет примеры. – nawfal

ответ

3

Я считаю, это очень полезно использовать анонимные методы, чтобы избежать глобальных переменных

Без анонимных методов:

private static Dictionary<Binding, ErrorProvider> dict = 
    new Dictionary<Binding, ErrorProvider>(); 

public static void ParseBinding(Binding binding) 
{ 

    var errorProvider = new ErrorProvider(); 

    dict.Add(binding, errorProvider); 

    binding.Parse += new ConvertEventHandler(binding_Parse); 

} 

static void binding_Parse(object sender, ConvertEventArgs e) 
{ 
    var binding = sender as Binding; 
    var errorProvider = dict[binding]; 

    try 
    { 
      // some validation form e.Value 
      // throws exception if not valid 
    } 
    catch (Exception ex) 
    { 
     errorProvider.SetError(binding.Control, ex.Message); 
    } 
} 

Это действительно опасно, так как мне нужно заботиться о себе, чтобы удалить записи из словарь, если он больше не используется, в противном случае у меня есть утечка памяти, так как сборщик мусора никогда не удалит привязку или поставщик ошибок.

Теперь гораздо проще реализация анонимных методов:

public static void ParseBinding(Binding binding) 
{ 
    var errorProvider = new ErrorProvider(); 

    binding.Parse += (sender, e) => 
     { 
      try 
      { 
       // some validation form e.Value 
       // throws exception if not valid 
      } 
      catch (Exception ex) 
      { 
       errorProvider.SetError(binding.Control, ex.Message); 
      } 
     }; 
} 
2

Читайте MSDN: Anonymous Methods (C# Programming Guide):

Создание анонимных методов является по существу способ передать блок кода в качестве параметра делегата.

Используя анонимные методы, вы сокращаете накладные расходы на кодирование в , создавая экземпляры делегатов, устраняя необходимость создания отдельного метода .

Например, указание блока кода вместо делегата может быть полезными в ситуации, когда приходится создать метод может показаться ненужных накладных


Это ошибка, чтобы иметь инструкцию перехода, такую ​​как goto, break, или продолжить, внутри блока анонимного метода, цель которого находится вне блока. Также ошибка заключается в том, что оператор перехода, такой как goto, , разбивается или продолжается, за пределами анонимного блока методов, целью которого является внутри блока.

Анонимный метод не может получить доступ к параметрам ref или out внешней области .

Доступ к небезопасному коду можно получить в рамках блока анонимного метода.

Кроме чтения Create Elegant Code with Anonymous Methods, Iterators, and Partial Classes

Анонимный метод определен в линию, а не в качестве способа члена любого класса. Кроме того, нет способа применить атрибуты метода к анонимному методу, а также анонимный метод не может определить общие типы или добавить общие ограничения.

1

Может быть полезно ...

http://www.dotnet-tricks.com/Tutorial/csharp/40ID180612-C-Sharp-Anonymous-Method.html

Есть несколько недостатков, которые при использовании анонимных методов. Во-первых, вы не можете использовать функцию «Редактировать и продолжить» в отладчике Visual Studio. Не допускается внесение изменений в метод или анонимный метод при выполнении кода - вместо этого вам необходимо внести изменения в свой код и перезапустить отладчик.

Другая потенциальная проблема заключается в том, что, предполагая, что код в анонимном методе должен выполняться в ответ на несколько событий, некоторые разработчики могут сами копировать и вставлять код в несколько мест своего приложения, игнорируя при этом общее правило повторного использования кода.

Смежные вопросы