题外话:别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍。

本人女猿一枚,2年工作经验,喜欢钻研,喜欢创新,闲暇之余喜欢写写博客,深知自身能力薄弱,如表达错误、不当之处请园友们多多指出,互相交流。

最近在学习lambda表达式,lambda表达式与匿名方法有着密切联系,而匿名方法又离不开委托,索性我就围绕委托 、泛型、匿名方法做个总结,以加深我的理解,总结的内容很基础,希望各位大神看后勿喷。

首先,引用MSDN上的原话解释这几个名词:

委托:是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。

泛型:泛型是 2.0 版 C# 语言和公共语言运行库 (CLR) 中的一个新功能,使用泛型类型可以最大限度地重用代码、保护类型的安全以及提高性能。

匿名方法:在 2.0 之前的 C# 版本中,声明委托的唯一方法是使用命名方法。C# 2.0 引入了匿名方法。

要将代码块传递为委托参数,创建匿名方法则是唯一的方法。如果使用匿名方法,则不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。

MSDN解释的挺透彻的了,我就不多嘴了,下面看看具体的实例。

 委托

有了委托,我们就可以把方法当成参数来传递,用委托对象调用它所指向的方法,委托与c++中的指针很相似,但是委托是类型安全的。

首先先看一个例子:

小张委托小明去打热水:

//定义一个委托
public delegate void GetHotWaterEventHandler();
static void Main(string[] args)
{
//声明一个委托对象,并绑定一个方法
GetHotWaterEventHandler Getwater = new GetHotWaterEventHandler(MyHotWater);
Getwater();//使用委托调用方法
Console.ReadKey();
}
//小明打热水方法
private static void MyHotWater()
{
Console.WriteLine("Oh,NO!命苦的我又要去打热水了!");
}

上面就是一个简单的委托,该委托没有返回值,没有传入参数,实际使用时,委托的返回值和形参要与绑定的方法相同,否则会报错。

由上面的例子可以总结出使用委托的具体步骤:

1.用关键字delegate定义一个委托;

2.声明一个委托对象,并为该委托绑定一个方法;

3.用委托对象去调用所绑定的方法;

以上三步就能实现一个委托,是不是很简单呢?

使用委托要注意:

1)委托和绑定的方法要有相同的参数;

2)用+=或-=实现方法的绑定与解绑;一个委托可以绑定多个方法;

好了,委托就总结到这里,下面总结泛型委托。

三种泛型委托:

首先,我解释下在C#中为什么要使用泛型:

假如我们接到一个方法需求:比较两个参数的大小,并返回较大的一个。但是需求上并没有说明参数的具体类型,需求提供者让写一个通用的方法来实现,

这样,假如没有泛型,我们在写方法时,形参类型就要用object了,因为object是所有类型的基类,用object肯定不会出错;但是我们仔细想想,假如用户

输入的参数是int型的,这样在用我们的方法时,就会出现装箱操作,返回时又需要进行一次拆箱操作,这样反复的装箱、拆箱操作会大大降低系统的性能,

因此,我们需要一种通用的类型——泛型,来解决出现的这个问题。

编程时,使用泛型能提高代码的重用度,提高系统性能,提高代码的安全性。

好了,聪明的大家应该明白为什么使用泛型了,下面开始总结三种泛型委托。

1.predicate:

定义:public delegate  bool Predicate<in T>(T obj);

这种委托返回值必须为bool型,可传入一个T类型参数;

代码实例:

static void Main(string[] args)
{
//注意返回值必须为bool,输入参数只能有一个
var value=new Predicate<int>(Compare);
bool bvalue = value();
Console.WriteLine(bvalue.ToString());//输出Tru
Console.ReadKey();
}
private static bool Compare(int x)
{
return x > ;
}

2.Action:

定义:public delegate void Action<T>(T obj1,T obj2,.......T obj16);

这种委托可以传入最多16个参数,但是无返回值;

代码实例:

 static void Main(string[] args)
{
var Test = new Action<int, string, string>(action_Compare);
Test(, "90后", "非90后");//输出我是非90后
Console.ReadKey();
}private static void action_Compare(int x, string a, string b)
{
string result=x>?a:b;
Console.WriteLine("我是" + result);
}

3.Func:

定义:public delegate <T> Func<T>(T obj1,T obj2,........T obj16);

这种委托为了弥补以上两种委托的缺点而出现,它可以传入最多16个T类型参数,返回T类型值;

实例代码:

 static void Main(string[] args)
{
//注意最后一个string是返回类型
var Test3 = new Func<int, string, string,string>(func_Compare);
Console.WriteLine("我是"+Test3(, "90后", "非90后"));//输出我是非90后
Console.ReadKey();
}
private static string func_Compare(int x, string a, string b)
{
string result = x > ? a : b;
return result;
}

三种泛型委托介绍完了,最后出场的就是匿名方法了。

匿名方法

拿刚才委托的例子来讲,小张委托小明去打热水,我们专门写了一个小明打热水的方法供委托来调用。假如这个方法我们只会使用一次,而且代码量又特别少,那么专门写一个方法就显得累赘了许多,也增加了系统编码开销,因此c#2.0出现了匿名方法,使用委托时不必创建单独的方法,因此减少了实例化委托所需的编码系统开销。

代码实例:

static void Main(string[] args)
{
//使用匿名方法
GetHotWaterEventHandler Getwater = delegate()
{
Console.WriteLine("Oh,NO!命苦的我又要去打热水了!");
};
Getwater();//使用委托调用方法
Console.ReadKey();
}

