web-dev-qa-db-ja.com

静的フィールドを初期化するのか、静的プロパティに値を返すのか?

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

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

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

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

最初の例では、プロパティにアクセスするたびに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; }
}
37
Justin Niessner

最初のケースでは、プロパティがアクセスされるたびにメソッドが呼び出されます。フィールドとして設定されている場合は、型が初期化されたときに、それがeverにアクセスされているかどうかに関係なく、1回だけ実行されます。

遅延初期化された値が必要な場合は、.NET 4のLazy<T>をお勧めします。

15
Jon Skeet

はい、プロパティはアクセスするたびにDataTools.LoadSearchList()を呼び出します。静的フィールドはメソッドを1回だけ呼び出します。

2