none
匿名方法 RRS feed

答案

  • 微软2008开始搞的一个开发技巧。是编译器支持的概念。

    开发时候,使用

    delegate(参数)
    {
    代码
    }

    的方式定义一个局部有效的函数,但实际上,编译后,会生成一个实际的函数名,这个函数是类的成员方法。你可以在编译后的dll中找到。

    或是定义一个委托类型的成员方法,指向这个匿名方法,在多个地方复用,都是没问题的。

    匿名方法不过就是简化了操作。你不必总是去编写新的方法,然后用委托指向它,如果某个方法你偶尔用一次,直接在函数中声明使用就可以了,例如

    public void TestAnonymous()
    {
        Fun<int,int,int> Add = delegate(int a,int b){return a+b;}
        int x=0,y=2,z=3;
        x = Add(y,z);
    }


    2011 c# mvp China
    2011年3月8日 2:48
    版主
  • 你好!

    参考MSDN:http://msdn.microsoft.com/zh-cn/library/0yw3tz5k(v=vs.80).aspx

    匿名方法最大的好处是减少代码量,使代码更简洁。


    知识改变命运,奋斗成就人生!
    2011年3月8日 2:37
    版主
  • 简单的来说,就是你只需要给出函数的接口参数和返回值定义,以及函数的实现就可以了,而至于这个函数叫什么名字,你可以不写。

    这个多用在函数指针(C语言中的概念),或代理(C#的脚法),或事件。 当你写一个算法(比如排序)的时候,可以要求外部给你提供一个函数(比如指定用哪个属性排序)让你调用,而你并不需要关心这个函数叫什么名字或如何实现的。 这时候你就定义一个函数指针,并在你的算法中直接调用这个函数即可。 具体这个函数的实现可以由外部的调用者来指定。 而且调用者在制定函数的时候可以直接写一个代码段付给函数指针,不必单独声明一个函数了。这个时候用的语法就是所谓的匿名方法。

    C#匿名方法的定义可以有很多种  拉姆达(=>)或代理等都可以声明匿名函数。 具体的语法请查看前面几位版主的连接。

     


    信奎爷,无所畏惧!!
    2011年3月8日 9:58

全部回复

  • 你好!

    参考MSDN:http://msdn.microsoft.com/zh-cn/library/0yw3tz5k(v=vs.80).aspx

    匿名方法最大的好处是减少代码量,使代码更简洁。


    知识改变命运,奋斗成就人生!
    2011年3月8日 2:37
    版主
  • 微软2008开始搞的一个开发技巧。是编译器支持的概念。

    开发时候,使用

    delegate(参数)
    {
    代码
    }

    的方式定义一个局部有效的函数,但实际上,编译后,会生成一个实际的函数名,这个函数是类的成员方法。你可以在编译后的dll中找到。

    或是定义一个委托类型的成员方法,指向这个匿名方法,在多个地方复用,都是没问题的。

    匿名方法不过就是简化了操作。你不必总是去编写新的方法,然后用委托指向它,如果某个方法你偶尔用一次,直接在函数中声明使用就可以了,例如

    public void TestAnonymous()
    {
        Fun<int,int,int> Add = delegate(int a,int b){return a+b;}
        int x=0,y=2,z=3;
        x = Add(y,z);
    }


    2011 c# mvp China
    2011年3月8日 2:48
    版主
  • 简单的来说,就是你只需要给出函数的接口参数和返回值定义,以及函数的实现就可以了,而至于这个函数叫什么名字,你可以不写。

    这个多用在函数指针(C语言中的概念),或代理(C#的脚法),或事件。 当你写一个算法(比如排序)的时候,可以要求外部给你提供一个函数(比如指定用哪个属性排序)让你调用,而你并不需要关心这个函数叫什么名字或如何实现的。 这时候你就定义一个函数指针,并在你的算法中直接调用这个函数即可。 具体这个函数的实现可以由外部的调用者来指定。 而且调用者在制定函数的时候可以直接写一个代码段付给函数指针,不必单独声明一个函数了。这个时候用的语法就是所谓的匿名方法。

    C#匿名方法的定义可以有很多种  拉姆达(=>)或代理等都可以声明匿名函数。 具体的语法请查看前面几位版主的连接。

     


    信奎爷,无所畏惧!!
    2011年3月8日 9:58
  • 您好,除了楼上几位谈到的简化代码外,还需要注意一点就是匿名函数访问局部变量或参数时会改变局部变量或参数的生命周期。有时这也能成为一个提升性能的技巧。
    2011年3月8日 13:25
    版主
  • 您好,除了楼上几位谈到的简化代码外,还需要注意一点就是匿名函数访问局部变量或参数时会改变局部变量或参数的生命周期。有时这也能成为一个提升性能的技巧。

    首先感谢你的答复!

    请问匿名方法是怎么影响局部变量的生命周期的?能说详细点吗?或举一个例子,谢谢!

    2011年3月11日 5:22
  • for (int i = 0; i < 10; i++)
    {
      new Thread(() => Console.WriteLine(i)).Start();
    }
    

    运行看看。


    2011 c# mvp China
    2011年3月11日 6:13
    版主
  • 您好,除了楼上几位谈到的简化代码外,还需要注意一点就是匿名函数访问局部变量或参数时会改变局部变量或参数的生命周期。有时这也能成为一个提升性能的技巧。

    首先感谢你的答复!

    请问匿名方法是怎么影响局部变量的生命周期的?能说详细点吗?或举一个例子,谢谢!

    George已给出了局部变量的例子,同理可推参数的例子。

    匿名函数是为委托服务的,委托已定义了函数的相关的参数。那么局部变量和参数等如何传递?只有一个方法---〉设计一个辅助类,这个类包含了局部变量和参数。因此改变了其生命周期。

    更具体的说明,请参见<CLR via C#>关于委托的章节。

    2011年3月13日 13:45
    版主
  • Fun<int,int,int> 这个是系统内置的函数么,我只看到过键值对的啊,怎么还有三个参数的!
    2011年8月8日 9:58
  • Fun<int,int,int> 这个是系统内置的函数么,我只看到过键值对的啊,怎么还有三个参数的!

    您好,这是一个泛型委托,定义如下:public delegate TResult Func<T1, T2, TResult>(T1 arg1, T2 arg2);

    写成Fun<int,int,int>时,就表示两个参数为int,函数的返回值也是int。

    2011年8月8日 13:29
    版主