这几天看完了C# 视频,其中的一些基础知识,继承,接口,多态等等一些理解的还可以,但是又接触到了一个新的词----委托。对此理解的不是很好,在经过深入的查找和学习一些资料后,写下自己的一点理解
什么是委托?
生活中:比如说公司老板出差了,那么公司的一些事物就需要人来管理,这时候老板告诉他的秘书在他出差的时间帮助他干什么,这就是委托。
开发中: 委托也可以看成一种数据类型,可以用于定义量,但是它是一种特殊的数据类型,它所定义的变量类型的数值只能是一个函数,更确切的说,委托类型的变量可以接收的数值只能是函数,委托的变量可以接收一个函数的地址,类似于C++语言的函数指针。
委托关键字
Delegate
下面看一个小例子来了解一下委托如何应用到代码中
class Program
{
static void Main(string[] args)
{
MathOptDelegate oppDel; //在Main()方法中定义一个委托类型的变量
MathOpt obj = new MathOpt();
oppDel = obj.Add; //给此委托类型赋值
Console.WriteLine(oppDel(1, 2)); //输出3
}
}
public class MathOpt
{
public int Add(int arg1, int arg2)
{
return arg1 + arg2;
}
}
public delegate int MathOptDelegate(int value1,int value2);
//定义了一个委托数据类型 MathOptDelegate,delegate为关键字
注释: 在写委托这个函数时要注意的两点
1. 一定要指明委托的类型是什么,比如是int 类型 或是其他的
2.委托事件的函数名字,一定要和我们类的名字保持一致,例如例子中类名是MathOpt 那么委托的名字也要是MathOptDelegate.
看到这我就想问,为什么要这样实现呢,我完全可以直接调用,根本不用委托就能实现,为什么还要通过委托来间接的调用呢?对此也是很不解,查了资料说是使代码的使用灵活了,有扩展性。
这只是一个简单的小例子,假如在开发过程中,我们要实现很多功能,例如要实现对两个数的加法 减法 乘法 除法等等,如果我们想实现只需要给出两个数,和你想实现的操作方法,例如减法,那么我们就要写很多歌可能性来完成这些操作,这时候委托就派上用场了
例如下面的代码:
class Program
{
static void Main(string[] args)
{
PrintResule(MathOpt.Add, 4, 5);
}
public static int PrintResule(MathOptDelegate action, int a, int b)
{
int result = action(a, b);
return result;
}
}
public static class MathOpt
{
public static int Add(int arg1, int arg2)
{
return arg1 + arg2;
}
public static int Sub(int arg1, int arg2)
{
return arg1 - arg2;
}
}
public delegate int MathOptDelegate(int value1,int value2);
通过委托,我们就可以去进行相应的计算了,现在只是初步理解,我想等接触更大的项目会理解的更好吧
下面我在用一个通俗的例子来理解一下
假如说我们早上要吃包子作为早饭,那么我们可能让爸爸或者妈妈给自己做,那你就会调用
爸爸.要包子()
妈妈.要包子()
返回包子对象。
但是如果你爸妈不在家的时候,你只能去街上买,问题是你根本不知道街上这些人的名字,那你怎么调用呢?
所以你就要用到委托了,委托就是给你一个协定。
比如delegate包子 要包子();你只需要知道能调用要包子返回一个包子就可以了,根本不需要知道是谁,怎么给你做的包子,就好象你到大街上买是人家自己做的还是工厂做的还是昨天剩下的你都不清楚。包子店就提供了这样一个委托,你只需要到包子店调用要包子()就可以拿到包子了
就像上述例子中,我们不用知道谁去计算,怎么计算,我们只要发出一个需求,给我计算1+1 给委托,委托就会帮你去完成了,直接返回给你结果。
总的来说就是:委托适合用在某时或某种情况执行某些事,而这些事你事先并不知道是什么
更直白一点理解,委托应该就是第三方,调用者告诉第三方要做什么,然后调用者就不用管了
这个委托(第三方)就会去调用方法去帮你实现
委托的好处:
1.相当于用方法作为另一方法参数(类似于C的函数指针)
2.在两个不能直接调用的方法中作为桥梁,如:在多线程中的跨线程的方法调用就得用委托
3.当不知道方法具体实现什么时使用委托,如:事件中使用委托
以上就是我对委托的一点理解,随着学习的深入还会理解的更深吧!欢迎大家交流指导