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的区别