静的フィールドを初期化するか、静的プロパティ get で値を返すか? 質問する

静的フィールドを初期化するか、静的プロパティ get で値を返すか? 質問する

A) 次のコードでは、メソッドはDataTools.LoadSearchList()1 回だけ呼び出されますか、それともプロパティにアクセスするたびに呼び出されますか?

public static IEnumerable<string> SearchWordList
{
    get
    {
        return DataTools.LoadSearchList();
    }
}

B) これには何か違いがありますか?

public static IEnumerable<string> SearchWordList = DataTools.LoadSearchList();

ベストアンサー1

最初の例では、プロパティにアクセスするたびに LoadSearchList() が呼び出されます。

2 番目では、 LoadSearchList() は 1 回だけ呼び出されます (ただし、これはプロパティではなくフィールドになったため、使用するかどうかに関係なく呼び出されます)。

より良い選択肢は次のようになります:

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; }
}

おすすめ記事