• Readonly与const初识


    对于readonly和const,很多人无法具体区分,不清楚它们的具体使用场合;现在我们分析它们之间的区别和使用场合。

    const是一个编译期常量;const只能用于修饰基元类型、枚举类型或者字符串类型,具有局限性;

    因为const是编译期常量,所以const天然就是static的,不用手动的为其增加static修饰符,例如:

    static const int ConstValue = 100;

    编译时,将会提示“常量 ConstValue不能标记为static”;

    const最大的优点在于 “效率”,这也是使用const的理由,之所以说const效率高,是因为它在经过编译器编译后,我们在代码中引用const变量的地方会用const变量所对应的实际的值来代替,例如:

    Console.WriteLine(ConstValue);

    其实代码生成的IL代码则为

    Console。WriteLine(100);

    此时程序将不再通过变量来寻找对应的值。

    然而readonly是一个运行时常量,并且readonly可以修饰任何类型,没有限制,其赋值行为发生在运行时,readonly的全部意义在于,它在运行时第一次被赋值后将不可以改变,当然了,这个可以分为两个意思

    1.对于值类型变量,值本身不可改变

    2.对于引用类型变量,引用本身不可改变(指针不可改变)

    先说说值类型,例如:

        class Employee {
            public readonly int ReadOnlyNumber;
    
            public Employee(int value) {
                ReadOnlyNumber = value;
            }
        }
    View Code

    Employee的实例ReadOnlyNumber在构造方法中被赋值,之后将不可改变,例如

                Employee emp = new Employee(100);
                emp.ReadOnlyNumber = 20;

    此代码将无法通过编译,提示“无法对只读字段赋值(构造函数或者变量初始值指定项中除外)”;

    针对于引用类型变量,我们可以做如下的修改

        class Boss {
            public string Name { get; set; }
        }
    
    
        class Employee2
        {
            public readonly Boss ReadOnlyBoss;
    
            public Employee2(Boss value)
            {
                ReadOnlyBoss = value;
            }
        }

    Employee2的ReadOnlyBoss是一个引用类型变量,在其被赋值后,变量不能再指向任何其他的Boss实例;例如

                Employee2 emp2 = new Employee2(new Boss() { Name="Witt"});
                emp2.ReadOnlyBoss = new Boss() { Name = "Witt2" };

    这段代码将无法编译成功,因为ReadOnlyBoss不能在赋值后再指向任何其他的实例。

    但是呢,之前我们说过,引用本身不可改变,但是引用所指向的实例的属性值却可以随意修改,例如下面这段代码将可以通过

                Employee2 emp2 = new Employee2(new Boss() { Name="Witt"});
                //emp2.ReadOnlyBoss = new Boss() { Name = "Witt2" };
                emp2.ReadOnlyBoss.Name = "Witt2";

    readonly所代表的运行时含义有一个重要的作用,就是可以为每一个类的实例指定一个readonly的变量,我们以前面的Employee来举例说明;

                Employee e1 = new Employee(10);
                Employee e2 = new Employee(100);
                Employee e3 = new Employee(200);
                Employee e4 = new Employee(300);
                Employee e5 = new Employee(400);

    在这里,每个实例都生成了自己的readonly变量,这也就是readonly的优点。

    好了,说了这么多,相信大家也都明白了,const的优点在于效率,但却没有readonly灵活,在程序对效率的要求并不高时(效率的地位不高),readonly则成为你更好的选择,因为readonly没有更多的灵活性。

    现在说一下注意点,之前我说过readonly在赋值之后将不能被再次赋值,这是错误的,下面这个例子将很好的说明这一点

        class Employee {
            public readonly int ReadOnlyNumber = 50;
            public Employee(int value) {
                ReadOnlyNumber = value;
                ReadOnlyNumber += 20;
                ReadOnlyNumber *= 2;
            }
        }

    ReadOnlyNumber在初始化器中被赋值为50,后来,在构造中又被多次赋值;实际上,我们可以将初始化器理解成构造方法的一部分,在构造方法中,我们确实可以多次对ReadOnlyNumber赋值。

    DEMO下载

  • 相关阅读:
    CF799B T-shirt buying
    luogu3469 [POI2008]BLO_Blockade
    luogu2746 校园网
    USACO 2.2 Party Lamps 【高能等效+规律枚举】
    USACO 2.2 Subset Sums 【经典的方案DP+必要的转化】
    USACO 2.2 Preface Numbering 【实质是分治思想】
    bzoj 1051: [HAOI2006]受欢迎的牛 (Tarjan 缩点)
    bzoj 1088: [SCOI2005]扫雷Mine
    bzoj 2761: [JLOI2011]不重复数字 (map||Treap)
    bzoj 1230: [Usaco2008 Nov]lites 开关灯
  • 原文地址:https://www.cnblogs.com/xufei/p/3530431.html
Copyright © 2020-2023  润新知