c#的委托是什么

之前囫囵吞枣的看了一遍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.

posted @ 2015-03-24 21:53  小明_siuming2  阅读(211)  评论(1编辑  收藏  举报