MyException - 我的异常网
当前位置:我的异常网» .NET相关 » 嘱托学习笔记后续:泛型委托及委托中所涉及到匿名方

嘱托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

www.MyException.Cn  网友分享于:2015-02-08  浏览:0次
委托学习笔记后续:泛型委托及委托中所涉及到匿名方法、Lambda表达式

引言:

  最初学习c#时,感觉委托、事件这块很难,其中在学习的过程中还写了一篇学习笔记:委托、事件学习笔记。今天重新温故委托、事件,并且把最近学习到和委托相关的匿名方法、Lambda表达式及泛型委托记录下来,以备复习使用。

 

委托:

  日常工作中,常常见到委托用在具体的项目中。而且委托使用起来相对来说也是非常简单的,下面列举一个委托实例用以说明如何使用委托,代码如下:

class Program
    {
        public delegate int CalculateDelegate(int x, int y);

        static void Main(string[] args)
        {
            CalculateDelegate calculateDelegate = new CalculateDelegate(Add);
            int result = calculateDelegate(2, 3);
        }

        public static int Add(int x, int y)
        {
            return x + y;
        }
    }

从上例中可以看出,使用一个委托分为三个步骤:

1)声明一个委托:public delegate int CalculateDelegate(int x, int y);

2)定义一个委托对象并绑定方法:CalculateDelegate calculateDelegate = new CalculateDelegate(Add);

3)调用委托:int result = calculateDelegate(2, 3);

其中第二步、第三步的写法和大家有出入,通常很多人喜欢这样写:

1)声明一个委托

2)定义一个委托要绑定的方法

3)定义一个委托,绑定上述定义的方法

 

匿名方法:

使用上面编写的委托实例,描述匿名方法到底为何物,是怎么使用的。委托绑定方法实现如下:

CalculateDelegate calculateDelegate = new CalculateDelegate(Add);

public static int Add(int x, int y)
        {
            return x + y;
        }

 

如果使用匿名方法重写上面的方法,代码如下:

CalculateDelegate calculateDelegate = delegate(int x, int y){return x + y;};

可见:匿名方法绑定委托直接省去了编写一个单独的方法,使得代码更为简洁。

项目中,使用委托时,很多时候编辑器会帮助我们把方法直接放入合适的委托对象中,但有时候编辑器帮助不了我们,比如:Control.Dispatcher.Invoke(delegate). 例如:

this.btnExit .Dispatcher .Invoke (new Action(() => {}));

 

注:感谢园友上位者的怜悯的意见。

 

Lambda表达式:

用Lambda表达式重写上面使用匿名方法编写的委托实例,在匿名方法的基础上,编写如下:

方式一:

CalculateDelegate calculateDelegate = (int x, int y) => { return x + y; };

 

方式二:

CalculateDelegate calculateDelegate = (x, y) => { return x + y; };

 

方式三:

CalculateDelegate calculateDelegate = (x, y) => x + y;

从上面可以看出,Lambda仅仅是在匿名方法的基础上加上 => 符号,但是却让整个代码实现起来显得更为优雅。 

 

泛型委托:

在.net平台下有Microsoft自带的泛型委托,如:Action,Action<T>,Fun<T>等。实际使用中,如果需要用到泛型委托,系统内置的委托基本上就能满足需求了,下面一一介绍它们的原型及调用实例。

Action

系统封装的Action委托,没有参数没有返回值。调用实例为:

class Program
    {
        public delegate void Action();

        static void Main(string[] args)
        {
            Action action = new Action(Method);
            action();
        }

        private static void Method()
        {
            Console.WriteLine("i am is a action");
        }
    }

 

如果方法的表达很简单,可以使用Lambda表达式,代码如下: 

Action action = () => { Console.WriteLine("i am is a action"); };
            action();

 

Action<T>

系统封装的Action<T>委托,有参数但是没有返回值。调用实例为:

