Code Bye

C#小白来提问(7):委托疑问

public delegate void ThreadStart();
然后
ThreadStart ts = new ThreadStart(obj.Foo);
从原理上来说,ThreadStart还应该接受this指针参数。原因是成员方法Foo里面可能用到了obj的字段。
C++的回调函数,传成员方法时是一定要带上this指针的。
为什么C#不用传,而C++为什么没有按C#的方式来做。
解决方案:30分
为什么C#不用传
原因是Delegate里已经包含了,可以用Delegate.Target获得
而C++为什么没有按C#的方式来做
原因是C++出现的早,而且和微软没什么关系
解决方案:10分
C++出现的早,可Anders probably knows c++ as well as pascal。
没看懂LZ说的“C++的回调函数,传成员方法时是一定要带上this指针的”说的是啥意思。你指的是function object中的binder吗?
non-static member function需要一个instance来invoke,所以那个member function pointer里保存的只是一个offset,depending on it””s virtual or not, you may be able to pass this pointer across address space。
所以, “传成员方法”是不需要this的!但当使用”.*”或”->*” operator来调用成员函数指针指向的函数时,的确需要一个class instance。
当然,c++ member function的实现,肯定是将this当作成员函数的参数的,只不过这是由编译器替你完成的。至于c#,一切都在class里,连global function都木有,你觉得它的函数引用要肿么实现?

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#小白来提问(7):委托疑问