和刚才委托那个代码实例相比,是不是简单了许多呢?

好了,总结完毕,养精蓄锐,准备学习lambda了。

c#委托、泛型委托和匿名方法的更多相关文章

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

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

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

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

  3. 十二、C# 委托与Lambda表达式(匿名方法的另一种写法)

    委托与Lambda表达式   1.委托概述 2.匿名方法 3.语句Lambda 4.表达式Lambda 5.表达式树   一.委托概述 相当于C++当中的方法指针,在C#中使用delegate 委托来 ...

  4. 委托、事件、匿名方法、Lambda

    一.委托(delegate)     定义:public delegate  void/类型  DefinedDelegate(参数1,参数2...) 委托是类型安全的. 委托实例:DefinedDe ...

  5. C#基础精华07(委托事件,委托的使用,匿名方法)

    1.委托概述 委托是一种数据类型,像类一样(可以声明委托类型变量).方法参数可以是int.string.类类型 void M1(int n){  } √ void M2(string s){  } √ ...

  6. 委托,lambda,匿名方法

    lambda表达式其实就是匿名方法的变体或者说简写. 原来我们用 delegate void Del(int x); Del d = delegate(int x) { return x + 1; } ...

  7. [读书笔记]C#学习笔记四: C#2.0泛型 可控类型 匿名方法和迭代器

    前言 C#1.0的委托特性使方法作为其他方法的参数来传递,而C#2.0 中提出的泛型特性则使类型可以被参数化,从而不必再为不同的类型提供特殊版本的实现方法.另外C#2.0还提出了可空类型,匿名方法和迭 ...

  8. C#学习笔记三: C#2.0泛型 可控类型 匿名方法和迭代器

    前言 C#1.0的委托特性使方法作为其他方法的参数来传递,而C#2.0 中提出的泛型特性则使类型可以被参数化,从而不必再为不同的类型提供特殊版本的实现方法.另外C#2.0还提出了可空类型,匿名方法和迭 ...

  9. 委托, 泛型委托,Func<T>和Action<T>

    使用委托来做一些事情,大致思路是: 1.定义声明一个委托,规定输入参数和输出类型.2.写几个符合委托定义的方法.3.把方法列表赋值给委托4.执行委托 internal delegate int MyD ...

  10. Delegates, Events, and Anonymous Methods 委托、事件与匿名方法

    http://www.cnblogs.com/r01cn/archive/2012/11/30/2795977.html

随机推荐

  1. 如何理解TCP的三次握手协议?

    • TCP是一个面向链接的协议,任何一个面向连接的协议,我们都可以将其类比为我们最熟悉的打电话模型. 如何类比呢?我们可以从建立和销毁两个阶段分别来看这件事情. 建立连接阶段 首先,我们来看看TCP中 ...

  2. NVARCHAR(MAX) 的最大长度

    本文使用的环境是SQL Server 2017, 主机是64位操作系统. 大家都知道,Micorosoft Docs对 max参数的定义是:max 指定最大的存储空间是2GB,该注释是不严谨的: nv ...

  3. ElasticSearch系列四 CURD

    1: ES 类似JPA操作 1.1 编写实体类 1.2 编写映射文件 xxx.json 1.3编写repository继承 ElasticSearchrepository 1.4 编写admin 的C ...

  4. 前端进阶系列(三):HTML5新特性

    HTML5 是对 HTML 标准的第五次修订.其主要的目标是将互联网语义化,以便更好地被人类和机器阅读,并同时提供更好地支持各种媒体的嵌入.HTML5 的语法是向后兼容的.现在国内普遍说的 H5 是包 ...

  5. Android Base64图片无法长按保存 问题解决

    踩了一个巨坑. 目前微信ios/android 均能长按保存src=base64的图片  (微信android x5 专门解决了这个问题); 但是android其他App没有针对解决这个系统问题(姑且 ...

  6. psql的jsonb操作--存储对象/对象数组

    1. 建表 create table demo( id serial NOT NULL PRIMARY KEY, name ), info JSONB ); 2.存储对象操作 2.1添加 insert ...

  7. 超详细,多图文介绍redis集群方式并搭建redis伪集群

    超详细,多图文介绍redis集群方式并搭建redis伪集群 超多图文,对新手友好度极好.敲命令的过程中,难免会敲错,但为了截好一张合适的图,一旦出现一点问题,为了好的演示效果,就要从头开始敲.且看且珍 ...

  8. 在shell脚本中调用sql语句

    查询员工信息 -S:静默登录 [oracle@localhost shells]$ cat shell1.sh #!/bin/bash #查询员工信息 sqlplus -S /nolog <&l ...

  9. linux 读取 USB HID鼠标坐标和点击 在 LCD上显示

    首先要,编译内核时启用了 USB HID 设备.启用了 鼠标 . 在开发板上插入usb 时会有如下提示. 可以看到,多了一个 mouse0 和 eventX 打出来的是我的 联想鼠标. 1, 在 终端 ...

  10. [BlueZ] 3、使用 meshctl 连接控制一个 sig mesh 灯

    目录 前言 1.准备工作 2.meshctl 连接.配置.控制 sig mesh 灯 3.最终效果: LINKS 前言 本文介绍如何使用 meshctl 配对.连接.控制一个 sig mesh 球泡灯 ...