警惕匿名方法造成的变量共享

匿名方法

匿名方法是.NET 2.0中引入的高级特性,“匿名”二字说明它可以把实现内联地写在一个方法中,从 而形成一个委托对象,而不用有明确地方法名,例如:

static void Test()
{
  Action<string> action = delegate(string  value)
  {
    Console.WriteLine(value);
  };

  action("Hello  World");
}

但是匿名方法的关键并不仅于“匿名”二字。其最强大的特性就在于匿名方法形成了一个闭包,它可 以作为参数传递到另一个方法中去,但同时也能访问方法的局部变量和当前类中的其它成员。例如:

class TestClass
{
  private void Print(string message)
  {
     Console.WriteLine(message);
  }

  public void Test()
  {
     string[] messages = new string[] { "Hello", "World" };
    int index =  0;

    Action<string> action = (m) =>
    {
       this.Print((index++) + ". " + m);
    };

    Array.ForEach(messages,  action);
    Console.WriteLine("index = " + index);
  }
}

如上所示,在TestClass的Test方法中,action委托调用了同在TestClass类中的私有方法Print,并对 Test方法中的局部变量index进行了读写。在加上C# 3.0中Lambda表达式的新特性,匿名方法的使用得到 了极大的推广。不过,如果使用不当,匿名方法也容易造成难以发现的问题。

时间: 2024-12-23 10:40:34

警惕匿名方法造成的变量共享的相关文章

艾伟:警惕匿名方法造成的变量共享

匿名方法 匿名方法是.NET 2.0中引入的高级特性,"匿名"二字说明它可以把实现内联地写在一个方法中,从而形成一个委托对象,而不用有明确地方法名,例如:   static void Test() { Action<string> action = delegate(string value) { Console.WriteLine(value); }; action("Hello World"); } 但是匿名方法的关键并不仅于"匿名&quo

C# 2.0 Specification(匿名方法)(一)

21匿名方法21.1.匿名方法表达式匿名方法表达式(anonymous-method-expression)定义了匿名方法(anonymous method),它将计算为引用该方法的一个具体值. l primary-no-array-creation-expression(基本非数组创建表达式:)-anonymous-method-expression(匿名方法表达式) l anonymous-method-expression:delegate anonymous-method-signatu

C#2.0语言规范(三)匿名方法

规范 第三章 匿名方法原著:Microsoft Corporation原文:http://msdn.microsoft.com/vcsharp/team/language/default.aspx (SpecificationVer2.doc)翻译:lover_P出处: -------------------------------------------------------------------------------- [内容] 3.1 匿名方法表达式 3.2 匿名方法签名 3.3 匿

C# 2.0:使用匿名方法、迭代程序和局部类来创建优雅的代码

程序|创建 本文基于 Microsoft Visual Studio 2005 的预发布版本,它以前的代码名称为"Whidbey".此处所包含的任何信息都可能会改变. 本文讨论: • 遍历集合 • 跨文件类定义 • 与委托一起使用的匿名方法 • Visual Studio 2005 中的其他 C# 新功能 本文使用下列技术: • C# 和 Visual Studio 可以在此下载代码: • C20.exe (164KB) 本页内容 迭代程序 迭代程序实现 递归迭代 局部类型 匿名方法

Javascript中的方法和匿名方法实例详解_javascript技巧

本文实例讲述了Javascript中的方法和匿名方法.分享给大家供大家参考.具体分析如下: Javascript方法(函数) 声明函数 以function开头,后跟函数名,与C#.java不同,Javascript不需要声明返回值类型.参数类型.没有返回值就是undefined. 举个例子更清楚:  无参数无返回值的方法: function f1(){ alert('这是一个方法'); } f1();//调用方法 无参数有返回值的方法: function f2(){ return 100; }

Visual C# 2.0匿名方法揭密

visual 匿名方法基础 匿名方法是C#2.0的一个新的语言特性.本文的主要内容是提供给读者关于匿名方法的内部实现和工作方式的一个更好的理解.本文无意于成为匿名方法的完全语言特性参考. 匿名方法允许我们定义委托对象可以接受的代码块.这个功能省去我们创建委托时想要传递给一个委托的小型代码块的一个额外的步骤.它也消除了类代码中小型方法的混乱.让我们看看:比方说,我们有一个字符串集合命名为MyCollection.这个类有一个方法:获得集合中满足用户提供的过滤准则的所有项,调用者决定在集合中的一个特

C# 2.0 Specification(匿名方法)(二)

21.7委托实例相等性如下规则适用由匿名方法委托实例的相等运算符(§7.9.8)和object.Equals方法产生的结果. l 当委托实例是由具有相同被捕获外部变量集合的语义相同的匿名方法表达式计算而产生时,可以说(但不是必须)它们相等. l 当委托实例由具有语义不同的匿名方法表达式,或具有不同的被捕获外部变量集合时,它们决不相等. 21.8明确赋值匿名方法参数的明确赋值状态与命名方法是相同的.也就是,引用参数和值参数被明确的赋初值,而输出参数不用赋初值.并且,输出参数在匿名方法正常返回之前必

Delphi 2009中的匿名方法(reference to)

之前我们可以定义方法类型, 然后通过方法类型的变量来使用方法, 譬如:unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs; type TForm1 = class(TForm) procedure FormCreate(Sender: TObject); end; var Form1: TForm1; implementation

C# 2.0的Specification(匿名方法)(二)

21.7委托实例相等性 如下规则适用由匿名方法委托实例的相等运算符(§7.9.8)和object.Equals方法产生的结果. l 当委托实例是由具有相同被捕获外部变量集合的语义相同的匿名方法表达式计算而产生时,可以说(但不是必须)它们相等. l 当委托实例由具有语义不同的匿名方法表达式,或具有不同的被捕获外部变量集合时,它们决不相等. 21.8明确赋值 匿名方法参数的明确赋值状态与命名方法是相同的.也就是,引用参数和值参数被明确的赋初值,而输出参数不用赋初值.并且,输出参数在匿名方法正常返回之