2012-10-10 183 views
4

在VB.Net中,我使用了這種變體,所以當使用SearchModel時,有一個空的標籤準備就緒。如何在C#中實例化一個屬性的新實例

Public Class SearchModel 
    Public Property Tags As New List(Of TagDetails) 
End Class 

一個簡單的轉換結果在這一點,但「標籤」爲空:

public class SearchModel 
{ 
    public List<TagDetails> Tags { get; set; } 
} 

這是創建了「標籤」屬性,並在同一時間創建一個新的空單可以接受的方法是什麼?

public class SearchModel 
{ 
    public List<TagDetails> Tags = new List<TagDetails>(); 
} 

或者我應該通過所有這個儀式嗎?

public class SearchModel 
{ 
    private List<TagDetails> _TagDetails; 
    public List<TagDetails> Tags 
    { 
     get { return _TagDetails ?? (_TagDetails = new List<TagDetails>()); } 
     set { _TagDetails = value; } 
    } 
} 

回答

8

的傳統方法是使用一個構造函數:

public class SearchModel 
{ 
    public SearchModel() 
    { 
     Tags = new List<TagDetails>(); 
    } 
    public List<TagDetails> Tags { get; set; } 
} 
+0

+1。通常情況下,你會在這種情況下將'set'設置爲private,所以不能替代List本身,但內容仍然可以修改。 (也編輯答案)。 –

+0

那麼,如果你希望它是私人的,那麼只能讓它成爲一個私人設置者。僅僅因爲你在構造函數中實例化了它,並不意味着你有*使它成爲一個私有的setter。 – Gromer

+0

@AlexeiLevenkov:我會同意Gromer。私人二傳手並不是必須具有構造函數的人。 –

5

中實例化在構造函數中:

public class SearchModel 
{ 
    public List<TagDetails> Tags { get; set; } 

    public SearchModel() 
    { 
     Tags = new List<TagDetails>(); 
    } 

    public SearchModel(List<TagDetails> tagDetails) 
    { 
     Tags = tagDetails; 
    } 
} 

我這樣做,在C#中,因爲你有大部分代碼在C#。你可以保持自動屬性這樣做。你也可以添加一個重載的構造函數,它接受一個要使用的列表(如果你不需要,就刪除它)。

0

最直接的轉換爲以下(這是VB做幕後):

public class SearchModel 
{ 
    private List<TagDetails> _Tags = new List<TagDetails>(); 
    public List<TagDetails> Tags 
    { 
     get 
     { 
      return _Tags; 
     } 
     set 
     { 
      _Tags = value; 
     } 
    } 
} 
0

也有沒有公開具體的列表類的好論據。我當然會質疑,二傳手是否明智,在物體壽命和垃圾收集器方面,你會得到一個正確的解決方案。

public class SearchModel 
{ 
    private List<TagDetails> _tags; 

    public SearchModel() 
    { 
     _tags = new List<TagDetails>(); 
    } 

    public IEnumerable<TagDetails> Tags {get {return _tags;}} 

} 

將是我第一次嘗試,然後添加任何其他列表類型的方法,我需要,清除,追加等

0

如果你想保持列表中的延遲實例:

public class SearchModel 
{ 
    private Lazy<List<TagDetails>> tags = new Lazy(() => new List<TagDetails>()); 

    public List<TagDetails> Tags 
    { 
    get { return this.tags.Value; } 
    } 
} 

但是,您將無法設置該值。

相關問題