从概念上看,值类型直接存储其值,而引用类型存储对其值的引用。这两种类型存储在内存的不同地方。在C#中,我们必须在设计类型的时候就决定类型实例的行为。这种决定非常重要,用《CLR via C#》作者Jeffrey Richter的话来说,“不理解引用类型和值类型区别的程序员将会给代码引入诡异的bug和性能问题(I believe that a developer who misunderstands the difference between reference types and value types will introduce subtle bugs and performance issues into their code.)”。这就要求我们正确理解和使用值类型和引用类型。
\n
- 1. 通用类型系统
\n - 2. 值类型
\n - 3. 引用类型
\n - 4. 值类型和引用类型在内存中的部署
\n- 4.1 数组在内存中的部署
\n - 4.2 值类型和引用类型的嵌套
\n
\n - 4.1 数组在内存中的部署
- 5. 正确使用值类型和引用类型
\n- 5.1 辨明值类型和引用类型的使用场合
\n - 5.2 将值类型尽可能实现为具有常量性和原子性的类型
\n - 5.3 确保0为值类型的有效状态
\n - 5.4 尽量减少装箱和拆箱
\n
\n - 5.1 辨明值类型和引用类型的使用场合
- 6. 总结
\n - 7. 参考
\n
\n
1. 通用类型系统
\n
C#中,变量是值还是引用仅取决于其数据类型。
\n
C#的基本数据类型都以平台无关的方式来定义。C#的预定义类型并没有内置于语言中,而是内置于.NET Framework中。.NET使用通用类型系统(CTS)定义了可以在中间语言(IL)中使用的预定义数据类型,所有面向.NET的语言都最终被编译为IL,即编译为基于CTS类型的代码。
\n
例如,在C#中声明一个int变量时,声明的实际上是CTS中System.Int32的一个实例。这具有重要的意义:
\n
- 确保IL上的强制类型安全;
\n - 实现了不同.NET语言的互操作性;
\n - 所有的数据类型都是对象。它们可以有方法,属性,等。例如:
\n
\n
int i;
i = 1;
string s;
s = i.ToString();\n
i = 1;
string s;
s = i.ToString();\n