当前位置:首页 > 理解C#值类型与引用类型

理解C#值类型与引用类型

点击次数:3848  更新日期:2010-12-30
\n

从概念上看,值类型直接存储其值,而引用类型存储对其值的引用。这两种类型存储在内存的不同地方。在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

    \n
  • 1. 通用类型系统
    \n
  • 2. 值类型
    \n
  • 3. 引用类型
    \n
  • 4. 值类型和引用类型在内存中的部署
    \n

      \n
    • 4.1 数组在内存中的部署
      \n
    • 4.2 值类型和引用类型的嵌套

    \n
  • 5. 正确使用值类型和引用类型
    \n

      \n
    • 5.1 辨明值类型和引用类型的使用场合
      \n
    • 5.2 将值类型尽可能实现为具有常量性和原子性的类型
      \n
    • 5.3 确保0为值类型的有效状态
      \n
    • 5.4 尽量减少装箱和拆箱

    \n
  • 6. 总结
    \n
  • 7. 参考

\n

1. 通用类型系统


\n

C#中,变量是值还是引用仅取决于其数据类型。


\n

C#的基本数据类型都以平台无关的方式来定义。C#的预定义类型并没有内置于语言中,而是内置于.NET Framework中。.NET使用通用类型系统(CTS)定义了可以在中间语言(IL)中使用的预定义数据类型,所有面向.NET的语言都最终被编译为IL,即编译为基于CTS类型的代码。


\n

例如,在C#中声明一个int变量时,声明的实际上是CTS中System.Int32的一个实例。这具有重要的意义:


\n

    \n
  • 确保IL上的强制类型安全;
    \n
  • 实现了不同.NET语言的互操作性;
    \n
  • 所有的数据类型都是对象。它们可以有方法,属性,等。例如:

\n
int i;
i = 1;
string s;
s = i.ToString();

\n