2013-06-02 88 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; 
    } 
} 

保護這將是一個公共組的目的是什麼?