常量和只读

Anonim

在继续实现代码之前,了解C#编程的概念非常重要。在我们跳到const和readonly之间的差异之前,让我们首先理解关键字以及它们在程序中的使用方式。两者都是C#编程中最常用的关键字,基本上用于相同的目的。但是,这两个关键字彼此非常不同。 Const是用于表示常量值的保留字,它指定在编译时不能修改值,而readonly是可以在字段上使用的修饰符,其值可以在运行时更改。让我们来看看const和readonly之间的一些关键差异。

什么是Const?

Const是指一个常量变量,其值必须在声明期间仅分配一次。当在声明期间使用关键字const时,它变为常量,意味着值保持不变,并且不能在整个程序中更改。它更像是一个保留字,它指定在编译时不能修改值。默认情况下,const是隐式静态的,因此可以使用“Classname.VariableName”使用类名调用它。常量值也称为文字。它可以是任何基本数据类型,例如整数const,浮点const或字符串文字。

什么是ReadOnly?

Readonly关键字是一个修饰符,只能用于字段而不能用于局部变量。 readonly字段可以在声明时或在同一个类中的构造函数内初始化,因此对于程序的不同执行,值可以是不同的,具体取决于所使用的构造函数。 readonly关键字指定对象的实例变量不可修改,并且在声明之后修改它的任何尝试都会导致编译错误。在执行之前,变量不会变为不可修改。变量只是为了停止调用代码在构造之后意外修改它。

Constant和ReadOnly之间的区别

  1. 基本

Constant(const)关键字只是不可变变量,其值只能在编译时初始化。这些常量值也称为文字。它只是允许我们指定变量是否可修改。简单来说,常量是隐式静态的,应该在它们用于程序之前进行初始化。另一方面,Readonly关键字是一个可以在字段上使用的修饰符,其值可以在运行时更改。它可以防止字段被更改,并且可以通过引用变量设置其值。

  1. 初始化

默认情况下,const是静态的,并且应该在变量声明时分配值,这意味着仅在编译时分配值。使用“const”关键字声明常量。常量字段的初始化必须是常量表达式,并且不能修改。简单地说,const是一个编译时常量。另一方面,只读字段只能在类级别而不是在方法内部初始化,并且在初始化之后不能修改字段。换句话说,只能在声明时或构造函数内初始化只读变量。

  1. 内存分配

const值直接放入代码中,因为它充当编译时替换。编译器将常量值放在定义常量的程序集元数据中,并在初始化后将值嵌入IL代码本身,因此运行时的常量不需要内存来进行分配。 Readonly值不是常量,它存储在加载器堆中,在加载类型之前无法分配的内存。只读字段存储在动态存储器中,因此只能在运行时获取值。

  1. 二进制版本

虽然这两个关键字几乎都用于相同的目的,但它们具有不同的二进制版本语义。当表达式引用常量时,编译器会在编译时嵌入该值。因此,如果在不同的程序集中使用该值,则需要更新原始程序集并更改值。装配中的更改在重新编译之前不会反映出来。当表达式引用只读字段时,直到运行时才会获取该值。如果在不同的程序集中更改了值,则更改会在加载后立即反映在程序集中,而无需重新编译它。

Const与Readonly:比较图表

Const与Readonly的总结

这两个关键字都用于声明成员的相同内容,以便在整个程序中不能更改这些值。但是,const关键字与readonly关键字非常不同。 Const是一个常量变量,其值应在编译时初始化,而readonly字段只能在类级别初始化,无论是在声明时还是在构造函数内部。 Const是编译时常量,而readonly字段是只读的。可以使用“Classname.VariableName”访问Constance变量,而可以使用“InstanceName.VariableName”访问只读变量。此外,const变量可以在方法中声明,而readonly字段不能在方法中声明。