在第一个示例中,每次访问属性时都会调用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; }
}
属性和字段的行为完全不同,尽管从编码的角度看它们可能看起来很相似。一个属性实际上只是一对获取/设置方法的快捷方式,并且与任何方法一样,每次调用时都会执行该正文。 – MattDavey 2011-03-18 15:25:14