前段时间在CSDN看到有个帖子问关于常量(const )和只读(readonly)的区别,觉得很有意思,于是找了些资料,写了些代码研究了一下。

发现常量和只读变量有以下区别
1.常量必须在声明时就被初始化,指定了值后就不能修改了.只读字段可以在声明时被初始化,也可以在构造函数中指定初始化的值,在构造以后值就不能修改.
2.常量是静态的,而自读字段可以是静态和动态的
3.Const可以用在字段和局部变量,readonly只可以修饰字段

以下是我的测试代码

using System;

//说明:没有编号的字段在声明时不初始化,构造时被初始化
//编号为1的字段在声明时初始化,构造时不被初始化
//编号为2的字段在声明时,构造时都被初始化
//编号为3的字段在声明时,构造时都不被初始化
public class Test
...{
    //常量
    //常量必须在声明时就被初始化,使用下面语句的出现编译错误"常数字段要求提供一个值"
    //const string myConst;
    const string myConst="声明时被初始化";
    //静态只读
    public static readonly string myStaticReadonly;
    public static readonly string myStaticReadonly1="声明时被初始化";
    public static readonly string myStaticReadonly2="声明时被初始化";
    public static readonly string myStaticReadonly3;
    
    //只读
    public readonly string myReadonly;
    public readonly string myReadonly1="声明时被初始化";
    public readonly string myReadonly2="声明时被初始化";
    public readonly string myReadonly3;
    
    //默认构造函数
    public Test()
    ...{
        myReadonly="默认构造函数时被初始化";
        myReadonly2="默认构造函数时被初始化";
    }
    
    //带参构造函数
    public Test(string arr)
    ...{
        myReadonly=arr;
        myReadonly2=arr;
    }
    
    //静态构造函数,此函数不能带参数
    static Test()
    ...{
        myStaticReadonly="构造时被初始化";
        myStaticReadonly2="构造时被初始化";
        //常量的值不能在构造函数中被更改,使用下面语句的出现编译错误"赋值号左边必须是变量、属性或索引器"
        //myConst="value";    
    }
    
    //试验在用静态方法改变常量和自读变量的值
    public static void StaticChangeValue()
    ...{
        //常量的值不能被改变,使用下面语句的出现编译错误"赋值号左边必须是变量、属性或索引器"
        //myConst="被改变";
        
        //无法在构造后改变自读字段的值,使用下面语句的出现编译错误"无法对静态只读字段赋值(静态构造函数或变量初始值设定项中除外)"
        //myStaticReadonly="被改变";
    }
    
    //试验在用方法改变自读变量的值
    public void ChangeValue()
    ...{
        //无法在构造后改变自读字段的值,使用下面语句的出现编译错误"无法对只读的字段赋值(构造函数或变量初始值指定项中除外)"
        //myReadonly="被改变";
    }
    
    //试验静态局部常量和自读变量
    public static void Include()
    ...{
        const string includeConst="局部静态常量";
        //readonly不能修饰静态局部变量
        //static readonly includeReadonly="局部静态自读变量";
    }
    //试验局部自读变量
    public void StaticInclude()
    ...{
        //readonly不能修饰局部变量
        //readonly staticIncludeReadonly="局部静态自读变量";
    }
    public static void Main()
    ...{
        //参看静态数据
        Console.WriteLine("Test.myConst:"+Test.myConst);
        Console.WriteLine("Test.myStaticReadonly:"+Test.myStaticReadonly);
        Console.WriteLine("Test.myStaticReadonly1:"+Test.myStaticReadonly1);
        Console.WriteLine("Test.myStaticReadonly2:"+Test.myStaticReadonly2);
        Console.WriteLine("Test.myStaticReadonly3:"+Test.myStaticReadonly3);
        Console.WriteLine("");
        
        Test test=new Test();
        Console.WriteLine("test.myReadonly:"+test.myReadonly);
        Console.WriteLine("test.myReadonly1:"+test.myReadonly1);
        Console.WriteLine("test.myReadonly2"+test.myReadonly2);
        Console.WriteLine("test.myReadonly3"+test.myReadonly3);
        Console.WriteLine("");
        
        Test test1=new Test("带参构造函数时被初始化");
        Console.WriteLine("test1.myReadonly:"+test1.myReadonly);
        Console.WriteLine("test1.myReadonly1:"+test1.myReadonly1);
        Console.WriteLine("test1.myReadonly2"+test1.myReadonly2);
        Console.WriteLine("test1.myReadonly3"+test1.myReadonly3);
        Console.WriteLine("");
        
        Console.WriteLine("从结果可以看出构造时初始化的值将覆盖声明时初始化的值");
        Console.WriteLine("没有初始化的只读字段被赋予默认值,空值");
        
        Console.Read();
    }
}

