Подтвердить что ты не робот

Статическая инициализация свойств

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

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

B) Есть ли разница в этом?

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

Ответ 1

В первом примере 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; }
}

Ответ 2

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

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

Ответ 3

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