- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
类型、方法与的继承
类型、方法与继承 类型简述 在.NET代码中,我们可以很方便的创建各种类型,一个简单的数据模型、复杂的聚合对象类型、或是对客观世界实体的抽象 。 类?(class)?是最基础的?C# 类型 ,支持继承与多态。一个c# 类Class主要包含两种基本成员: 状态(字段、常量、属性等) 操作(方法、事件、索引器、构造函数等) 利用创建的类型(或者系统提供的),可以很容易的创建对象的实例。使用 new 运算符创建,该运算符为新的实例分配内存,调用构造函数初始化该实例,并返回对该实例的引用,如下面的语法形式: 类名? 实例名 = new 类名([构造函数的参数]) 创建后的实例对象,是一个存储在内存上(在线程栈或托管堆上)的一个对象 ,可以创造实例的类型在内存中又是一个什么样的存在 ? Type Object 就是类型对象(Type Object) int a = 123; // 创建int类型实例a int b = 20; // 创建int类型实例b var atype = a.GetType(); // 获取对象实例a的类型 Type var btype = b.GetType(); // 获取对象实例b的类型Type Console.WriteLine(System.Object.Equals(atype,btype)); //输出:True Console.WriteLine(System.Object.ReferenceEquals(atype, btype));??????? //输出:True 任何对象都有一个GetType()方法(基类System.Object提供的),该方法返回一个对象的类型,类型上面包含了对象内部的详细信息,如字段、属性、方法、基类、事件等等(通过反射可以获取)。在上面的代码中两个不同的int变量的类型(int.GetType())是同一个Type,说明int在内存中有唯一一个(类似静态的)Systen.Int32类型。 上面获取到的Type对象(Systen.Int32)就是一个类型对象,她同其他引用类型一样,也是一个引用对象,这个对象中存储了int32类型的所有信息(类型的所有元数据信息)。 每一个类型(如System.Int32)在内存中都会有一个唯一的类型对象,通过(int)a.GetType()可以获取该对象; 类型对象(Object Type)存储在内存中一个独立的区域,叫加载堆(Load Heap),加载堆是在进程创建的时候创建的,不受GC垃圾回收管制,因此类型对象一经创建就不会被释放的,他的生命周期从AppDomain创建到结束; 前问说过,每个引用对象都包含两个附加成员:TypeHandle和同步索引块,其中TypeHandle就指向该对象对应的类型对象; 类型对象的加载由class loader负责,在第一次使用前加载; 类型中的静态字段就是存储在这里的(加载堆上的类型对象),所以说静态字段是全局的,而且不会释放; 方法表 类型对象内部的主要的结构是怎么样的呢?其中最重要的就是方法表,包含了是类型内部的所有方法入口。 public class A { public virtual void Print() { Console.WriteLine(A); } } public class B1 : A { public override void Print() { Console.WriteLine(B1); } } public class B2 : A { public new void Print() { Console.WriteLine(B2); } } B1 b1 = new B1(); B2 b2 = new B2(); 内部结构图 方法表的加载 方法表的加载时父类在前子类在后的,首先加载的是固定的4个来自System.Object的虚方法:ToString, Equals, GetHashCode, and Finalize; 然后加载父类A的虚方法; 加载自己的方法; 最后是构造方法:静态构造函数.cctor(),对象构造函数.ctor() 方法的调用:当执行代码b1.Print()时(此处只关注方法调用,忽略方法的继承等因素),通过b1的TypeHandel找到对应类型对象,然后找到方法表槽,然后是对应的IL代码,第一次执行的时候,JIT编译器需要把IL代码编译为本地机器码,第一次执行完成后机器码会保留,下一次执行就不需要JIT编译了。这也是为什么说.NET程序启动需要预热的原因。 继承本质 方法表的创建过程是从父类到子类自上而下的,这是.NET中继承的很好体现,当发现有覆写父类虚方法会覆盖同名的父方法,所有类
您可能关注的文档
最近下载
- 国内支付业务付款回单[收集].pdf VIP
- 2025年辽宁省抚顺市辅警人员招聘考试题库及答案.docx
- 剑桥商务英语BEC单词初级.pdf VIP
- 客户经理职能转变之我见.doc VIP
- Unit 2 Bridging Cultures Using Language&Assessing Your Progress人教版(2019)教学课件.pptx VIP
- 2025年辽宁高级档案职称考试(档案管理概论)精选模拟试题及答案.docx VIP
- 中华人民共和国法治宣传教育法普法课件.pptx VIP
- 人教版高中英语选择性必修第二册精品课件 Unit 2 BRIDGING CULTURES Section C Using Language & Assessing Your Progress (2).ppt VIP
- 英语选择性必修2选择性必修 二 Unit 2 Bridging Cultures - Assessing your progress(28张PPT).pptx VIP
- 2023-CSP-S提高级(第一轮)C++真题.doc VIP
文档评论(0)