C# 基元类型 引用类型 值类型 学习笔记(二)

CLR via C# 学习笔记(二)

基元类型 引用类型 值类型

一、基元类型

  1. 编译器能直接支持的数据类型,比如int, short, long, double等。
Int32 x = 2; //x是32位值
Int64 y = x; //隐式转型为64位值
  1. 溢出检测
    check和uncheck操作符
    下面的代码就抛出溢出异常
check{ //允许溢出的代码放在uncheck中
Byte b = 100;
b += 200;
}

二、引用类型和值类型

  1. 引用类型从托管堆分配,new之后返回对象的内存地址
  2. 值类型都由System.ValueType派生
    值类型都隐式封闭(不可重写),为了防止值类型(int, double等)作为其他类型的基类
  3. 值类型 = 值类型:逐字段赋值;
    引用类型 = 引用类型:内存地址赋值
  4. 值类型:未装箱和已装箱
    引用类型:已装箱

三、值类型的装箱和拆箱
在下面的代码中Add() 添加一个元素,参数应该是object,相当于获取对象object上的指针,但是上面p传递的是值类型;因此p必须转换成堆上的对象获取引用,就发生了装箱三步

struct Point{
int32 x, y;
}
ArratList arr;
Point p;
p.x = p.y = 100;
arr.Add(p);

装箱三步:

  1. 在对上分配值类型需要的内存量
  2. 值类型复制到堆内存
  3. 返回堆内存上的指针

拆箱:
下面的代码,获取数组上第一个Point元素,发生了拆箱操作:

Point p = (Point) arr[0];

拆箱两步:

  1. 获取Point中各个字段的地址
  2. 将字段中的值从堆复制到栈上

四、dynamic

  1. dynamic在运行时才可以确定类型
    好处:在json反序列化时使用,减少代码
  2. var在写代码的时候就确定类型

版权声明:本文为panzelinsdo原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。