当前位置:编程学习 > C#/ASP.NET >>

请教匿名委托

如题 ,最好能说说有什么好处 --------------------编程问答-------------------- 1.最直接的,代码简洁些
2.C#3.0的语法LINQ依赖于此。

http://www.cnblogs.com/solo/archive/2008/04/24/1168981.html
我个人的很浅的理解 --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 学习zhong! --------------------编程问答-------------------- 与有名函数相比,当函数只使用一次时,匿名函数有几个优点: 

程序的名称空间不会受到那些只使用一次的函数的污染。 
函数的代码就位于使用它的地方,这样程序员就不用到处寻找这些只会使用一次的小函数代码了。 
这种函数显然是与它所传递到的函数相关的,因此它显然与使用这个上下文的其他程序员也是有关的。如果这些只使用一次的函数都是与调用函数单独编写的,而后来调用函数被删除了,那么显然这些只使用一次的函数也就需要删除了。 

参考:
http://www.ibm.com/developerworks/cn/linux/l-highfunc.html --------------------编程问答-------------------- 匿名方法还可以使用方法外的局部变量 --------------------编程问答-------------------- 可以生成闭包,比如:
class Program
    {
        public static void Main()
        {
            Action a = Test(1);
            a();
            a();
            a();
        }
        public static Action Test(int a)
        {
            return delegate()
            {
                Console.WriteLine(++a);
            };
        }
    }
参数a被封到了委托里,但是在推出Test函数后生命周期并没有完。闭包在有的时候是非常有用的。比如你一个窗体里面多个用户控件是动态加载的,用户控件里的函数又不都一样,就可以通过传参来生成闭包调用。
还可以就是做curry化
Func<int, int, int> func = i => i + 1;
Func<int, int> curry = func.Curry(1);
curry(2);

public static Func<P2, R> Curry<P1, P2, R>(this Func<P1, P2, R> func, P1 arg0)
        {
            return func.Curry()(arg0);
        }
--------------------编程问答-------------------- 匿名方法可以将代码块传递为委托参数...减少实例化委托所需的系统开销...

引用 MSDN:
例如,如果创建方法所需的系统开销是不必要的,则指定代码块(而不是委托)可能非常有用。启动新线程即是一个很好的示例。无需为委托创建更多方法,线程类即可创建一个线程并且包含该线程执行的代码。



引用 1 楼 fancystyle 的回复:
1.最直接的,代码简洁些 
2.C#3.0的语法LINQ依赖于此。 

http://www.cnblogs.com/solo/archive/2008/04/24/1168981.html 
我个人的很浅的理解

虽然Lambda表达式也是匿名函数...但和匿名方法并不是一回事儿...要分清楚...

例如...可以将匿名方法转换为带有各种签名的委托..对于Lambda表达式来说却是不可能的... --------------------编程问答-------------------- 可以将匿名方法转换为带有各种签名的委托..对于Lambda表达式来说却是不可能的...
==========================================================================================
为什么Lambda不行,别忽悠人好吗

public delegate int TestD(int a);
    class Program8
    {
        public static void Main()
        {
            Testdelegate(Test, 1);
            Testdelegate(i => i + 1, 1);
        }
        public static int Test(int a)
        {
            return a;
        }
        public static void Testdelegate(TestD d, int a)
        {
            Console.WriteLine(d(a));
        }
    } --------------------编程问答-------------------- 8楼...先去学学什么叫Lambda表达式... --------------------编程问答-------------------- 8楼...先去学学什么叫Lambda表达式...
==============================================
请你举个例子 --------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 8楼...先去学学什么叫Lambda表达式...
============================================== 
我Lambda表达式学的不好,像您请教Lambda比匿名委托差在哪了。 --------------------编程问答-------------------- Lambda跟匿名委托没有可比性...都说了不是一个东西...虽然概念非常类似...

另外匿名委托、匿名方法、匿名函数都是不同的概念...多看看MSDN... --------------------编程问答-------------------- Lambda跟匿名委托没有可比性...都说了不是一个东西...虽然概念非常类似...

另外匿名委托、匿名方法、匿名函数都是不同的概念...多看看MSDN...

==============================================================================
请举例子,你这解释没有说服力。我就问这句“可以将匿名方法转换为带有各种签名的委托..对于Lambda表达式来说却是不可能的”

--------------------编程问答-------------------- 不是每个人都像你那么闲...上班时间抽空上来看看而已...下班才有空...

你可以自己先去看MSDN...很容易明白的... --------------------编程问答-------------------- 你没有任何例子就说我 “.先去学学什么叫Lambda表达式..”
不明白你为什么那么狂 --------------------编程问答-------------------- 你那个例子跟“Lambda表达式不可能将匿名方法转换为带有各种签名的委托”没有任何关系...自己先搞清楚...不需要我来举例... --------------------编程问答-------------------- 你那个例子跟“Lambda表达式不可能将匿名方法转换为带有各种签名的委托”没有任何关系...自己先搞清楚...不需要我来举例.
==================================================================================================
那就请你举一个正确的例子 --------------------编程问答-------------------- to fuadam:

看来你还真闲...本来我打算下了班抽时间认真回个帖...你越这样我越懒得回答...

如果我错了...放心...CSDN高手如云...早就有一帮人跳出来BS我了...

论坛里回答问题是自愿的...大家都很忙...没有谁必须承担义务...自己看资料去... --------------------编程问答-------------------- 我没说你一定要回答这个问题,我只是觉得你很狂。我认为你说错了,我就举一个例子,而你在说我的时候,不举例子。而是很不屑的说,你先去学学lambda去。好像我是刚毕业的小白啊。 --------------------编程问答-------------------- 不要吵架哦,都是来学习的嘛 --------------------编程问答-------------------- 学习学习~~~~~~~~~~ --------------------编程问答--------------------  恩 扛上
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,