C# 中的 const 和 readonly 有什么区别?

What is the difference between const and readonly in C#?(C# 中的 const 和 readonly 有什么区别?)
本文介绍了C# 中的 const 和 readonly 有什么区别?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

C#中的constreadonly有什么区别?

What is the difference between const and readonly in C#?

你什么时候会使用其中一个?

When would you use one over the other?

推荐答案

除了明显的区别

  • 必须在定义 const 时声明值 VS readonly 值可以动态计算,但需要在构造函数退出之前分配.. 之后它被冻结了.
  • const 是隐含的 static.您使用 ClassName.ConstantName 表示法来访问它们.
  • having to declare the value at the time of a definition for a const VS readonly values can be computed dynamically but need to be assigned before the constructor exits.. after that it is frozen.
  • const's are implicitly static. You use a ClassName.ConstantName notation to access them.

有细微的差别.考虑在 AssemblyA 中定义的类.

There is a subtle difference. Consider a class defined in 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 并在代码中使用这些值.编译时:

AssemblyB references AssemblyA and uses these values in code. When this is compiled:

  • const 值的情况下,它就像一个查找替换.值 2 被烘焙到"AssemblyB 的 IL.这意味着,如果明天我将 I_CONST_VALUE 更新为 20,AssemblyB 在我重新编译之前仍然有 2.
  • readonly 值的情况下,它就像一个 ref 到一个内存位置.该值未烘焙到 AssemblyB 的 IL.这意味着如果内存位置被更新,AssemblyB 无需重新编译即可获得新值.所以如果I_RO_VALUE更新到30,只需要构建AssemblyA,所有客户端都不需要重新编译.
  • in the case of the const value, it is like a find-replace. The value 2 is 'baked into' the AssemblyB's IL. This means that if tomorrow I update I_CONST_VALUE to 20, AssemblyB would still have 2 till I recompile it.
  • in the case of the readonly value, it is like a ref to a memory location. The value is not baked into AssemblyB's IL. This means that if the memory location is updated, AssemblyB gets the new value without recompilation. So if I_RO_VALUE is updated to 30, you only need to build AssemblyA and all clients do not need to be recompiled.

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

So if you are confident that the value of the constant won't change, use a const.

public const int CM_IN_A_METER = 100;

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

But if you have a constant that may change (e.g. w.r.t. precision).. or when in doubt, use a readonly.

public readonly float PI = 3.14;

更新:Aku 需要提及,因为他首先指出了这一点.我还需要插入我学到的地方:Effective C# - Bill Wagner

这篇关于C# 中的 const 和 readonly 有什么区别?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!

本站部分内容来源互联网,如果有图片或者内容侵犯您的权益请联系我们删除!

相关文档推荐

DispatcherQueue null when trying to update Ui property in ViewModel(尝试更新ViewModel中的Ui属性时DispatcherQueue为空)
Drawing over all windows on multiple monitors(在多个监视器上绘制所有窗口)
Programmatically show the desktop(以编程方式显示桌面)
c# Generic Setlt;Tgt; implementation to access objects by type(按类型访问对象的C#泛型集实现)
InvalidOperationException When using Context Injection in ASP.Net Core(在ASP.NET核心中使用上下文注入时发生InvalidOperationException)
LINQ many-to-many relationship, how to write a correct WHERE clause?(LINQ多对多关系,如何写一个正确的WHERE子句?)