c#如何区分静态只读变量和常量
常量const
常量就是一个其值永远不会改变的静态字段。常量的值会在编译时自动推算,编译器会在遇到常量时,将其逐个替换为该常量的值。常量可以是C#内建的任何数字类型或枚举类型。声明一个常量的时候必须对其进行初始化。
例如:
class Program { const int a = 2; static void Main(string[] args) { Console.WriteLine(a); Console.ReadLine(); } }
那么编译之后的IL的代码有两行值得注意:
1. const int a=2; 编译为.field private static literal int32 a = int32(0x00000002)
2. 在Console.WriteLine之前,常量的值被编译器推算出来:
IL_0001: ldc.i4.2;
IL_0002: call void [mscorlib]System.Console::WriteLine(int32)
静态只读static readonly
静态只读常量只是在某一个应用程序中初始化之后,不能对其进行修改。但是在不同的应用程序中可以有不同的值。
同样,对于上面的例子,如果我们把变量a更改为静态只读,那么IL代码有哪些变化呢?
1. static readonly int a=2;编译为.field private static initonly int32 a
2.在Console.WriteLine之前,不会推算其值:
IL_0001: ldsfld int32 Learning.LinqDemo.ConsoleApp.Program::a
IL_0006: call void [mscorlib]System.Console::WriteLine(int32)
两者的区别:
简单的一句话就可以:常量在所有的程序中都是同一个值,而静态只读变量在不同的程序中可以有不同的值。