常量的概念就是一个包含不能修改的值的变量,常量是C#与大多数编程语言共有的。但是,常量不必满足所有的要求。有时可能需要一些变量,其值不应改变,但在运行之前其值是未知的。C#为这种情形提供了另一个类型的变量:只读字段。

readonly关键字比const灵活得多,允许把一个字段设置为常量,但可以执行一些运算,以确定它的初始值。其规则是可以在构造函数中给只读字段赋值,但不能在其他地方赋值。只读字段还可以是一个实例字段,而不是静态字段,类的每个实例可以有不同的值。与const字段不同,如果要把只读字段设置为静态,就必须显式声明。

如果有一个编辑文档的MDI程序,因为要注册,需要限制可以同时打开的文档数。现在假定要销售该软件的不同版本,而且顾客可以升级他们的版本,以便同时打开更多的文档。显然,不能在源代码中对最大文档数进行硬编码,而是需要一个字段表示这个最大文档数。这个字段必须是只读的--每次安装程序时,从注册表键或其他文件存储中读取。代码如下所示:

public class DocumentEditor
{
public static readonly uint MaxDocuments;

static
DocumentEditor()
{
MaxDocuments = DosomethingToFindOutMaxNumber();
}

在本例中,字段是静态的,因为每次运行程序的实例时,只需存储最大文档数一次。这就是在静态构造函数中初始化它的原因。如果只读字段是一个实例字段,就要在实例构造函数中初始化它。例如,假定编辑的每个文档都有一个创建日期,但不允许用户修改它(因为这会覆盖过去的日期)。注意,该字段也是公共的,我们不需要把只读字段设置为私有,因为按照定义,它们不能在外部修改(这个规则也适用于常量)。

如前所述,日期用基类System.DateTime表示。下面的代码使用带有3个参数(年份、月份和月份中的日)的System.DateTime构造函数,可以从MSDN文档中找到这个构造函数和其他DateTime构造函数的更多信息。

public class Document
{
public readonly DateTime CreationDate;

public
Document()
{
// Read in creation date from file. Assume result is 1 Jan 2002
// but in general this can be different for different instances
// of the class 
CreationDate = new DateTime(2002, 1, 1);
}
}

在上面的代码中,CreationDate和MaxDocuments的处理方式与其他字段相同,但因为它们是只读的,所以不能在构造函数外部赋值:

void SomeMethod()
{
MaxDocuments = 10; // compilation error here. MaxDocuments is readonly
}

还要注意,在构造函数中不必给只读字段赋值,如果没有赋值,它的值就是其数据类型的默认值,或者在声明时给它初始化的值。这适用于静态和实例只读字段。

最新文章

  1. RestSharp简单扩展
  2. objective-c系列-NSDictionary&NSMutableDictionary
  3. Faster-rnnlm代码分析3 - EvaluateLM(前向计算ForwardPropagate)
  4. Form文件夹开发步骤
  5. 【python】2048
  6. [转] 网络流算法--Ford-Fulkerson方法及其多种实现
  7. SQL随着子查询结果更新多个字段
  8. 关于Trie Tree简单实现
  9. Unity 5.3.5f1 (32-bit) 的简单塔防游戏
  10. 团队作业4--第一次项目冲刺(Alpha版本) 4
  11. dp资源分配问题
  12. [转帖]web安全:QQ号快速登录漏洞及被盗原理
  13. RANSAC介绍(Matlab版直线拟合+平面拟合)
  14. django 聚合内容 RSS/Atom
  15. 第9章 符合Python风格的对象
  16. 二分查找的实现(java版本)
  17. 理解并实现PubSub模式
  18. Windows Installer (MSI)知识学习
  19. spring线程池ThreadPoolTaskExecutor与阻塞队列BlockingQueue
  20. 运行时用AnimatorOverrideController动态加载动画片段

热门文章

  1. Android四大组件之一:BroadCastReceiver(广播接收者)
  2. THREE.js代码备份——canvas_lines(随机点、画线)
  3. H.264的一些资料整理
  4. Ubuntu下第一个C程序的成功运行
  5. AndroidStudio支持新的NDK的操作使用
  6. 关于CORS
  7. DEDECMS中,文章页直接输出字段名
  8. 8款实用的Jquery瀑布流插件
  9. Mysql 正则获取字段的交集【转】
  10. 用cookie实现localstorage功能