[英]Thoughts on the use of readonly for any/all instance members of a class?
前言
一段时间以来,我一直在几乎所有类字段中使用readonly修饰符。 我将它用于List <T>成员,IDisposeable成员,整数,字符串等......除了我打算改变的值类型之外的所有东西。 即使我通常想在Dispose()上取消成员,我也倾向于这样做。 恕我直言不需要if语句来测试null或处理条件的优点大大超过了“可以”多次处理的对象中的“潜在”问题。
问题
你什么时候使用readonly,或者是吗?
您或您的公司是否有关于readonly使用的最佳实践和/或编码标准?
我很想听听你对以下样本课的看法,一般概念是不是很好的做法?
class FileReaderWriter : IFileReaderWriter, IDisposable
{
private readonly string _file;
private readonly Stream _io;
public FileReaderWriter(string path)
{
_io = File.Open(_file = Check.NotEmpty(path), FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None);
}
public void Dispose() { _io.Dispose(); }
...
}
在代码成功编译的任何情况下,我都在字段上使用readonly。
为什么? 很简单,如果字段引用/值突然从不变为变化,则可能违反类和消费者中的微妙假设。 因此,我想提醒这一变化,以评估这种新行为的含义。
和你一样,我readonly
使用readonly
。 在可能的情况下,我也使用不可变的集合。
Dispose
是一个有趣的,因为它有效地将类型从“可用”变为“不可用” - 我很想有一个非readonly bool
成员来表明这一点。 然后,我很少发现自己需要实现IDisposable
。 通常当我使用资源时,它仅用于单个方法的过程,因此我将资源设置为该方法的本地资源。
readonly
关键字只是.NET工具箱中的另一个工具。 因此在适用的地方使用它! 一般而言,您希望获得最少的属性访问权限,
原因是您希望保护您的代码不被您不打算从其访问的地方调用/访问。 回到你的readonly
问题,如果你的类成员只能从构造函数中修改(设置) 一次 ,那么readonly
就是这样做的方法。
我们公司没有任何关于readonly
官方编码标准,但我们的团队普遍同意尽可能使用它并且在有意义的地方使用它(通常是这样)。 它清楚地表明了程序员或规范的意图,即一旦设置,这并不意味着改变。
我们中的一些人也使用Resharper,它往往会提醒你使用它很多。 因此,您的示例课程将被视为我们团队的“良好实践”。
为了缩短代码,我不会把它放进去,但前提是我有一个静态分析工具可以防止滥用。
例如,当用Java编写时,我依靠PMD来确保我不会将自己的所有参数都声明为最终版本。
你可以,正确地说,使用readonly / final会更快地告诉你你的错误,但是我已经做了足够长的时间,以至于在写作时我的蜘蛛感觉会消失,如果我碰巧错过了某些东西,静态分析工具会让我想起它的。
像其他几个回复者一样,我经常使用readonly
。 幸运的是, Resharper非常热衷于发现成员可以readonly
。 它向代码的读者显示,一旦创建实例,就会设置此值,这是一个有价值的细节imo。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.