首页 > C# > C# 中的常量和只读有什么区别?

C# 中的常量和只读有什么区别?

上一篇 下一篇

网友问题:
C# 中的常量只读有什么区别?

你什么时候会使用一个而不是另一个?

分割线

网友回答:

有一个陷阱与康特!如果从另一个程序集引用一个常量,则其值将直接编译到调用程序集中。这样,当您更新引用程序集中的常量时,它不会在调用程序集中更改!

分割线

网友回答:

常数

  • 默认情况下,常量是静态的
  • 它们在编译时必须有一个值(例如你可以有 3.14 * 2,但不能调用方法)
  • 可以在函数中声明
  • 复制到使用它们的每个程序集中(每个程序集都会获得值的本地副本)
  • 可用于属性

只读实例字段

  • 在构造函数退出时必须具有设置的值
  • 在创建实例时进行评估

静态只读字段

  • 在代码执行命中类引用时(创建新实例或执行静态方法时)进行评估
  • 在静态构造函数完成时必须具有计算值
  • 不建议将 ThreadStaticAttribute 放在这些线程上(静态构造函数将仅在一个线程中执行,并将为其线程设置值;所有其他线程将未初始化此值)

分割线

网友回答:

除了明显的差异

  • 必须在定义 VS 值时声明值可以动态计算,但需要在构造函数退出之前分配。之后它被冻结。constreadonly
  • const的隐式 .您可以使用表示法来访问它们。staticClassName.ConstantName

有一个微妙的区别。考虑在 中定义的类。AssemblyA

public class Const_V_Readonly
{
  public const int I_CONST_VALUE = 2;
  public readonly int I_RO_VALUE;
  public Const_V_Readonly()
  {
     I_RO_VALUE = 3;
  }
}

AssemblyB在代码中引用和使用这些值。编译时:AssemblyA

  • 在值的情况下,它就像一个查找-替换。值 2 被“烘焙到”的 IL 中。这意味着如果明天我更新到 20,AssemblyB 在我重新编译它之前仍然会有 2constAssemblyBI_CONST_VALUE
  • 在值的情况下,它类似于内存位置。该值不会烘焙到 的 IL 中。这意味着,如果更新了内存位置,则无需重新编译即可获取新值。所以如果更新到 30,你只需要构建,所有客户端都不需要重新编译。readonlyrefAssemblyBAssemblyBI_RO_VALUEAssemblyA

因此,如果您确信常量的值不会更改,请使用 .const

public const int CM_IN_A_METER = 100;

但是,如果您有一个可能会更改的常量(例如 w.r.t. 精度)或有疑问,请使用 .readonly

public readonly float PI = 3.14;

更新:阿库需要提及,因为他首先指出了这一点。我还需要插入我学到这个的地方:有效的 C# – 比尔瓦格纳

模板简介:该模板名称为【C# 中的常量和只读有什么区别?】,大小是暂无信息,文档格式为.编程语言,推荐使用Sublime/Dreamweaver/HBuilder打开,作品中的图片,文字等数据均可修改,图片请在作品中选中图片替换即可,文字修改直接点击文字修改即可,您也可以新增或修改作品中的内容,该模板来自用户分享,如有侵权行为请联系网站客服处理。欢迎来懒人模板【C#】栏目查找您需要的精美模板。

相关搜索
  • 下载密码 lanrenmb
  • 下载次数 232次
  • 使用软件 Sublime/Dreamweaver/HBuilder
  • 文件格式 编程语言
  • 文件大小 暂无信息
  • 上传时间 02-10
  • 作者 网友投稿
  • 肖像权 人物画像及字体仅供参考
栏目分类 更多 >
热门推荐 更多 >
微信图片 微信文章 自适应 企业网站 微信模板 微信素材 html5 响应式 微信公众平台 单页式简历模板
您可能会喜欢的其他模板