以前一直迷迷糊糊的,现在总算搞明白。

Lambda表达式

Lamda表达式基本写法是()=>{ };
Lambda和方法一样都可以传入参数和拥有返回值。(int x)=>{return x;};
Lambda表达式并不是C#独有的,其它语言也拥有Lambda表达式。

一些文档上写Lambda是匿名函数,我认为是不对的,Lambda可以表示一个匿名函数,但是还可以来表示Linq表达式啊。

delegate委托

委托基本的使用包括声明一个委托、实例化一个委托、使用一个委托

// 声明一个委托,类型是myDelegate,
public delegate void myDelegate(string str);
public static void HellowChinese(string strChinese)
{
Console.WriteLine("Good morning," + strChinese);
Console.ReadLine();
}
// 实例化
myDelegate d = new myDelegate(HellowChinese);
// 使用
d("Mr wang");

委托很好用。当编程到一定阶段,发现只传递一个或几个int、strig类型参数是不够的,希望可以把一段代码进行传递来执行某个操作,委托提供了这样的途径,委托提供了一种可以直接访问类中方法的途径,可以将方法当作一个参数传递从而使用

匿名函数

上面已经讲到匿名函数了。函数和方法等价,用来封装一段代码片以便随时使用,有的有返回值有的无返回值。写在类里面。

但是如果我只想把这段代码片使用一次呢?再声明一个类、一个方法实在太麻烦,这时候匿名函数就拥有了价值。用来封装一段代码、直接执行或者传递。

匿名函数总是和委托一齐使用,因为匿名函数方便了委托的使用(不用声明一个类了)

匿名方法两种实现方式:

使用Lambda表达式:

        public delegate void Seep();
static void Main(string[] args)
{ Seep s = () => { Console.WriteLine(); Console.WriteLine(); };
}

使用委托

        public delegate void Seep();
static void Main(string[] args)
{
Seep see = delegate () { Console.WriteLine(); };
}

Action、Func、Predicate

委托需要先声明一个类型才能使用,这很麻烦,比如我在某一个命名空间声明了一个没有返回值的委托myDelegate,然后想要这个委托的时候,每个命名空间都要引用这个命名空间,这太不友好了。

微软直接就在框架中定义了三种委托:Action、Func、Predicate。这三种委托是C#的System命名空间中已经定义好的,如Action

上面已经通过匿名函数实现了不用声明类,现在通过C#预定义的委托类型实现了不用声明委托类型,那么现在就可以直接写代码片来执行了

这三种委托的相应泛型形式,可以写出如下代码:

            #region 无参数无返回值
// lambda实现委托实例
Action a1 = () => Console.WriteLine();
a1();
// delegate实现委托实例,下面不再演示delegate。
Action a2 = delegate { Console.WriteLine(); };
a2();
#endregion #region 有参数无返回值
Action<int> a3 = (x) => Console.WriteLine(x);
a3();
#endregion #region 无参数有返回值的情况
Func<int> e1= ()=> ;
var value1= e1();
#endregion #region 有参数有返回值的情况
// 最后一个泛型是返回值的类型
Func<int,int> e2 = (x) => x+;
int value2= e2();
// 多参数情况
Func<int, int,int> e3 = (x,x2) => x+x2 + ;
int value3 = e3(,);
#endregion #region 返回值是布尔类型
// 其实Predicate可以用Func返回值是bool来代替的。
Predicate<int> p = (x) => x > ;
bool value4 = p();
#endregion

委托还有一些特性(如可加性),感兴趣的可以查阅相关资料。

Expression

Expression指的是System.Linq.Expressions,是Linq表达式,表达式树,不是Lambda表达式!!

Linq表达式用于离线集合的查询。什么是离线集合?最常用的是EF里面的DBContext,我也只用过这个,所以我不想那么多,就把Expression当成EF里面使用的就行了。

1、只能接受Lambda表达式表示的委托

2、Lambda表达式只能有一条语句。

            Expression<Func<int,int>> eeee = (x)=> x+  ;

总结

1、都是希望可以单独引用一段代码片引起的。
2、然后引用了委托delegate,delegate的使用方式为声明类型-实例化类型(传入想要使用的类的方法)-使用委托(使用方法)
3、简化操作,使用(通过Lambda或者delegate)匿名方法来直接声明一段代码片,避免声明所想使用的类的方法
4、简化操作,直接使用C#预定义的三种委托Action、Func、Predicate,连声明委托都省了。
5、本文代码:https://github.com/Beiluola/delegateDemo

注意

1、匿名函数总是和委托一起使用(三种预定义委托)
2、使用三种预定义委托就可以满足大多数需求。
3、Expression是Linq表达式树,只能使用接受一句lambda表达式。和匿名函数无关。

