给定:
class Parser {
public Parser(TextReader source) => Source = source;
public int GetChar() => Source.Read();
private readonly TextReader Source = null;
}如何将TextReader标记为只读?我的意思是,你正在从缓冲区中读取数据,而情况正在发生变化。我遗漏了什么?
最初,我有一个不带readonly的源代码,但它是由一个代码助手建议的,它确实可以编译。
谢谢
发布于 2020-12-11 22:16:07
readonly 并不意味着文本阅读器对象本身是只读的和/或不可变的。
在您的特定示例中,这意味着,在构造函数完成执行后,字段Source 将永远不会指向构造函数中指定的TextReader之外的另一个one。尝试在构造函数外部为Source赋一个不同的值将会产生编译时错误。
这可能是一个有价值的不变量:特别是,它意味着如果您在构造函数中添加null检查,您的实例方法可以依赖于Source永远不为null。
下面是来自C# language reference的相关部分
在字段声明中,
readonly指示对字段的赋值只能作为声明的一部分或在同一个类的构造函数中发生。一个只读字段可以在字段声明和构造函数中多次分配和重新分配。
readonly字段不能在构造函数退出后赋值。...
发布于 2020-12-11 22:31:54
这里要理解的是,类中的Source成员变量是独立于对象本身的。该变量保存对对象的引用。当您标记变量readonly时,您将引用标记为只读,而不是对象。
这意味着您可以使用引用来仍然调用实际对象上的方法和更改属性。但它仍然很有价值,因为一旦构造函数设置了该引用,它就会保持设置状态。你知道,在这个引用的另一端的对象在整个类的生命周期中都是同一个对象。
这是很有帮助的,例如,知道一个类中的成员永远不会为空。还可以考虑像打开文件流、网络连接或数据库连接这样的事情,在这些情况下,更改对象可能会丢失连接另一端的重要状态。
https://stackoverflow.com/questions/65252320
复制相似问题