之前囫囵吞枣的看了一遍c#的入门书,还是有很多不懂的地方,比如这个delegate委托,书里面就完全没有提到过。查中文资料又翻译的让人看不懂,还不如直接看英文了。这边我试着翻译一下,翻的不好请指出
原文来自 [code project](http://www.codeproject.com/Articles/11657/Understanding-Delegates-in-C)
c#的委托是啥
Arul Nayagam C
前言
委托是c#.net里面很玄的一个东西,这篇文章里面我试着解释一下委托是啥,还有多重委托是啥,以及在c#里面的简单应用。
什么是委托?
委托是一种类型,不过它指向的不是数字啊,字符串啊之类的,它指向的对象的方法的引用(我好晕),而且他还是可以保证这种引用不会出现类型错误。(这是不是也算静态检查的一种?)
优势
- 充当中间人把方法保护起来
- 可以让程序效率更高
- 还可以用来对方法进行异步调用。(啥是异步调用……)
如何声明一个委托?
public delegate type_of_delegate delegate_name()
举个栗子:
public delegate int mydelegate(int delvar1,int delvar2)
注意:
- 括号里面的参数没有也行,另外也可以在这里用参数的列表(List?)
- 委托的格式一定要和对应的方法一致,不管是整个委托的类型,还是参数的类型,比如引用的方法参数是两个int,返回值也是int,那这边委托的声明也一样要参照这些来设置。所以委托可以保证避免类型错误。
例程
public delegate double Delegate_Prod(int a,int b);class Class1 { static double fn_Prodvalues(int val1,int val2) { return val1*val2; } static void Main(string[] args) { //Creating the Delegate Instance Delegate_Prod delObj = new Delegate_Prod(fn_Prodvalues); //msdn文档里面看到也可以这么写Delegate_Prod delObj=fn_Prodvalues; //感觉这样写更有委托的味道 Console.Write("Please Enter Values"); int v1 = Int32.Parse(Console.ReadLine()); int v2 = Int32.Parse(Console.ReadLine()); //use a delegate for processing double res = delObj(v1,v2); Console.WriteLine ("Result :"+res); Console.ReadLine(); } }
解释一下:
我们这个程序主要是讲解一下委托怎么用
Delegate_Prod这个委托具有double类型,接受的参数也是两个double类型
而在类里面,fn_Prodvalues这个方法也是返回double,接受两个double参数,看到了吧,一样的吧?
在main方法里面,我们给Delegate_Prod建立了一个实例,然后把fn_Prodvalues这个方法的名称交给Delegate的实例了
Delegate_Prod delObj = new Delegate_Prod(fn_Prodvalues);
接下来,我们就不会让fn_Prodvalues直接与外界接触啦,如果要接触,参数要经过delegate传输,就像这样:
delObj(v1,v2);
然后方法返回的结果也是经由delobj这个委托的实例传输回来。
多重委托
什么是多重委托呢?其实就是一个委托同时接了几个活,引用了一个以上的方法。
鉴于它这么猛,没有方法会认真对待他,所以不会有结果传回:多重委托的引用对象还有它自己都必须是void类型的
再举一个简单的例子:
delegate void Delegate_Multicast(int x, int y); Class Class2 { static void Method1(int x, int y) { Console.WriteLine("You r in Method 1"); } static void Method2(int x, int y) { Console.WriteLine("You r in Method 2"); } public static void <place w:st="on" />Main</place />() { Delegate_Multicast func = new Delegate_Multicast(Method1); func += new Delegate_Multicast(Method2); func(1,2); // Method1 and Method2 are called func -= new Delegate_Multicast(Method1); func(2,3); // Only Method2 is called } }
解释:
上面的程序里面,两个方法,method1和method2都是接受两个int参数,void无返回。
然后main方法里面,这个多重委托就这么声明好了,顺便还送了一个方法进去:
Delegate_Multicast func = new Delegate_Multicast(Method1);
然后我们又用+=再送了一个方法给他
后面我们又用-=从他那里拿走了一个方法
总结
这篇文章简单的讲解了一下委托的概念,举了几个简单的小程序作为例子。如果你对于这篇文章有什么问题,联系原作者in english,arul_tony@yahoo.com.