C#之委托

来源:互联网 发布:mac宽带连接说鉴定失败 编辑:程序博客网 时间:2024/06/07 10:44

委托

委托是C#版的寻址方法。相对于C++的函数指针,委托不仅是类型安全的(它定义了返回类型和参数类型),而且包含的是一类具有相同参数类型以及返回类型方法的引用。

委托基础

1.声明委托

声明的委托语法如下:

delegate void IntMethodInvoker(int x);

在示例中,定义了一个委托 IntMethodInvoker,并指定引用的方法应该带有一个 int 参数,并返回 void 。

2.实例化委托

当声明一个委托时,就可以把它当做一个数据类型,用这个数据类型来定义一个变量时,即是实例化委托。

//定义委托private delegate string GetAString();...int x=40;实例化委托GetAString stringMethod = new GetAString(x.ToString);//GetAString stringMethod = x.ToString;...

值得注意的是,输入方法名ToString时,并不带括号的。

3.调用委托

委托的调用形式有两种:

//第一种stringMethod();//第二种stringMethod.Invoke(); 

两种形式的调用结果都一样,C#编译器会把第一种转换为第二种。


委托高级用法

1.Action<T>Func<T>委托

Action<T>Func<T>是C#自带的两种泛型委托,Action<T>表示引用一个void返回类型的方法,可以传递最多16种参数类型;而后者允许调用带返回类型的方法。与Action<T>一样,它也最多可以传递16种参数类型,并且可以接受无参数带返回类型的方法。

2.多播委托

前面所讲的都是一个委托包含一个方法。然而,委托可以包含多个方法,它会按顺序的执行多个方法,所以,多播委托只能得到最后一个方法的结果。

...//形式一Action<double> Method = FirstMethod;Method += SecondMethod;//形式二Action<double> Method1 = FirstMethod;Action<double> Method2 = SecondMethod;Action<double> Method = Method1 + Method2;...

在上面的示例中,假如调用第一个方法抛出了异常,多播委托就会停止迭代,不再调用第二个方法。
为了避免这个情况,Delegate类定义GetInvocationList()方法,它返回一个Delegate对象数组。这时,再对数组进行迭代,就会捕捉到异常并且继续运行。

3.匿名方法

匿名委托与前面的所有委托并无差别,假如该委托只用一次,那就可以采用匿名方法实现,这样子可以减少代码量,也方便查看代码。


除了以上这些,委托还运用到了其他地方,如Lambda表达式以及事件。在接下来的文章中再进行讲解吧。

原创粉丝点击