0

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

什么是好方法?

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

对比

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

或其他(我想不出)

4

4 回答 4

3

考虑到您的需求(只能在构造函数和公共中设置),请使用以下内容。

public class foobar
{
    private readonly string aaa;

    public string AAA { get { return aaa; } }

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

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

于 2013-09-07T17:26:04.820 回答
2

我会做以下事情:

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

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

但这只是某人的意见。

于 2013-09-07T17:21:09.900 回答
0

这完全取决于您的用例,但通常在这种情况下,您可以将这些字段保留为字段,直到您需要将它们转换为属性。例如,当潜在的后代需要覆盖该字段(然后将该字段变为虚拟属性),或者当您需要从该类中提取接口时,或者当您需要序列化该对象并且序列化程序不'不支持字段等。

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

此外,只读字段更好地传达了字段用途的信息——只读字段清楚地表明该字段永远不会在父对象的生命周期内更改其值或它引用的对象,而具有私有设置器的属性则不会t 做这个保证。

于 2013-09-07T18:03:09.177 回答
0

制作 getter 的一个原因是,您通常希望其他使用您的类的类通过您的类实现的接口(而不是具有类型“foobar”的引用)来这样做 - 并且接口不能包含字段。

于 2013-09-07T17:31:07.473 回答