Readonly与const初识
对于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赋值。
Readonly与const初识的更多相关文章
- 我所理解的readonly和const
最近要给学校软件小组新成员讲几次课,所以把很多以前懒得学习的和模糊不清的知识点,重新学习了一下. MSDN是这样解释的: readonly 关键字与 const 关键字不同. const 字段只能在该 ...
- readonly与const
readonly与const 在C#中,readonly 与 const 都是定义常量,但不同之处在于:readonly 是运行时常量,而 const 是编译时常量. ; public void Te ...
- 配置文件App.config的使用以及Readonly与Const的对比
以前我们学习的时候都把连接数据库的连接字符串写在一个类中,因为我们的数据库都在自己电脑上.如果更换数据库地址,需要更改这个类,然后重新编译才可以连接到数据库.现在我们需要将连接字符串当道一个文件中,然 ...
- Usage of readonly and const
Many new learners can not make sure the usage scenarios of readonly and const keywords. In my opinio ...
- readonly和const的区别
readonly与const的区别1.const常量在声明的同时必须赋值,readonly在声明时可以不赋值2.readonly只能在声明时或在构造方法中赋值(readonly的成员变量可以根据调用不 ...
- c#:readonly与const的区别
readonly与const的区别: 1.初始化:const 字段只能在该字段的声明中初始化. readonly 字段可以在声明或构造函数中初始化. 2.值: const 字段是编译时常量(con ...
- C#中的readonly跟const用法小结
总结一下常量和只读字段的区别: 由来: 笔者也是在看欧立奇版的<.Net 程序员面试宝典>的时候,才发现自己长久以来竟然在弄不清出两者的情况下,混用了这么长的时间.的确,const与rea ...
- [C#] readonly vs const
C#中的readonly和const两个关键字都可以用来定义系统变量,那两者之间有什么区别呢? 1. const变量赋值后,就不可以对其进行修改.且在定义时就需要给它赋值,使用const修饰的变量是s ...
- 编写高质量代码改善C#程序的157个建议——建议6: 区别readonly和const的使用方法
建议6: 区别readonly和const的使用方法 很多初学者分不清readonly和const的使用场合.在我看来,要使用const的理由只有一个,那就是效率.但是,在大部分应用情况下, “效率” ...
随机推荐
- eclipse导入maven项目后依赖jar包更新问题->update project按钮
eclipse导入maven项目后依赖jar包更新问题 1.eclipse有专门的导入maven项目按钮,file-import-maven project,eclipse会自动查找指定路径下的pom ...
- Spring框架学习之第5节
request session global-session 三个在web开发中才有意义 如果配置成prototype有点类似于request 如果配置成singleton有点类似于web开发中的gl ...
- mysql和oracle的一个汉字占几个字符
以前一直使用oracle11g,一个汉字占3个字节,所以在操作mysql时也一直这样分配长度. 今天测试了下发现不对了 可以看到第一个的长度确实是15,但是第二个为什么是5? 在网上找到资料:char ...
- iOS:核心动画之转场动画CATransition
转场动画——CATransition CATransition是CAAnimation的子类,用于做转场动画,能够为层提供移出屏幕和移入屏幕的动画效果.iOS比Mac OS X的转场动画效果少一点 U ...
- PowerDesigner将PDM导出生成WORD文档
PowerDesigner将PDM导出生成WORD文档 环境 PowerDesigner15 1.点击Report Temlates 制作模板 2.如果没有模板,单击New图标创建.有直接双击进入. ...
- Hadoop namenode无法启动问题解决
原因:在root账户(非hadoop账户)下操作hadoop会导致很大的问题 首先运行bin/start-all.sh发现namenode没有启动 只有它们 9428 DataNode 9712 Jo ...
- HDU 4622 Reincarnation 后缀自动机
模板来源:http://blog.csdn.net/zkfzkfzkfzkfzkfzkfzk/article/details/9669747 解法参考:http://blog.csdn.net/dyx ...
- hiho #1332 : 简单计算器 栈+递归
#1332 : 简单计算器 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 编写一个程序可以完成基本的带括号的四则运算.其中除法(/)是整除,并且在负数除法时向0取整.( ...
- apiCloud创建APP项目
1.注册一个apiCloud账户 2.创建一个应用 3.安装sublime插件 4.用sublime创建应用 5.配置参数,保证一致 6.上传代码,两种方式 一种是压缩成zip 一种是配置svn,通过 ...
- WEBUS2.0 In Action - 搜索操作指南 - (4)
上一篇:WEBUS2.0 In Action - 搜索操作指南(3) 6. 搜索多个索引 为了提升性能, 我们可以从多个索引同时进行搜索, Webus.Search.MultiSearcher提供了相 ...