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