使用匿名方法的例子和回顾

本文关键字:方法 | 更新日期: 2023-09-27 17:49:39

有人能给我如何使用匿名方法的例子吗?

使用它们是否会导致性能下降?

使用匿名方法的例子和回顾

我发现使用匿名方法来避免全局变量非常有用

不使用匿名方法:

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

Read MSDN: Anonymous Methods (c# Programming Guide):

创建匿名方法本质上是传递代码块的一种方式作为委托参数。

通过使用匿名方法,可以减少代码开销实例化委托,无需创建单独的方法。

例如,在委托的位置指定代码块可以是在必须创建方法的情况下非常有用

不必要的开销

使用跳转语句,如goto、break或继续,在目标在外部的匿名方法块中块。使用跳转语句(如goto)也是错误的,在目标为的匿名方法块之外中断或继续

匿名方法不能访问对象的ref或out形参外部范围。

在anonymous-method-block中不能访问不安全的代码。

也请阅读使用匿名方法、迭代器和部分类创建优雅的代码

匿名方法是内联定义的,而不是作为的成员方法任何类。此外,没有办法将方法属性应用于匿名方法,匿名方法也不能定义泛型类型或者添加通用约束。

可能有帮助…

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

使用匿名方法有几个缺点。首先,你不能在Visual Studio调试器中使用"编辑并继续"功能。不允许在分步执行代码时更改方法或匿名方法——相反,您必须更改代码并重新启动调试器。

另一个潜在的问题是,假设匿名方法中的代码需要执行以响应多个事件,一些开发人员可能会发现自己在应用程序的几个地方复制和粘贴代码,从而忽略了代码重用的一般规则。