c#如何区分静态只读变量和常量

常量const

常量就是一个其值永远不会改变的静态字段。常量的值会在编译时自动推算,编译器会在遇到常量时,将其逐个替换为该常量的值。常量能够是C#内建的任何数字类型或枚举类型。声明一个常量的时候必须对其进行初始化。ide

例如:spa

class Program
{
    const int a = 2;        
    
    static void Main(string[] args)
    {           
        Console.WriteLine(a);
        Console.ReadLine();
    }
}
Const Sample

那么编译以后的IL的代码有两行值得注意:code

1. const int a=2; 编译为.field private static literal int32 a = int32(0x00000002)blog

2. 在Console.WriteLine以前,常量的值被编译器推算出来:
IL_0001:  ldc.i4.2; 
IL_0002:  call       void [mscorlib]System.Console::WriteLine(int32)编译器

 

静态只读static readonly

静态只读常量只是在某一个应用程序中初始化以后,不能对其进行修改。可是在不一样的应用程序中能够有不一样的值。string

一样,对于上面的例子,若是咱们把变量a更改成静态只读,那么IL代码有哪些变化呢?it

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)event

二者的区别:

简单的一句话就能够:常量在全部的程序中都是同一个值,而静态只读变量在不一样的程序中能够有不一样的值。class

相关文章
相关标签/搜索