class Program
    {
        public delegate void Action<in T1, in T2>(T1 arg1, T2 arg2);

        static void Main(string[] args)
        {
            Action<int,int> action = new Action<int,int>(Method);
            action(2,3);
        }

        private static void Method(int x,int y)
        {
            Console.WriteLine("i am is a action");
        }
    }

 

使用Lambda表达式编写Action<T>代码如下:

Action<int, int> action = (x, y) => { Console.WriteLine("i am is a action"); };
            action(2,3);

 

Fun<T>

系统封装的Fun<T>委托,有返回值。调用实例为:

class Program
    {
        public delegate TResult Fun<in T1, in T2, out TResult>(T1 arg1, T2 arg2);

        static void Main(string[] args)
        {
            Fun<int, int, bool> fun = new Fun<int, int, bool>(Method);
            bool ret = fun(2,3);
        }

        private static bool Method(int x,int y)
        {
            if (x + y == 5)
            {
                return true;
            }
            else
            {
                return false;
            }
        }
    }

 

使用Lambda表达式编写Fun<T>,代码如下:

Fun<int, int, bool> fun = (x, y) =>
            {
                if (x + y == 5)
                {
                    return true;
                }
                else
                {
                    return false;
                }
            };

            bool ret = fun(2,3);

 

Fun<T>没有参数有返回值的情况:

Fun<bool> fun = () =>
            {
                int x = 4;
                int y = 3;
                if (x + y == 5)
                {
                    return true;
                }
                else
                {
                    return false;
                }

            };

            //也可以如此编写
            Fun<bool> fun = () => false;

此种情况很少使用,而且由于能力有限,暂且看不出来使用它们的意义所在。

 

总结:

  在平时的项目中,常见的委托种类及实例本质上也是上述所说的几种。除此之外还有一些其他的委托方法,资质有限精力有限,此处暂且不提,以后碰到在另当别论。

 

2楼上位者的怜悯
1.“匿名方法构成的委托”,我觉得不太准确,应该是大部分时候编辑器会帮你把方法放入合适的委托,有些地方编辑器是帮不了你的,比如:,Control.Invoke(delegate),这个地方必须放委托,它不能确定你的方法是什么样子的,,2.Funclt;boolgt; func = () =gt; true;,Func委托是可以没有参数的
Re: lhb62232397
@上位者的怜悯,非常感谢提出的意见,已修改。
1楼ChuckLu
有看《C#入门经典》吗?
Re: lhb62232397
@ChuckLu,以前有选择性的看过,what?

文章评论

Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
程序员应该关注的一些事儿
程序员应该关注的一些事儿
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
每天工作4小时的程序员
每天工作4小时的程序员
我的丈夫是个程序员
我的丈夫是个程序员
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
Google伦敦新总部 犹如星级庄园
Google伦敦新总部 犹如星级庄园
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
2013年中国软件开发者薪资调查报告
2013年中国软件开发者薪资调查报告
老程序员的下场
老程序员的下场
漫画:程序员的工作
漫画:程序员的工作
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
为什么程序员都是夜猫子
为什么程序员都是夜猫子
科技史上最臭名昭著的13大罪犯
科技史上最臭名昭著的13大罪犯
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
 程序员的样子
程序员的样子
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
Java程序员必看电影
Java程序员必看电影
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
如何成为一名黑客
如何成为一名黑客
10个调试和排错的小建议
10个调试和排错的小建议
旅行,写作,编程
旅行,写作,编程
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
一个程序员的时间管理
一个程序员的时间管理
老美怎么看待阿里赴美上市
老美怎么看待阿里赴美上市
那些性感的让人尖叫的程序员
那些性感的让人尖叫的程序员
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
程序员都该阅读的书
程序员都该阅读的书
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
程序员必看的十大电影
程序员必看的十大电影
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
鲜为人知的编程真相
鲜为人知的编程真相
程序员和编码员之间的区别
程序员和编码员之间的区别
编程语言是女人
编程语言是女人
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
中美印日四国程序员比较
中美印日四国程序员比较
代码女神横空出世
代码女神横空出世
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有