2013-06-02 44 views
5

我有一个属性定义为...C#房产与硬编码getter和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; } 
} 

现在,当我这样做时,我得到一个错误,告诉我函数是递归的所有路径。

有没有办法做到这一点,而不创建一个私人支持领域?

+1

不要这样做。http://msdn.microsoft.com/en-us/library/ms182327.aspx – SLaks

+1

为什么你不能使用后台字段? – Default

+0

当涉及到滥用他们正在使用的系统时,人们有多么难以置信。幸运的是,编译器足够聪明,知道你正试图滥用系统,否则问题将是“为什么我的应用程序挂起” –

回答

12

拨打私人领域:

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(); 
    } 
+0

没办法做到这一点。 –

+0

为什么在java中创建一个例子(顺便说一下,它看起来像有效的C#代码给我)? C#中不会有相同的逻辑吗? – Default

+0

C#中的getter/setter缩短并不是你在很多语言中看到的,所以一些初学者可能不明白为什么发生递归。因此,我觉得用一种更加标准的方式写出一个吸气器来展示它的实际作用会很有趣。 –

3

没有没有办法做到没有支持领域。与这个问题无关,但与情况有关。一般来说,你不应该为集合公开一个setter,而只能是一个getter。如果你有一个setter,你经常暴露对象的内部状态,应该保持隐藏状态。

0

你应该使用私有字段来存储OBJ文件的列表。 您无法从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; } 
} 
1

你的财产是指自己在财产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; } 
} 
0

不,不是真的。

在您的代码中,当您检查if (Objs == null)时 - 您正在有效地使用当前所在的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(); 
} 
0
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; 
    } 
} 

保护这将是一个公共组的目的是什么?