簡體   English   中英

初始化靜態字段與返回靜態屬性中的值獲取?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM