委托
委托
什么是委托
深入理解C#有这么一个例子:一份遗嘱可以是还钱,可以是捐款,也可以是留给某某,但是这么一份遗嘱放在那,你只知道是遗嘱,并不知道其中的内容,你可以委托给一个律师去执行这份遗嘱,但是律师并不知道这份遗嘱要执行的内容,这个例子很好的比喻了什么是委托。</br>
正如上面的例子所说,委托像这份遗嘱一样,需要在特定的时间点去执行一系列操作,而你可能并不知道操作的细节,你也可以参照C里面的函数指针去理解。</br>
简单的委托构成
想要让委托做事,必须满足四个条件:
-
声明委托类型
-
必须有一个方法包含了要执行的代码
-
必须创建一个委托实例
-
必须调用(invoke)委托实例
声明委托类型
1.什么是委托类型?
一个用来约束你要定义的委托方法的返回值和参数个数以及类型的类型。
2.如何声明委托?
<关键字> <返回类型> <委托类型的名称> <参数>
delegate void StringProcessor(string input)
3.声明的意义?
根据上面的示例,分析一下,其实它是创建了一个对象,派生自System.MulticastDelegate(又派生自System.Delegate),它约束了你将要执行操作的方法的返回类型,和参数个数,以及参数类型,必须严格对应。根据遗嘱的例子你可以这么假设,它定义了,遗产分配的东西,给予的对象,它更像一个规则或者大纲,具体的执行方法,还要看下面所要定义的方法,例子也许不是十分恰当,但是帮助你更容易理解。
4.需要注意的东西
什么是委托类型,上面我们定义的就是委托类型即Delegate。
构造委托要执行操作的方法
1.为什么要构造方法?
假设遗嘱指定了,给500w给死者的儿子。但是现在儿子又太小,那么你需要设立一系列的条件和操作去帮助死者的儿子拿到这份遗产,这一系列有条件的操作,就是你构造函数的意义所在。
即为委托类型找一个方法,并且这个方法能执行我们想要的操作。
2.构造方法的约束或者规则?
委托类型已经定义了返回值,参数类型及个数,所以构造方法需要严格遵守,如:
void test(string x)
以上方法就是符合前文中定义的委托类型。
3.需要注意的东西
创建委托实例
1.如何创建?
创建其实就像把你定义的委托方法,当作构造参数传递给委托类型,从而构造一个委托实例,下面的例子将展示,静态方法和非静态方法的创建方式:
//假设test方法属于TestClass中的方法
StringProcessor proc1,proc2;
//如果不是静态方法
TestClass tClass =new TestClass();
proc1=new StringProcessor(tClass.test);
//如果是静态方法
proc1=new StringProcessor(TestClass.test);
2.需要注意的东西?
必须注意,假如委托实例本身不能被Gc回收。委托实例会阻止它的目标被作为垃圾回收。这可能造成内存泄漏(leak),特别是一个“生命周期”短的对象调用一个“生命周期”长的对象中的事件,并用它作为自身目标,这间接延长了“生命周期”短的对象的生命周期。
调用委托实例
1.如何调用?
这里只需要调用委托实例中的Invoke方法即可,异步委托则调用BeginInvoke和EndInvoke(后面异步委托再来讲)
接着上面的示例 我们可以执行以下方法
proc1.Invoke("我是委托");
2.调用的约束或者规则
其实挺简单,没啥特别好说的,Invoke的参数其实还是传给了test()方法。
3.注意事项
Invoke这个方法来源于哪里?
合并和删除委托
对事件的简单讨论
委托总结