[英]Initializing a static field vs. returning a value in static property get?
A) 在下面的代碼中,方法DataTools.LoadSearchList()
只調用一次,還是每次訪問屬性時調用?
public static IEnumerable<string> SearchWordList
{
get
{
return DataTools.LoadSearchList();
}
}
B) 這有什么區別嗎?
public static IEnumerable<string> SearchWordList = DataTools.LoadSearchList();
在您的第一個示例中,每次訪問該屬性時都會調用 LoadSearchList()。
在第二個中, LoadSearchList() 只會被調用一次(但無論您是否使用它都會被調用,因為它現在是一個字段而不是一個屬性)。
更好的選擇可能是:
private static IEnumerable<string> _searchWordList;
public static IEnumerable<string> SearchWordList
{
get
{
return _searchWordList ??
( _searchWordList = DataTools.LoadSearchList());
}
}
或者,如果您使用 .NET 4.0 並且想要線程安全的東西,您可以使用Lazy<T>
,正如 Jon Skeet 所提到的(我認為語法應該是正確的,但不要強迫我):
private static Lazy<IEnumerable<string>> _searchWordList =
new Lazy<IEnumerable<string>>(() => DataTools.LoadSearchList());
public static IEnumerable<string> SearchWordList
{
get { return _searchWordList.Value; }
}
在第一種情況下,每次訪問屬性時都會調用該方法。 當它被設置為一個字段時,它將只運行一次 - 當它初始化類型時 - 無論它是否曾經被訪問過。
如果你想要一個延遲初始化的值,我會推薦 .NET 4 中的Lazy<T>
。
是的,每次訪問該屬性都會調用 DataTools.LoadSearchList()。 靜態字段只會調用該方法一次。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.