热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

初识委托,Lambda表达式,匿名方法

由于笔者仅仅是一名学生,没有什么项目经验,对于这门语言多数也是自学,理解不深,在此只能分享一下自己拙劣的见解,当然,我也希望如果前辈看到,能够花点时间为后生指路,不胜感激!委托(D
      由于笔者仅仅是一名学生,没有什么项目经验,对于这门语言多数也是自学,理解不深,在此只能分享一下自己拙劣的见解,当然,我也希望如果前辈看到,能够花点时间为后生指路,不胜感激!
 
委托(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> 

 

     委托的多播(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)会越来越好,加油!!!

 
 
 
 
 
 
 
 
 
 
 
 
 

推荐阅读
  • 本文介绍了作者在开发过程中遇到的问题,即播放框架内容安全策略设置不起作用的错误。作者通过使用编译时依赖注入的方式解决了这个问题,并分享了解决方案。文章详细描述了问题的出现情况、错误输出内容以及解决方案的具体步骤。如果你也遇到了类似的问题,本文可能对你有一定的参考价值。 ... [详细]
  • 本文介绍了Java集合库的使用方法,包括如何方便地重复使用集合以及下溯造型的应用。通过使用集合库,可以方便地取用各种集合,并将其插入到自己的程序中。为了使集合能够重复使用,Java提供了一种通用类型,即Object类型。通过添加指向集合的对象句柄,可以实现对集合的重复使用。然而,由于集合只能容纳Object类型,当向集合中添加对象句柄时,会丢失其身份或标识信息。为了恢复其本来面貌,可以使用下溯造型。本文还介绍了Java 1.2集合库的特点和优势。 ... [详细]
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Python正则表达式学习记录及常用方法
    本文记录了学习Python正则表达式的过程,介绍了re模块的常用方法re.search,并解释了rawstring的作用。正则表达式是一种方便检查字符串匹配模式的工具,通过本文的学习可以掌握Python中使用正则表达式的基本方法。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 本文介绍了深入浅出Linux设备驱动编程的重要性,以及两种加载和删除Linux内核模块的方法。通过一个内核模块的例子,展示了模块的编译和加载过程,并讨论了模块对内核大小的控制。深入理解Linux设备驱动编程对于开发者来说非常重要。 ... [详细]
  • 本文介绍了如何使用Express App提供静态文件,同时提到了一些不需要使用的文件,如package.json和/.ssh/known_hosts,并解释了为什么app.get('*')无法捕获所有请求以及为什么app.use(express.static(__dirname))可能会提供不需要的文件。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • NotSupportedException无法将类型“System.DateTime”强制转换为类型“System.Object”
    本文介绍了在使用LINQ to Entities时出现的NotSupportedException异常,该异常是由于无法将类型“System.DateTime”强制转换为类型“System.Object”所导致的。同时还介绍了相关的错误信息和解决方法。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • 单页面应用 VS 多页面应用的区别和适用场景
    本文主要介绍了单页面应用(SPA)和多页面应用(MPA)的区别和适用场景。单页面应用只有一个主页面,所有内容都包含在主页面中,页面切换快但需要做相关的调优;多页面应用有多个独立的页面,每个页面都要加载相关资源,页面切换慢但适用于对SEO要求较高的应用。文章还提到了两者在资源加载、过渡动画、路由模式和数据传递方面的差异。 ... [详细]
  • 本文介绍了H5游戏性能优化和调试技巧,包括从问题表象出发进行优化、排除外部问题导致的卡顿、帧率设定、减少drawcall的方法、UI优化和图集渲染等八个理念。对于游戏程序员来说,解决游戏性能问题是一个关键的任务,本文提供了一些有用的参考价值。摘要长度为183字。 ... [详细]
author-avatar
龙龙玖号_367
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有