初识委托,Lambda表达式,匿名方法
由于笔者仅仅是一名学生,没有什么项目经验,对于这门语言多数也是自学,理解不深,在此只能分享一下自己拙劣的见解,当然,我也希望如果前辈看到,能够花点时间为后生指路,不胜感激!
委托(Delegate)
是否还记得当年学C语言的时候,讲到后半部分的时候老师就不爱讲了,沉默许久"讲了你们也听不懂,后面咱们不讲了.",想我这么爱学习的好青年,怎么能受得了这样的委屈???二话不说当时就给老师回了一句"老师英明!"后来虽然自己看了指针,但是脑海中对指针十分模糊,直到我与C#相识........
C#这门语言从C/C++中继承了一部分特性,又很大程度的保存了指针(虽然属于不安全代码unsafe),当然,它也提供了一种非常安全的方法指针,它还有一个非常安全的名字:委托(delegate).
委托是什么呢?委托是存放有对某个方法的引用的一种引用类型变量.引用可以在运行时被改变.特别适用于实现事件和回调方法,所有的委托都派生自System.Delegate类.
声明委托:
委托声明决定了可由该委托引用的方法.委托可指向一个与其具有相同标签的方法.
例如:
1 public delegate void dele(string s);//声明一个string类型的单参数空类型的委托dele 2 3 上面的委托dele可被用于引用任何一个带有单string参数 空 类型的方法 4 5 public void M1(string s)//例如存在一个M1方法 6 { 7 console.write("方法1"+s); 8 } 9 10 11 //将方法M1委托给dele 12 13 dele = M1; 14 15 16 //使用委托调用方法 17 dele("被委托"); 18 声明委托的语法如下: 19 delegate <return type> <delegate-name> <parameter list>
委托的多播(Multicasting of a Delegate)
委托对象可使用"+"运算符进行合并.一个合并委托调用它多合并的两个委托.只有相同类型的委托可以合并."-"运算符可用于从合并的委托中移除组件委托.
Lambda表达式:
Lambda表达式,真切的让我体会到程杰老师的那句"代码不仅仅是一门技术,更是一种艺术".没错,就是这样,第一次看见的时候满脸问号,"这是什么写法?在学习的时候没见过啊,感觉好高大上啊!"于是看了相关的介绍与写法示例后,自己试着写了写,嗯,舒服就完事了,原来还能这样写.
Lambda表达式 (lambda expression):是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。[-----百度百科]
匿名方法:
在查看Lambda表达式的时候我又看到一个比较陌生的"新大陆",匿名方法;
匿名方法(Anonymous methods):提供了一种传递代码块作为委托参数的技术。匿名方法是没有名称只有主体的方法。在匿名方法中不需要指定返回类型,它是从方法主体内的 return 语句推断的。 [-----菜鸟教程]
那么Lambda表达式和匿名方法应该怎么写呢?
Lambda表达式和匿名方法的核心我认为就是委托,写法上,也是围绕着委托所展开的,举例说明吧.
伪代码示例:
1 //首先声明一个委托 2 public delegate void Dele(string s); 3 4 Dele dele = null; 5 6 //一个普通的方法 7 public void M1(string s) 8 { 9 Console.Write("方法一:"+s); 10 } 11 12 //使用委托引用方法 13 14 dele += M1; 15 16 dele("委托"); 17 18 ------------ 19 Result: 20 方法一:委托 21 ------------ 22 23 //委托可以用作方法的参数 24 25 //方法二,第一个参数是 26 27 public void M2(Dele dele, string s) 28 { 29 dele(s); 30 } 31 32 //M1是一个方法,可以作为参数传入 33 34 M2(M1,"委托作为参数"); 35 36 ------------------ 37 Result: 38 方法一:委托作为参数 39 ------------------ 40 41 //Lambda表达式 42 43 dele = (string s) => {Console.Write("方法一:"+s);}; 44 45 dele("Lambda1"); 46 47 ---------------- 48 Result: 49 方法一:Lambda1 50 ---------------- 51 52 //因为编译器会进行类型推断,所以可以省略参数类型。 53 54 dele = (s) => {Console.Write("方法一:"+s);}; 55 56 dele("Lambda2"); 57 58 --------------- 59 Result: 60 方法一:Lambda2 61 ----------------- 62 63 //Lambda表达式作为参数 64 65 public void M3(Dele dele, string s) 66 { 67 dele(s); 68 } 69 70 //Lambda表达式作为参数 71 72 M3((string s) => Console.WriteLine("方法三:"+s),"Lambda1");//单行代码可以省略大括号 73 74 //Lambda表达式作为参数 75 76 M3((s) => {Console.WriteLine("方法三:"+s),"Lambda2");}; 77 78 -------------------- 79 Result: 80 方法三:Lambda1 81 方法三:Lambda2 82 -------------------- 83 84 //匿名方法 85 86 Dele dele = delegate(string s) 87 { 88 Console.WriteLine("匿名方法:" + s); 89 }; 90 91 dele("实现"); 92 93 --------------- 94 Result: 95 匿名方法:实现 96 ------------- 97 98 //匿名方法作为参数 99 100 public void M4(Dele dele,string s) 101 { 102 dele(s); 103 } 104 105 M4(delegate(string s) {Consolr.WriteLine("匿名方法作为参数:" + s); }, "实现"); 106 107 ------------------------- 108 Result: 109 匿名方法作为参数:实现 110 -------------------------
这些知识是我在课堂内没有学到的(外聘老师.....)今天听了一天公开课,感慨很深,因为热爱着这个职业,所以一直在学习,但是一个初学者仅仅靠自己,总不会走太远,如果一个人足够牛X,说不定也能靠自己走到终点,但是很显然,我与这俩字不沾边.....哈哈,很多知识掌握存在盲区,之前学习也是东一榔头西一棒槌的没有一个好的学习路线,浪费了很多时间,现在还是一点一点踱步前进吧,期待有前辈看到笔记的不足之处能够指出,也希望MS的.NET(Core)会越来越好,加油!!!