分享

C#中被委托的方法必须是静态的吗?(转)

 3D建模仿真 2018-07-07

静态方法与实例方法的区别:

静态方法都是通过关键字static来定义的,静态方法不需要实例这个对象就可以通过类名来访问这个对象。在静态方法中不能直接访问类中的非静态成员。而用实例方法则需要通过具体的实例对象来调用,并且可以访问实例对象中的任何成员。

如果用委托绑定实例方法的话需要用实例对象来访问,所以我们在绑定实例方法到委托的时候必须同时让委托得到实例对象的信息,这样才能在委托被回调的时候成功执行这个实例方法。也就是说,当绑定实例方法给委托的时候,参数会被设置为这个参数所在类型的实例对象。如果给委托绑定的是静态方法,那么这个参数将被设置为NULL。

综上,委托既可以绑定静态方法也可以绑定实例方法,但是在绑定实例方法的时候,delegate的target属性就被设置为指向这个实例方法所属类型的一个实例对象。当绑定静态方法时,delegate的target属性就给NULL

委托是一个类,将方法封装成委托类型的对象。委托对象里包含三个部分的东西:
1、指向方法的指针,标识要回调的方法。
2、指向方法所指向的对象的指针,默认为null,当封装静态方法时,指针为null;当封装对象的方法时,指针指向当前调用方法的对象。
3、构建委托链表时对委托对象的索引。
上面第一个定义的委托F()等价与类F;而下面的定义的委托FS()等价与类FS。当用委托F分别调用类A、B、C的方法fA(),fB(),fC()时,分别将三个方法封装成三个委托类型F的委托对象;同理,当用委托FS分别调用类A、B、C中的静态方法fSA()、fSB()、fSC()时,分别将前面三个方法封装成委托类型FS的对象。
    为什么不同的方法需要不同的委托类型对象来封装呢,这就引出了委托的类型安全的调用。只有当方法的签名,也就是方法的返回类型、参数类型等和委托类型一致时,才能对它进行封装。
用法:
调用实例方法时:F  f += new F(fs);或者直接利用委托提供的便利方式 F f += fs;
调用静态方法时:FS fs += new FS(A.fSA);或者直接利用委托提供的便利方式 FS fs += A.fSA;
与C/C++回调函数的不同:
1、C/C++里的回调函数只是一个函数指针,而C#里的委托是一个对方法封装的委托对象。
2、C/C++里不提供类型安全,而C#的方法签名必须与委托类型对象一致。
3、C/C++里一个函数指针只能指向一个方法,但委托因为是一个对象,里面不但有指向函数的指针,还可以指向调用该方法的对象,以及指向委托对象的索引,因此一个委托类型对象可以指向多个委托对象,也就是可以形成委托链表。只是是利用数组实现的。
例子,当委托对象fs调用静态方法fSA()、fSB()和fSC()时,整个个委托对象链如下如下图:
                                                            委托对象调用静态方法
因为是静态方法,所以_target指向为null;当调用的是实例方法时;_target指向各自对象即可。如下图所示。
                                                                                  委托对象调用实例方法

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多