C#运行时的相互关系

发表于:2011-12-30 09:37

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:陈太汉    来源:51Testing软件测试网采编

  本博客主要讲述运行时类型、对象、线程栈和托管堆之间的相互关系,静态方法、实例方法和虚方法的区别,以及内存的分配和回收。

  线程栈:在一个进程中可能包含多个线程,一个线程在创建的时候,会分配到一个大小1MB大小的栈,栈用于存储方法的实参、形参以及方法内部的局部变量,栈是从高位内存地址向地位地址构建的,由于栈有先进后出的特点,所以先定义的变量后被回收。

  下面来看一个简单的例子,让你更了解线程栈

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

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

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

21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号