2

我已经阅读了 C# 中的 const 和 readonly 关键字。这些关键字之间的区别之一是 const 的值在编译时解析,而 readonly 关键字在运行时解析。虽然我没有机会在我的任何项目中实施它们。所以我想试一试。我创建了我将在我的其他项目中使用的 mylibrary。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();
    }
}

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

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

PS我已经通过这个链接的答案。在其中一个答案中提到了以下内容

在只读值的情况下,它就像一个内存位置的引用。该值未包含在 AssemblyB 的 IL 中。这意味着如果内存位置被更新,程序集 B 无需重新编译即可获得新值。所以如果 I_RO_VALUE 更新为 30,则只需要构建 AssemblyA。所有客户端都不需要重新编译。

谁能解释一下粗线的确切含义。我认为这就是我在我的例子中所做的。

4

5 回答 5

3

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

我认为你可以readonly通过反射改变一个领域。这使得测试它变得更容易。

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

于 2013-08-03T14:54:55.640 回答
1

我认为您并不完全理解 readonly 修饰符的含义。检查此参考以获取有关它的信息。

请注意以下行:

public static readonly string MyVar = "Vikram";

并不意味着每次你提到MyVar它的价值都会被重新评估。
这只是意味着一旦MyVar设置了 的值,它就不会再次更改,使其只读以供进一步使用。

例如,以下几行:

public class Class1
{
    public static readonly string MyVar;

    public Class1()
    {
        MyVar = SomeCalculation();
    }

    Console.WriteLine(MyLibrary.Class1.MyVar);
    Console.WriteLine(MyLibrary.Class1.MyVar);
}

只会触发SomeCalculation()一次!

于 2013-08-03T15:03:50.997 回答
0

你只需要构建AssemblyA。所有客户端都不需要重新编译。

有组装A和组装B。程序集A在某处有 const 表达式,例如:

public const int number = 10;

如果number在程序集中使用它,编译器将简单地将变量B的“原始”值放入程序集的元数据中。如果在 中更改,则不会更改任何内容。要使程序集中的嵌入值更改,也必须重新编译。这种行为的好处之一是无需加载程序集即可使用程序集。numberBnumberABBBAB

但是,在 的情况下readonly,从这个角度来看,它的工作方式与所有其他(实例|类)字段一样。它不像静态方式那样工作const(const被认为是唯一的类级变量,绝不是实例变量)

于 2013-08-04T17:01:15.417 回答
0

只读:内存在运行时分配,值在运行时初始化。

常量:它使用“常量”关键字。在声明时赋值。该值将在整个程序中保持不变。例如。const int i=5;

于 2013-08-03T16:26:42.847 回答
0

在我的博客上阅读了一些关于关键字的信息后,我写了一篇文章

博客常量的一些摘录

  • 在定义时将值提供给 const 字段。
  • 然后编译器将常量的值保存在程序集的元数据中
  • 常量总是被认为是静态成员,而不是实例成员。
于 2015-07-14T04:57:06.970 回答