[英]C# Property with hard coded getter and setter
我有一个属性定义为......
public List<Obj> Objs { get; set; }
我希望能够做的是在get方法中加入一些逻辑,所以它看起来像......
public List<Obj> Objs
{
get
{
if (Objs == null)
{
Objs = new List<Obj>();
}
if (Objs.Count < 1)
{
Objs.Add(new Obj());
}
return Objs;
}
set { Objs = value; }
}
现在,当我这样做时,我收到一个错误,告诉我函数在所有路径上都是递归的。
有没有办法在不创建私有支持字段的情况下执行此操作?
你必须建立一个私人领域:
private List<Obj> _objs;
public List<Obj> Objs
{
get
{
if (_objs== null)
{
_objs= new List<Obj>();
}
if (_objs.Count < 1)
{
_objs.Add(new Obj());
}
return _objs;
}
set { _objs= value; }
}
为什么不可能? 让我们在Java中做同样的事情:
private List<Obj> objs;
public List<Obj> getListObjs()
{
...
// Recursion
return getListObjs();
}
没有支持领域,没有办法做到这一点。 与问题无关但与情况有关。 一般情况下,您不应该为集合公开一个setter,而只是暴露一个getter。 如果你有一个setter,你经常暴露对象的内部状态,那应该保持隐藏状态。
您的属性在属性的get
部分的定义中引用它自己。 这是非法的,因为它会导致吸气剂以无限循环结束。 您要么具有自动实现的属性(第一个示例),要么具有支持字段的属性(由编译器为自动实现的属性自动生成)。 您需要添加(首选私有)字段作为您的财产的后备存储:
private List<Obj> objs;
public List<Obj> Objs
{
get
{
if (objs == null)
{
objs = new List<Obj>();
}
if (objs.Count < 1)
{
objs.Add(new Obj());
}
return objs;
}
set { objs = value; }
}
你应该使用私有字段来存储Objs列表。 你无法从get方法得到get方法的数据...... :)是递归。
private List<Obj> _objs;
public List<Obj> Objs
{
get {
if (_objs== null)
{
_objs = new List<Obj>();
}
if (_objs.Count < 1)
{
_objs.Add(new Obj());
}
return _objs;
}
set { _objs= value; }
}
不,不是真的。
在你的代码中,当你检查if (Objs == null)
- 你实际上正在使用你当前所在的get方法。所以Objs { get; }
Objs { get; }
自称,这就是为什么它总是递归。
请记住,自动属性( get; set;
)实际上只是拥有支持字段和单独的get和set方法的简写。 如果没有这种魔力,您的代码将如下所示:
private List<Obj> _objs;
public List<Obj> GetObjs() { return _objs; }
public void SetObjs(List<Objs> objs) { _objs = objs; }
你在帖子中真正实现的是这个 - 注意GetObjs()多次调用自己。 因此,每当它自己调用时,它最终会导致它再次调用自己。 又一次又一次:
public List<Obj> GetObjs() {
if (GetObjs() == null)
{
SetObjs(new List<Obj>());
}
if (GetObjs().Count < 1)
{
GetObjs().Add(new Obj());
}
return GetObjs();
}
private List<Obj> objs = new List<Obj>() { new Obj() };
public List<Obj> Objs { get { return objs; } }
或者如果你想保护某人删除最后一个Obj
private List<Obj> objs = new List<Obj>();
public List<Obj> Objs
{
get
{
if (objs.Count == 0) objs.Add(new Obj());
return objs;
}
}
公共场景的目的是什么?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.