委托回调静态方法和实例方法有何区别

分析问题

  在开始分析委托内部构造之前,先来回顾一下最基本的概念,在C#中,静态方法和实例方法分别指什么,两者有什么区别。和其他大部分面向对象的高级语言相同,在C#中静态方法由关键字static来定义,静态方法可以通过类名来访问而不需要任何实例对象,相应的,在静态方法中不能访问类型中任何非静态成员。而实例方法需要通过具体的实例对象来调用,可访问实例对象中的任何成员。

  现在来研究一下委托绑定实例方法和静态方法的区别。如上所述,当一个实例方法被调用时,需要通过实例对象来访问,可以想象,绑定一个实例方法到委托必须同时让委托得到实例方法的代码段和实例对象的信息,这样在委托被回调时候.NET才能成功地执行该实例方法。下图展示了委托内部的结构。

 

  _target是一个指向目标实例的引用。当绑定一个实例方法给委托时,该参数会被设置成该方法所在类型的一个实例对象。而当绑定一个静态方法给委托时,该参数则会被设置为null。

  _methodPtr是一个指向绑定方法代码段的指针,和C++中的函数指针极其类似。绑定静态方法或实例方法在这个成员的设置上并没有不同。

  事实上,对于继承自System.MulticastDelegate的自定义委托类型来说,还有另外一个成员变量:_prev,该指针指向委托链中的下一个委托,关于链式委托的概念在后面的小姐中会有所覆盖。至此,读者已经理解了委托绑定实例方法和静态方法的不同点,那就是_target的成员设置。

答案

  当委托绑定静态方法时,内部的对象成员变量_target将会被设置成null,而当委托绑定实例方法时,_target将会设置成指向该实例方法所属类型的一个实例对象,当委托被执行时,该对象实例将被用来调用实例方法。

时间: 2024-10-28 19:12:04

委托回调静态方法和实例方法有何区别的相关文章

iOS开发——语法篇OC篇&静态方法与实例方法

静态方法与实例方法 方法是类的行为,写在接口和实现两个文件中.在接口部分声明方法,在实现部分实现方法. 1.类方法与实例方法 Objective-C中的类可以声明两种类型的方法:实例方法和类方法.实例方法就是一个方法,它在类的一个具体实例的范围内执行.也就是说,在你调用一个实例方法前,你必须首先创建类的一个实例.而类方法,比较起来,也就是说,不需要你创建一个实例. +表示类方法,就是类调用方法,不依赖与任何对象的方法,类似于c语言的static关键字 static函数.-表示是实例(对象)方法,

java 静态方法和实例方法的区别

静态方法和实例方法的区别主要体现在两个方面:   在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方式.也就是说,调用静态方法可以无需创建对象.   静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法:实例方法则无此限制.   下面几个例子展示了这一区别.   1.调用静态方法示例. //-----------hasStaticMethod.j

Python的类方法,静态方法,实例方法的区别

Python的方法并不想C#,Java这些编译性语言那样严格的区分静态方法和实例方法.也就是说Python的静态方法,类方法和实例方法只是在调用上有区别,类型和实例都可以调用.一般规则如下:A:实例方法:没有@classmethod和@staticmethod标记的方法是实例方法.假设这个有n个比传参数,类型调用的时候需要给n个参数传参.而实例调用时则只能传n-1个参数,因为第一个参数被系统默认传递了实例本身:因为有这个规定,所以实例方法如果没有参数,则实例是无法调用的,但类型可以调用.B:类方

静态方法与实例方法的区分

Java系列之:看似简单的问题 静态方法和实例化方法的区别 Java程序启动class文件被读取时类被加载,如果有static方法,此时会分配内存,非static方法实例化类时才在内存中分配控件存储,引用存储在堆栈中,实体存储在堆中 最大的区别在于内存. 静态方法在程序开始时生成内存,实例方法在程序运行中生成内存, 所以静态方法可以直接调用,实例方法要先成生实例,通过实例调用方法,静态速度很快,但是多了会占内存. 任何语言都是对内存和磁盘的操作,至于是否面向对象,只是软件层的问题,底层都是一样的

静态方法和实例方法(mark)

借花献佛[转自 ivony's blog] 关于静态方法和实例方法的一些误区. 一.    静态方法常驻内存,实例方法不是,所以静态方法效率高但占内存.     事实上,方法都是一样的,在加载时机和占用内存上,静态方法和实例方法是一样的,在类型第一次被使用时加载.调用的速度基本上没有差别.  二.    静态方法在堆上分配内存,实例方法在堆栈上.     事实上所有的方法都不可能在堆或者堆栈上分配内存,方法作为代码是被加载到特殊的代码内存区域,这个内存区域是不可写的.  三.    实例方法需要

静态方法和实例方法的区别(转)

静态方法和实例方法的区别主要体现在两个方面: 在外部调用静态方法时,可以使用"类名.方法名"的方式,也可以使用"对象名.方法名"的方式.而实例方法只有后面这种方式.也就是说,调用静态方法可以无需创建对象. 静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),而不允许访问实例成员变量和实例方法:实例方法则无此限制. 下面几个例子展示了这一区别. 1.调用静态方法示例. //-----------hasStaticMethod.java-----

静态方法、实例方法和虚方法的区别

基础知识 对于面向对象的语言来说,所有类型都是从System.Object类型派生,正是由于这个原因,保证了每个类型都有一组最基本的方法,也就是从他们的父类System.Object继承古来的方法,Object的定义如下面的代码所示,System.Object所定义的基本方法中基本包含了CLR所有的方法类型,静态方法(Static修饰,属于类成员).虚方法(Virtural修饰,属于实例成员).实例方法(普通的方法,属于实例成员).可能会有人说还有抽象方法,其实抽象方法最后的编译也是一个虚方法.

编写高质量代码改善C#程序的157个建议——建议100:静态方法和实例方法没有区别

建议100:静态方法和实例方法没有区别 静态方法在加载时机和内存使用上和实例方法完全一致.在这里,我们先引出一个概念“类型对象”.比如类型Person,我们都知道new Person() 会产生一个对象,这个对象叫做“实例对象”,它在运行时会加载到GC Heap上.而“类型对象”是指代表Person类型本身的那个对象,这个对象在第一次使用类型时被加载到Loader Heap上.类型对象包括其自身的指针.自身的同步索引快.静态字段,以及一个方法表.在这个方法表中,无论是静态方法还是实例方法都会被存

Js类的静态方法与实例方法区分以及jQuery如何拓展两种方法

上学时C#老师讲到对象有两类方法,静态方法(Static)和实例方法(非Static),当时不理解静态是为何意,只是强记. 后来从事了前端的工作,一直在对类(即对象,Js中严格来说没有类的定义,虽众所周知,这里还是赘述一番,以免产生歧义)的操作上,严重缺乏整体概念,最近看extetnd中再次提到拓展静态方法与实例方法,故而再次百度,才幡然领悟,其实一直有用,只是不知其专业术语呀,哈哈~ 静态方法,属于类的方法,即类可以直接调用的方法.为类所有实例化对象所共用(但不能用实例对象之间调用),所以静态