前一段时间写了一篇,最近这本书都没怎么看它了,呵,书一买回来时会翻几页,而看完的书却真的是少之又少,再加上看书的时间并不多,天天又是面对这些专业书,也够无聊的。不过这些书对增加些基本知识确实是大有用处的,对基础的扎实理解才能达到更高的境界,像人家老外写的书,不同凡响,总是每一处都写得非常的细致,而且对整个框架的理解也非常透彻,一眼望云,国人能做到的有几人?还有就是最近装上了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!