const和readonly小结

Posted simon麦田

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了const和readonly小结相关的知识,希望对你有一定的参考价值。

前言:从上周开始看<<CLR via C#>>第三版,刚刚看完了第四和第七两章,这两章都算常识,但是有很多基础知识和术语理解不是很深入,所以看得有点慢,计划每两周写点心得,是以成文。

1、应用场景重现

一个简单的应用程序解决方案,如下:

其中,类库CSharpLib里定义一个简单的类SomeType如下:

1 2 3 4 5 6 7 8 namespace  CSharpLib      public  class  SomeType               public  const  int  ConstField = 50;          public  static  readonly  int  ReadonlyField = 50;     

在控制台应用程序ConsoleApp中,引用类库CSharpLib,然后写下如下代码:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 using  System;   namespace  ConsoleApp      using  CSharpLib;        class  Program               static  void  Main( string [] args)                       Console.WriteLine( "Const field is 0." , SomeType.ConstField);              Console.WriteLine( "Readonly field is 0." , SomeType.ReadonlyField);              Console.ReadKey();              

这样这个控制台应用程序的输出就都是50,这个结果应该是每个开发人员都预期的,没有任何可疑之处。

当我们把类库CSharpLib中的常量都改变时:

1 2 3 4 5 6 7 8 namespace  CSharpLib      public  class  SomeType               public  const  int  ConstField = 55;          public  static  readonly  int  ReadonlyField = 5555;     

也就是说,我们预期的目标输出是55和5555。当改好类库,开发人员发现控制台应用程序没做出任何修改,所以只将类库重新生成,然后将.dll文件拷到控制台应用程序bin目录下(做过asp.net开发的应该都知道,当某个类库修改时,我们通常都直接拷贝修改后的类库.dll到网站下的bin目录,除了习惯性偷懒,版本控制也是一个问题),然后双击运行ConsoleApp.exe文件,我们惊讶地发现当前的输出不是55和5555,而是50和5555,也就是说,const字段修改后没有达到预期目的。

 

2、注意点总结

为什么会发生上面的现象呢?从c#的常量的本质说起。

(1)、什么是常量(书中原话摘录)

const和readonly的区别

const 和 readonly 修饰符的用法

const和readonly

Java的Final和C#的Const,Readonly比较分析(转载)

两种常量类型-readonly和const

const和static readonly 区别