zoukankan      html  css  js  c++  java
  • .Net中常量和只读变量的区别(const与readonly)

            //const修饰的数据叫做 常量
            //常量一旦声明常量的值就不能改变。
            //常量在声明的时候 必须要赋初始值
            //C#编译器在编译的时候 声明常量的那句话不见了.
            //在使用常量的地方就用常量的值代替了.
            //某些数据在整个程序的运行过程中其值不会发生改变 我们就把这个值定义常量 以提高程序的运行效率 

    内容:

        我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等。在多数情况下可以混用。二者本质的区别在于,const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值。而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值。明白了这个本质区别,我们就不难看出下面的语句中static readonly和const能否互换了:

    1. static readonly MyClass myins = new MyClass();
    2. static readonly MyClass myins = null;
    3. static readonly B = 10;   static readonly A = B * 20;
    4. static readonly int [] constIntArray = new int[] {1, 2, 3};
    5. void SomeFunction()
       {
          const int a = 10;
          ...
       }
    6.private static string astr="abcd";
      private const string str = astr+"efg";
    1:不可以换成const。new操作符是需要执行构造函数的,所以无法在编译期间确定
    2:可以换成const。我们也看到,Reference类型的常量(除了String)只能是Null。
    3:可以换成const。我们可以在编译期间很明确的说,A等于200。
    4:不可以换成const。道理和1是一样的,虽然看起来1,2,3的数组的确就是一个常量。
    5:不可以换成readonly,readonly只能用来修饰类的field,不能修饰局部变量,也不能修饰property等其他类成员。

    6.错误:如果在astr前加上const或者const改为readonly即可;

    总结:1.const、readonly和static readonly定义的常量,指定初始值后(包括在构造函数内指定的初始值) 将不可更改,可读不可写;
            2.const定义时必须指定初始值,而readonly定义时可以不进行初始化(MS建议在定义时初始值),同时也可以在构造函数内指定初始值,

              并以构造函数内指定的值为准;

            3.const和static readonly定义的常量是静态的,只能由类直接访问;而readonly定义的常量是非静态 的,只能由实例对象访问;  
            4.static readonly常量,如果在构造函数内指定初始值,则必须是静态无参构造函数;
            5.const是编译时常量,readonly是运行时常量;cosnt较高效,readonly较灵活。在应用上以static readonly代替const,以平衡const在灵活性上的不足,
               同时克服编译器优化cosnt性能,所带来的程序集引用不一致问题;  
         

  • 相关阅读:
    RN-Android构建失败:Caused by: org.gradle.api.ProjectConfigurationException: A problem occurred configuring root project 'AwesomeProject'.
    Android更新包下载成功后不出现安装界面
    真机调试: The application could not be installed: INSTALL_FAILED_TEST_ONLY
    react native 屏幕尺寸转换
    Android Studio生成签名文件,自动签名,以及获取SHA1和MD5值
    React Native安卓真机调试
    git提交代码报错Permission denied, please try again
    The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.
    命令行设置快捷命令
    Linux 常用指令
  • 原文地址:https://www.cnblogs.com/kongsq/p/5132478.html
Copyright © 2011-2022 走看看