的延遲初始化版本,這是我用了很多自己的技術。這還可以幫助節省內存資源,因爲它沒有實例化列表對象,除非對象屬性實際上在消費代碼中被使用。這使用「延遲加載」技術。
此外,您列出的「延遲加載」技術不是線程安全的。如果同時發生多個呼叫,則可能會有多次呼叫將該屬性設置爲一個新的列表對象,從而會用新的空列表對象覆蓋任何現有的列表值。爲了使Get訪問線程安全的,你需要使用Lock statement,就像這樣:
private IList<BCSFilter> _BCSFilters;
// Create out "key" to use for locking
private object _BCSFiltersLOCK = new Object();
/// <summary>
/// Gets or sets the BCS filters.
/// </summary>
/// <value>The BCS filters.</value>
public IList<BCSFilter> BCSFilters
{
get
{
if (_BCSFilters == null)
{
// Lock the object before modifying it, so other
// simultaneous calls don't step on each other
lock(_BCSFiltersLOCK)
{
if (_BCSFilters == null)
}
_BCSFilters = new List<BCSFilter>();
}
}
}
return _BCSFilters;
}
set
{
_BCSFilters = value;
}
}
不過,如果你總是需要的清單<>對象實例化這是一個稍微簡單對象的構造函數中只是創建它並改用自動屬性。像下面這樣:
public class MyObject
{
public MyObject()
{
BCSFilters = new List<BCSFilter>();
}
public IList<BCSFilter> BCSFilters { get; set; }
}
此外,如果您離開「設置」存取公共那麼消費代碼就能將該屬性設置爲空,可破壞其他消費代碼。因此,讓消費代碼無法將屬性值設置爲Null的一種好方法是將set訪問器設置爲private。像這樣:
public IList<BCSFilter> BCSFilters { get; private set; }
相關的技術是從屬性返回一個IEnumerable對象。這將允許您隨時在對象內部替換列表<>類型,並且消費代碼不會受到影響。要返回IEnumerable> <>,您可以直接返回普通列表<>對象,因爲它實現了IEnumerable接口。像下面這樣:
public class MyObject
{
public MyObject()
{
BCSFilters = new List<BCSFilter>();
}
public IEnumerable<BCSFilter> BCSFilters { get; set; }
}
+1同意。不要在沒有必要的地方添加它。 – 2009-11-24 12:11:39
感謝Chris給出了一個簡明扼要的答案 – 2009-11-24 12:20:01
唯一的缺點是這個初始化不是線程安全的,另請參閱Rob Levine的回覆。 (如果你把這個寫入你的回覆中,會很好。) – peterchen 2009-11-24 12:40:27