一、基元类型 、 引用类型 和 值类型的区别;
1、基元类型(primitive type):编译器直接支持的数据类型; 基元类型 直接映射到 FCL 中存在的类型。
C# 小写是基元类型,例如:string , 大写是FCL类型,例如String, 基元类型直接映射到FCL类型,所以这两者之间没有区别,一模一样,不用纠结使用哪种方式了。
支持 直接使用FCL类型, 不使用基元类型, Float 对应 Single FCL类型; dynamic 对应 System.Object FCL类型;
2、C# 默认是 溢出检查关闭; 操作符 checked() 和 unchecked() 可以在特定区域控制溢出检查;
3、引用类型 : 任何类 都是引用类型, 引用类型总是从托管堆上分配, c#的new操作符返回对象内存地址; 引用类型 在托管堆中分配 内存, 返回内存地址
比如: ClassA a = new ClassA(); a 是 内存地址,指向托管堆中的数据;
值类型: 结构(struct) 或 枚举(enum)类型, 值类型的实例 一般在线程栈上分配;
两者的一个重点区别: 将值类型变量赋给另一个值类型变量,会执行逐字段的复制。 将引用类型的变量 赋给 另一个引用类型的变量只复制内存地址。 所以多个引用类型变量 可以引用堆中同一对象, 值类型变量则自成一体。
二、 对象相等性 和 同一性
1、同一性: 使用(引用) 是通过一个对象, (同一个对象,值完全相同)
2、相等性 : 值完全相同, (1、同一个对象,值相同 2、不同对象【相同类型的】,值相同)
Object 的 Equals 实现的是同一性; 而非相等性;