引用:
const用 const 修饰符声明的成员叫常量,是在编译期初始化并嵌入到客户端程序static readonly用 static readonly 修饰符声明的成员依然是变量,只不过具有和常量类似的使用方法:通过类进行访问、初始化后不可以修改。但与常量不同的是这种变量是在运行期初始化测试类:using System;
using System.Collections.Generic;
using System.Text;namespace Example02Lib
{
    public class Class1
    {
        public const String strConst = "Const";
        public static readonly String strStaticReadonly = "StaticReadonly";
    }
}客户端代码using System;
using System.Collections.Generic;
using System.Text;
using Example02Lib;namespace Example02
{
    class Program
    {
        static void Main(string[] args)
        {
            //修改Example02中Class1的strConst初始值后,只编译Example02Lib项目
            //然后到资源管理器里把新编译的Example02Lib.dll拷贝Example02.exe所在的目录,执行Example02.exe
            //切不可在IDE里直接调试运行因为这会重新编译整个解决方案!!            //可以看到strConst的输出没有改变,而strStaticReadonly的输出已经改变
            //表明Const变量是在编译期初始化并嵌入到客户端程序,而StaticReadonly是在运行时初始化的
            Console.WriteLine("strConst : {0}", Class1.strConst);
            Console.WriteLine("strStaticReadonly : {0}", Class1.strStaticReadonly);            Console.ReadLine();
        }
    }
}
运行结果:
strConst : Const
strStaticReadonly : StaticReadonly 如果测试类代码为using System;
using System.Collections.Generic;
using System.Text;namespace Example02Lib
{
    public class Class1
    {
        public const String strConst = "Const1";
        public static readonly String strStaticReadonly = "StaticReadonly1";
    }
}第二次运行结果:
strConst : Const
strStaticReadonly : StaticReadonly1我想知道为什么? 为什么会出现第二次运行结果?

解决方案 »

  1.   

    那几行绿色的注释就是原因了,平常应用程序谁没事这样拷?这个例子想说明一个问题“Const变量是在编译期初始化并嵌入到客户端程序,而StaticReadonly是在运行时初始化的”
      

  2.   

    所谓的"嵌入",就是把以下代码,
    Console.WriteLine("strConst : {0}", Class1.strConst);在编译时变成
    Console.WriteLine("strConst : {0}", "Const");
      

  3.   


    可是拷贝过去的时候,dll中的Class1.strConst值已经是"Const1"了呀,为何编译器还认为是 "Const"?
    这个有点不理解
      

  4.   

    你知道编译器是要来生成代码,不是用来运行代码的吗?
    单单以下一行,需要用到Class1吗?
    Console.WriteLine("strConst : {0}", "Const");
      

  5.   


    编译器是用来生成代码的啊,可是Example02Lib.DLL不是已经是二进制文件,修改后的变量strConst的值不已经是“Const1”,客户端记录的值怎么还是“Const”,有点想不通啊!
    编译期初始化也应该是dll编译啊
      

  6.   

    请阅读Effective C#。里面有一个rule就是尽量用static readonly 而不是const. 
      

  7.   

    使用Const的坏处是,如果定义一个const变量a, 在x.dll中,在y.dll使用这个变量,编译后x.dll和y.dll都保存的是值。如果你修改了const变量a的值,编译,部署时只部署x.dll。会造成y.dll中的值没有更新。