常量和字段

一、常量
常量是一个特殊的符号,它有一个从不变化的值。定义常量符号时,它的值必须能在编译时确定。确定之后,编译器将常量的值保存到程序集的元数据中。这意味着只能为编译器认定的基元类型定义常量。C#也允许定义一个非基元类型的常量变量,前提是把它的值作者为null。
下面举例说明:
namespace ABC
{
    public class SomeType
    {
        public const Int32 MaxEnteriesInList = 500;
        public static readonly Int32 myreadonly = 100;
    }
}
namespace Const
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("ConstField:" + ABC.SomeType.MaxEnteriesInList);
            Console.WriteLine("ReadonlyField:" + ABC.SomeType.myreadonly);
            Console.ReadKey();
        }
    }
}
直接编译后,输出的结果如下图:

 
下面假设我们的要求发生了变化,将MaxEnteriesInList 改为501,将myreadonly改为101,接着将类库ABC重新生成。然后把ABC.dll拷到Const的bin目录下替换原来的dll,直接运行Const.exe,会得到如下结果:
 
会发现MaxEnteriesInList的值没有发生改变,这是为什么呢?请看上面的加粗部分说明。此外通过中间代码理解起来更容易。


二、字段
字段是一种数据成员,其中容纳了一个值类型的实例或者对一个引用类型的引用。
C#字段的修饰符有:
默认:对应CLR术语中的Instance。
static:对应CLR术语中的Static,这种字段是类型状态的一部分,而不是对象状态的一部分。
readonly:对应CLR术语中的InitOnly,这种字段只能有一个构造器方法中的代码写入。编译器和验证机制确保readonly字段不会被构造器意外得到任何方法写入。注意:可利用发射来修改readonly字段。
重要提示:当某个字段是引用类型,并且该字段被标记为readonly时,那么不可改变的是引用,而非字段引用的对象。
    public sealed class AType
    {
        //Invalidchars总是引用同一个数组对象
        public static readonly Char[] InvalidChars = new Char[] { 'A', 'B', 'C' };
    }
    public sealed class AnotherType
    {
        public static void M()
        {
            //合法
            AType.InvalidChars[0] = 'X';
            AType.InvalidChars[1] = 'Y';
            AType.InvalidChars[2] = 'Z';
            //不能让Invalidchars引用别的什么东西
            //AType.InvalidChars = new Char[] { 'X','Y','Z'};
        }
    }
volatile:对应CLR术语中的Volatile.
posted @ 2011-05-16 21:01  Raysonxin  阅读(299)  评论(1编辑  收藏  举报