A)次のコードでは、メソッドDataTools.LoadSearchList()
は1回だけ呼び出されますか、それともプロパティがアクセスされるたびに呼び出されますか?
public static IEnumerable<string> SearchWordList
{
get
{
return DataTools.LoadSearchList();
}
}
B)これに違いはありますか?
public static IEnumerable<string> SearchWordList = DataTools.LoadSearchList();
最初の例では、プロパティにアクセスするたびにLoadSearchList()が呼び出されます。
2番目では、LoadSearchList()は一度だけ呼び出されます(ただし、プロパティではなくフィールドになったため、使用するかどうかに関係なく呼び出されます)。
よりよいオプションは次のとおりです。
private static IEnumerable<string> _searchWordList;
public static IEnumerable<string> SearchWordList
{
get
{
return _searchWordList ??
( _searchWordList = DataTools.LoadSearchList());
}
}
または、.NET 4.0を使用していて、スレッドセーフなものが必要な場合は、Jon Skeetが述べたように、Lazy<T>
を使用できます(構文は正しいはずですが、私はそれを気にしないでください)。
private static Lazy<IEnumerable<string>> _searchWordList =
new Lazy<IEnumerable<string>>(() => DataTools.LoadSearchList());
public static IEnumerable<string> SearchWordList
{
get { return _searchWordList.Value; }
}
最初のケースでは、プロパティがアクセスされるたびにメソッドが呼び出されます。フィールドとして設定されている場合は、型が初期化されたときに、それがeverにアクセスされているかどうかに関係なく、1回だけ実行されます。
遅延初期化された値が必要な場合は、.NET 4のLazy<T>
をお勧めします。
はい、プロパティはアクセスするたびにDataTools.LoadSearchList()を呼び出します。静的フィールドはメソッドを1回だけ呼び出します。