C#中匿名函数、委托delegate和Action、Func、Expression、还有Lambda的关系和区别的更多相关文章

  1. .net中的各种委托(Delegate、Action、Func)

    1.Delegate,委托的鼻祖 protected delegate int ClassDelegate(int x, int y);//定义委托类型及参数 static void Main(str ...

  2. c#中匿名函数lamb表达式

    c#中匿名函数lamb表达式 实例一:(其实,这样都是些语法糖) using System; using System.Collections.Generic; using System.Linq; ...

  3. Python中匿名函数与内置高阶函数详解

    大家好,从今天起早起Python将持续更新由小甜同学从 初学者的角度 学习Python的笔记,其特点就是全文大多由 新手易理解 的 代码与注释及动态演示 .刚入门的读者千万不要错过! 很多人学习pyt ...

  4. C#基础知识六之委托(delegate、Action、Func、predicate)

    1. 什么是委托 官方解释 委托是定义方法签名的类型,当实例化委托时,您可以将其实例化与任何具有兼容签名的方法想关联,可以通过委托实例调用方法. 个人理解 委托通俗一点说就是把一件事情交给别人来帮助完 ...

  5. 转载 C#匿名函数 委托和Lambda表达式

    转载原出处: http://blog.csdn.net/honantic/article/details/46331875 匿名函数 匿名函数(Anonymous Function)是表示“内联”方法 ...

  6. C#委托delegate、Action、Func、predicate 对比用法

    委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递.事件是一种特殊的委托. 一.委托的声明   (1) delegate delegate我们常用到的一种声明 Delega ...

  7. js中匿名函数和回调函数

    匿名函数: 通过这种方式定义的函数:(没有名字的函数) 作用:当它不被赋值给变量单独使用的时候 1.将匿名函数作为参数传递给其他函数 2.定义某个匿名函数来执行某些一次性任务 var f = func ...

  8. C#常见委托のdelegate定义,Func,Action,Predicate总结

    委托,顾名思义,就是让其他代理,本质就是为具有共性方法组定义一个方法模板:(交流可以加qq群:435226676) 委托常见的方式有一般委托显示定义,Func<T,TResult> (T, ...

  9. JS中匿名函数$(function(){ })和(function(){})()的区别

    “$(function(){ });” Jquery语法的匿名函数,用于存放操作DOM对象的代码,执行其中代码时DOM对象已存在: (通过这样就可以在页面加载完成时通过ajax再异步加载一些数据) “ ...

随机推荐

  1. html——网页高度

    确定浏览器窗口的尺寸(浏览器的视口,不包括工具栏和滚动条) var w=window.innerWidth || document.documentElement.clientWidth || doc ...

  2. ListView 中 的 分页

     Django Pagination 简单分页 当博客上发布的文章越来越多时,通常需要进行分页显示,以免所有的文章都堆积在一个页面,影响用户体验.Django 内置的 Pagination 能够帮助我 ...

  3. Unable to save settings: Failed to save settings. Please restart IntelliJ IDEA

    找到原先备份的项目,把 .idea 文件夹重新覆盖,解决问题.

  4. 深入理解Java线程池

    我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁 ...

  5. Java字符串与文件的互转操作

    Java中有时候需要读取一个文本类的文件,将其转换为字符串,然后做进一步处理.Java中没有现成的API方法.   一.字符串转换为文件 /** * 将字符串写入指定文件(当指定的父路径中文件夹不存在 ...

  6. Linux实战教学笔记44:NoSQL数据库开篇之应用指南

    第1章 NoSQL数据库 1.1 NoSQL概述 自关系型数据库诞生40年以来,从理论产生发展到现实产品,例如:大家最常见的MySQL和Oracle,逐渐在数据库领域里上升到了霸主地位,形成每年高达数 ...

  7. ARGB_8888

    原文出处:http://www.cnblogs.com/and_he/archive/2012/12/22/argb.html A:透明度 R:红色 G:绿 B:蓝 Bitmap.Config ARG ...

  8. 监控服务器cpu、磁盘、模板以及自定义key

    一.检测主机存活 net.tcp.service.perf[tcp,,] Float型 返回0代表端口挂了 zabbix fping要开启sudo权限之类比较不方便 二.监控CPU负载 监控load ...

  9. 如何启动jdeveloper中集成的weblogic

    1>运行jdeveloper,打开运行日志,入下图,日志最开始的红框部分就是打开weblogic的命令,将此命令复制出来执行即可打开weblogic 程序员的基础教程:菜鸟程序员

  10. 支付宝soa框架发展思路(转载)

    大家好,这里是首届QCon Beijing的现场,现在坐在我的旁边是的支付宝的首席架构师程立.先给大家介绍一下,支付宝架构发展到今天,经历哪些时期,都有哪些里程碑? 我回忆一下,支付宝系统架构发展大概 ...