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
  • 相关阅读:
    unsupported jsonb version number 123
    如何在MPlayer上支持RTSP
    TDengine 时序数据库的 ADO.Net Core 提供程序 Maikebing.EntityFrameworkCore.Taos
    如何使用IoTSharp对接ModBus?
    如何从源码启动和编译IoTSharp
    Asp.Net Core 自动适应Windows服务、Linux服务、手动启动时的内容路径的扩展方法
    MQTTnet 的Asp.Net Core 认证事件的扩展
    Asp.Net Core 中利用QuartzHostedService 实现 Quartz 注入依赖 (DI)
    The remote certificate is invalid according to the validation procedure 远程证书验证无效
    settings插拔式源码
  • 原文地址:https://www.cnblogs.com/weilei/p/11498673.html
Copyright © 2011-2022 走看看