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

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

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

static const int ConstValue = ;

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

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

Console.WriteLine(ConstValue);

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

Console。WriteLine();

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

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

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

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

先说说值类型,例如:

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

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

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

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

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

    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();
Employee e2 = new Employee();
Employee e3 = new Employee();
Employee e4 = new Employee();
Employee e5 = new Employee();

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

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

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

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

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

DEMO下载

Readonly与const初识的更多相关文章

  1. 我所理解的readonly和const

    最近要给学校软件小组新成员讲几次课,所以把很多以前懒得学习的和模糊不清的知识点,重新学习了一下. MSDN是这样解释的: readonly 关键字与 const 关键字不同. const 字段只能在该 ...

  2. readonly与const

    readonly与const 在C#中,readonly 与 const 都是定义常量,但不同之处在于:readonly 是运行时常量,而 const 是编译时常量. ; public void Te ...

  3. 配置文件App.config的使用以及Readonly与Const的对比

    以前我们学习的时候都把连接数据库的连接字符串写在一个类中,因为我们的数据库都在自己电脑上.如果更换数据库地址,需要更改这个类,然后重新编译才可以连接到数据库.现在我们需要将连接字符串当道一个文件中,然 ...

  4. Usage of readonly and const

    Many new learners can not make sure the usage scenarios of readonly and const keywords. In my opinio ...

  5. readonly和const的区别

    readonly与const的区别1.const常量在声明的同时必须赋值,readonly在声明时可以不赋值2.readonly只能在声明时或在构造方法中赋值(readonly的成员变量可以根据调用不 ...

  6. c#:readonly与const的区别

    readonly与const的区别: 1.初始化:const  字段只能在该字段的声明中初始化. readonly  字段可以在声明或构造函数中初始化. 2.值: const 字段是编译时常量(con ...

  7. C#中的readonly跟const用法小结

    总结一下常量和只读字段的区别: 由来: 笔者也是在看欧立奇版的<.Net 程序员面试宝典>的时候,才发现自己长久以来竟然在弄不清出两者的情况下,混用了这么长的时间.的确,const与rea ...

  8. [C#] readonly vs const

    C#中的readonly和const两个关键字都可以用来定义系统变量,那两者之间有什么区别呢? 1. const变量赋值后,就不可以对其进行修改.且在定义时就需要给它赋值,使用const修饰的变量是s ...

  9. 编写高质量代码改善C#程序的157个建议——建议6: 区别readonly和const的使用方法

    建议6: 区别readonly和const的使用方法 很多初学者分不清readonly和const的使用场合.在我看来,要使用const的理由只有一个,那就是效率.但是,在大部分应用情况下, “效率” ...

随机推荐

  1. spring_150805_datasource

    实体类: package com.spring.model; public class DogPet { private int id; private String name; private in ...

  2. 矩阵快速幂 POJ 3070 Fibonacci

    题目传送门 /* 矩阵快速幂:求第n项的Fibonacci数,转置矩阵都给出,套个模板就可以了.效率很高啊 */ #include <cstdio> #include <algori ...

  3. STL中set底层实现方式

    Q:STL中set底层实现方式? 为什么不用hash? A: 第一个问题:set底层实现方式为RB树(即红黑树). 第二个问题: 首先set,不像map那样是key-value对,它的key与valu ...

  4. ios开发--一个苹果证书怎么多次使用——导出p12文件

    为什么要导出.p12文件 当我们用大于三个mac设备开发应用时,想要申请新的证书,如果在我们的证书里,包含了3个发布证书,2个开发证书,可以发现再也申请不了开发证书和发布证书了(一般在我们的证书界面中 ...

  5. Centos环境下部署游戏服务器-软件安装

    这篇文章主要介绍一下游戏服务器需要安装的软件和需要修改的配置.现介绍下项目,本项目服务器端是c++ + mysql组合,客户端是as写的,需要安装的服务为Mysql,Php,Apache, 以及一个n ...

  6. Win8.1安装VirtualSVN Server发生service visualSVN Server failed to start解决办法

    Service 'VisualSVN Server' failed to start. Please check VisualSVN Server log in Event Viewer for mo ...

  7. iOS xcode缓存问题

    Question: When I try to build my app in Xcode, I get this error message:PCH file built from a differ ...

  8. iOS:UIMapView地图视图控件的简单使用

    可以通过设置MKMapView的mapViewType设置地图类型 MKMapTypeStandard 普通地图 MKMapTypeSatellite 卫星云图  MKMapTypeHybrid 普通 ...

  9. c# ffmpeg视频转换

    c#  ffmpeg视频转换 什么是ffmpeg,它有什么作用呢,怎么可以使用它呢,带着问题去找答案吧!先参考百度百科把,我觉得它很强大无奇不有,为了方便大家我就把链接提供了! http://baik ...

  10. Node 实现 AES 加密,结果输出为“byte”。

    Node 实现 AES 加密,结果输出为"byte". 最近做个需求,对接一个平台的接口,该平台采用 AES (Advanced Encryption Standard)加密算法, ...