`
wodamazi
  • 浏览: 1423678 次
文章分类
社区版块
存档分类
最新评论

回复读者问题:为何C#中类方法的IL代码要放在类型表中?

 
阅读更多

Dear 金老师:
买了你的书<net2.0面向对象编程解密>后很受启发,但是还有有些觉得不是很完整
如对象内存模型一章中,写到:一个类可以创建多个实例对象,这些实例对象共享一个类型表
因为类的静态字段都放置在类型表中,所以类的静态字段被此类创建的所有对象共享
这可以理解
但是类的静态和动态方法也是都放在类型表里面的啊
那么此类创建的所有对象共享动态方法吗?
这点不理解啊/
还有第二篇的第四章的继承多态 能否也从对象内存的模型讲解以下 像上面的一样
比如方法的重载 隐藏 多态 你书上只说了是这样
没有像第三章那样从内存的角度来说为什么是这样

深夜打扰 不好意思 也万分感谢你写的书
小马
===========================================================

我的答复:

方法(即函数)代码被编译以后,以类为模板创建出来的每个对象,其方法代码(IL指令)都是一样的。如果每个对象都拥有自己的方法代码,是不是很占用内存空间?


你可能会有点疑惑:如果动态方法是放在类型表中供所有对象共享的,那么方法中的局部变量怎么办?多个对象都调用它,这不乱套了吗?

其实,方法调用即函数调用,函数调用其返回地址是放在线程堆栈中的,其内部变量也放在线程堆栈中。每调用一次函数,就往线程堆栈中Push一个函数的相关调用信息(包括返回地址和局部变量的值),当函数调用返回时,从线程堆栈中Pop出来就行了,不存在冲突的问题.

IL代码的JIT编译器会帮助我们根据具体CPU和操作系统的情况生成相应机器指令处理底层的所有技术细节。

有关多态的内存模型,其实书中是有的,你可以看看<再探CLR对象模型>一节(应该是这一节,记不太清了)。

分享到:
评论

相关推荐

    c# 代码中看不到方法体.docx

    看了网上好多同仁的疑惑,说为什么看不到方法体,例如:public int sum(int x,int y); 这个方法既不在接口中,也不在抽象类中。好像不符合C#的语法。 现将详细解释附上,希望能够大小同仁的疑惑。

    C# IL中间代码注入实现切面编程

    之前分享的那篇“面向切面编程–渲染监控日志记录方案”中提供了利用RealProxy作为代理类来生成代理的面向切面的编程方法,那个方法可以 实现面向切面编程进行日志记录,现在渲染主程序也是采用的这种方式。那篇...

    如何用C#动态编译、执行代码

    如何用C#动态编译、执行代码 在开始之前,先熟悉几个类及部分属性、方法:CSharpCodeProvider、ICodeCompiler、CompilerParameters、CompilerResults、Assembly。 一、CSharpCodeProvider 提供对C#代码生成器和代码...

    C# Formatter (针对C#代码的格式化工具).msi

    美化代码,在每个类,方法,属性或区域的顶部添加分隔符注释 删除代码行的缩进 删除多余的空白行 从C#代码中删除所有空行或不可见行 从C#代码中删除所有注释 删除左侧的缩进,并修剪每行代码右侧超过白色的字符 ...

    《Beginning C# Objects中文版:概念到代码》

    为什么它们如此神奇而直白以及如何正确使用对象去构建一个软件应用?这也是一本关于C#的书,但它并非一本“C#大全”,而是一份对该语言的温文但全面的介绍,还特别强调了如何把对象模型转换到功能完备的C#应用程序。...

    C#_IL介绍

    C#_IL介绍

    C#动态调用类方法

    1.动态调用类方法,模拟VB中的CallByName 2.附带了C#和VB的代码 3.主要是一个项目中用到了要调用很多参数和返回值相同的一系列函数,所以 想到了这个方法,不用重复的写方法名,使用循环调用

    C#常用工具类代码集合Util第二版本(自己工作总结)

    C#常用工具类代码集合Util第二版本(自己工作总结),包括常用工具类,扩展方法工具类,百度地图C#工具类,Echart工具类,Office工具类,Autofac工具类,Web开发常用工具类,Winform开发常用工具类,是自己工作十年...

    C# 实体类代码 生成器

    比较简单的C# 实体类代码 生成器,这个只是执行文件,源代码请到http://heyant.com/html/Download58.html下载

    C# to Java 代码转换工具

    一个很强大的工具, 能将c#代码片段、文件甚至工程直接转换成java代码,并能彻底解决外部引用的DLL问题,最强的是支持c#工程的直接转换,生成的Java代码质量也很不错。软件已破解,去除了未注册版最多只能转换1000行的...

    C#强化系列文章(共九篇)

    C#强化系列文章五:动态代码的使用(反射和动态生成类).doc C#强化系列文章六:应用程序域(AppDomain)浅析.doc C#强化系列文章七:序列化和反序列化.doc C#强化系列文章八:HttpModule,HttpHandler,...

    C# .net数据库表实体类生成,一键生成数据库所有表的实体类

    因为.net core不能一键生成EF数据结构,所以做了个数据库实体类代码生成器,一键生成数据库所有表的实体类,代码可以参考,特殊需求可以自己改

    探讨C#中Dispose方法与Close方法的区别详解

    (这里用using或许更好)当我们开发C#代码的时候,经常碰到一个问题,有些class提供Close(),有些class提供Dispose(),那么Dispose和Close到底有什么区别? 在这里,要明确一下C#程序(或者说.NET)中的资源。简单的...

    C#+存取SqlServer中的Image类型

    C#+存取SqlServer中的Image类型

    C#配置文件读写源代码

    C#配置文件读写源代码 源代码 根据配置文件读写

    C#防SQL注入代码的三种方法

    对于网站的安全性,是每个网站开发者和运营者最关心的问题。网站一旦出现漏洞,那势必将造成很大的损失。为了提高网站的安全性,首先网站要防注入,最重要的是服务器的安全设施要做到位。  下面说下网站防注入的几...

    C#射击类游戏:龙之战(源码)

    整个游戏框架已基本完成,源码中采用了一些设计模式,有精美的游戏画面和详尽的代码注释,是大家学习C#游戏开发和图形编程的一个良好范例,绝对不会让大家失望。 参照本程序,大家完全可以做出一个自己的射击类游戏...

    C# 实体类代码生成器,支持简单编程

    本软件使用VC开发,可用于C#相关的数据表实体类代码的生成,根据不同的模板相成不同的实体类文件。 安装密码:www.uu13.com 相关的模板示例可以参考 帮助--》使用帮助 有详细的说明 实体类代码生成工具简述: 1....

    C#,VB,IL超强反编译工具

    C#,VB,IL超强反编译工具,反编译跟原文件一模一样

    20060208pm--跟我一起学Visual Studio 2005(1):C#语法篇(上)

    另外也不能彻底地解决集合类的性能问题,那么你认为到底C#中泛型的实际用处是什么呢?在下一版本中,.NET中的泛型是后还会有所改善? A:的确C#中的泛型和C++中有很大差别,C#中限制也比较多。但是C#泛型能够解决...

Global site tag (gtag.js) - Google Analytics