繁体   English   中英

对于任何/所有实例成员使用readonly的想法?

[英]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.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM