CLR via C# 学习笔记(二)
基元类型 引用类型 值类型
一、基元类型
- 编译器能直接支持的数据类型,比如int, short, long, double等。
Int32 x = 2; //x是32位值
Int64 y = x; //隐式转型为64位值
- 溢出检测
check和uncheck操作符
下面的代码就抛出溢出异常
check{ //允许溢出的代码放在uncheck中
Byte b = 100;
b += 200;
}
二、引用类型和值类型
- 引用类型从托管堆分配,new之后返回对象的内存地址
- 值类型都由System.ValueType派生
值类型都隐式封闭(不可重写),为了防止值类型(int, double等)作为其他类型的基类 - 值类型 = 值类型:逐字段赋值;
引用类型 = 引用类型:内存地址赋值 - 值类型:未装箱和已装箱
引用类型:已装箱
三、值类型的装箱和拆箱
在下面的代码中Add() 添加一个元素,参数应该是object,相当于获取对象object上的指针,但是上面p传递的是值类型;因此p必须转换成堆上的对象获取引用,就发生了装箱三步
struct Point{
int32 x, y;
}
ArratList arr;
Point p;
p.x = p.y = 100;
arr.Add(p);
装箱三步:
- 在对上分配值类型需要的内存量
- 值类型复制到堆内存
- 返回堆内存上的指针
拆箱:
下面的代码,获取数组上第一个Point元素,发生了拆箱操作:
Point p = (Point) arr[0];
拆箱两步:
- 获取Point中各个字段的地址
- 将字段中的值从堆复制到栈上
四、dynamic
- dynamic在运行时才可以确定类型
好处:在json反序列化时使用,减少代码 - var在写代码的时候就确定类型
版权声明:本文为panzelinsdo原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。