2

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

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

4

3 回答 3

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);
           }
        };
}
于 2012-12-28T07:27:35.030 回答
2

阅读 MSDN:匿名方法(C# 编程指南)

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

通过使用匿名方法,您无需创建单独的方法,从而减少了实例化委托的编码开销。

例如,在必须创建方法似乎是不必要的开销的情况下,指定代码块代替委托可能很有用


在目标位于块外的匿名方法块内有跳转语句(例如 goto、break 或 continue)是错误的。在目标位于块内的匿名方法块之外有跳转语句(例如 goto、break 或 continue)也是错误的。

匿名方法不能访问外部作用域的 ref 或 out 参数。

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

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

匿名方法是内联定义的,而不是任何类的成员方法。此外,无法将方法属性应用于匿名方法,匿名方法也无法定义泛型类型或添加泛型约束。

于 2012-12-28T06:41:45.563 回答
1

可能会有所帮助...

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

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

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

于 2012-12-28T06:58:28.440 回答