1.1.3 CLR垃圾回收
CLR中有个关键工具是垃圾回收器(Garbage Collector,GC)。GC让你从分配和释放内存的负担中解脱出来,而这些内存管理工作是很多软件错误发生的根源。然而GC并没有为你解除所有的资源处理负担,从第4章可以看到这一点。例如,文件句柄作为一个资源必须在使用后释放,就像内存一样。GC只直接管理内存资源,其他的比如数据库连接和文件句柄,可以用一个终结器(finalizer,将在第13章介绍)在GC通知你对象将要被摧毁的时候来释放。但是,一个更好的办法是用Disposable模式来完成这个任务,我们将在第4章和第13章介绍。
注解 CLR间接引用所有引用类型的对象,和C++(www.cppentry.com)里面的指针和引用类似,但C#没有指针的语法定义。在C#中定义一个引用类型变量的时候,事实上是预留了一个与类型关联的存储位置,这个位置在堆或者栈上保存着对象的引用。当把一个变量的对象引用复制到另一个变量时,会得到引用到同一个对象的两个变量。所有的引用类型实例都位于托管堆上。CLR管理这些对象的位置,如果需要移动,它会更新那些指向被移动对象的引用去指向新的位置。CLR里面也有值类型,它们的实例存活在栈上或作为托管堆上对象的一个域。它们的用法有很多限制和细微差别。通常在需要轻量级的结构来管理相关数据的时候需要用到它们。值类型在对非可变(immutable)的数据块建模的时候也有用,第4章将更详细地讨论这个问题。
用C#可以快速开发应用,而不必处理如C++(www.cppentry.com)环境里面那么繁琐的细节。同时,C#是一种让C++(www.cppentry.com)或Java开发者感到熟悉的语言。