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;
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的做法存在错误。
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
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