• clr via c#读书笔记五:常量和字段


    1、常量是值从不变化的符号。只能定义编译器识别的基元类型的常量。如:Boolean,Char,Byte,SByte,Int16,UInt16,Int32,UInt32,Int64,Single,Double,Decimal和String;

    2、c#也允许定义非基元类型的常量,但是前提是把值设为null.

    3、编译器将常量保存到程序集元数据中。

    4、常量总是被视为静态成员,而不是实例成员。定义常量将导致创建元数据。

    5、代码引用常量符号时,编译器在定义常量的程序集的元数据中查找该符号,提取常量的值,将值嵌入生成的IL代码中。由于常量的值直接嵌入代码,所以在运行时不需要为常量分配任何内存。除此之外,不能获取常量的地址,也不能以传引用的方式传递常量。

    6、CLR支持类型(静态)字段和实例(非静态)字段。如果是类型字段,容纳字段数据所需的动态内存是在类型对象中分配的,而类型对象是在类型加载到一个AppDomain时创建的。那么,什么时候将类型加载到一个AppDomain中呢?这通常是在引用了类型的任何方法首次进行JIT编译的时候。如果是实例字段,容纳字段数据所需的动态内存是在构造类型的实例时分配的。

    7、readonly字段只能在构造器(构造函数)方法中写入。可以利用反射来修改readonly字段。

    8、内联初始化:就是在定义类字段时,直接初始化值,如:

    public sealed class SomeType{
        public readonly String Pathname="Untitled";//内联初始化
    }
    

     但是内联初始化实际是在构造器中初始化的。这只是一个语法上简化。用内联语法有一些性能问题需要考虑。

    9、当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'};
        }
    }
    

      

  • 相关阅读:
    Python菜鸟之路:Python基础-线程、进程、协程
    Python菜鸟之路:Python基础-Socket编程-2
    Python菜鸟之路:Python基础-Socket基础-1
    react-native 使用 antd-mobile-rn UI进行开发app
    Java基础
    Java基础
    Java基础
    Java基础
    Java基础
    Java基础
  • 原文地址:https://www.cnblogs.com/yuzhoumanwu/p/8537842.html
Copyright © 2020-2023  润新知