第一分钟:委托

 有些教材,博客说到委托都会提到事件,虽然事件是委托的一个实例,但是为了理解起来更简单,今天只谈委托不谈事件。先上一段代码:

  下边的代码,完成了一个委托应用的演示。一个委托分三个步骤:

 class Program
{
//step01:首先用delegate定义一个委托 。
public delegate int CalculatorAdd(int x, int y);
static void Main(string[] args)
{
//step03:用这个方法来实例化这个委托。
CalculatorAdd cAdd = new CalculatorAdd(Add);
//int result = cAdd(5, 6);
int result = cAdd.Invoke(, );
}
// step02:声明一个方法来对应委托。
public static int Add(int x, int y)
{
return x + y; } }

    step01:首先用delegate定义一个委托 。

  step02:声明一个方法来对应委托。

  step03:用这个方法来实例化这个委托。

  至此,一个委托的应该就完成了,就可以调用委托了。

 第二分钟:匿名方法

  在上一分钟已经知道了,完成一个委托应用分三步走,缺一步都不行,如果要跨大步,当心步子大了扯着蛋。但是微软不怕扯着蛋,非要把三步做成两步来走啊!所以微软就用匿名方法来简化上边的三个步骤。匿名方法这个玩意儿怎么说呢,在C#中完全是可有可无的东西,只是为C#锦上添花,有人别出心裁给它取个名字叫语法糖。

  class Program
{
//step01:首先用delegate定义一个委托 。
public delegate int CalculatorAdd(int x, int y);
static void Main(string[] args)
{
//step02:用这样的写法 delegate(int x, int y) { return x + y; },把一个方法赋值给委托
CalculatorAdd cAdd = delegate (int x, int y) { return x + y; };
int result = cAdd.Invoke(, );
} }

  step01:首先用delegate定义一个委托 。

  step02:用这样的写法 delegate(int x, int y) { return x + y; },把一个方法赋值给委托,其实这种写法就是匿名方法。

  这时会惊奇的发现,这不是三步当着两步走了哇?

   第三分钟:Lambda表达式

  原本很简单的程序,加上几个delegate关键字,这代码一下就变得深奥了,深奥的东西懂的人就变少了,所以这个还可以作为加薪的筹码。但是微软对C#的设计理念是简单易用。微软就想方设法的来简化delegate(int x, int y) { return x + y; }这个匿名方法,Lambda就出现了。下边我来看几种lambda表达式的写法:

 class Program
{
public delegate int CalculatorAdd(int x, int y);
static void Main(string[] args)
{ //方法一:
CalculatorAdd cAdd1 = (int x, int y) => { return x + y; };
int result1 = cAdd1(, );
//方法二:
CalculatorAdd cAdd2 = (x, y) => { return x + y; };
int result2 = cAdd2(, );
//方法三:
CalculatorAdd cAdd3 = (x, y) => x + y;
int result3 = cAdd2(, );
}
}

第四分钟:泛型委托

  随着.net版本的不升级,新版本总要区别于旧版本吧,不然微软的工程师怎么向他们的老大交差呀?所以微软又来玩新花样了。

 class Program
{ static void Main(string[] args)
{
//方法一:
Func<int, int, int> cAdd1 = (int x, int y) => { return x + y; };
int result1 = cAdd1(, );
//方法二:
Func<int, int, int> cAdd2 = (x, y) => { return x + y; };
int result2 = cAdd2(, );
//方法三:
Func<int, int, int> cAdd3 = (x, y) => x + y;
int result3 = cAdd2(, );
}
}

 

 不管是匿名方法还是Lambda表达式,完成一个委托的应用,都逃不过两个步骤,一步是定义一个委托,另一步是用一个方法来实例化一个委托。 微软干脆把这两步都合成一步来走了。用Func来简化一个委托的定义。

  至此一个委托的应用就可用 Func<int, int, int> cAdd3 = (x, y) => x + y; 这样一句话来完成了,其中的Func就是所谓的泛型委托。

  第五分钟:表达式树

  表达式树其实与委托已经没什么关系了,非要扯上关系,那就这么说吧,表达式树是存放委托的容器。如果非要说的更专业一些,表达式树是存取Lambda表达式的一种数据结构。要用Lambda表达式的时候,直接从表达式中获取出来,Compile()就可以直接用了。如下代码:

class Program
{ static void Main(string[] args)
{ Expression<Func<int, int, int>> exp = (x, y) => x + y;
Func<int, int, int> fun = exp.Compile();
int result = fun(, );
}
}

