连锁推导法:在一个证明过程中,或一个比较复杂的推理过程中,将前一个推理的结论作为后一个推理的前提,一步接一步地推导,直到把需要的结论推出来。
我们在前面的知识中了解到值类型存储在堆栈(Stack)中,而引用类型存储在托管堆(Heap)中,堆栈的工作方式是以先进后出原则先保证先分配内存的变量后释放,你可以想像的出,堆栈中的变量是从后向前释放,这样就保证了堆栈中先进后出的规则不与变量的生命周期起冲突。
你可以仔细的想一下关于结构化编程的一些规则,C#对变量的声明要求是先定义后使用,变量的生命周期是从其定义开始直到程序的控制离开该变量所在的{}。以下代码描述了这个我们非常熟悉的事实
static void Main(string[] args)
{
int k = 10;//k的生命周期开始了
for (int i = 0; i <= 10 - 1; i++)//i的生命周期开始了
{
int m = k + i;//m的生命周期开始了
for (int j = i; j <= 10 - 1; j++)//j的生命周期开始了
{
int n = j * i;//n的生命周期开始了
//n的生命周期结束了
}//j的生命周期结束了
//m的生命周期结束了
}//i的生命周期结束了
//k的生命周期结束了
}
下面的图描述了这些变量的生命周期和堆栈的存储
图
同时我们在C#的编程中可以发现一个非常有趣的现象,即我们不能将值类型设置为null,但可以对引用类型设置为null。
假设上述的代码改为如下形式
static void Main(string[] args)
{
int k = 10;//k的生命周期开始了
for (int i = 0; i <= 10 - 1; i++)//i的生命周期开始了
{
int m = k + i;//m的生命周期开始了
k = null; //k的生命周期结束了???
for (int j = i; j <= 10 - 1; j++)//j的生命周期开始了
{
int n = j * i;//n的生命周期开始了
//n的生命周期结束了
}//j的生命周期结束了
//m的生命周期结束了
}//i的生命周期结束了
//k的生命周期结束了
}
你考虑下第七行代码
k = null; //k的生命周期结束了???
这时候栈应该怎么处理呢?想像下,堆栈图会怎么样呢?显然堆栈到了第三步就不知道怎么样才可以把变量k销毁了。
图
那为什么引用类型就可以设置为null呢?我们先看如下的代码
static void Main(string[] args)
{
System.Collections.ArrayList k = new System.Collections.ArrayList();//k的生命周期开始了
for (int i = 0; i <= 10 - 1; i++)//i的生命周期开始了
{
k.Add(i);
int m = k.Count;//m的生命周期开始了
for (int j = i; j <= 10 - 1; j++)//j的生命周期开始了
{
int n = j * i;//n的生命周期开始了
//n的生命周期结束了
}//j的生命周期结束了
//m的生命周期结束了
}//i的生命周期结束了
//k的生命周期结束了
}
对应的堆栈中的处理大致如图
图
我们可以看出变量k还是分配在堆栈中,但实际存放ArrayList实例的区域却是存储在堆中。对ArrayList的实例使用,是通过在堆栈中的变量k来间接的指向的。这样的好处是,将对象引用null和生命周期两个概念可以分离出来。
以下代码请仔细认知
图
我们可以很清晰的观察到,k的生命周期并没有发生变化,只是当k = null;后,变量k不再指向堆中的有效地址了。
现在我们明白了,因为值类型变量直接在Stack中保存了数据,因此在生命周期结束前数据不能被任何形式的销毁,而引用类型变量在Heap中保存数据,所以赋值null其实是将对应在Heap中的数据销毁而不是结束变量的生命周期。
分享到:
相关推荐
DevExpress Components Packages 18.1.4 Source for Delphi 10.3
DevExpress18.1.4Crack DevExpress 开发的控件有很强的实力,不仅功能丰富,应用简便,而且界面华丽,更可方便定制。对于编程人员来说是个不错的选择。它的菜单栏控件更具代表,完全可以替代开发环境提供的基本控件...
Delphi & C++Builder 著名控件 DevExpress VCL 18.1.4 Full Sources,含自动安装工具。
DevExpress_VCL_18.1.4_Full_Sources.rar
DevExpress VCL 18.1.4 Full Sources With Help.part2.rar
DevExpress_18.1.4_10.3_Source.rar
DevExpress_VCL_18.1.4_Full_Sources_Downloadly.ir.rar
DevExpress VCL 18.1.4 Full Sources(完整源码) 1套是源码文件(每种组件一个文件夹),1个是一键编译安装工具,1个是清除水印程序。 拥有180多种VCL界面控件,功能丰富且易于上手 DevExpress VCL Subscription 是...
汉化包源代码,非全面汉化,仅汉化常用组件,比如cxGrid 过滤器等,覆盖源码用DxAutoInstaller安装。
DevExpress_Universal_Complete_18.1.4_Build_20180620_Downloadly.ir.rar```
WPFChmHelp.v18.1.4 英文版帮助文件 适合使用dev WPF项目开发的人员使用,内部chm功能介绍完整。 包含所有controls,接口说明&实例
资源分类:Python库 所属语言:Python 资源全名:scidb-py-18.1.4.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059
DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包。所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,让您快速开发出完美、强大的VCL应用程序!...
DevExpress_VCL_18.1.4_Full_Sources 不解释..,牛逼...,新的功能D7用不上,但是XE10.*,那都是战斗机级别的.
DevExpress_VCL_18.1.4_Full_Sources_Helper DevExpress VCL Controls是 Devexpress公司旗下最老牌的用户界面套包。所包含的控件有:数据录入,图表,数据分析,导航,布局,网格,日程管理,样式,打印和工作流等,...
LLVM-18.1.4-win64安装包 和clang-format配置
第一部分 软件需求:是什么和为什么 第1章 基本的软件需求 1 1.1 软件需求的定义 2 1.1.1 一些关于“需求”的解释 2 1.1.2 需求的层次 3 1.2 每个项目都有需求 4 1.3 什么情况将会导致好的群体发生不合格的...
DevExpress VCL 18.1.4 Full Sources With Help.part1.rar
DevExpress VCL 18.1.4 Full Sources With Help.part3.rar