日期:2014-05-18  浏览次数:20742 次

有关于引用类型的疑惑?高分在线等!
小弟初学C#,今天在书上看了些关于值类型和引用类型的解释,但感觉书上所说不全,特此来请教各位高手,答疑解惑!
问题1:
我们举个例子
Class Student{
int age;
string name;


}
//创建对象并赋值:
Student stu=new Student();
stu.age=18;
stu.name="张三";
这是一个很普通的类,但仔细观察会发现创建出来的age中保存的是对对象的引用,而 stu.age=18呢?是把age 这个int型的变量声明到类体里,它就从属于这个类了?它也成了一个引用类型了吗?

问题2:
如果上面的条件不成立的话,那么是否是说int还是单独的值类型,而建立出的stu只是保存着它的地址呢?


------解决方案--------------------
首先Student是一个引用类型,放在堆(heap)里,对于Student里的age你可以把它理解为堆中的指针(通俗点就是索引),实际上它是一个类的属性这个你懂的,18是堆中分配出的一个空间存储的值,而age则指向这个空间。

所以可以看出,引用类型一定是放在堆里的。
而堆里面不一定只存放引用类型。
可以去我博客里看看(C#中堆和栈的区别分析)这篇文章。

如有不对,还请指点。
------解决方案--------------------
它也成了一个引用类型了吗?
-----------------------------

不会,age变量的4个字节存储空间包含在Student实例的内存空间内,不等于age是引用类型,它仍然是值类型,

如果age是引用类型,那么存储值比如18的那段内存空间就会独立出来,分配在heap的另外一个地方,不在Student实例内存空间内部,而Student中值保存着指向那个18的地址,也就是引用,

name就是这样,"张三"存储在heap的另外一个地方,不在stu实例内部,而name作为引用占4个字节在stu实例内部,但name保存的是存储"张三"的地址,