readonly属性设定者

时间:2010-04-22 13:18:16

标签: c# properties

经过大量的调试会话后,我发现问题在于我调用了readonly属性的setter。发生这种情况时是否有引发编译器警告的技巧?因为将setter私有标记不起作用。

干杯,

CA


明确我的意思:

    private readonly List<SomeObject> _budget;
    public IEnumerable<SomeObject> Budget
    {
        get
        {
            return _budget;
        }
    }

可以使用

访问
A.Budget=new SomeObject();

没有编译器{错误,警告,消息}

4 个答案:

答案 0 :(得分:8)

如果您的财产有一个二传手,那么它不是只读的。删除setter使其成为只读。

public string MyProperty // not read-only
{
    get { return myPropertyBacking; }
    set { myPropertyBacking = value; }
}

public string MyProperty // read-only
{
    get { return myPropertyBacking; }
}

答案 1 :(得分:8)

你在这里混淆了什么。在您的示例中,如果您尝试A.Budget=new SomeObject();,如果类Budget中的属性A没有setter,则编译器将产生错误。 从这里开始,我只能假设你的问题是什么。

我的猜测是,您希望包含在Budget属性中的集合是只读的。这可能是你成为IEnumerable<SomeObject>的原因,而私人成员是List<SomeObject>。因此,即使你没有设置器,你仍然可以(A.Budget as List<SomeObject>).Add(bla)。要禁止此操作,您可以使用List.AsReadOnly,如下所示:

private readonly List<SomeObject> _budget;
public ReadOnlyCollection<SomeObject> Budget
{
    get
    {
        return _budget.AsReadOnly();
    }
}

答案 2 :(得分:3)

删除二传手。

答案 3 :(得分:0)

因为它没有意义,但如果你的例子意味着这样的东西......

private readonly List<SomeObject> _budget;
public List<SomeObject> Budget
{
    get
    {
        return _budget;
    }
}

可以使用

访问
A.Budget.Add(new SomeObject());

这样可以正常工作。

修改

bitbonk的最新编辑正是我要去的地方!我只是在等待确认问题。