常见面试题目:
1. 值类型和引用类型的区别?
2. 结构和类的区别?
3. delegate是引用类型还是值类型?enum、int[]和string呢?
4. 堆和栈的区别?
5. 什么情况下会在堆(栈)上分配数据?它们有性能上的区别吗?
6.“结构”对象可能分配在堆上吗?什么情况下会发生,有什么需要注意的吗?
7. 理解参数按值传递?以及按引用传递?
8. out
和 ref
的区别与相同点?
9. C#支持哪几个预定义的值类型?C#支持哪些预定义的引用类型?
10. 有几种方法可以判定值类型和引用类型?
11. 说说值类型和引用类型的生命周期?
12. 如果结构体中定义引用类型,对象在内存中是如何存储的?例如下面结构体中的class类 User对象是存储在栈上,还是堆上?
public struct MyStruct { public int Index; public User User;
认识值类型与引用类型
万变不离其宗,只要搞清楚值类型和引用类型的原理,上面所有题目就都迎刃而解了。
基本概念
CLR支持两只类型:引用类型和值类型。这是.NET语言的基础和关键,他们从类型定义、实例创建、参数传递,到内存分配都有所不同。虽然看上去简单,但真正理解其内涵的人却好像并不多。
下图清晰了展示了.NET中类型分类,值类型主要是一些简单的、基础的数据类型,引用类型主要用于更丰富的、复杂的、复合的数据类型。
内存结构
值类型和引用类型最根源的区别就是其内存分配的差异,在这之前首先要理解CLR的内存中两个重要的概念:
Stack 栈:线程栈,由操作系统管理,存放值类型、引用类型变量(就是引用对象在托管堆上的地址)</