这几天在重温这部分基础知识,发现对这些概念只是停留在肤浅的表面,有很大的误解,在这里记下一些重点,随时更新
以前未深入了解时存在的一些误解:
1.值类型是存在于栈中,引用类型存在于堆中。(这句话在一些面试题中经常看到,但是这是错的:引用类型中声明的值类型变量,存于堆中)
2. C#程序入口就是program类,更甚的是桌面程序进去的所有窗体也是引用类型,那几乎所有对象都存在于堆中,则可以推断栈则很少用到,没什么用处。(错:方法中声明的值类型及引用类型变量都分配在线程栈,只是引用类型变量的值是指向分配在托管堆中实例对象的指针)
3.引用类型的对象作为参数传入方法后,重新对实参赋值,则该参数引用的对象也会改变。(错:虽然两个引用类型的变量引用同一个实例对象,但不代表改变A变量的指向会影响B变量的指向)
以下是一些知识点:
1.引用类型总是分配于托管堆上,无论是类型对象还是类型实例对象。但表示(或称为“引用”)类型实例对象的变量,可能存在于栈中
2.方法中声明的值类型,总是分配在线程栈中,方法中声明的引用类型,其变量分配在线程栈,实例对象分配在托管堆
3. .net 的参数传递总是默认按值传递,无论是值类型参数还是引用类型参数,并且传入方法的参数会在方法内部生成相应的副本(值类型复制具体的值,引用类型复制实例对象在托管堆中的地址)
4.引用对象的实例方法(即非静态方法)进入执行栈的时候,总会将当前对象(this)作为第一个参数传入方法,然后才是其他参数(如果有),并且实例方法只会被JIT编译一次
这是这几天的一点收获,以后有想到的还会更新。如果有错误,敬请指出。