zoukankan      html  css  js  c++  java
  • 初识委托,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)会越来越好,加油!!!

     
     
     
     
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    [Bash] Shortcut
    [Bash] Rerun Bash Commands with History Expansions (!! & !$)
    [Bash] Create and Copy Multiple Files with Brace Expansions in Bash
    [Bash] Add Executable Files to $PATH with Bash
    [Typescript] Create Type From Any Given Data in TypeScript
    [Typescript] Ignore Null or Undefined Values with TypeScript Non-Null Assertion Operator
    [Bash] Chain Commands with Pipes and Redirect Output in Bash
    [Bash] Use Conditional Statements in Bash
    [Bash] Understand Exit Statuses in Bash
    监听内容变化 TextWatcher @功能 [MD]
  • 原文地址:https://www.cnblogs.com/wangxiao666/p/12501179.html
Copyright © 2011-2022 走看看