静态属性初始化

mag*_*tic 29 .net c# static initialization properties

A)在下面的代码中,该方法DataTools.LoadSearchList()只会被调用一次,还是每次访问属性时?

public static IEnumerable<string> SearchWordList
{
    get
    {
        return DataTools.LoadSearchList();
    }
}
Run Code Online (Sandbox Code Playgroud)

B)这有什么不同吗?

public static IEnumerable<string> SearchWordList = DataTools.LoadSearchList();
Run Code Online (Sandbox Code Playgroud)

Jus*_*ner 39

在第一个示例中,每次访问属性时都会调用LoadSearchList().

在第二个中,LoadSearchList()只会被调用一次(但无论你是否使用它都会被调用,因为它现在是一个字段而不是一个属性).

更好的选择可能是:

private static IEnumerable<string> _searchWordList;

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

或者,如果你正在使用.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; }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,如果涉及多个线程,*可能*被调用多次.我个人更喜欢使用.NET 4中的`Lazy <T>`,如果这是一个选项.然后,很容易调整这种事情来制作第二个并发调用者块,例如. (4认同)
  • 对我来说很好看,虽然我认为*你可能只是做`新的Lazy <IEnumerable <string >>(DataTools.LoadSearchList)`来使用方法组转换. (2认同)

Jon*_*eet 15

在第一种情况下,每次访问属性时都会调用该方法.当它被设置为一个字段时,它将只运行一次 - 当它初始化的类型 - 无论它是否被访问过.

如果你想要一个延迟初始化的值,我建议Lazy<T>从.NET 4.