c#委托的理解和基础学习

来源:互联网 发布:ubuntu哪个版本好用 编辑:程序博客网 时间:2024/04/19 09:33


C#委托的理解和基础学习

Delegate,委托,是c#中非常重要的一个概念,使用委托使程序员可以将方法引用封装在委托对象内。然后可以将该委托对象传递给可调用所引用方法的代码,而不必在编译时知道将调用哪个方法。与C或C++中的函数指针不同,委托是面向对象,而且是类型安全的。用最通俗易懂的话来讲,你就可以把委托看成是用来执行方法(函数)的一个东西。在使用委托的时候,你可以像对待一个类一样对待它。即先声明,再实例化。只是有点不同,类在实例化之后叫对象或实例,但委托在实例化后仍叫委托。

比如:

delegate int GetCalculatedValueDelegate(int x, int y);  

在上面的定义中,我们定义了一个委托,这个委托代表着一类函数,这些函数的第一个参数是整数型的x,第二个参数是整数型的y,而函数的返回值则是一个整数。在这里,为了描述方便,我们把这一类的函数称为具有相同签名(signature)的函数(注意:这个签名并不是数字签名中的概念,而只是表示这类函数具有相同的参数列表和返回值)。

既然委托是一种类型,那么它就能被用来定义参数、变量以及返回值。由委托定义的变量用于保存具有相同签名的函数实体。需要注意的是,C#和C++不同,C++中的函数指针只能保存全局的或者静态的函数,而C#中的委托实体则可以指代任何函数。

现在我们来看一个例子,
delegate string Get();        static string _1(Get get)        {            return get();        }        static string _2()        {            return "123";        }        private void button1_Click(object sender, EventArgs e)        {            label1.Text = _1(_2);        }
上面的例子是一个基于窗体的例子,但窗体大多数读者都应该能做出来,如果确实需要解决方案(VS里的),在文章末尾有笔者的联系方式。
到这里也就能基本上明白“委托”的意义了,本来需要调用_2函数的,却通过_1来调用了,也就是,_2的操作由_1的参数中的委托代为效劳。本来是要小明去老师办公室拿粉笔盒的,由于小明和小文是好朋友,因此小明就要小文代他去拿,于是小文成了小明的代理,小明委托小文去拿粉笔盒。
忘了一点,委托也可以有返回值和参数,这个函数差不多,但跟函数有一定的区别,委托是代为别人效劳。

委托作为参数,在C#中非常常见。比如线程的创建,需要给一个ThreadStart或者ParameterizedThreadStart委托作为参数,而在线程执行的时候,将这个参数所指代的函数用作线程执行体。再比如:List<T>类型的Find方法的参数也是一个委托,它把“怎么去查找”或者说“怎么样才算找到”这个问题留给了开发人员。开发人员只需要定义一个参数为T,返回值为布尔型的函数,实现函数体,并将函数作为参数传给Find方法,就可以完成集合中元素的查找。

委托作为返回值一般会用在“根据不同情况决定使用不同的委托”这样的情形下。这有点像工厂模式,不过委托用作返回值还是用的没有用作参数这样频繁。

我们再来看一个例子:

using System; namespace 委托实例{   delegate int NumOpe(int a,int b); //委托声明  class Class1   {     static void Main(string[] args)     {       Class1 c1 = new Class1();       NumOpe p1 = new NumOpe(c1.Add); //委托实例化      Console.WriteLine(p1(1,2)); //委托调用      Console.ReadLine();     }     private int Add(int num1,int num2)     {       return(num1+num2);     }   } }


例中,委托NumOpe引用了方法Add。
委托声明了以后,就可以象类一样进行实例化,实例化时把要引用的方法(如:Add)做为参数,这样委托和方法就关联了起来,就可以用委托来引用方法了。

使用委托的注意事项:

1、委托的参数个数、类型、顺序必须与所引用的方法完全一致。
2、所引用的方法与委托的返回值必须一致。

详细的深入讲解将在后续的文章里讲解。

笔者的联系方式:2608184397@qq.com


1 0
原创粉丝点击