zoukankan      html  css  js  c++  java
  • c#如何区分静态只读变量和常量

    常量const

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

    例如:

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

    那么编译之后的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)

    两者的区别:

    简单的一句话就可以:常量在所有的程序中都是同一个值,而静态只读变量在不同的程序中可以有不同的值。

  • 相关阅读:
    SEO优化---学会建立高转化率的网站关键词库
    从一个程序员的角度看——微信小应用
    当AngularJS POST方法碰上PHP
    angularJS(6)
    彻底解决显示Opencv中Mat图像到Mfc窗口问题
    数据结构与算法基础总结
    java类别问题
    java基础知识
    逻辑地址、线性地址、物理地址和虚拟地址的区别
    TCP协议中的三次握手和四次挥手(图解)
  • 原文地址:https://www.cnblogs.com/yang_sy/p/3556275.html
Copyright © 2011-2022 走看看