2013-04-29 171 views
1

我總是看到這兩種初始化模式在每一天的代碼中使用。我只是在尋找一個明確的理由,爲什麼你會選擇一個,而不是偏好?C#List屬性初始化模式

模式1

public class School 
{ 
    private List<User> _users; 

    public School() 
    { 
     _users = new List<User>(); 
    } 

    public List<User> Users 
    { 
     get 
     { 
      return _users; 
     } 
     set 
     { 
      _users = value; 
     } 
    } 
} 

模式2

public class School 
{ 
    public School() 
    { 
     this.Users = new List<User>(); 
    } 
    public List<User> Users { get; set;} 
} 
+3

我發現第二個更具可讀性;你不是嗎?此外,我非常重視我的屏幕房地產,所以第二次允許我一次看到更多的代碼,這進一步幫助我理解。 – 2013-04-29 01:29:42

+0

是的,我個人使用第二種模式,除非我需要轉換後備變量。 – joepour 2013-04-29 01:31:46

回答

4

它們是基本相同的。如果你在get或set中做了特別的事情,第一個只會有所作爲,否則第二個更緊湊,更容易閱讀。

0

模式2正在使用自動屬性。如果您不需要訪問支持字段,則不要放入支持字段。您可以隨後添加。這是一種封裝形式。

1

他們是一樣的東西。第二個是「語法糖」,這意味着編譯器基本上會爲您重複打字。

1

如果您需要訪問備份變量,請使用第一個。否則,請使用第二個參數,讓.NET框架爲您生成支持變量。

雖然我會說,將IList作爲公共財產公開並不總是一個好主意,因爲您可以打開班級列表進行全面修改。如果您只想公開IList的內容,請考慮實施enumerator

0

如果變量需要一個默認值,平時我用這個模式:

public class School 
{ 
    private List<User> _users = new List<Users>(); 
    public List<User> Users 
    { 
     get 
     { 
      return _users; 
     } 
     set 
     { 
      _users = value; 
     } 
    } 
} 

至少要等到我學會API設計。在那之後,我通常使用這種模式(這可能與大衛Hoerster的答案):

public class School 
{ 
    List<User> _users = new List<Users>(); 
    public IEnumerable<User> Users 
    { 
     get 
     { 
      return _users; 
     } 
     set 
     { 
      _users.Clean(); 
      _users.AddRange(value); 
     } 
    } 

    public void AddUser(User user){ 
     _users.Add(user); 
    } 
} 

一些原因:

  • 我immediaetly該酒店有默認值知道,沒有跟蹤到構造函數。
  • 它支持更好的抽象,因爲你可以將除列表以外的其他列舉,如的ObservableCollection,甚至純陣列(用戶[])

它可能有一些代碼味道,雖然,但我更喜歡它更好比擁有一個具體的List對象。