我应该吸收只读字段吗?为什么?

时间:2013-09-07 17:18:34

标签: c# oop

当然我希望foobar类必须/不会修改字段aaa,除非在构造函数中,并且其他类可能会看到aaa的值。 foob​​ar类现在没有被密封,但也许没有人想让类继承自foobar类。

有什么好方法?

public class foobar
{
    public readonly string aaa;
    public foobar(int param)
    {
        aaa = method(param);
    }
}

VS

public class foobar
{
    private readonly string aaa;
    public string AAA { get; }
    public foobar(int param)
    {
        aaa = methond(param);
    }
}

或其他人(我不能想到)

4 个答案:

答案 0 :(得分:3)

考虑到您的要求(仅可在构造函数和公共项中设置),请使用以下命令。

public class foobar
{
    private readonly string aaa;

    public string AAA { get { return aaa; } }

    public foobar(int param)
    {
        aaa = methond(param);
    }
}

然后,如果您不希望让用户从您的类继承,请使用sealed,如果不能以某种方式从公共API访问,您也可以创建类internal。这样,没有人甚至不会看到这个类存在,它将是你的实现细节。

答案 1 :(得分:2)

我会这样做:

public sealed class foobar
{
    public string AAA { get; private set; }

    public foobar(int param)
    {
        aaa = method(param);
    }
}

但这只是某人的意见。

答案 2 :(得分:0)

制作getter的一个原因是你经常需要其他使用你的类的类通过你的类实现的接口来实现(而不是引用类型为'foobar') - 并且接口不能包含字段。

答案 3 :(得分:0)

这一切都取决于您的用例,但通常在这种情况下,您可以将这些字段保留为字段,直到您需要将其转换为属性。例如,当潜在的后代需要覆盖该字段(然后将该字段设置为虚拟属性),或者当您需要从该类提取接口时,或者当您需要序列化该对象并且序列化器不需要时,需要出现这种情况。不支持领域等。

在此之前,您可以将它们保留为只读字段,因为字段访问比属性访问更快,对于只读字段可能更加如此,因为对于只读字段(以及本地变量),编译器/ JIT可以做出更好的假设和优化就寄存器等的波动性和缓存而言。

readonly字段更好地传达了一个消息到字段的目的 - 一个只读字段清楚地表明该字段永远不会改变它的值或它在父对象的生命周期中引用的对象,而具有私有的属性塞特不保证。