zoukankan      html  css  js  c++  java
  • const & readonly 关键字

    1、使用 const 关键字来声明某个常量字段或常量局部变量。常量字段和常量局部变量不是变量并且不能修改。 常量可以为数字、布尔值、字符串或 null 引用(Constants can be numbers, Boolean values, strings, or a null reference)。

    2、不允许在常数声明中使用 static 修饰符。

    3、常数可以参与常数表达式,如下所示:

    4、readonly 关键字与 const 关键字不同:const 字段只能在该字段的声明中初始化。readonly字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,`readonly` 字段可能具有不同的值。

    5、static  如果 static 关键字应用于类,则类的所有成员都必须是静态的。不能通过实例引用静态成员。 然而,可以通过类型名称引用它。

    const关键字可以将字段或局部变量声明为常量,其不能被修改。readonly关键字被用来声明只读字段,主要用于字段。两者有一定的相似性,但是也有明显的差异性,所以本文将两者结合在一起来进行说明。我们先来看下面的四段代码片段。

    Code1:
    private const int FIRST_NUM = 1;
    Code2:
    private static const int SECOND_NUM = 1;
    Code3:
    int t = 1;private const int THIRD_NUM = t + 1;
    Code4:
    private const int FIFTH_NUM = FIRST_NUM + 1;
    大家知道哪些代码片段有问题吗?
    答案是,代码片段2及代码片段3的做法存在错误。
     
    Code2不正确的原因是:
    const 默认就是静态的,所以在声明中显式地加上static 关键字的做法明显是错误的。这一点,可以通过查看IL代码来证明,其中Code1对应的IL代码如下:
    .field private static literal int32 FIRST_NUM = int32(0x00000001)
    很显然,常量FIRST_NUM 默认就是静态的(static )。
    那么,readonly字段能不能被设置成静态呢?
    做个实验就知道了,代码如下:
    private static readonly int firstnum = 1;
    编译无错,正常。
    到这里,可以得出readonly及const的第一个区别:const 默认就是静态的,而 readonly 如果设置成静态的就必须显示声明(区别1)。
    Code3不正确的原因是:
    const 字段只能在该字段的声明中初始化。不能从一个变量中提取值来初始化常量。这里面更深层次的原因就是:const 字段是编译时常数。在编译时就应该确定其具体值。
    那么,readonly字段能不能使用变量来进行初始化呢?
    同样使用实验来验证我们的想法,代码如下:
    public class ReadOnlyAndConstClass{     private readonly int secondnum;     public ReadOnlyAndConstClass()     {          int t = 1;          secondnum =t +1;     }}
    很显然,是可以的,但必须在构造函数中。
    这是因为 readonly 是在计算时执行的,当然它可以用某些变量来进行初始化。
    到这里,总结出readonly及const的第二个区别:
    const 字段是编译时常数,而 readonly 字段可用于运行时常数(区别2)。
    当然,我们还能得出另外一个不同点:
    const 字段只能在该字段的声明中初始化。readonly 字段可以在声明或构造函数中初始化。因此,根据所使用的构造函数,readonly 字段可能具有不同的值。这说明不同的实例可以有不同的常量值,所以说,使用readonly来定义不变量更加灵活(其实,这也是readonly的最大特点)(区别3)。
    最后,补充最后一点区别:
    const对于引用类型的常数,可能的值只能是 string 和 null。而  readonly可以是用于任何类型字段的声明(区别4)。
    ————————————————
    版权声明:本文为CSDN博主「三五月儿」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/yl2isoft/article/details/11392777
  • 相关阅读:
    在sql中日期转化
    SQL Server标准版企业版个人版区别
    Oracle 9i默认用户
    SQL Server和Oracle的常用函数对比
    Delphi6函数大全
    Oracle 不支持 TOP 关键字
    c#连接数据库
    VC6安装及打开工程文件问题的解决
    error C4430: 缺少类型说明符 假定为 int。注意: C++ 不支持默认 int
    VC++ dll导出类
  • 原文地址:https://www.cnblogs.com/weilei/p/11498673.html
Copyright © 2011-2022 走看看