首页 > Python基础教程 >
-
C#语法--委托,架构的血液
什么是委托?
委托实际上是一种类型,是一种引用类型。
微软用delegate关键字来声明委托,delegate与int,string,double等关键字一样。都是声明用的。
下面先看下声明代码,这里声明了两个委托。
1
2
|
public delegate void TestDelegate(string message); public delegate int TestDelegate(MyType m, long num); |
delegate既然是关键字,和int,string一样,那么,为什么delegate后又跟了一个void或者int呢?
如果他们是同等地位的关键字,为什么可以一起使用呢?
很简单,我们把delegate后面的 【void TestDelegate(string message)】理解为一个变量,是不是就清晰明了了一些。
我们把delegate关键字理解为,是用来专门来定义这种复杂的变量的。而这种复杂的变量可以包含一个返回值和任意数目任意类型的传入参数。
有没有感觉,这个复杂的变量特别像一个函数的定义。
没错,官方定义,委托类型的声明与方法签名相似。所以,这个复杂变量,的确,书写的方式就是与函数一样。
那么,为什么这个声明方式如此怪异呢,是因为,我们用delegate定义的变量,只能用函数赋值。赋值方式如下所示:
1
2
3
4
5
6
7
8
9
10
|
public delegate void TestDelegate( string message); public delegate long TestDelegate2( int m, long num); public static void Excute() { TestDelegate2 td = Double; } static long Double( int m, long num) { return m * num; } |
委托的基本应用
学会了赋值以后,我开始使用委托。
委托的使用方式如下:
1
2
|
string result = td(51, 8); Console.WriteLine(result); |
这里我们会发现,委托的使用方式与函数调用一样。
没错,它们的确是一样的。因为委托是用函数来赋值的,所以调用方式一样也并不奇怪,不是吗。
换一种说法,就是委托封装了一个函数。
如果委托是封装的函数,并且它又是引用类型。那么委托第一种常规的应用就浮现出来了。
那就是——引用类型的函数。
如果函数是引用类型,那么这个函数只要没被内存回收,就可以被调用。如果是public函数或者是public static函数,那么它能跨越的东西就更多了。
比如可以跨类调用,跨程序集调用等等。而这种用法,就是委托的基本应用。
匿名委托的应用
匿名委托的官方介绍:在 2.0 之前的 C# 版本中,声明委托的唯一方式是使用命名方法。 C# 2.0 引入匿名方法,在 C# 3.0 及更高版本中,Lambda 表达式取代匿名方法作为编写内联代码的首选方式。
看不懂没关系,我们直接来学习使用。代码如下:
1
2
3
4
5
6
|
delegate string anonymousDelegate( int m, long num); public static void Excute() { anonymousDelegate ad = delegate ( int m, long num) { return m.ToString() + num.ToString(); }; //2.0时代的匿名委托 anonymousDelegate ad2 = (m, num) => { return m.ToString() + num.ToString(); }; //3.0以后匿名委托 } |