码迷,mamicode.com
首页 > Windows程序 > 详细

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

时间:2015-04-16 19:56:00      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:c#   delegate   .net   



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方法,就可以完成集合中元素的查找。

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

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

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

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

标签:c#   delegate   .net   

原文地址:http://blog.csdn.net/imcjysy/article/details/45079189

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!