Const、Readonly 和 Static
介绍
C# 提供了const、readonly和static readonly等关键字,当您最需要它们时,它们可能会造成混淆。这三个关键字之间的细微差别会导致应用程序中的执行流程完全不同。本指南将带您了解这些巧妙的细节以及在应用程序中正确使用这些关键字所需了解的内容。
持续的
const关键字只会转换一个常量。这些变量的特殊之处在于它们需要在编译时有一个值,并且默认情况下它们是静态的。此默认值意味着将创建变量的单个副本并在所有对象之间共享。如果您通过类使用此上下文,则可以通过类的名称访问它们。对于引用解决方案的复杂应用程序,在程序集之间获取常量的本地副本也很重要。
举例来说,看一下常数。
const string myConstant;
默认情况下,这会引发编译时错误,因为您需要在编译之前为常量提供一个值。正确的形式应该是:
const string myConstant = "Constants are cool!"
一个例外是当你在函数中定义常量时。
static string TestConst()
{
const string solved = "This is a viable solution!";
return solved;
}
使用以下语句调用该函数:
Console.WriteLine($"The constant returned was: {TestConst()}");
以上内容为我们提供了以下控制台输出。请注意允许函数调用的基于f 字符串的字符串插值。
The constant returned was: This is a viable solution!
只读
readonly关键字是一个特殊的修饰符,与const关键字非常相似。它可以用于字段,但不能用于局部变量。这些字段可以在声明时初始化,也可以在对象的构造函数中初始化。此关键字确保对象的变量实例或属性在初始化后不能被修改,这种尝试将导致异常。const 在编译时初始化,而readonly关键字允许在编译时或运行时初始化变量。
从编译器的角度来看,这两种初始化都是很好的。
public readonly string compileTime = "Whateeeva";
public readonly string runTime;
compileTime变量告诉您这是预先初始化的。没有抛出任何异常,runTime指示此变量的值将使用类的构造函数进行初始化。
让我们举一个例子。
class Student
{
public readonly string FullName;
public Student(string name)
{ FullName = name; }
}
此定义保存了在运行时初始化的类的FullName属性,但由于readonly关键字的性质,编译仍然成功。
让我们实例化我们的类并打印FullName。
Student Daniel = new Student( "Szabó Dániel Ernő");
Console.WriteLine($"The full name of the student is : {Daniel.FullName}");
如果我们一切操作正确,控制台上应该可以看到以下输出。
The full name of the student is : Szabó Dániel Ernő
核心差异
从最高层次上讲,如果我们要区分readonly和const关键字。我们可以说,区别在于变量的值在应用程序的整个生命周期中是否已知。对于readonly关键字,运行时知道最新值。对于const关键字,编译时必须知道该值。这两个关键字的共同点是它们都涵盖不可变数据类型,这意味着该值在应用程序的整个生命周期中都不能改变。
对于const关键字,标记为 const 的变量由编译器放置在定义常量和元数据的程序集元数据中,并在初始化后将值嵌入到IL代码中。这意味着在运行时不会为常量分配内存。在底层,readonly值不是常量;它存储在加载器堆中,这是一种在加载类型之前无法分配的内存类型。readonly字段存储在动态内存中,其值只能在运行时访问。
尽管非常相似,但这些关键字使用不同的二进制版本控制。当表达式引用特定常量时,编译器会在编译时嵌入该值。这意味着。如果该值在不同的程序集中使用,则需要更新原始值并更改该值。程序集中的更改只有在重新编译后才会反映出来。当表达式引用只读字段时,直到运行时才会获取该值。值的更改会立即反映出来,无需重新编译程序集。
结论
这两个关键字背后的想法是相同的。我们希望标记一个变量以在应用程序执行期间保存其值并且不允许修改。第一个区别是初始化const或readonly变量的时间段。第一个 const 在编译时初始化,而后者 readonly 在最近的运行时初始化。第二个区别是readonly只能在类级别初始化。另一个重要的区别是const变量可以通过“ClassName.VariableName”引用,而readonly可以通过“InstanceName.VariableName”引用。我已经尽我所能介绍了差异和相似之处,希望您能找到您想要的东西。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~