知识大全 浅析C#运行时相互关系

Posted

篇首语:汗水和丰收是忠实的伙伴,勤学和知识是一对最美丽的情侣。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 浅析C#运行时相互关系相关的知识,希望对你有一定的参考价值。

浅析C#运行时相互关系  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

    本博客主要讲述运行时类型 对象 线程栈和托管堆之间的相互关系 静态方法 实例方法和虚方法的区别 以及内存的分配和回收     线程栈 在一个进程中可能包含多个线程 一个线程在创建的时候 会分配到一个大小 MB大小的栈 栈用于存储方法的实参 形参以及方法内部的局部变量 栈是从高位内存地址向地位地址构建的 由于栈有先进后出的特点 所以先定义的变量后被回收     下面来看一个简单的例子 让你更了解线程栈

  

  由于线程栈是从高位开始分配内存 先分配的我就画在上面了 在调用F () 方法时 分配内存的顺序是 name >n >F 的返回地址 >Age >name 回收内存的顺序当然是反过来的 在一个方法中 应该包含一些序幕代码 进行一些初始化工作 还有一些尾声代码 等方法执行完成之后做一些回收工作 由于方法的返回地址先分配 在方法执行完成的时候回到返回地址 递归太深就容易出现栈溢出 请看我的《递归再一次让哥震惊了》 因为参数 局部变量都必须等到方法返回的时候才能回收

  在介绍托管堆之前先看看两个简单的类

  

    publicclassPerson    privateintheight;  publicvoidSetHeight(intheight)    this height = height;    publicvirtualvoidSay(stringword)    publicstaticstringHead()    return my head ;    publicstaticintAge =  ;    publicclassStudent : Person    publicoverridevoidSay(stringword)    Console WriteLine(word);     

  

  

    staticvoidMain(string[] args)    Person student = newStudent();  student Say( Hello cth );  student SetHeight( );  Person Head();  Console ReadLine();   

  CLR会在第一次访问一个对象时加载该对象 在这里 定义变量student时会为Person对象在线程栈中分配内存 第一次加载吗 在构造一个Student对象之前先要加载Student对象 并为Student类型对象分配内存 并构建一个Student对象 对象的地址存入线程栈中的局部变量student 中 我们知道类型对象的内容包含 类型对象指针 同步索引块 静态字段和方法(静态的和非静态的) 不管是类型对象 还是实例类型都必须有类型对象指针 同步索引块 我们知道静态字段属于类 被这个类的所有实例共享 当然静态字段的内存是在类型本身中分配的 方法也是类的所有实例共享的 他的内存也是在类型本身中分配的 在每一个类型对象中都有一个方法表 类中定义的方法都有一个对应的项

  在构造一个对象的实例时 只需要为类型对象指针 同步索引块 该对象的实例字段分配内存 对于对象实例来说 类型对象指针可以让实例访问类型对象中德静态字段 方法等

  Student是线程栈中的定义的一个局部变量 保存Student的一个实例的在托管堆中的地址 所以他可以访问Student对象中的字段 方法 其实访问方法是通过类型对象指针访问类型对象Student中的方法表中对象的项

  Say方法的执行过程 变量student指向的是一个Student对象 调用的当然是Student类型对象中的Say方法 尽管在定义student的时候是Person类型 因为他是引用类型 他指向的是托管堆中Student对象的内存 然后遍历该对象的方法表 找到该方法调用

  特别说明虚方法 JIT在虚方法中加了一些额外的代码 方法每次调用的时候都会执行这些代码 这些代码会检查发出调用的变量 然后根据这个变量找到其应用的对象 然后调用这个对象的方法 若没有这些代码 你觉得CLR是调用父类的方法还是调用之类的方法呢 虚方法带来方便的同时 也多了这些必须的检查的代码

  SetHeight方法的执行过程 和Say方法前面是一样 只是在遍历Student对象的方法表时没有找到该方法 我们知道父类中定义的非private方法都可以被子类继承 是因为每个类型都定义了一个字段引用了他的基类 如果一个类调用的方法那个方法不是自己定义的 那么编译器会回溯类层次结构 一直到基类Object 找到相关的方法并调用 如果没有找到相关的方法就报了异常呗 所以SetHeight方法其实调用的是Person中的SetHeight方法

cha138/Article/program/ASP/201311/21810

相关参考

知识大全 C#接口和抽象类技术特点浅析

C#接口和抽象类技术特点浅析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  一C#抽象类  C#

知识大全 C#中Delegate浅析与思考

C#中Delegate浅析与思考  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &nbs

知识大全 C#创建SQL Server数据库浅析

C#创建SQLServer数据库浅析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  C#语言有很

知识大全 C#中的Adapter设计模式浅析

C#中的Adapter设计模式浅析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  意图  把一个

知识大全 C# 跨线程调用TextBox方法浅析

C#跨线程调用TextBox方法浅析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! &n

知识大全 C#回调函数及API应用浅析

C#回调函数及API应用浅析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  开发环境:WinXP

知识大全 浅析C#中的套接字编程

浅析C#中的套接字编程  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!大家都知道Java语言的强大功

知识大全 C# HttpWebRequest提交数据方式浅析

C#HttpWebRequest提交数据方式浅析  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  

知识大全 浅析Java与C#的事件处理机制(二)

浅析Java与C#的事件处理机制(二)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  \\在程序

知识大全 浅析Java与C#的事件处理机制(一)

浅析Java与C#的事件处理机制(一)  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  Java与