前言
一段时间以来,我一直在为几乎所有类字段使用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(); }
...
}
答案 0 :(得分:9)
在代码成功编译的任何情况下,我都会在字段上使用readonly。
为什么呢?很简单,如果字段引用/值突然从不变为变化,则可能违反类和消费者中的微妙假设。因此,我想提醒这一变化,以评估这种新行为的含义。
答案 1 :(得分:4)
和你一样,我尽可能地使用readonly
。在可能的情况下,我也使用不可变集合。
Dispose
是一个有趣的,因为它实际上将类型从“可用”变为“不可用” - 我很想有一个非只读bool
成员来表明这一点。然后,我很少发现自己需要实施IDisposable
。通常当我使用资源时,它只用于单个方法的过程,因此我将资源设置为该方法的本地资源。
答案 2 :(得分:2)
readonly
关键字只是.NET工具箱中的另一个工具。因此在适用的地方使用它!通常,您希望优化至少对属性的访问量
原因是您希望保护您的代码不被您不打算从其访问的地方调用/访问。回到你的readonly
问题,如果你的类成员只能从构造函数中修改(设置)一次,那么readonly
就是这样做的方法
答案 3 :(得分:0)
我们公司没有关于readonly
的任何官方编码标准,但我们的团队普遍同意尽可能使用它并且在有意义的地方使用它(通常是这样)。它清楚地表明了程序员或规范的意图,即一旦设置就不会改变它。
我们中的一些人也使用Resharper,它往往会提醒你使用它很多。因此,您的示例课程将被视为我们团队的“良好实践”。
答案 4 :(得分:0)
为了更短的代码,我不会把它放进去,但只有 如果我有一个静态分析工具可以防止滥用。
例如,当用Java编写时,我依靠PMD来确保我不会将自己的所有参数都声明为最终参与。
你可以,正确地说,使用readonly / final会更快地告诉你你的错误,但是我已经做了足够长的时间,以至于我的狡猾感在写作时会消失,如果我碰巧错过了一些静态分析工具让我想起它。
答案 5 :(得分:0)
与其他几个回复者一样,我经常使用readonly
。幸运的是Resharper非常热衷于发现会员何时成为readonly
。它向代码的读者显示,一旦创建实例,就会设置此值,这是一个有价值的细节imo。