技术驱动生活,科技畅想未来!

坚持每天进步一点!

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

常量是一种表示恒定不变的值的符号,当定义一个常量时,我们必须在编译时就确定它的值,而当使用常量时,编译器首先从定义常量的模块元数据中查找符号,直接取出常量的值,然后就将它嵌入到编译后产生的IL代码中。由于常量的值是直接嵌入到代码中的,所以常量在运行时不再需要任何的内存分配,所以我们不能获取常量的地址,或者以引用的方式来传递一个常量。

下面这个例子,我们会发现常量可能导致的版本更新问题:

using System;

public class Component

{

    public const Int32 MaxEntriesInList=50;

}

接着引用这个程序集:

using System;

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应用程序,这是在使用常量时必须要注意和理解的一个问题。

posted on 2009-03-08 13:23  ajiefjcn  阅读(200)  评论(0编辑  收藏  举报