zoukankan      html  css  js  c++  java
  • C#基础知识系列八(const和readonly关键字)

    C#基础知识系列八(const和readonly关键字)

    前言

      不知道大家对const和readonly这两个关键字的区别有什么了解,原来自己之前还真不清楚它们到底是怎么回事,那么如果你也不是很清楚的话,可以一起来探讨一下。在了解这两个关键字的时候我们先来了解一下静态常量和动态常量。

      静态常量:是指编译器在编译时候会对常量进行解析,并将常量的值替换成初始化的那个值。

      而动态常量的值则是在运行的那一刻才获得的,编译器编译期间将其标示为只读常量,而不用常量的值代替,这样动态常量不必在声明的时候就初始化,而可以延迟到构造函数中初始化。现在再来说明const与readonly吧。

    readonly和const

      const修饰的常量是上述中的第一种,即静态常量;而readonly则是第二种,即动态常量。那么区别可以通过静态常量与动态常量的特性来说明:

       1、const修饰的常量在声明的时候必须初始化;readonly修饰的常量则可以延迟到构造函数初始化 

           2、const修饰的常量在编译期间就被解析,即常量值被替换成初始化的值;readonly修饰的常量则延迟到运行的时候

       3、const修饰的常量注重的是效率;readonly修饰的常量注重灵活

       4、const修饰的常量没有内存消耗;readonly因为需要保存常量,所以有内存消耗

       5、const只能修饰基元类型、枚举类、或者字符串类型;readonly却没有这个限制

    第一个例子:

    如果在const前面加了一个static的话,那显然是错误的,因为const编译之后就已经是static静态字段了

    在编译之后const 变量就会被替换成变量的值了,这也就是为什么说它是高效了。

            const double pi = 3.1415926;
            static void Main(string[] args)
            {
                Console.WriteLine(pi);
                Console.ReadLine();
            }

    打印变量的代码编译之后就已经是

    Console.WriteLine((double) 3.1415926);

    第二个例子:

    接下来看一下readonly的小例子

    复制代码
        class Person
        {
            public readonly string Name;
            public Person(string name)
            {
                this.Name = name;
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                Person person = new Person("aehyok");
                person.Name = "Leo";
                Console.ReadLine();
            }
        }
    复制代码

    Person实例 name 在构造函数中被赋值后就不可变,下面的代码在编译后会报错

    接下来我们看一下另外一种情况

    复制代码
        class Person
        {
            public string Name;
            public Person(string name)
            {
                this.Name = name;
            }
        }
    
        class Worker
        {
            public readonly Person Person;
            public Worker(Person person)
            {
                this.Person = person;
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                Worker worker = new Worker(new Person("aehyok"));
                worker.Person = new Person("Leo");
    
                worker.Person.Name = "Leo";
    
                Console.ReadLine();
            }
        }
    复制代码

    来看编译后的效果

    这一点不知是否可以说是readonly的灵活呢

    第三个例子:

    复制代码
        class Program
        {
            static readonly int A = B * 10;
            static readonly int B = 10;
            public static void Main(string[] args)
            {
                Console.WriteLine("A is {0},B is {1} ", A, B);
                Console.ReadLine();
            }
        }
    复制代码

    结果很简单

    道理也比较简单,就是static readonly是动态常量,变量的值在编译期间不予以解析,所以开始都是默认值,像A与B都是int类型,故都是0。而在程序执行到A=B*10;所以A=0*10=0,程序接着执行到B=10这句时候,才会真正的B的初值10赋给B。

    总结

       对于const和readonly这两个关键字目前来说,也算是有所了解了,还是学了不少东西,如果看完本文还有疑问的话,你可以通过微软提供的ILDASM工具。

    打开cmd命令之后,输入ILDASM。

    打开exe文件进行查看IL执行过程,慢慢研究吧。 

     
     
    分类: C#
  • 相关阅读:
    webdav srs相关
    How To Configure WebDAV Access with Apache on Ubuntu 14.04
    ubuntu 编译lighttpd
    srs编译及推流测试
    Compile pciutils (lspci, setpci) in Windows x86,在 Windows x86 平台下编译 pciutils (lspci, setpci)
    mingw MSYS2 区别
    Qt之美(三):隐式共享
    Qt之美(二):元对象
    Qt之美(一):d指针/p指针详解
    C++的栈空间和堆空间
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3530348.html
Copyright © 2011-2022 走看看