Const 和 Readonly 关键字






4.44/5 (9投票s)
在 C# 中何时、什么和如何使用常量。
引言
这两个词在定义应用程序(C#)中的常量时都起着非常重要的作用。乍一看,它们似乎是相同的,但事实并非如此。让我们逐一理解它们,以便有一个清晰的认识。
const
词本身意味着它永远不会改变。如果您将任何变量指定为 const
,则意味着该变量的值永远不会在应用程序内部更改。
我们声明常量的方式是使用 const
关键字。基本上,只能在基本类型(如 int
、double
等)上定义 const
。应该确保在声明时就分配该值,而另一件重要的事情是,无论为 const
变量设置什么值,该值都将在编译时设置,并且该值将存储在 .dll 或 .exe 中。在后面部分,我将向您展示如何使用 Ildasm 在 DLL 或 EXE 中查看此值。定义 const
变量的示例代码如下
另一个关键字是 readonly
。readonly
一词听起来也像 const
,但对于只读变量,一旦分配了值,就无法更改该值。这意味着它限制了我们对值的赋值。定义 readonly
的示例代码如下所示
更深入的组合示例代码
请注意,只读变量可以在声明时或在构造函数内部赋值。这两个是唯一可以为只读变量赋值的地方。对于 readonly
,值赋值是在运行时完成的,并且在内存分配方面,常规变量和只读变量之间没有区别。
在上面的代码中,让我们在 Main
函数中更改 PI
和 age
变量的值,如下所示
现在的问题是,如果两者具有相同的性质,那么创建两个不同的东西有什么意义呢?嗯,事实并非如此,因为 const
是编译时常量,而 readonly
是运行时常量。我们大多数人可能都知道,编译时常量的值是在声明时设置的,并且也可以在 ildasm 中看到这一点。对于运行时常量,这些是在运行时设置的,这就是为什么不必在声明时就为只读变量赋值的原因,因为也可以在构造函数中为它们赋值,如下所示
何时使用什么?
如果该值将在整个程序中固定,并且在任何情况下都不会更改,则应选择 const
。
但另一方面,如果初始值的赋值取决于某个参数/条件,并且需要在运行时确定值,则可以选择只读,并基于此设置只读变量的初始值。但请注意,一旦分配了值,在应用程序的整个生命周期内,根本不可能再进行修改。
ILDASM 和常量
现在,让我们快速跳转到 ildasm 以证明这两个的值分配。
正如我之前提到的,const
是编译时常量,并且在声明时就已赋值。因此,可以使用 IL 代码通过 ildasm 证明这一点。在 ildasm 中,可以在十六进制中看到 const 变量的值,但对于只读变量,在 ildasm 的 PI 变量中没有分配此类值。
希望以上提示对您有用。