转载于:https://www.cnblogs.com/renrenqq/archive/2004/07/02/20406.html

const VS readonly相关推荐

  1. const与readonly,析构函数,虚拟方法

    const 与readonly    const 关键字用于修改字段或局部变量的声明.它指定字段或局部变量的值不能被修改.常数声明引入给定类型的一个或多个常数.     常数声明可以声明多个常数,例如 ...

  2. const和readonly内部区别

    const和readonly关键字也是面试中经常考到的问题,通常都是用来表示一个不可变的变量成员,那么具体区别是什么?从用法上说,const只能以inline代码的形式定义,而readonly既可以以 ...

  3. const和readonly

    说道定义的变量不容修改的问题,不得不说起C#中还有一个readonly关键字,也是使用在字段上定义不容修改的值,但是const和readonly有几个区别,             区别1)   在语 ...

  4. 20100422.C#.const VS readonly

    const和readonly这对"顽固"的兄弟着实会让我这样的菜鸟迷惑. 研究了一番算是有所感悟了. const常量在编译时就会确定值,编译器直接进行值replace,就像是C语言 ...

  5. C# 总结const、 readonly、 static三者区别:

    总结const. readonly. static三者区别: (有人问我,看似简单,我也没能立刻回答出来,总结一下,分享一下.) const:静态常量,也称编译时常量(compile-time con ...

  6. 如何在 C# 中使用 const,readonly,static

    平时在开发时经常会用到 const,readonly,static 关键字,可以肯定这些关键词是完全不同的概念,但有时候他们在用法上很相似以至于在场景中不知道选择哪一个,这篇文章我们就来讨论 C# 中 ...

  7. const 和readonly

    原文:http://www.cnblogs.com/royenhome/archive/2010/05/22/1741592.html 关于 const和readonly修饰符之间的区别,要牵涉到C# ...

  8. C#中const和readonly的区别

    C#引入了readonly修饰符来表示只读域,const来表示不变常量.顾名思义对只读域不能进行写操作,不变常量不能被修改,这两者到底有什么区别呢?只读域只能在初始化--声明初始化或构造器初始化--的 ...

  9. c# const与readonly 关键字的比较

    C#中,const 与readonly是两个比较有用的关键字.const 与 readonly 定义的数据成员在初始化都不能再改变. 比如定义了 public class MathUtitlity { ...

  10. C# const与readonly的用法和区别解析(转)

    总结一下const和readonly: 1.const和readonly的值一旦初始化则都不再可以改写: 2.const只能在声明时初始化:readonly既可以在声明时初始化也可以在构造器中初始化: ...

最新文章

  1. 为asa防火墙配置ssh登陆
  2. 江苏“超牛”女博导:16岁考入北大,跨专业读博,成为全球第4个获此奖项的学者!...
  3. 常用的java虚拟机_带你了解 JAVA虚拟机 面试必备
  4. 寻找是生命中的另一场迷失
  5. 手把手玩转win8开发系列课程(22)
  6. logistic regression_【科研加油站】SPSS操作之有序Logistic回归的详细教程
  7. 在VS2015中使用SDL2.0
  8. HDU_2156 分数矩阵
  9. Apache 开启伪静态模块
  10. 分享10个优秀的技术栈社区
  11. CCF所有领域best paper合集!发顶会论文必看!中国计算机学会推荐会议的Best paper~
  12. 健身用肌酸市场前景分析及行业研究报告
  13. RedHat7.5最小化安装之后一些配置
  14. java如何设置成中文字体,Java程序中文字体配置
  15. 直插电阻色环电阻读电阻阻值,电阻误差与电阻温度系数方法图文
  16. ¥1-1 SWUST oj 941: 有序顺序表的合并操作的实现
  17. 用c++实现AES基本算法
  18. Vivado中Simulator仿真软件的使用
  19. jsp连接数据库出现java.lang.ClassNotFoundException: com.mysql.jdbc.Driver异常以及不同情况的排错解决方法
  20. 智康护智慧养老,民政监管养老机构管理解决方案

热门文章

  1. 真人节目《通灵之战》的观后感
  2. android最贵的手机,2019翻盖手机排行榜_2019年最贵的手机有哪些?最贵手机排行榜...
  3. java动态bean_Java如何操作对象(bean)进行动态排序?
  4. java 怎么给其他进程发送消息_Java程序与其它进程的数据通信
  5. linq分类汇总怎么写_包围结构的字怎么写才好看?掌握方法是关键,分类总结要领很实用...
  6. java转sap hybris方向_SAP Hybris的Convertor, Populator, Facade和DTO这几个概念是如何协同工作的...
  7. HSPA+系列之“下行增强F-DPCH +下行增强CELL_FACH
  8. Sudo环境变量继承
  9. spark的集群安装
  10. 使用GDB进行嵌入式远程调试