我在程序集中有以下代码:
public class Class1
{
public const int x = 10;
}在一个不同的程序集中,我有:
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Class1.x);
Console.ReadKey();
}
}当然,输出是10,但后来我将x更改为20
public class Class1
{
public const int x = 20;
}我重新编译了程序集,并将其移到命令行程序的bin目录中。但是,我的程序的输出仍然是10,直到我编译了包含main函数的程序集。
为什么会发生这种情况?
发布于 2014-06-15 08:07:35
C#中的常量值是在使用它们的位置排列的.也就是说,行Console.WriteLine(Class1.x);将被编译为Console.WriteLine(10);。生成的IL代码如下所示:
.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程序集之前,它将具有内联值10。MSDN对常量使用的这种情况有警告:
不要创建一个常量来表示您希望随时更改的信息。例如,不要使用常量字段存储服务的价格、产品版本号或公司的品牌名称。随着时间的推移,这些值可能会发生变化,而且由于编译器传播常量,因此必须重新编译与库一起编译的其他代码才能看到更改。
他们提到常数表达式只在编译时计算。即,Class1.x将在Main程序集编译时进行评估,以求值10。如果没有重新编译,这个值就不会改变。但不幸的是,它并没有清楚地解释这种行为的原因(至少对我来说)。
顺便说一下,在调用方法的地方,命名参数和可选参数值也是内联的,您还需要重新编译调用程序集来更新值。
https://stackoverflow.com/questions/24227690
复制相似问题