值类型的存储位置和声明它的类型有关。当Main()执行的时候,会分配一个栈区,如果在Main()里面声明了值类型,那么它就会保存在这个栈上;如果Main()先声明了一个struct,而struct里面声明了值类型,那么这个值类型也一样保存在栈上,因为声明这个值类型的类型即struct也在栈上;而如果声明值类型的类型是一个引用类型,比如一个类,那么这个值类型就会保存在堆上。
赋值时的区别
引用类型赋值是一种浅拷贝,只是将引用类型的地址传递了过去,比如A = B,那么A、B的操作都会相互影响。当然,string是一种特例,赋值或者传参后不会相互影响。如果你想引用类型也能执行深拷贝,就要自己写Clone()方法了。
空间分配及回收
堆和栈这里的区别具体不解释,可以查看相关文档,这里引用一位前辈的比喻来看出: 使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。
使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。比喻很形象,说的很通俗易懂,不知道你是否有点收获。
以下是我想的两个例子,如果你都能答对且明白原理,则说明你至少理解了堆栈。
1、引用类型赋值,修改某一个引用类型,会有什么结果
static void Main(string[] args) { var my = new MyInt(); var you = my; you.index = 1; you = null; Console.WriteLine(my.index.ToString()); Console.ReadLine(); } public class MyInt { public int index; }
结果是:1;而且没有返回异常。(重点是为什么没发生异常)?
2、引用类型传递和指针传递(ref代表传递的是指针)的区别
static void Main(string[] args) { PRogram main = new Program(); var my = new MyInt(); main.CommonMethod(my); Console.WriteLine(my.index.ToString()); main.RefMethod(ref my); Console.WriteLine(my.index.ToString()); Console.ReadLine(); } public void CommonMethod(MyInt myInt) { myInt.index = 1; myInt = null; } public void RefMethod(ref MyInt myInt) { myInt.index = 2; myInt = null; } public class MyInt { public int index; }
结果是1,然后异常;(为什么引用类型传递不异常,而指针传递异常)?
数据结构的栈和内存中的栈有什么区别吗?网上说数据结构的栈是一个理论,一个是实现方式,那么数据结构中的队列,在内存中有什么实现呢?还是说网上的说法是错误的?
希望大神们帮我解释一下。
新闻热点
疑难解答