首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在重新编译引用程序集时不变的常量值

在重新编译引用程序集时不变的常量值
EN

Stack Overflow用户
提问于 2014-06-15 08:06:15
回答 2查看 1.9K关注 0票数 14

我在程序集中有以下代码:

代码语言:javascript
运行
复制
public class Class1
{
    public const int x = 10;
}

在一个不同的程序集中,我有:

代码语言:javascript
运行
复制
class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine(Class1.x);
        Console.ReadKey();
    }
}

当然,输出是10,但后来我将x更改为20

代码语言:javascript
运行
复制
public class Class1
{
    public const int x = 20;
}

我重新编译了程序集,并将其移到命令行程序的bin目录中。但是,我的程序的输出仍然是10,直到我编译了包含main函数的程序集。

为什么会发生这种情况?

EN

Stack Overflow用户

回答已采纳

发布于 2014-06-15 08:07:35

C#中的常量值是在使用它们的位置排列的.也就是说,行Console.WriteLine(Class1.x);将被编译为Console.WriteLine(10);。生成的IL代码如下所示:

代码语言:javascript
运行
复制
  .entrypoint
  .maxstack  8
  IL_0000:  nop
  IL_0001:  ldc.i4.s   10  // here just integer value 10 is loaded on stack
  IL_0003:  call       void [mscorlib]System.Console::WriteLine(int32)

不会有到Class1的任何链接。因此,在重新编译Main程序集之前,它将具有内联值10MSDN对常量使用的这种情况有警告:

不要创建一个常量来表示您希望随时更改的信息。例如,不要使用常量字段存储服务的价格、产品版本号或公司的品牌名称。随着时间的推移,这些值可能会发生变化,而且由于编译器传播常量,因此必须重新编译与库一起编译的其他代码才能看到更改。

他们提到常数表达式只在编译时计算。即,Class1.x将在Main程序集编译时进行评估,以求值10。如果没有重新编译,这个值就不会改变。但不幸的是,它并没有清楚地解释这种行为的原因(至少对我来说)。

顺便说一下,在调用方法的地方,命名参数和可选参数值也是内联的,您还需要重新编译调用程序集来更新值。

票数 21
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24227690

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档