инициализация статического свойства - PullRequest
29 голосов
/ 18 марта 2011

A) В следующем коде будет ли метод DataTools.LoadSearchList() вызываться только один раз или каждый раз при обращении к свойству?

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

B) Есть ли какая-либо разница с этим?

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

Ответы [ 3 ]

37 голосов
/ 18 марта 2011

В первом примере LoadSearchList () будет вызываться при каждом обращении к свойству.

Во втором случае LoadSearchList () будет вызываться только один раз (но он будет вызываться независимо от того, используете вы его или нет, поскольку теперь это поле, а не свойство).

Лучшим вариантом может быть:

private static IEnumerable<string> _searchWordList;

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

Или, если вы используете .NET 4.0 и хотите что-то поточно-ориентированное, вы можете использовать Lazy<T>, как отметил Джон Скит (я думаю, что синтаксис должен быть правильным, но не придерживайтесь меня):

private static Lazy<IEnumerable<string>> _searchWordList =
    new Lazy<IEnumerable<string>>(() => DataTools.LoadSearchList());

public static IEnumerable<string> SearchWordList
{
    get { return _searchWordList.Value; }
}
15 голосов
/ 18 марта 2011

В первом случае метод будет вызываться при каждом обращении к свойству.Когда оно установлено в качестве поля, оно будет выполнено ровно один раз - при типе, к которому оно было инициализировано - независимо от того, к нему или к нему обращались ever .

Если вы хотите, чтобы значение, инициализированное лениво, I 'рекомендую Lazy<T> из .NET 4.

2 голосов
/ 18 марта 2011

Да, свойство будет вызывать DataTools.LoadSearchList () при каждом доступе.Статическое поле будет вызывать метод только один раз.

...