C# 将文本阅读器标记为只读

C# 将文本阅读器标记为只读,c#,C#,鉴于: 如何将TextReader标记为只读?我的意思是,你正在从缓冲区读取数据,事情正在发生变化。我错过了什么 最初,我的源代码没有readonly,但它是由一个代码助手建议的,它可以编译 谢谢只读并不意味着文本阅读器对象本身是只读和/或不可变的 在您的特定示例中,这意味着在构造函数完成执行后,字段Source将永远不会指向构造函数中指定的文本阅读器以外的其他文本阅读器。尝试在构造函数外部为源分配不同的值将产生编译时错误 这可能是一个有价值的不变量:特别是,这意味着如果在构造函数中添加null

鉴于:

如何将TextReader标记为只读?我的意思是,你正在从缓冲区读取数据,事情正在发生变化。我错过了什么

最初,我的源代码没有readonly,但它是由一个代码助手建议的,它可以编译


谢谢

只读
并不意味着文本阅读器对象本身是只读和/或不可变的

在您的特定示例中,这意味着在构造函数完成执行后,字段
Source
将永远不会指向构造函数中指定的文本阅读器以外的其他文本阅读器。尝试在构造函数外部为
分配不同的值将产生编译时错误

这可能是一个有价值的不变量:特别是,这意味着如果在构造函数中添加null检查,那么实例方法可以依赖于
Source
从不为null

以下是本报告的相关部分:

在字段声明中,
readonly
表示对字段的赋值只能作为声明的一部分或在同一类的构造函数中进行。只读字段可以在字段声明和构造函数中多次分配和重新分配

构造函数退出后,无法分配
只读
字段。[……]


这里要理解的是类中的
成员变量与对象本身是独立的。变量保存对对象的引用。将变量
标记为只读时,将引用标记为只读,而不是对象

这意味着您可以使用引用仍然调用方法并更改实际对象的属性。但它仍然很有价值,因为一旦构造函数设置了引用,它就会保持不变。您知道,这个引用的另一端的对象在类的整个生命周期中都是同一个对象


例如,这有助于了解类中的成员永远不会为null。还可以考虑像打开文件流、网络连接或数据库连接之类的操作,在这些操作中,更改对象可能会丢失连接另一端的重要状态。

readonly
提供了浅层不变性。不允许在构造函数之外分配给
Source
,但仍然可以对其调用方法(这些方法可以改变
TextReader
对象本身)。这意味着您的
GetChar()
方法无法执行,例如
Source=null
Source=newtextreader()
class Parser {
  public Parser(TextReader source) => Source = source;
  public int GetChar() => Source.Read();
  private readonly TextReader Source = null;
}