Const(常量)与readonly(只读)的区别
const与readonly定义的值都不能更改,但它们到底有哪些异同点呢?
Const
² Const是常量的意思,其定义的变量只能读取不能更改,且只能在定义时初始化,不能在构造函数与其它属性与方法中初始化
public class ConstTest
{
/// <summary>
/// const定义的变量
/// </summary>
public const int SUM = 100;
public ConstTest()
{
//错误!const定义的变量不能在构造函数中初始化
SUM = 100;
}
public void method()
{
//错误!const定义的变量不能在方法中初始化
SUM = 100;
}
}
² Const 定义的字段属于类访问,类似于静态变量,只能通过类名来访问
//只能通过类名访问
Console.WriteLine(ConstTest.SUM);
ConstTest t = new ConstTest();
//错误!无法通过实例对象访问
Console.WriteLine(t.SUM);
² Const 只能定义值类型与字串,若定义引用类型的变量,只能初始化为null
/// <summary>
/// const定义的变量
/// </summary>
public const int SUM = 100;
public const string CHARACTER_STRING = "We are chinese!我们都是中国人!";
/// <summary>
/// const定义的引用类型只能初始化为null
/// </summary>
public const Object obj = null;
/// <summary>
/// 错误!const定义的引用类型只能初始化为null
/// </summary>
public const Person person = new Person();
readonly
readonly是只读的意思,其定义的变量在运行期间也只能读取不能更改,但与const有以下不同
readonly分为实例只读变量与静态只读变量
² 实例只读变量在定义时或者实例构造函数中初始化,通过对象访问
public class ReadOnlyTest
{
/// <summary>
/// 定义时初始化(实例只读变量)
/// </summary>
public readonly int sum = 0;
public ReadOnlyTest()
{
//实例只读变量在实例构造函数中初始化
sum = 100;
}
}
客户端访问形式
ReadOnlyTest test = new ReadOnlyTest();
Console.WriteLine(test.sum);
² static readonly 静态只读变量可以在定义时或者静态构造函数中初始化,通过类名称访问
public class ReadOnlyTest
{
/// <summary>
/// 定义时初始化(静态只读变量)
/// </summary>
public static readonly int static_sum = 0;
static ReadOnlyTest()
{
//静态只读变量在静态构造函数中初始化
static_sum = 99;
}
}
客户端访问形式
Console.WriteLine(ReadOnlyTest.static_sum);
² 实例只读变量若要在构造函数中初始化,只能选择实例构造函数,静态只读变量若要在构造函数中初始化,只能选择静态构造函数
public class ReadOnlyTest
{
/// <summary>
/// 定义时初始化(实例只读变量)
/// </summary>
public readonly int sum = 0;
/// <summary>
/// 定义时初始化(静态只读变量)
/// </summary>
public static readonly int static_sum = 0;
public ReadOnlyTest()
{
//错误!静态只读变量只能在静态构造函数中初始化!
static_sum = 100;
}
static ReadOnlyTest()
{
//错误!实例只读变量只能在实例构造函数中初始化!
sum = 100;
}
}
总结:
const与readonly相同点:运行期间都只能读取不能更改
const 与readonly不同点:
1. const定义时即初始化,运行期间无法再初始化;readonly除了在定义时可以初始化外,还能在运行期间的构造函数中初始化,实例只读变量只能在实例构造函数中初始化,静态只读变量只能在静态构造函数中初始化
2. const定义的变量只能通过类名称访问,而readonly会根据其是否定义为静态类型而分别通过对象与类名称访问
3. const只能定义值类型与字串,若定义引用类型则初始化值必须为null,而readonly无此限制,可以定义引用类型时初始化为null,在对应的构造函数中再重新初始化
=======================================
以上内容为个人原创,转载请注明出处
Const(常量)与readonly(只读)的区别的更多相关文章
- const 常量数据,只读
网上其他的博客地址:1 http://www.cnblogs.com/ronny/p/3672501.html 2 http://www.cnblogs.com/hellogiser/p/cplusp ...
- C#中的静态常量(const)和动态常量(static和readonly)用法和区别
C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景.工作原理 readonly为运行时常量,程序运行时进行赋 ...
- const和static readonly的区别
我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等. 在多数情况下可以混用.二者本质的区别在于,const的值是在编译期间确定的,因此只能在 ...
- 两种常量类型-readonly和const
C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景. 工作原理 readonly 为运行时常量(动态常量), ...
- C# const和static readonly区别
[转]C# const和static readonly区别 以前只是知道Const和static readonlyd的区别在于const的值是在编译期间确定的,而static readonly是在运行 ...
- Effective C# 学习笔记(原则二:为你的常量选择readonly而不是const)
原则二.为你的常量选择readonly而不是const Prefer readonly to const 对于常量,C#里面有两个不同的版本:运行时常量(readonly)和编译时常量(co ...
- in C#,编译型常量(const)和运行时常量(readonly)
readonly 关键字与 const 关键字不同. const 字段只能在该字段的声明中初始化. readonly 字段可以在声明或构造函数中初始化. 因此,根据所使用的构造函数, readonly ...
- 《Effective C#》读书笔记-1.C# 语言习惯-2.使用运行时常量(readonly)而不是编译时常量(const)
概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识 ...
- #define宏常量和const常量的区别
C++ 语言可以用const 来定义常量,也可以用#define 来定义常量.但是前者比后者有更多的优点:(1) const 常量有数据类型,而宏常量没有数据类型.编译器可以对前者进行类型安全检查.而 ...
随机推荐
- pip和easy_install更换使用国内源
因为论文原因,需要使用python安装一些自然语言库,但是使用pip或easy_install安装包时,总是超时(中国特色搞得事:-D),没有办法,上网查资料解决问题~~,在网上找到的方法都是说更换国 ...
- 部署网站出现System.ServiceModel.Activation.HttpModule错误
1. 部署网站到IIS7.5,Window 2008的时候出现这个错误 2. 错误信息 Server Error in '/' Application. Could not load type 'Sy ...
- 运行 Spark on YARN
运行 Spark on YARN Spark 0.6.0 以上的版本添加了在yarn上执行spark application的功能支持,并在之后的版本中持续的 改进.关于本文的内容是翻译官网的内容,大 ...
- 巧用CSS3伪类选择器自定义checkbox和radio的样式
由于原生的checkbox和radio的样式太简陋了,在设计页面的时候,设计师往往会设计自己的checkbox和radio样式.一半情况下,为了适应各个浏览器的兼容性,我们都会用其他的元素替代原生的c ...
- 插件开发--BE插件开发
U9的插件主要分为3种,即(1)BE插件(2)UI插件(3)BP/SV插件 1.新建类库解决方案 2.新建插件类,并引用以下dll,UBF安装目录U9.VOB.Product.UBF\UBFStudi ...
- python与C++交互
python和C++能进行有效的交互,c++调用Python的一些小用法 写了一个python脚本导入发生异常,可能是编码问题(如存在中文),Python默认的是ASCII可加上:#!/usr/bin ...
- session失效
今天写页面时,使用了session 设置session后 跳转页面session就丢失 上网查了一下也没有很好的解决办法 也没有说原因. 在自己本地电脑上写了两个页面测试一下,完全正常.但是上传到服务 ...
- OpenLayers图形与列表互动
项目上遇到这样一种需求:查询数据库后得到结果(带地理位置的)列表,每个结果在地图上都是一个四边形,四边形之间有交叉,有重叠,需要实现地图上的四边形和结果列表的互动.抛开其他逻辑功能,互动需求可以表示为 ...
- Android导航栏菜单强制转换
private void getOverflowMenu() { ViewConfiguration viewConfig = ViewConfiguration.get(this); try { F ...
- css3箭头效果
css3 record1 尝试用css写了个箭头效果 思路就是通过span和span子元素i分别通过设置他们的伪元素构造两个箭头,但是i构造的箭头两条线height都是0,hover的时候渐近的动画效 ...