技术改变世界!学习改变自己!

每天进步一点点,遥不可及的事情,在你一点一滴的努力下,也会变成现实。

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  55 随笔 :: 0 文章 :: 33 评论 :: 0 引用

公告

常量是一种表示恒定不变的值的符号,当定义一个常量时,我们必须在编译时就确定它的值,而当使用常量时,编译器首先从定义常量的模块元数据中查找符号,直接取出常量的值,然后就将它嵌入到编译后产生的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 2010-05-11 21:48 阿捷 阅读(...) 评论(...) 编辑 收藏