请教C#回调函数的调用问题
1个回答
展开全部
其实在C#语言中,如果不考虑unsafe编程的情况下,C#已经不存在指针了!但是有一种情况很特殊——我们需要实现将一个成员方法(函数是不规则的称呼,面向对象中只有成员方法,没有函数的概念了)做为一个参数传入到另一个方法。
当然,在C/CPP中我们存在指针,把函数(或成员方法,面向过程语言或支持面向过程语言中存在函数或过程的概念)指针做为参数传递即可——这是一种典型的“传址”引用的方式,在C#没有指针的情况下想完成一个传址引用,ref/out只能传递参数变量,并不能将方法转换成地址传入另一个方法的参数(方法参数化),怎么办——委托!
其实说白了,委托就是一种特殊的“代理”形式,把一个成员方法代理成一个变量(delegate变量),可以直接进行调用(根据委托形式,可以找到委托中代理的具体成员方法)!
回调就是一个委托的特殊形式,如果说委托着重于说明“代理”调用的话,而回调则是着重说明成员方法的参数化(指针特性)。
很多个认为一个完整的委托是要有委托(delegate声明)和代理的方法(真正执行的方法),然后要求其形式完全一致,但是,由于C#语法糖的存在,我们还种一种特殊形式的委托——匿名委托!很多人很奇怪,为什么方法名参做为一个参数呢?其实就是匿名委托,传入并非方法名,而是方法名的匿名委托(委托没有名字,所以只需要传入方法名即可)!
不要以为你回调函数你传入的是方法名——因为匿名委托的原因,这个方法名被自动包装成了一个没有名字的委托!看起来是传入方法名——其实原理根本不是那么回事!
当然即使你理解成方法名也可以,但只是一种错误的理解。因为他与常规的委托着重点不同,委托着重于代理执行,用于编译时确认成员方法。而回调则是运行时确定成员方法,着重于指针形式,所以匿名委托足以使用,能让你更容易理解回调函数(好象是被调用对象在执行期间又重新调用了调用对象的某个方法,所以叫回调——执行绪再次调用主体成员方法——就是A对象调用了B对象的BMethod方法,而BMethod方法需要再调用A对象的某个成员方法AMethod,那么传入Amethod方法的匿名委托就是回调,当然如果C对象是A对象的一个属性或成员时,调用C对象的方法也是回调——A的某个对象属性的成员方法)
回调如果你把CallBack参数当做一个成员方法时,那么,回调方法的理解也会变得超简单。
当然,在C/CPP中我们存在指针,把函数(或成员方法,面向过程语言或支持面向过程语言中存在函数或过程的概念)指针做为参数传递即可——这是一种典型的“传址”引用的方式,在C#没有指针的情况下想完成一个传址引用,ref/out只能传递参数变量,并不能将方法转换成地址传入另一个方法的参数(方法参数化),怎么办——委托!
其实说白了,委托就是一种特殊的“代理”形式,把一个成员方法代理成一个变量(delegate变量),可以直接进行调用(根据委托形式,可以找到委托中代理的具体成员方法)!
回调就是一个委托的特殊形式,如果说委托着重于说明“代理”调用的话,而回调则是着重说明成员方法的参数化(指针特性)。
很多个认为一个完整的委托是要有委托(delegate声明)和代理的方法(真正执行的方法),然后要求其形式完全一致,但是,由于C#语法糖的存在,我们还种一种特殊形式的委托——匿名委托!很多人很奇怪,为什么方法名参做为一个参数呢?其实就是匿名委托,传入并非方法名,而是方法名的匿名委托(委托没有名字,所以只需要传入方法名即可)!
不要以为你回调函数你传入的是方法名——因为匿名委托的原因,这个方法名被自动包装成了一个没有名字的委托!看起来是传入方法名——其实原理根本不是那么回事!
当然即使你理解成方法名也可以,但只是一种错误的理解。因为他与常规的委托着重点不同,委托着重于代理执行,用于编译时确认成员方法。而回调则是运行时确定成员方法,着重于指针形式,所以匿名委托足以使用,能让你更容易理解回调函数(好象是被调用对象在执行期间又重新调用了调用对象的某个方法,所以叫回调——执行绪再次调用主体成员方法——就是A对象调用了B对象的BMethod方法,而BMethod方法需要再调用A对象的某个成员方法AMethod,那么传入Amethod方法的匿名委托就是回调,当然如果C对象是A对象的一个属性或成员时,调用C对象的方法也是回调——A的某个对象属性的成员方法)
回调如果你把CallBack参数当做一个成员方法时,那么,回调方法的理解也会变得超简单。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询