受保护的只读字段与受保护的属性

我有一个抽象类,我想在其受保护的构造函数中初始化只读字段。 我希望这个只读字段在派生类中可用。

遵循我将所有领域设为私有并暴露属性的习惯,我实现了这一点,如下所示:

abstract class Foo
{
    private readonly int _field;

    protected Foo(int field)
    {
        _field = field;
    }

    protected int Field
    {
        get { return _field; }
    }
}

但后来我想知道在这里保持私密性是否真的有很多优势。 我意识到财产的优点,一般来说这个问题有几个SO问题,但他们关注的是公共领域而不是受保护领域。

那么我应该切换到下面的实现吗? 无论在哪种情况下都要注意哪些因素和优势/劣势?

abstract class Foo
{
    protected readonly int _field;

    protected Foo(int field)
    {
        _field = field;
    }
}

派生类仍然是原始代码的'用户'; 领域也应该从他们封装。

你应该将基类看作安全和可扩展的API,而不仅仅是暴露其内部的类。 保持字段是私人的 - 除了任何东西,它允许基类改变该属性值的生成方式:)


我会离开实施或与:

protected Field {get; private set;}

(不完全相同,Field不是父类的只读)

性能优于领域的优势是他们更有前途。 您可以在不影响子级的情况下更改父类的实现。 没有财产,您致力于该领域始终只是只读。 另一个原因是使用字段令他们不满,他们伤害了不透明性:类描述了字段的确切实现。

所以是的,离开封装。

我唯一会考虑直接使用字段进行可读性的地方是高度耦合的类,例如状态模式中的状态,但在这种情况下,类本身将是私有的。


只读属性在C#6.0中实现。 这很简单:

protected Foo(int field)
{
    Field = field;
}

protected int Field { get; }
链接地址: http://www.djcxy.com/p/21079.html

上一篇: Protected readonly field vs protected property

下一篇: const, readonly and mutable value types