C#依靠运行时来实现自动内存管理。公共语言运行时的垃圾回收器会作为程序的一部分运行,并负责回收那些不再被引用的对象所占用的内存,程序员无须显式释放对象的内存
C#并未抛弃指针,只是在大多数编程任务中是不需要使用指针的。对于性能优先的热点和互操作性,仍然可以在标记为unsafe的程序块内使用指针并进行显式内存分配。
CLR和语言无关
与其他的托管语言一样,C#也会将代码编译为托管代码。托管代码以中间语言(Intermediate Language, IL)的形式表示。CLR通常会在执行前,将IL转换为机器(例如x86或x64)原生代码,称为即时(Just-In-Time, JIT)编译。除此之外,还可以使用提前编译(ahead-of-time compilation)技术来改善拥有大程序集,
托管代码的容器称为程序集(assembly)或可移植程序集(portable executable)。程序集可以是一个可执行文件(.exe)也可以是一个库(.dll)。它们不仅包含IL,还包含称为元数据(metadata)的类型信息。元数据的引入使程序集无须额外的文件就可以引用其他程序集中的类型。
使用Microsoft的ildasm工具可以反编译并查看程序集的IL。而其他工具,例如ILSpy、dotPeek(JetBrains)以及Reflector(Red Gate)则可以将IL代码进一步反编译为C#。IL的层次相比原生机器代码要高得多,因此反编译器可以高质量地重建C#代码。
程序也可以通过反射(reflection)查询其元数据,甚至在运行时生成新的IL(reflection. emit)。
NET Framework是由CLR和大量的程序库组成的。这些程序库由核心库(本书主要介绍)和应用库组成,应用库依赖于核心库。
核心库又称为基础类库(Base Class Library, BCL)。而整个框架称为框架类库(Framework Class Library)。