Value Type
除了string以外的所有预定义类型
派生关系:System.Object → System.ValueType → struct (Except enum,其他值类型都用struct定义)(Enum的定义中明确继承了ValueType,除Enum以外,其他类型都是隐式继承的)
在C#中是用struct定义的,所以才会有方法、属性和字段
不能继承自其他类或结构体,但是可以实现接口
值类型的值直接存在“变量所在的那块内存里
作为方法参数或局部变量,存储在栈上;
作为类的字段或属性,存储在堆上
传参时会直接复制一份数据的拷贝,故尽量不要让值类型变量占太多空间
Reference Type
运行时从变量中读取内存位置(引用)( On Stack ),再跳转到包含数据的内存地址 ( On Heap )
传参时拷贝变量的引用
每个引用的大小即为处理器的native size:N位CPU→N位引用
字段 V.S. 属性:字段才是真正存储在堆上的,属性本质上是个方法
Null
对Null的解引用
略,解了直接抛出
NullReferebceException,解一个nullable的变量之前先用is操作符判断是否为null(不用 ==:可能会被重载)如果是使用了null值条件操作符 ( ?, ?[] ) 的变量被解引用,会直接返回一个null
隐式类型的局部变量
用var代替具体的类型,编译器根据声明的值(必须在声明时初始化)来自动判断数据类型
仅在数据类型复杂(比如元组)或者数据类型很明显的情况下使用
可以用于匿名类型
var nominousObj = new { Title = "a", age = 123};