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(只读)的区别的更多相关文章

  1. const 常量数据,只读

    网上其他的博客地址:1 http://www.cnblogs.com/ronny/p/3672501.html 2 http://www.cnblogs.com/hellogiser/p/cplusp ...

  2. C#中的静态常量(const)和动态常量(static和readonly)用法和区别

    C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景.工作原理 readonly为运行时常量,程序运行时进行赋 ...

  3. const和static readonly的区别

    我们都知道,const和static readonly的确很像:通过类名而不是对象名进行访问,在程序中只读等等. 在多数情况下可以混用.二者本质的区别在于,const的值是在编译期间确定的,因此只能在 ...

  4. 两种常量类型-readonly和const

    C#中有两种常量类型,分别为readonly(运行时常量)与const(编译时常量),本文将就这两种类型的不同特性进行比较并说明各自的适用场景. 工作原理 readonly 为运行时常量(动态常量), ...

  5. C# const和static readonly区别

    [转]C# const和static readonly区别 以前只是知道Const和static readonlyd的区别在于const的值是在编译期间确定的,而static readonly是在运行 ...

  6. Effective C# 学习笔记(原则二:为你的常量选择readonly而不是const)

    原则二.为你的常量选择readonly而不是const      Prefer readonly to const 对于常量,C#里面有两个不同的版本:运行时常量(readonly)和编译时常量(co ...

  7. in C#,编译型常量(const)和运行时常量(readonly)

    readonly 关键字与 const 关键字不同. const 字段只能在该字段的声明中初始化. readonly 字段可以在声明或构造函数中初始化. 因此,根据所使用的构造函数, readonly ...

  8. 《Effective C#》读书笔记-1.C# 语言习惯-2.使用运行时常量(readonly)而不是编译时常量(const)

    概念 编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识 ...

  9. #define宏常量和const常量的区别

    C++ 语言可以用const 来定义常量,也可以用#define 来定义常量.但是前者比后者有更多的优点:(1) const 常量有数据类型,而宏常量没有数据类型.编译器可以对前者进行类型安全检查.而 ...

随机推荐

  1. DTP激活时报Overlapping

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  2. CodeUI Test:UIMap录制文件分析一

    UIMap文件是Coded UI Test的核心文件,它分为三个文件. 1.UIMap.uitest 这是xml文件,里面描述了所有需要操作的目标控件以及进行操作的动作等. 2.UIMap.Desig ...

  3. iframe在浏览器中session失效问题

    iis中右击项目属性http头 添加一个http头 X-UA-Compatible 自定义http头值 IE=EmulateIE7 这样设置后就可以了

  4. Asp.net管道模型(管线模型)

    Asp.net管道模型(管线模型)   前言 为什么我会起这样的一个标题,其实我原本只想了解asp.net的管道模型而已,但在查看资料的时候遇到不明白的地方又横向地查阅了其他相关的资料,而收获比当初预 ...

  5. myeclipse连接oracle步骤

    1.加载ojdbc.jar驱动(路径:E:\myoracle\oracle\product\11.2.0\dbhome_1\jdbc\lib) 2.String url = "jdbc:or ...

  6. VIM小技巧

    1.复制多行 vi编辑器中的整行(多行)复制与粘贴就非常必要了. 1.复制 1)单行复制 在命令模式下,将光标移动到将要复制的行处,按"yy"进行复制: 2)多行复制 在命令模式下 ...

  7. [分享] 封装工具ES4配置文件解释

    [分享] 封装工具ES4配置文件解释 LiQiang 发表于 2015-2-3 14:41:21 https://www.itsk.com/thread-346132-1-4.html [分享] 封装 ...

  8. eclipse遇到不会部署的情况

    1.先看下右下角有没有在进行的进程,例如validating  验证中.那就关闭验证的选项 2.看下problem栏有没有问题.会导致building不了.

  9. DashPathEffect

    DashPathEffect 可以实现以动画的形式画线的效果. 通过setPathEffect()方法为画笔Paint对象设置绘制路径的特效. PathEffect pathEffect=new Da ...

  10. python——有一种线程池叫做自己写的线程池

    这周的作业是写一个线程池,python的线程一直被称为鸡肋,所以它也没有亲生的线程池,但是竟然被我发现了野生的线程池,简直不能更幸运~~~于是,我开始啃源码,实在是虐心,在啃源码的过程中,我简略的了解 ...