CLR VIA C#: 基元类型、 引用类型 和 值类型

一、基元类型 、 引用类型 和 值类型的区别;

  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 实现的是同一性; 而非相等性;

原文地址:https://www.cnblogs.com/generalLi/p/6287567.html