关于变量的高级内容(一)

值类型与引用类型

 

在C#里面只存在两种变量类型,一种是值类型另一种是引用类型。

C#的值类型包括了结构体和枚举,而引用类型则是指类。

也就是说除了object、类、枚举、结构体之外C#没有其他的数据类型了。

至于值类型与引用类型的区别,我要好好说明一下,两个值类型在进行赋值操作的时候,系统将会将他们的值复制:

也就是说

//在下面的操作当中,i的值将会完整的复制到b中
int
i=10; int b=i;

而引用类型,只能进行引用(对于引用类型而言,在进行引用操作的时候,系统会将类里面的非引用类型进行复制,而引用类型则是引用)

//假设我定义了一个类cls
//下面进行类初始化
cls A = new cls("asd");
//在声明一个cls类
cls B = A;

在这个操作当中,A不会进行复制操作,而是B直接引用了A这个对象,在内存也就仅仅告诉系统,B是A的别名而已,举个例子:神舟电脑实际上是蓝天代工的,只不过是贴个牌子。也许比较难理解,但是我们会在以后慢慢强调。

上面说的引用类型与值类型在赋值的时候会进行怎样的操作,下面就要说说这两者在内存中的区别。

由于值类型是在内存栈(Stack)中,使用的是一级缓存,所以值类型的读取以及复制都非常的快,而引用类型使用的则是堆(Heap),所用到的缓存也只是二级缓存读取速度相对慢得许多,因此在处理类的时候我们一般不推荐深度复制(也就是将整个实例的复制),深度复制实际上也比较难写。最多只是使用ICloneable实现以下浅复制。

而且引用类型占用的内存也相对较大。

(编者注:引用类型以及值类型的对比目前只想说那么一点,因为这是贯彻始终的知识,在这里深谈没有太大的意义,在后续更新的随笔里面我会一一强调,同样的写到后面的时候如果我觉得有需要补充的东西,我都会返回来更新的撒 ^_^)

 

[文章引用]

C#实例复制和深度复制的实现

堆栈     http://baike.baidu.com/link?url=lF2G9KQZMnwAqaxG1F_wbxnhc5mLG9Wt4A9m-Ac0SnfyhJntNIjdBzXqO4vLKDibUxzXujJUARy4SLiuX9BtVa

C#对象的浅拷贝与深拷贝     http://www.cnblogs.com/lidabo/archive/2012/03/12/2392304.html

posted @ 2016-08-01 17:18  丹麦的鱼  阅读(441)  评论(0)    收藏  举报