C#委托,匿名方法,Lambda,泛型委托,表达式树代码示例的更多相关文章

  1. C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法

    使用C#实现加减乘除算法经常被用作新手练习.本篇来分别体验通过委托.接口.匿名方法.泛型委托来实现. 使用委托实现 加减乘除拥有相同的参数个数.类型和返回类型,首先想到了使用委托实现. //创建一个委 ...

  2. c#打包文件解压缩 C#中使用委托、接口、匿名方法、泛型委托实现加减乘除算法 一个简单例子理解C#的协变和逆变 对于过长字符串的大小比对

    首先要引用一下类库:using Ionic.Zip;这个类库可以到网上下载. 下面对类库使用的封装方法: 得到指定的输入流的ZIP压缩流对象 /// <summary> /// 得到指定的 ...

  3. 委托-异步调用-泛型委托-匿名方法-Lambda表达式-事件【转】

    1. 委托 From: http://www.cnblogs.com/daxnet/archive/2008/11/08/1687014.html 类是对象的抽象,而委托则可以看成是函数的抽象.一个委 ...

  4. C#多线程+委托+匿名方法+Lambda表达式

    线程 下面是百度写的: 定义英文:Thread每个正在系统上运行的程序都是一个进程.每个进程包含一到多个线程.进程也可能是整个程序或者是部分程序的动态执行.线程是一组指令的集合,或者是程序的特殊段,它 ...

  5. 委托delegate 泛型委托action<> 返回值泛型委托Func<> 匿名方法 lambda表达式 的理解

    1.使用简单委托 namespace 简单委托 { class Program { //委托方法签名 delegate void MyBookDel(int a); //定义委托 static MyB ...

  6. Lambda表达式的演化,委托-匿名方法-Func-Lambda

    匿名方法 很多时候委托接收的方法是一次性的或者方法体是非常简单的... 例三: 我们可以写成: 有没有发现我们每次都要定义委托,很多时候签名可能是一样的.这样就没有必要定义重复的. 然后又过了很久很久 ...

  7. (28)C#委托,匿名函数,lambda表达式,事件

    一.委托 委托是一种用于封装命名和匿名方法的引用类型. 把方法当参数,传给另一个方法(这么说好理解,但实际上方法不能当参数,传入的是委托类型),委托是一种引用类型,委托里包含很多方法的引用 创建的方法 ...

  8. C# delegate event func action 匿名方法 lambda表达式

    delegate event action func 匿名方法 lambda表达式 delegate类似c++的函数指针,但是是类型安全的,可以指向多个函数, public delegate void ...

  9. Lambda表达式常用代码示例

    Lambda表达式常用代码示例 2017-10-24 目录 1 Lambda表达式是什么2 Lambda表达式语法3 函数式接口是什么  3.1 常用函数式接口4 Lambdas和Streams结合使 ...

随机推荐

  1. java的List中使用filter过滤出符合特定条件的元素List

    在实际开发中,经常需要把一个列表中的元素,按照特定条件过滤出来,放到一个新的列表中.本文给出了几个例子,来描述解决这个问题的方法. 我们假设有一个书的List,需要找出其中id分别是3.6.8.9的书 ...

  2. python3 selenium模块Chrome设置代理ip的实现

    python3 selenium模块Chrome设置代理ip的实现 selenium模块Chrome设置代理ip的实现代码: from selenium import webdriver chrome ...

  3. composer Changed current directory to没反应

    根据官方手册执行composer global require "laravel/installer" 显示Changed current directory to C:/User ...

  4. git---分支的合并

    git使用分支也可进行多人协作开发. 一.创建分支 git branch zhaozilong 创建一个 zhaozilong 的分支 二.查看所有的分支 git branch -a :查看当前的所有 ...

  5. 【转载】 谷歌集群数据分析 clusterdata-2011-2

    原文地址: https://www.twblogs.net/a/5c2dc304bd9eee35b21c418b/zh-cn ------------------------------------- ...

  6. 软件定义网络基础---SDN的核心思想

    一:SDN包含的核心思想:解耦,抽象,可编程 二:解耦 (一)SDN网络解耦思想 解耦是指将控制平面和数据平面进行分离,主要为了解决传统网络中控制平面和数据平面在物理上紧耦合导致的问题 控制平面和数据 ...

  7. 头文件里声明和定义,Qt编译不过问题

    1.现象1 Qt5.2.1,新建头文件,声明一个类,然后在此头文件中实现类的static变量和方法,但是编译不过,显示:multiple definition of `xxx'. 2.现象2 在高版本 ...

  8. Qt编写气体安全管理系统9-数据查询

    一.前言 数据查询模块在整个系统中难度最低,由于Qt对数据库操作的封装堪称完美,所以各种查询都是手到擒来,不费吹灰之力.Qt中内置了sqlite数据库,你可以在数据库插件目录sqldrivers发现q ...

  9. 123457123456#0#-----com.tym.myNewShiZi45--前拼后广--识字tym

    com.tym.myNewShiZi45--前拼后广--识字tym

  10. mssql的update :from语法

    一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表以外的数据.我们先来讨论根据其他表数据更新你要更新的表 一.MS    S ...