【问题标题】:Why is this field declared as private and also readonly?为什么这个字段被声明为私有并且也是只读的?
【发布时间】:2011-03-03 06:58:53
【问题描述】:

在以下代码中:

public class MovieRepository : IMovieRepository
{
    private readonly IHtmlDownloader _downloader;

    public MovieRepository(IHtmlDownloader downloader)
    {
        _downloader = downloader;
    }

    public Movie FindMovieById(string id)
    {
        var idUri = ...build URI...;

        var html = _downloader.DownloadHtml(idUri);

        return ...parse ID HTML...;
    }

    public Movie FindMovieByTitle(string title)
    {
        var titleUri = ...build URI...;

        var html = _downloader.DownloadHtml(titleUri);

        return ...parse title HTML...;
    }
}

I asked for something to review my code,有人建议这种方法。我的问题是为什么 IHtmlDownloader 变量是只读的?

【问题讨论】:

    标签: c# .net interface readonly


    【解决方案1】:

    如果它是私有的并且是readonly,那么好处是在它被初始化之后你不能不经意地从该类的另一部分更改它。 readonly 修饰符确保该字段只能在其初始化期间或在其类构造函数中被赋予一个值。

    如果某些功能在初始化后不应该改变,最好使用可用的语言结构来强制执行。

    【讨论】:

    • 宾果游戏。如果它是只读的,则只能通过对象初始化或在构造函数中设置。这不是必需的,但代码质量的一部分限制了可能发生错误的范围。
    • Eric 的回答很好,但直到 Cylon 说您只能更改初始化和构造函数中的只读字段时才有意义。谢谢大家!
    • 还有一个额外的好处是编译器和 JITter 可以实现某些优化,因为知道该值将在构造后修复。
    • @Sergio:好点,我更新了答案以明确这一点。
    • @Adam:不,我最后一次认真研究编译器优化可能是在 10 年前(10 年前的编译器可以优化所有这些调用)。这些天来,对于大多数应用程序来说,它几乎没有意义。硬件对于许多事情来说“足够快”,一些需要极速性能的事情(例如游戏和现在由于 CUDA/OpenCL 而更广泛的数值计算类别)有专用硬件,...
    【解决方案2】:

    这确保_downloader 的值在构造函数执行后不会改变。标记为 readonly 的字段只能在类的构造函数中赋值。

    【讨论】:

      【解决方案3】:

      只读字段可用于对初始化后不应更改的数据进行建模。您可以在声明只读字段时或在构造函数中使用初始值设定项为只读字段分配值,但此后您无法更改它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-10-09
        • 1970-01-01
        • 2022-12-06
        • 1970-01-01
        • 1970-01-01
        • 2011-10-03
        • 1970-01-01
        • 2011-08-25
        相关资源
        最近更新 更多