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方法,就可以完成集合中元素的查找。
委托作为返回值一般会用在“根据不同情况决定使用不同的委托”这样的情形下。这有点像工厂模式,不过委托用作返回值还是用的没有用作参数这样频繁。
详细的深入讲解将在后续的文章里讲解。
笔者的联系方式:[email protected]