是否可以强制自动属性使用只读后备字段?

Jad*_*son 12 .net c#

我的项目包含大量具有属性的类,其后备字段标记为只读,因为它们仅在构造时设置.作为一种风格问题,我喜欢使用自动属性,因为它消除了大量的样板代码,并鼓励使用属性成员而不是支持字段.但是,当使用自动属性时,我失去了我的支持字段的"readonly-ness".我知道当字段以这种方式标记时,编译器/运行时能够利用一些性能增强,所以我希望能够将我的auto-property标记为readonly,如下所示:

[ReadOnly]
public string LastName { get; }
Run Code Online (Sandbox Code Playgroud)

而不是

private readonly string _LastName;
public string LastName 
{ 
    get
    { 
        return _LastName;
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有一些机制可以做到这一点?如果没有,自定义支持字段的性能增益是否真的值得?

我认为,将该字段公开为公共是另一种选择,以这种方式公开字段似乎是错误的.即

public readonly string LastName;
Run Code Online (Sandbox Code Playgroud)

mqp*_*mqp 13

我不敢,但你可以这样做:

public string LastName { get; private set; }
Run Code Online (Sandbox Code Playgroud)

不太好readonly,但不是太糟糕.


Jon*_*eet 8

不,不幸的是没有办法做到这一点.就个人而言,我认为C#中自动实现的属性缺少两件事 - 一个默认值(我认为将在VB10中)和只能在构造函数中设置的只读属性.换句话说,我希望能够做到:

public class Foo
{
    public string Tag { get; internal set; } = "Default value";

    // The "readonly" would imply "private" as it could only
    // be set from a constructor in the same class
    public int Value { get; readonly set; }

    public Foo()
    {
        // Valid to set property here, but nowhere else
        Value = 20;
    }
}
Run Code Online (Sandbox Code Playgroud)

正如Jared所提到的,这意味着将对属性setter的编译器调用更改为简单的字段赋值,并确保它们仅在构造函数中发生.

这将使编写不可变类型更简单.不幸的是,C#4的情况不会有所改善.我们希望我们能为C#5获得类似的东西......

  • 我个人坚持只读备用字段,除非它是丢弃代码.我喜欢知道它*正确*不可变,即使我不小心尝试在我自己的类型中设置它. (5认同)