C# 只读属性设置器
经过广泛的调试会话后,我发现问题在于我调用了只读属性的setter。发生这种情况时,是否有技巧引发编译器警告?因为将setter标记为private不起作用 干杯 CAC# 只读属性设置器,c#,properties,C#,Properties,经过广泛的调试会话后,我发现问题在于我调用了只读属性的setter。发生这种情况时,是否有技巧引发编译器警告?因为将setter标记为private不起作用 干杯 CA 为了明确我的意思: private readonly List<SomeObject> _budget; public IEnumerable<SomeObject> Budget { get { return _budge
为了明确我的意思:
private readonly List<SomeObject> _budget;
public IEnumerable<SomeObject> Budget
{
get
{
return _budget;
}
}
如果没有编译器{error,warning,message}请删除setter。如果属性有setter,则它不是只读的。删除setter使其成为只读
public string MyProperty // not read-only
{
get { return myPropertyBacking; }
set { myPropertyBacking = value; }
}
public string MyProperty // read-only
{
get { return myPropertyBacking; }
}
你搞混了。在您的示例中,如果您尝试执行
A.Budget=newsomeobject(),编译器将产生错误代码>如果类A
中的属性Budget
没有设置器。
从现在起,我只能假设你的问题是什么
我猜您希望包装在Budget
属性中的集合是只读的。这可能就是为什么您将其设置为IEnumerable
,而私有成员是列表
。因此,即使您没有setter,您仍然可以执行(a.Budget as List)。添加(bla)
。要禁止此操作,您可以这样使用:
private readonly List<SomeObject> _budget;
public ReadOnlyCollection<SomeObject> Budget
{
get
{
return _budget.AsReadOnly();
}
}
private readonly List\u预算;
公共只读集合预算
{
得到
{
返回_budget.AsReadOnly();
}
}
就其本身而言,这是没有意义的,但如果您的示例是这样的话
private readonly List<SomeObject> _budget;
public List<SomeObject> Budget
{
get
{
return _budget;
}
}
这样做不会出错
编辑
bitbonk的最新编辑正是我要做的!我只是在等待问题的确认。在什么情况下?100%确定,如果您从类外的代码调用私有setter,它将永远不会编译。我是不是遗漏了什么?我不知道这怎么可能不出错。看起来您需要A.Budget=newlist()
但即使如此,它仍应给出一个错误,说明“无法将属性或索引器'Budget'分配给--它是只读的”@drs9222:Agreed<代码>A.预算
在列出的代码中不可分配。哎呀,你说得对。之前应该检查过第三次posting@AnonymousCoward这是否意味着您确实会出错?我知道你已经得到了答案,但我很好奇到底发生了什么。
private readonly List<SomeObject> _budget;
public List<SomeObject> Budget
{
get
{
return _budget;
}
}
A.Budget.Add(new SomeObject());