使用匿名方法的示例和缺点

时间:2012-12-28 06:38:18

标签: c# anonymous-methods

有人可以举例说明如何使用匿名方法吗?

他们是否会退缩使用它们的性能下降?

3 个答案:

答案 0 :(得分: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);
           }
        };
}

答案 1 :(得分:2)

阅读MSDN:Anonymous Methods (C# Programming Guide)

  

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

     

通过使用匿名方法,可以减少编码开销   通过消除创建单独的代理来实例化委托   方法

     

例如,在委托的位置指定代码块即可   在必须创建方法的情况下有用似乎是一种情况   不必要的开销


  

有一个跳转语句是错误的,例如goto,break或   继续,在目标位于外部的匿名方法块内   块。有一个跳转语句也是错误的,比如goto,   在目标为的匿名方法块之外中断或继续   在街区内。

     

匿名方法无法访问参数的ref或out   外部范围。

     

匿名方法块中不能访问任何不安全的代码。

另请阅读Create Elegant Code with Anonymous Methods, Iterators, and Partial Classes

  

匿名方法是在线定义的,而不是作为成员方法定义的   任何课程。此外,无法应用方法属性   匿名方法,匿名方法也不能定义泛型类型   或添加通用约束。

答案 2 :(得分:1)

可能会有帮助......

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

使用匿名方法时有一些缺点。首先,您无法使用Visual Studio调试器中的“编辑并继续”功能。单步执行代码时不允许对方法或匿名方法进行更改 - 相反,您必须更改代码并重新启动调试器。

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