我是靠谱客的博主 英勇眼神,这篇文章主要介绍CLR Via C# 第五章(基元类型,引用类型与值类型)(1)——读书笔记,现在分享给大家,希望可以做个参考。

基元类型,引用类型与值类型

1.基元类型

基元类型:编译器直接支持的概念称作基元类型
简单来说,就是int,char,bool这些基本类型,基元类型会直接映射到Framework类库(FCL)中的类型,
如int会映射到System.Int32类型,所以,

复制代码
1
2
int a=0; System.Int32 b=0;

两者等价,都会编译生成成相同的IL
直接使用FCL类型名称,更能够解决概念误差。

2.check与unchecked操作符

这两个操作符能够对单个表达式或域进行溢出的检查与否进行操作,若检查到溢出,则CLR会抛出OverflowException异常。
这个主要用于计算校验等。

3.引用类型与值类型

CLR支持两种类型:值类型与引用类型

引用类型总是从托管堆分配,C#中用new操作符返回对象内存地址,即指向对象数据的内存地址。

  • 引用对象本身保存的是对象的内存地址
  • 引用类型对象中其他字节(字段)总设为0
  • 从托管堆分配对象时,可能强制执行一次垃圾回收

值类型的实例则一般在线程栈分配。

  • 值类型对象本身包含了实例的字段,所以不包含指针
  • 不受垃圾回收器控制

区分:任何称为类的类型都是引用类型,所有值类型都称为结构或枚举

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
private static class ReferenceVsValue { // Reference type (because of 'class') private class SomeRef { public Int32 x; } // Value type (because of 'struct') private struct SomeVal { public Int32 x; } public static void Go() { SomeRef r1 = new SomeRef(); // Allocated in heap SomeVal v1 = new SomeVal(); // Allocated on stack r1.x = 5; // Pointer dereference v1.x = 5; // Changed on stack Console.WriteLine(r1.x); // Displays "5" Console.WriteLine(v1.x); // Also displays "5" // The left side of Figure 5-2 reflects the situation // after the lines above have executed. SomeRef r2 = r1; // **Copies reference (pointer) only** SomeVal v2 = v1; // Allocate on stack & copies members r1.x = 8; // Changes r1.x and r2.x v1.x = 9; // Changes v1.x, not v2.x Console.WriteLine(r1.x); // Displays "8" Console.WriteLine(r2.x); // Displays "8" Console.WriteLine(v1.x); // Displays "9" Console.WriteLine(v2.x); // Displays "5" // The right side of Figure 5-2 reflects the situation // after ALL the lines above have executed. } }

内存分配对比

最后

以上就是英勇眼神最近收集整理的关于CLR Via C# 第五章(基元类型,引用类型与值类型)(1)——读书笔记的全部内容,更多相关CLR内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(54)

评论列表共有 0 条评论

立即
投稿
返回
顶部