【问题标题】:What's the benefit of a property with readonly getter?带有只读 getter 的属性有什么好处?
【发布时间】:2021-05-16 21:13:25
【问题描述】:

我已经多次看到 readonly(通常是针对成员,但也适用于 readonly 结构)。

但我第一次看到的是 readonly get 的属性组合:

private double _x;
public double X
{
    readonly get => _x;
    set => _x = value;
}

但这意味着什么?指定 getter 只读的具体限制是什么?

【问题讨论】:

    标签: c# .net properties


    【解决方案1】:

    readonly get 语法是new addition to C# 8。它表示 getter 不能修改实例成员。

    常规 getter 可以修改实例:

    public double X
    {
        get { _x = 1; return _x; }
    }
    

    该代码完全有效;更有用的是,例如,getter 可以更新缓存的值。 readonly get 访问器不能这样做,编译器将强制执行此不变量。

    【讨论】:

    • 微软没有很好地记录这有点奇怪。甚至您的链接也指向 C# 8 提案页面,并且该链接指向尚未关闭的 GitHub 问题...
    • 如果只访问只读成员,它将阻止编译器制作结构的防御性副本,这可能是最重要的部分
    • 这在只读文档中有所提及,如我的回答中所链接,但您必须在字里行间阅读。
    【解决方案2】:

    这不是有效的 C# 代码。检查任何编译器会得到你:

    修饰符readonly对该项目无效

    这是因为 getter 和 setter 只是函数的语法糖。

    对于类,你确实是对的,只读 getter 没有意义,因为只读函数没有意义。只有不提供 setter 的变量才具有只读性和属性。

    https://dotnetfiddle.net/SPhTR8

    对于结构体,表示大不改变状态。

    这使得下面的 getter 是非法的:

    // This will get you a compiler error
    readonly get { _z = 7d; return _z; }
    

    这里说明:https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/readonly

    在结构类型内的实例成员声明中,readonly 表示实例成员不修改结构的状态。

    【讨论】:

    • 我确信我在 Microsoft 网站上看到了这个。于是我又搜索了一下,找到了:docs.microsoft.com/en-us/dotnet/csharp/…
    • 检查更新的答案和小提琴。我错过了您问题中提到的结构。
    • 我想,我犯了同样的错误,并尝试在类而不是结构中使用它。
    猜你喜欢
    • 1970-01-01
    • 2021-11-11
    • 1970-01-01
    • 2021-01-18
    • 2011-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多