C# 类中函数的生命周期

五星铲屎官 2017-02-28 10:37:15
C# 类的函数是在类实例化时,在内存堆中开辟空间么?如果对象不引用函数还在堆中存在么?类中的函数生命周期和类的实例化对象生命周期一样么?
...全文
515 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
threenewbee 2017-03-01
  • 打赏
  • 举报
回复
引用 3 楼 qq_25013675 的回复:
[quote=引用 1 楼 caozhy 的回复:] 相同的问题,在ask回答你了,如果问题解决,请及时采纳
你好,那每次调用同意个函数时内部的临时变量会在内存中重复开辟内存空间么?,我看到有人回答函数的内存分配在代码区上,程序运行时就会分配内存,非静态类需要new开辟内存,GC将不被引用的引用类型视为垃圾回收,这样如果函数存在这个类中对象不被引用时那这个对象的引用回收,而函数还是存在于代码区的内存空间么?[/quote] 不叫“临时变量”叫局部变量,每次调用当然有自己的局部变量,而且放在堆栈上,否则怎么递归调用。至于你说的“有人说”那个就没什么好说的了,网上到处都是菜鸟,什么人胡乱一说不要当真。
五星铲屎官 2017-03-01
  • 打赏
  • 举报
回复
引用 6 楼 sp1234 的回复:
学一下计算机原理。 计算存储中的代码区域跟数据区域是两回事,不要搞混了。
谢谢
五星铲屎官 2017-03-01
  • 打赏
  • 举报
回复
引用 9 楼 dongxinxi 的回复:
不管是实例函数还是静态函数,局部变量都会单独分配,参数也会按顺序压栈,函数执行完(跳出)时会弹出(清空) 至于你上面说的“代码区”,应该指的是PE文件(exe和dll都属于win32 PE文件)中的代码节 http://www.cnblogs.com/Dahaka/archive/2011/08/01/2124045.html 这个涉及到运行一个exe的详细过程,以及dll加载到内存的方式。 这个建议去看圣书《Windows核心编程》 OS为了提高内存使用效率,每个dll在物理内存中理论上只会存一份,用户程序其实只是将镜像映射(加载)到进程的地址空间里 实际上,用.Net之类的高级语言不用太在意这个过程,完全是透明的,托管的,不必纠结 不过垃圾回收机制还是要去了解的
非常感谢你的回答
五星铲屎官 2017-03-01
  • 打赏
  • 举报
回复
非常感谢你的回答
五星铲屎官 2017-03-01
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
相同的问题,在ask回答你了,如果问题解决,请及时采纳
你好,那每次调用同意个函数时内部的临时变量会在内存中重复开辟内存空间么?,我看到有人回答函数的内存分配在代码区上,程序运行时就会分配内存,非静态类需要new开辟内存,GC将不被引用的引用类型视为垃圾回收,这样如果函数存在这个类中对象不被引用时那这个对象的引用回收,而函数还是存在于代码区的内存空间么?
xuggzu 2017-03-01
  • 打赏
  • 举报
回复
普通函数生命同类,静态函数进程加载就活了。
  • 打赏
  • 举报
回复
不管是实例函数还是静态函数,局部变量都会单独分配,参数也会按顺序压栈,函数执行完(跳出)时会弹出(清空) 至于你上面说的“代码区”,应该指的是PE文件(exe和dll都属于win32 PE文件)中的代码节 http://www.cnblogs.com/Dahaka/archive/2011/08/01/2124045.html 这个涉及到运行一个exe的详细过程,以及dll加载到内存的方式。 这个建议去看圣书《Windows核心编程》 OS为了提高内存使用效率,每个dll在物理内存中理论上只会存一份,用户程序其实只是将镜像映射(加载)到进程的地址空间里 实际上,用.Net之类的高级语言不用太在意这个过程,完全是透明的,托管的,不必纠结 不过垃圾回收机制还是要去了解的
xuzuning 2017-03-01
  • 打赏
  • 举报
回复
类的方法在程序加载时就已经分配了内存,并不管你是否有使用,也不管你实例化这个类多少次
mk_lucifer 2017-03-01
  • 打赏
  • 举报
回复
所以我还是建议,在学习编程时,先学习一下操作系统的基本原理,否则这种问题只会让你用一种很感性的认识去理解问题。。要么就别钻这种牛角尖,你去网上搜,一大堆人会忽悠你。。。 在我没学bin文件结构和bin程序导入过程之前,只会C,我还以为源码上紧挨着的两个全局变量内存上也是挨着的,那都是想多了,用”按道理“应该这样的思维在考虑问题。不知道得东西别瞎揣摩,想你也不会想得通,以为一看是你的认识就是错的。。。
  • 打赏
  • 举报
回复
学一下计算机原理。 计算存储中的代码区域跟数据区域是两回事,不要搞混了。
mk_lucifer 2017-03-01
  • 打赏
  • 举报
回复
你好像没明白函数是什么东西。或者我理解错了你的意图。。。 我觉得你好像在认为函数是对象实例内存的一部分,其实无论在哪个语言,函数都是程序代码,并不是数据,也不是实例的一部分,实例中的内容只有数据。。。代码是在动态链接库加载时添加的,只要dll引用了,即使你不掉用,他也会存在。。。但开辟不开内存就不一定了,动态链接库只在第一次被系统加载时才开辟内存,其他进程引用时,只是做了内存映射,并没有开辟新的,这也是dll库代替lib库的一个重要原因,节省内存,但是dll不宜过大,因为即使不用的部分也会加载。。。函数内存只有dll引用计数是0时才会释放。。。
threenewbee 2017-02-28
  • 打赏
  • 举报
回复
相同的问题,在ask回答你了,如果问题解决,请及时采纳

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