A)在下面的代码中,方法DataTools.LoadSearchList()
只会被调用一次,还是每次访问属性时都会被调用?
public static IEnumerable<string> SearchWordList
{
get
{
return DataTools.LoadSearchList();
}
}
B)这有什么不同吗?
public static IEnumerable<string> SearchWordList = DataTools.LoadSearchList();
答案 0 :(得分:36)
在第一个示例中,每次访问属性时都会调用LoadSearchList()。
在第二个中,LoadSearchList()只会被调用一次(但无论你是否使用它都会被调用,因为它现在是一个字段而不是属性)。
更好的选择可能是:
private static IEnumerable<string> _searchWordList;
public static IEnumerable<string> SearchWordList
{
get
{
return _searchWordList ??
( _searchWordList = DataTools.LoadSearchList());
}
}
或者,如果您使用的是.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; }
}
答案 1 :(得分:13)
在第一种情况下,每次访问属性时都会调用该方法。当它被设置为一个字段时,它将只运行一次 - 当它初始化的类型 - 无论是否 访问它。
如果你想要一个延迟初始化的值,我建议使用.NET 4中的Lazy<T>
。
答案 2 :(得分:2)
是的,每次访问时,属性都会调用DataTools.LoadSearchList()。静态字段只会调用该方法一次。