今天,我学习了一下MSDN上面委托这一章的内容。虽然自己以前虽然看到看过一些webcast关于委托方面的一些视频,也在网上看过一些相关的介绍,但是一直没有弄清楚委托到底是怎么一回事。今天花了一天时间,我终于可以解开她神秘的外纱。
委托,英文名称为delegate,中文可以翻译为代表,代理。顾名思义,委托和为她分配的方法具有完全相同的行为。委托是一种引用方法的类型,因而它是引用类型的一种。与其他的引用类型不同,委托是对方法的引用。它代替了C++的函数指针。因为在C#中,方法是封装在类里面的,所以它是面向对象的,是类型安全的。
要使用委托,一般有以下三个步骤:
1.声明委托
下面的语句声明一个新的委托类型
public delegate int PerformCalculation(int x,int y)
这个委托类型的访问修饰符是public.为什么要设为public呢?因为创建委托,就是希望在外部类里面通过委托调用它所封装的方法,所以访问修饰符一般就是public.这一点和私有字段对应的属性的访问修饰符一般设为public道理是相同的.delegate是创建委托类型的关键字,这是C#语法所规定好了的。int PerformCalculation(int x,int y)统称为委托的签名。int为该委托类型的返回类型.PerformCalculation为委托名.因为委托名决定了一个委托名决定委托的类型,所以取什么样的委托名,就创建了什么样的委托类型。这个例子就创建了一个PerformCalculation委托类型。当然委托名的命名要有实际意义,才能方便以后对它的调用.(int x,int y)是此委托类型的参数列表,包括了参数类型、参数名称和参数的数目.从委托的声明看来,委托和类等其他引用类型最大的区别是多了一个返回类型和参数列表。返回类型和参数列表共同构成了委托的签名。这里要注意的是,与在方法重载的上下文,方法签名不带返回类型不同,在委托的上下文中,委托签名是带返回类型的。为委托封装的方法的返回类型和参数列表必须与委托签名匹配,但可以不完全匹配,如委托的封装方法的返回类型是对应的委托的返回类型的派生类型,方法的参数名称也可以和委托签名不同,不过参数类型必须相同。
声明了委托只是创建了一种委托类型,要使用它,我们接下来必须对它进行实例化。认真想一想,这和我们创建了一个类,我们必须创建类的实例,才能访问类里面的实例成员是一个道理。
2.实例化委托
声明了委托类型后,必须创建委托对象并使之与特定方法关联。
下面的语句将步骤1创建的委托PerformCalculation实例化:
实例化委托有三种方法:
1).使用命名方法实例化
委托可以与命名方法关联。使用命名方法对委托进行实例化时,该方法将作为参数传递
int Calculate(int x,int y) {/*……*/}
PerformCalculation pc = new PerformCalculation(obj.Calculate)
或PerformCalculation pc = obj.Calculate
2).使用匿名方法实例化
在不希望付出创建新方法的系统开销时,C# 使您可以对委托进行实例化,并立即指定委托在被调用时将处理的代码块。这些被称为匿名方法
PerformCalculation pc = delegate(int m,int n){/*……*/}
3).使用Lambra表达式
“Lambda 表达式”是一个匿名函数,它可以包含表达式和语句,并且可用于创建委托或表达式目录树类型。
PerformCalculation pc = x->x*y
3.调用委托
通过委托对象的名称(后面跟着要传递给委托的参数,括在括号内)调用委托对象
pc (5,6)
由于没有应用委托进行过开发,缺乏相应的经验,对委托的应用还有很多不清楚的地方,期待在以后的工作学习中去挖掘!