• Const和ReadOnly


    总结一下const和readonly有这么几条区别:

    1. const和readonly的值一旦初始化则都不再可以改写;
    2. const只能在声明时初始化;readonly既可以在声明时初始化也可以在构造器中初始化;
    3. const隐含static,不可以再写static const;readonly则不默认static,如需要可以写static readonly;
    4. const是编译期静态解析的常量(因此其表达式必须在编译时就可以求值);readonly则是运行期动态解析的量;
    5. const既可用来修饰类中的成员,也可修饰函数体内的局部变量;radonly只可以用于修饰类中的成员

    在许多教程中常看到列出了两者之间的区别
      const 
           (1)在编译期间解析常量
           (2)必须在申明时就初始化
           (3)即可用来修饰类中的成员,也可用来修饰函数中的局部变量
      static readonly
          (1)在运行期间解析常量
          (2)即可在申明时初始化,也可在构造器中初始化
          (3)只可用来修饰类中的成员

    从上面的区别看似乎也很明白,可是在实际的使用中还是不太好把握。在c#中有两种不同的常量:
    静态常量(compile-time constants) 和动态常量(runtime constants),他们之间有不同的特性,错误的使用不仅会损失效率,
    还可能造成错误。相比之下,静态常量在速度上会稍快写,但是灵活性却比动态常量差。

     从我个人对他们的使用中总结出有如下三点需要注意:
    (1)当使用new来初始化一个常量,不管他是值类型,还是引用类型都只能使用static readonly
      

    Code


    (2) 比较编译时和运行时他们之间的区别

    1static readonly A=B*20
    2static readonly B=10
    3//在编译的时候B并没有被编译为10,A也没有被编译为200
    4const A=B*20
    5const B=10
    6//显然在编译的时候,就把B编译为10,A编译为200了,而不是在运行时计算B*20


    (3)在不同的项目中使用const和static readonly的区别


     1//下面有一个项目
     2public class OneClass
     3{
     4 public const int myInt=5;
     5 public static readonly string strStaticReadonly="StaticReadonly";
     6}

     7//在另一个项目中引用了上述属性
     8public class AnotherClass
     9{
    10int i=OneClass.myInt;
    11string ss=OneClass.strStaticReadonly;
    12}

    13//编译时运行程,i=5;ss="StaticReadonly",这是理所当然的,但是我们如过了OneClass中的值
    14public class OneClass
    15{
    16 public const int myInt=10;
    17 public static readonly string strStaticReadonly="Changed";
    18}

    19//然后编译OneClass项目,生成DLL,运行AnotherClass(只是运行,并不是编译后运行,发现结果是:
    20//i=5不变,但是ss=“changed”,为什么会这样,原因是在AnotherClass中,i已经被定义为5了,而不是运行时再去取dll的值,所以说const在编译时就确定了。
  • 相关阅读:
    Fiddler:在PC和移动设备上抓取HTTPS数据包
    WP8:在WinRT组件(C++)中调用C#类库的解决方案
    Windows Phone 7.5/8.0/8.1 WebBrowser 渲染异常的原因及解决方法
    Xamarin.iOS开发初体验
    WP8:Unity3D之间的值传递
    【Win10 UWP】QQ SDK(一):SDK基本使用方法
    WP8.1:关于屏幕尺寸和分辨率的那些事儿
    .NET vs2010中使用IrisSkin2.dll轻松实现winForm窗体换肤功能
    记事本的编辑问题,如何删除记事本中某一列不需要的值
    C#制作RDLC报表
  • 原文地址:https://www.cnblogs.com/love828/p/3222011.html
Copyright © 2020-2023  润新知