C# 委托的理解
题记:
学好一门技术语言,其实不难。首先心理上要克服畏惧的不良的情绪,在意志品质上要提高克服困难的勇气。其次,要循序渐进,逐个梳理概念上的难点。最后,就是多看手册,多练习。
因为最近手头上有个C# 的项目工程,为了搞清楚里面的内容,不得不从来来回顾下C#的语言特点以及C#开发windows程序的技术要点。今天的主题是 委托
简介
首先了解下委托的概念:
委托是C# 语言的特性。它提供类似C++语言中函数指针的功能。那委托与C++中指针函数的异同有哪些呢?这我们留到后一篇再讲解。
C#里面有两种类型的数据结构,一个是值类型,另一个是引用类型。
委托是引用类型。 可以利用委托在执行时传入方法的名称,从而动态决定想调用的方法。
委托衍生出两个方面的技术要点:一是callBack(回调), 其二是事件处理。
初步了解了C#委托的概念要点,接着我们通过实例来说明。
委托的使用过程
委托的使用过程为3步:定义(声明)、实例化和调用。
1、定义(声明)
通过关键字delegate 进行,并同时指定返回类型(可是是void)和带参数的(可以为空),如:
delegate int ZDelegate();
delegate void MDelegate(uint i);
2、实例化
委托的实例化通过关键字new 进行,并同时指定所引用的方法,而且方法的参数列表和返回类型都应与委托相一致。如:
MDelegate md = MDelegate(card.Deposit);
3、调用
项调用方法一项来调用委托,只不过此时无需指出方法所属的对象或类。
md(100);
我们来看一个完整的实例:
namespace mydemo
{
delegate int Converter(int x); //定义一个委托
class Test
{
static void Main()
{
Converter t = Square; // Create delegate instance
int result = t(3); // Invoke delegate
Console.WriteLine(result); // 9
Console.ReadLine();
}
static int Square(int x) { return x * x; }
}
}
委托的多播:
多播委托(MulticastDelegate)提供了一种类似于流水线式的钩子机制,只要加载到这条流水线上的委托,都会被顺序执行。
因为所有的委托都继承自MulticastDelegate,因此所的委托都具备多播特性。
委托的多播可以通过 “+=” 或者 “-=”来实现。
“+=” :添加方法
“-=”:去挑方法。
来看下面的一个例子:
namespace mydemo
{
delegate void Converter(int x); //定义一个委托
class Test
{
static void Main()
{
Converter t = new Converter(Square); // Create delegate instance
t(3); // Invoke delegate
Converter m = new Converter(Square);
m += new Converter(multi);
m(3);
Console.ReadLine();
}
static void Square(int x) {
Console.WriteLine( x * x); }
static void multi(int x) {
Console.WriteLine (x * 10);}
}
}
输出的是
9
9
30
上述的例子中 第一个委托实例调用的是t(3),执行的是方法Square(3)中的内容,
第二个委托实例调用的是m3,执行的是按顺序的方法Square(3),multi(3)中的内容。
委托的内容,就这些,不难理解,你同意吗?