const VS readonly

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

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

以下是我的测试代码

None.gif using  System;
None.gif
None.gif
// 说明:没有编号的字段在声明时不初始化,构造时被初始化
None.gif
// 编号为1的字段在声明时初始化,构造时不被初始化
None.gif
// 编号为2的字段在声明时,构造时都被初始化
None.gif
// 编号为3的字段在声明时,构造时都不被初始化
None.gif
public   class  Test
ExpandedBlockStart.gifContractedBlock.gif
... {
InBlock.gif    
//常量
InBlock.gif    
//常量必须在声明时就被初始化,使用下面语句的出现编译错误"常数字段要求提供一个值"
InBlock.gif    
//const string myConst;
InBlock.gif
    const string myConst="声明时被初始化";
InBlock.gif    
//静态只读
InBlock.gif
    public static readonly string myStaticReadonly;
InBlock.gif    
public static readonly string myStaticReadonly1="声明时被初始化";
InBlock.gif    
public static readonly string myStaticReadonly2="声明时被初始化";
InBlock.gif    
public static readonly string myStaticReadonly3;
InBlock.gif    
InBlock.gif    
//只读
InBlock.gif
    public readonly string myReadonly;
InBlock.gif    
public readonly string myReadonly1="声明时被初始化";
InBlock.gif    
public readonly string myReadonly2="声明时被初始化";
InBlock.gif    
public readonly string myReadonly3;
InBlock.gif    
InBlock.gif    
//默认构造函数
InBlock.gif
    public Test()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
...{
InBlock.gif        myReadonly
="默认构造函数时被初始化";
InBlock.gif        myReadonly2
="默认构造函数时被初始化";
ExpandedSubBlockEnd.gif    }

InBlock.gif    
InBlock.gif    
//带参构造函数
InBlock.gif
    public Test(string arr)
ExpandedSubBlockStart.gifContractedSubBlock.gif    
...{
InBlock.gif        myReadonly
=arr;
InBlock.gif        myReadonly2
=arr;
ExpandedSubBlockEnd.gif    }

InBlock.gif    
InBlock.gif    
//静态构造函数,此函数不能带参数
InBlock.gif
    static Test()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
...{
InBlock.gif        myStaticReadonly
="构造时被初始化";
InBlock.gif        myStaticReadonly2
="构造时被初始化";
InBlock.gif        
//常量的值不能在构造函数中被更改,使用下面语句的出现编译错误"赋值号左边必须是变量、属性或索引器"
InBlock.gif        
//myConst="value";    
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
InBlock.gif    
//试验在用静态方法改变常量和自读变量的值
InBlock.gif
    public static void StaticChangeValue()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
...{
InBlock.gif        
//常量的值不能被改变,使用下面语句的出现编译错误"赋值号左边必须是变量、属性或索引器"
InBlock.gif        
//myConst="被改变";
InBlock.gif        
InBlock.gif        
//无法在构造后改变自读字段的值,使用下面语句的出现编译错误"无法对静态只读字段赋值(静态构造函数或变量初始值设定项中除外)"
InBlock.gif        
//myStaticReadonly="被改变";
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
InBlock.gif    
//试验在用方法改变自读变量的值
InBlock.gif
    public void ChangeValue()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
...{
InBlock.gif        
//无法在构造后改变自读字段的值,使用下面语句的出现编译错误"无法对只读的字段赋值(构造函数或变量初始值指定项中除外)"
InBlock.gif        
//myReadonly="被改变";
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
InBlock.gif    
//试验静态局部常量和自读变量
InBlock.gif
    public static void Include()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
...{
InBlock.gif        
const string includeConst="局部静态常量";
InBlock.gif        
//readonly不能修饰静态局部变量
InBlock.gif        
//static readonly includeReadonly="局部静态自读变量";
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
//试验局部自读变量
InBlock.gif
    public void StaticInclude()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
...{
InBlock.gif        
//readonly不能修饰局部变量
InBlock.gif        
//readonly staticIncludeReadonly="局部静态自读变量";
ExpandedSubBlockEnd.gif
    }

InBlock.gif    
public static void Main()
ExpandedSubBlockStart.gifContractedSubBlock.gif    
...{
InBlock.gif        
//参看静态数据
InBlock.gif
        Console.WriteLine("Test.myConst:"+Test.myConst);
InBlock.gif        Console.WriteLine(
"Test.myStaticReadonly:"+Test.myStaticReadonly);
InBlock.gif        Console.WriteLine(
"Test.myStaticReadonly1:"+Test.myStaticReadonly1);
InBlock.gif        Console.WriteLine(
"Test.myStaticReadonly2:"+Test.myStaticReadonly2);
InBlock.gif        Console.WriteLine(
"Test.myStaticReadonly3:"+Test.myStaticReadonly3);
InBlock.gif        Console.WriteLine(
"");
InBlock.gif        
InBlock.gif        Test test
=new Test();
InBlock.gif        Console.WriteLine(
"test.myReadonly:"+test.myReadonly);
InBlock.gif        Console.WriteLine(
"test.myReadonly1:"+test.myReadonly1);
InBlock.gif        Console.WriteLine(
"test.myReadonly2"+test.myReadonly2);
InBlock.gif        Console.WriteLine(
"test.myReadonly3"+test.myReadonly3);
InBlock.gif        Console.WriteLine(
"");
InBlock.gif        
InBlock.gif        Test test1
=new Test("带参构造函数时被初始化");
InBlock.gif        Console.WriteLine(
"test1.myReadonly:"+test1.myReadonly);
InBlock.gif        Console.WriteLine(
"test1.myReadonly1:"+test1.myReadonly1);
InBlock.gif        Console.WriteLine(
"test1.myReadonly2"+test1.myReadonly2);
InBlock.gif        Console.WriteLine(
"test1.myReadonly3"+test1.myReadonly3);
InBlock.gif        Console.WriteLine(
"");
InBlock.gif        
InBlock.gif        Console.WriteLine(
"从结果可以看出构造时初始化的值将覆盖声明时初始化的值");
InBlock.gif        Console.WriteLine(
"没有初始化的只读字段被赋予默认值,空值");
InBlock.gif        
InBlock.gif        Console.Read();
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值