常量是一种表示恒定不变的值的符号,当定义一个常量时,我们必须在编译时就确定它的值,而当使用常量时,编译器首先从定义常量的模块元数据中查找符号,直接取出常量的值,然后就将它嵌入到编译后产生的IL代码中。由于常量的值是直接嵌入到代码中的,所以常量在运行时不再需要任何的内存分配,所以我们不能获取常量的地址,或者以引用的方式来传递一个常量。
下面这个例子,我们会发现常量可能导致的版本更新问题:
using System;
public class Component
{
public const Int32 MaxEntriesInList=50;
}
public class Component
{
public const Int32 MaxEntriesInList=50;
}
接着引用这个程序集:
using System;
class app
{
static void Main()
{
Console.WriteLine(“Max entries supported in list:”+Component.MaxEntriesInList);
}
}
class app
{
static void Main()
{
Console.WriteLine(“Max entries supported in list:”+Component.MaxEntriesInList);
}
}
上面的程序引用了MaxEntriesInList常量,当该应用程序被编译时,编译器会发现MaxEntriesInList是一个值为50的常量符号,就将其整数值50直接嵌入到应用程序的IL代码中。这会导致应用程序编译成功后,即使不存在原先引用的DLL程序集,也能正常运行,我们完全可以在编译成功后,删除Component.dll。
这意味着,如果我们把前面Component程序集中的MaxEntriesInList修改为1000,并重新编译MaxEntriesInList.dlll后,app应用程序将不会感知这一切,因为它不会再去MaxEntriesInList.dll中获取MaxEntriesInList常量的值,除非我们重新编译app应用程序,这是在使用常量时必须要注意和理解的一个问题。