《C#本质论》读书笔记<四>值类型再解析

不要创建消耗内存大于16字节的值类型

值类型在占用内存比较小时,性能比较快, 内存比较大(16字节)时,反而不一定性能好
《C#本质论》读书笔记<四>值类型再解析_第1张图片

值类型与引用类型内存分布示意图

值类型在栈中,用完即可回收。
引用类型在栈中有个引用,引用的大小与处理器的位数一致。该引用指向堆中具体的内存块。
《C#本质论》读书笔记<四>值类型再解析_第2张图片

要创建不变得值类型

《C#本质论》读书笔记<四>值类型再解析_第3张图片

结构体Struct

结构体与类的比较
结构体的字段需要全部直接初始化(复看不太理解,挖个坑)

结构体的字段不许有默认值,因为初始化时会赋予类型对应默认值。
《C#本质论》读书笔记<四>值类型再解析_第4张图片

在所有的字段初始化完之前,访问this是非法的
new值类型与new引用类型的区别

《C#本质论》读书笔记<四>值类型再解析_第5张图片

装箱和拆箱

装箱和拆箱都需要拷贝(尽量避免)

装箱是内存申请和内存拷贝
拆箱是内存检查和内存拷贝
《C#本质论》读书笔记<四>值类型再解析_第6张图片

拆箱(unbox)的内部过程:

(1)因为一个对象将被转换,所以编译器必须先判断堆栈上指向合法对象的地址,以及这个对象类型是否可以转换为MSL unbox指令调用中指定的值类型。如果检查失败就抛出InvalidCastException异常。
(2)校验通过后,就返回指向对象内的值的指针。可以看出,装箱操作会创建转换类型的副本,而拆箱就不会。不过注意一下,在我们装箱的时候是先把变量i的值复制了一份赋给ob的,所变量j拿到的是ob这个变量的引用。也就是后面再改变i的值并不会影响j的值,但是改变ob的值就会。

拆箱时要求必须要拆为原来装箱时的类型

哪怕拆为可以隐式转型的类型,也无法编译通过;
(例如int装箱成的Object无法直接拆为double,尽管int可以隐式转为double)

枚举

枚举和字符串的互转
  • 枚举可以直接ToString转为字符串
    《C#本质论》读书笔记<四>值类型再解析_第7张图片

  • 字符转为枚举需要Enum.Parse《C#本质论》读书笔记<四>值类型再解析_第8张图片

你可能感兴趣的:(读书笔记,c#)