<NET CLR via c# 第4版>笔记 第7章 常量和字段

7.1 常量

  • 常量 是值从不变化的符号。定义常量符号时,它的值必须能够在编译时确定。
  • 只能定义编译器识别的基元类型的常量,如果是非基元类型,需把值设为null。
  • 常量的值直接嵌入代码,所以不能获取常量地址,不能以传引用的方式传递常量。
  • 不能很好地支持跨程序集的版本控制(修改一个DLL中的常量值,需要重新编译所有引用该DLL的程序才可以)
  • 只有确定一个符号的值从不变化才应定义常量。
    public sealed class SomeLibraryType
    {
        //注意:c#不允许为常量指定 static 关键字,
        //因为常量总是隐式为 static
        public const int MaxEntriesInList = 50;
    }

7.2 字段

  • 字段 是一种数据成员,其中容纳了一个值类型的实例或者对一个引用类型的引用。

    CLR术语C#术语说明
    Staticstatic这种字段是类型状态的一部分,而不是对象状态的一部分
    Instance(默认)这种字段与类型的一个实例关联,而不是与类型本身关联
    InitOnlyreadonly这种字段只能由一个构造器方法中的代码写入
    Volatilevolatile编译器、CLR和硬件不会对访问这种字段的代码执行“线程不安全”的优化措施。只有以下类型才能标记为volatile:所有引用类型,Single,Boolean,Byte,SByte,Int16,UInt16,Int32,UInt32,Char,以及基础类型为Byte,SByte,Int16,Uint16,Int32或UInt32的所有枚举类型
  • 字段被标记为 readonly 时,不可改变的是引用,而非字段引用的对象 ,如:

    public sealed class AType
    {
        //InvalidChars总是引用同一个数组对象
        public static readonly char[] InvalidChars = new char[] { 'A', 'B', 'C' };
    }

    public sealed class AnotherType
    {
        public static void M()
        {
            //下面三行代码是合法的,可以通过编译,并可成功
            //修改InvalidChars数组中的字符
            AType.InvalidChars[0] = 'X';
            AType.InvalidChars[1] = 'Y';
            AType.InvalidChars[2] = 'Z';

            //下一行代码是非法的,无法通过编译,
            //因为不能让InvalidChars引用别的什么东西
            AType.InvalidChars = new char[] { 'X', 'Y', 'Z' };
        }
    }

返回目录

posted on 2017-05-18 11:46  Harry(悟秀)  阅读(307)  评论(2编辑  收藏  举报