c# - C# 中的 const 和 readonly 关键字

标签 c# .net oop

我已经阅读了 C# 中的 const 和 readonly 关键字。这些关键字之间的区别之一是 const 的值在编译时解析,而 readonly 关键字在运行时解析。尽管我没有机会在我的任何项目中实现它们。所以我想尝试一下。我创建了我的库,我将在其他项目中使用它。 mylibrary中的代码如下

 namespace MyLibrary
 {
  public class Class1
  {
    public static readonly string MyVar = "Vikram";
    //public readonly string MyVar;
    //public Class1()
    //{
    //    MyVar = "Test";
    //}
  }
}

现在我将使用这个库作为我的其他控制台项目的引用,如下所示

class Program
{
    static void Main(string[] args)
    {
        //MyLibrary.Class1 class1 = new MyLibrary.Class1();
        Console.WriteLine(MyLibrary.Class1.MyVar); // output is vikram
        Console.ReadLine();
        Console.WriteLine(MyLibrary.Class1.MyVar); // changed to Test but still op as  vikram
        Console.ReadLine();
    }
}

现在,在这两个写入行之间,我将更改库中“MyVar”的值并重新编译它,根据 readonly 的概念,它应该反射(reflect)在控制台项目中,而无需重新编译我的主项目。

如果我对 readonly 关键字的理解有误,请纠正我。

P.S我已经浏览过this的答案关联。在其中一个答案中提到了以下内容

对于只读值,它就像对内存位置的引用。该值未纳入 AssemblyB 的 IL 中。这意味着如果内存位置被更新,程序集 B 无需重新编译即可获取新值。因此,如果 I_RO_VALUE 更新为 30,您只需构建 AssemblyA。所有客户端都不需要重新编译。

谁能解释一下粗线到底是什么意思。我认为这就是我在示例中所做的。

最佳答案

您的理解是正确的,但您无法更改已加载的程序集。您必须重新启动该程序。

我认为您可以通过反射更改 readonly 字段。这使得测试变得更容易。

顺便说一句,只读字段的值必须是运行时值,因为您可以在其上放置任意初始值设定项。 C# 编译器不可能对其进行硬编码,因为它无法静态地知道运行时值。

关于c# - C# 中的 const 和 readonly 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18034105/

相关文章:

javascript - 为什么 Function.prototype 上没有原型(prototype)属性?

c++ - extern是否破坏封装

c# - Fiddler 不捕获带有 "GetAsync"的流量

c# - Sharepoint 访问请求 "Permission"代码

c# - 我怎样才能预料到单元测试程序集不可见的类型异常?

c# - 如何使用 Entity Framework 以 DataGridView 可编辑和上下文跟踪更改的方式过滤数据?

java - getText() 出现为 Null

c# - 欧拉计划的问题问题 12

javascript - 访问 aspx 页面的客户端 javascript block 中由 RegisterClientScriptBlock 注入(inject)的 javascript 代码

c# - 什么是 Windows IPC 方法