初识委托,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)会越来越好,加油!!!

 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2020-03-15 23:41  溺水的鲨鱼  阅读(193)  评论(0编辑  收藏  举报