65.9K
CodeProject 正在变化。 阅读更多。
Home

Const 和 Readonly 关键字

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.44/5 (9投票s)

2013 年 1 月 31 日

CPOL

3分钟阅读

viewsIcon

61022

在 C# 中何时、什么和如何使用常量。

引言

这两个词在定义应用程序(C#)中的常量时都起着非常重要的作用。乍一看,它们似乎是相同的,但事实并非如此。让我们逐一理解它们,以便有一个清晰的认识。

const 词本身意味着它永远不会改变。如果您将任何变量指定为 const,则意味着该变量的值永远不会在应用程序内部更改。

我们声明常量的方式是使用 const 关键字。基本上,只能在基本类型(如 intdouble 等)上定义 const。应该确保在声明时就分配该值,而另一件重要的事情是,无论为 const 变量设置什么值,该值都将在编译时设置,并且该值将存储在 .dll.exe 中。在后面部分,我将向您展示如何使用 Ildasm 在 DLL 或 EXE 中查看此值。定义 const 变量的示例代码如下

另一个关键字是 readonlyreadonly 一词听起来也像 const,但对于只读变量,一旦分配了值,就无法更改该值。这意味着它限制了我们对值的赋值。定义 readonly 的示例代码如下所示

更深入的组合示例代码

请注意,只读变量可以在声明时或在构造函数内部赋值。这两个是唯一可以为只读变量赋值的地方。对于 readonly,值赋值是在运行时完成的,并且在内存分配方面,常规变量和只读变量之间没有区别。

在上面的代码中,让我们在 Main 函数中更改 PIage 变量的值,如下所示

现在的问题是,如果两者具有相同的性质,那么创建两个不同的东西有什么意义呢?嗯,事实并非如此,因为 const 是编译时常量,而 readonly 是运行时常量。我们大多数人可能都知道,编译时常量的值是在声明时设置的,并且也可以在 ildasm 中看到这一点。对于运行时常量,这些是在运行时设置的,这就是为什么不必在声明时就为只读变量赋值的原因,因为也可以在构造函数中为它们赋值,如下所示

何时使用什么?

如果该值将在整个程序中固定,并且在任何情况下都不会更改,则应选择 const

但另一方面,如果初始值的赋值取决于某个参数/条件,并且需要在运行时确定值,则可以选择只读,并基于此设置只读变量的初始值。但请注意,一旦分配了值,在应用程序的整个生命周期内,根本不可能再进行修改。

ILDASM 和常量

现在,让我们快速跳转到 ildasm 以证明这两个的值分配。

正如我之前提到的,const 是编译时常量,并且在声明时就已赋值。因此,可以使用 IL 代码通过 ildasm 证明这一点。在 ildasm 中,可以在十六进制中看到 const 变量的值,但对于只读变量,在 ildasm 的 PI 变量中没有分配此类值。

希望以上提示对您有用。

© . All rights reserved.