您的位置:首页 > 编程语言 > C#

c# 委托的学习日记

2007-12-04 22:09 183 查看
曾经对委托和事件非常头疼,好在现在以自己的方式入门了,就行以自己的方式把它过一遍,当作学习日记吧。
委托(delegate)是一种引用类型,我们在处理他的时候要当作类来看待而不是方法,说白了委托就是对方法或者方法列表的引用,调用一个委托实例就好像是调用c++中的指针一样,他封装了对制定方法的引用,或者说委托起到的是桥梁的作用,实例后的委托对象会将给定的参数传递给他所回调的方法,并去执行方法。

看一个简单的例子:

//声明一个委托

delegate int myDelegateHandler(int a, int b);

public class A

{

//静态的处理方法

public static int M1(int a, int b)

{

int c = 0;

c = a + b;

return c;

}

}

//入口类

public class B

{

public static void Main()

{

//实例一个委托

myDelegateHandler mdh = new myDelegateHandler(A.M1);

//调用委托

int sum = mdh(2, 2);

Console.WriteLine(sum.ToString());

}

}

上面是一个非常简单的例子,具体的实现步骤:

1、 先声明个委托实例 ;

2、然后提供要处理的方法;

3、再实例化委托(把委托看作是类的话,实例化委托就不难理解了,其参数是要处理的方法,这里的方法 不用加括号,实例化的过程就是装载方法的过程,就好像需要参数的构造函数一样)实例化后的委托对象就好比是c++中的指针,它本身就是封装了方法的对象;

4、最后我们调用委托对象就好比是调用了被封装方法本身,调用时的参数也就传给了被封装的方法。

5、需要注意的是 所声明的委托无论是 参数个数,参数类型,返回值类型 都要和所要封装的方法保持一致,当调用委托实例对象时,所传入的参数也要保持一致 ,否则会出现错误。

委托链

我们知道委托是对方法的封装,而且委托可以封装很多方法形成委托链,其实委托就好像是一个容器,他封装了我们想要实现的若干方法,当调用委托对象(相当于c++中的指针)时,就会顺序的执行它所封装的所有的方法,如果有返回值的话,往往返回的是最后一个被执行的方法的返回值,委托链的形成可以用"+="或"-="对不同的委托实例进行二元操作。

委托链实例:

//定义一个委托

public delegate void PrintHandler(string message);

public class PrintProvider1

{

public void Print(string msg)

{

Console.WriteLine( msg + "1111111");

}

}

public class PrintProvider2

{

public void Print(string msg)

{

Console.WriteLine( msg + "2222222");

}

}

class Delegate1

{

public static void StaticPrint(string msg)

{

Console.WriteLine(msg + "3333333");

}

public static void Main()

{

string s = "委托链";

PrintProvider1 pp1 = new PrintProvider1();

PrintProvider2 pp2 = new PrintProvider2();

//创建委托实例

PrintHandler prn1 = new PrintHandler(pp1 .Print );

PrintHandler prn2 = new PrintHandler(pp2 .Print );

PrintHandler prn3 = new PrintHandler(StaticPrint );

Console.WriteLine("委托实例prn1的打印结果");

prn1(s );

Console.WriteLine("委托实例prn2的打印结果");

prn2(s);

Console.WriteLine("委托实例prn1+prn2的打印结果");

PrintHandler prn = prn1 + prn2;

prn(s);

Console.WriteLine("委托实例prn1+prn2+prn3的打印结果");

prn += prn3;

prn(s);

Console.WriteLine("委托实例prn1+prn3的打印结果");

prn -= prn2;

prn(s);

Console.WriteLine("委托实例prn3的打印结果");

prn -= prn1;

prn(s);

Console.WriteLine("试图调用null委托会引发异常");

try

{

prn -= prn3;

prn(s);

}

catch (NullReferenceException ex)

{

Console.WriteLine(ex .Message );

}

Console.WriteLine("试图从null中移出委托是无效操作");

try

{

prn -= prn3;

}

catch (NullReferenceException ex)

{

Console.WriteLine(ex .Message );

}

Console.Read();

}

}

执行结果

委托实例prn1的打印结果

委托链1111111

委托实例prn2的打印结果

委托链2222222

委托实例prn1+prn2的打印结果

委托链1111111

委托链2222222

委托实例prn1+prn2+prn3的打印结果

委托链1111111

委托链2222222

委托链3333333

委托实例prn1+prn3的打印结果

委托链1111111

委托链3333333

委托实例prn3的打印结果

委托链3333333

试图调用null委托会引发异常

未将对象引用设置到对象的实例。

试图从null中移出委托是无效操作
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: