现在的位置: 首页 > 综合 > 正文

读《.NET 大局观》(2)

2011年12月25日 ⁄ 综合 ⁄ 共 1048字 ⁄ 字号 评论关闭

前一段时间写了一篇,最近这本书都没怎么看它了,呵,书一买回来时会翻几页,而看完的书却真的是少之又少,再加上看书的时间并不多,天天又是面对这些专业书,也够无聊的。不过这些书对增加些基本知识确实是大有用处的,对基础的扎实理解才能达到更高的境界,像人家老外写的书,不同凡响,总是每一处都写得非常的细致,而且对整个框架的理解也非常透彻,一眼望云,国人能做到的有几人?还有就是最近装上了IE7,这163博客在写文章的时候选选择标签的时候会有点问题,可能是网易开发人员没考虑到IE7的兼容性CSS,搞得很不爽。

废话这么多,进入读书正题吧,当看到值类型和引用类型时,就有一些想法了,“值类型和引用类型之间的一个根本差异是:前者的实例被分配于堆栈,后者则只不过是一个位于堆栈的引用,指向(代表)一个被分配于堆的实值。

要理解这句话确实是不容易,如果单独绐我这样一句话我会莫名,其实到现在我对于堆和堆栈的了解也甚少,或是说根本不了解,一般说来,我理解的是值类型的声明都是用系统的值类型声明的,有Byte,Char,Int16,Int32,Int64,UInt16,UInt32,UInt64,Single,Double,Decimal,Enum,Boolean,而引用类型声明一般是类,接口,数组,委托,不过好像枚举是值类型的,在将值类型转换为引用类型时称为装箱(Boxing)。

换句话说,值类型是放在堆栈中的,供程序调用的,而引用类型,实际值是放在堆中,而引用地址放在堆栈中,堆栈变量所使用的内存会在其创建者返回时自动释放,而分配于堆中的变量,并不会自动释放内存,它们的内存将通过一个垃圾回收机制(garbage collection)的处理过程而被释放。

所以,我们通常在方法中传参数时,如果参数是值类型,一般不会改变原来变量的值,而如果是引用类型,会改变值。比如:

public void Sum(int x,int y)
{
  x = 1;
}
调用

int x=0,y=0;
Sum(x,y);
这个时候X的值还是0

如果传的是引用类型

public class a
{
   public int a=1;
}

public void gg(a x)
{x.a = 100;}

调用
a x = new a();
gg(x);

这个时候,对象X中的变量a已经是100了。

呵,好了,其实注意这些,有的时候对你困惑了好久认为不可理解的问题会一下子就理解了。呵!其实值类型和引用类型不仅仅是在C#会遇到的问题,还记得吗,C也是这样的,不过他用的应该是指针吧!哎,什么时候有时间再回味一下C!

    抱歉!评论已关闭.