首页 > 代码库 > 委托是怎么最终变成linq表达式的?(上)
委托是怎么最终变成linq表达式的?(上)
前不久,给学生们做培训,讲到C#语言委托部分的时候。我用了一天的时间。把委托讲到了linq表达式。但是呢!学生们反应并不是很好。貌似没有彻底领悟到这其中的过程。我写下这篇文章。也算是对学生们一个交代总结吧!
- 什么是委托?
我们其实可以把委托理解成含有一个或者多个方法的对象。我们在大多数时候用到委托都是在”执行“这个对象。但是委托却又和一般的对象不同,我们需要执行他所拥有的方法。
下面是一个示例代码
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace Delegate{ delegate void MyPrint(int value); //定义委托 class Program { void ChinesePrint(int value) { Console.WriteLine("中国人的国土面积{0}",value); } //两个和定义委托返回值参数相同的方法 void JapanesePrint(int value) { Console.WriteLine("日本人的国土面积{0}",value); } static void Main(string[] args) { Program p = new Program();//声明当前类 Console.WriteLine("请输入国家"); string Country = Console.ReadLine(); if (Country.Equals("japanese")) { MyPrint printdelegate = new MyPrint(p.ChinesePrint); printdelegate(1235); } else { MyPrint printdelegate = new MyPrint(p.ChinesePrint); printdelegate(9600000); } } }}
我们现在来看看委托和类的一些对比,委托也是用户自定义的类型,但类表示的是封装数据和方法的集合,而委托则持有一个或者多个的方法,以及一系列的自定义操作。
①:声明一个委托类型,委托看上起和方法的生命很相似,但是委托没有实现。
②:使用该委托类型声明一个委托变量。
③:创建一个委托类型的对象,把它赋值给委托变量。新的委托对象包含指向某个方法的引用,这个方法的签名和返回值必须一致。
④:可以为委托对象增加其他方法。
⑤:在代码中调用委托可以像调用方法那样。其中包含的方法全部被执行。
我们可以把delegate看作是一个包含有序方法列表的对象,这些方法具有相同的签名和返回类型。委托保存的方法可以来自任何类和结构。
如何声明委托类型
delegate(关键字) void(返回类型) MyDelgate(签名)(int x)(参数)
委托类型的声明看上去与方法的声明很相似,有返回类型和签名。返回类型和签名指定了委托的方法的接收方式。
①:以delegate关键字开头;
②:没有方法的主体。
创建委托对象
委托是引用类型,因此有引用和对象。在委托类型声明之后,我们可以声明变量并创建类型的对象。如下代码演示了委托类型的变量声明:
MyDel delvar
(委托类型) (变量)
有两种创建委托的对象的方式,第一种是使用new运算符的对象表达式,如下所示
①:委托类型名
②:一组圆括号,其中包含作为调用列表中第一个成员的方法的名字。方法可以是实例方法也可以是静态方法。
using System;using System.Collections.Generic;using System.Linq;using System.Text;namespace ConsoleApplication1{ public delegate int MyDelegate(string name); class Program { static void Main(string[] args) { MyDelegate Mydel1 = new MyDelegate(Max); MyDelegate Mydel2 = new MyDelegate(Min); MyDelegate MyDel = Max;//也可以使用快捷语法,直接将方法名称赋予MyDel } static int Max(string i) { return int.Parse(i); } static int Min(string i) { return int.Parse(i); } }}
下面的代码创建了两个委托对象,一个具有实例方法,而另一个具有静态方法。
委托是怎么最终变成linq表达式的?(上)