C#应该有一个懒惰的关键字来使懒惰初始化更容易吗?
例如.
public lazy string LazyInitializeString = GetStringFromDatabase();
代替
private string _backingField; public string LazyInitializeString { get { if (_backingField == null) _backingField = GetStringFromDatabase(); return _backingField; } }
解决方法
我不知道一个关键字,但它现在有一个
System.Lazy<T>
类型.
>它正式成为.Net Framework 4.0的一部分.
>它允许延迟加载成员的值.
>它支持一个lambda表达式或一个方法来提供一个值.
例:
public class ClassWithLazyMember { Lazy<String> lazySource; public String LazyValue { get { if (lazySource == null) { lazySource = new Lazy<String>(GetStringFromDatabase); // Same as lazySource = new Lazy<String>(() => "Hello,Lazy World!"); // or lazySource = new Lazy<String>(() => GetStringFromDatabase()); } return lazySource.Value; } } public String GetStringFromDatabase() { return "Hello,Lazy World!"; } }
测试:
var obj = new ClassWithLazyMember(); MessageBox.Show(obj.LazyValue); // Calls GetStringFromDatabase() MessageBox.Show(obj.LazyValue); // Does not call GetStringFromDatabase()
在上面的测试代码中,GetStringFromDatabase()只被调用一次.我认为这是你想要的.
编辑:
在收到@dthorpe和@Joe的评论之后,我可以说是以下是最短的:
public class ClassWithLazyMember { Lazy<String> lazySource; public String LazyValue { get { return lazySource.Value; } } public ClassWithLazyMember() { lazySource = new Lazy<String>(GetStringFromDatabase); } public String GetStringFromDatabase() { return "Hello,Lazy World!"; } }
因为以下不编译:
public Lazy<String> LazyInitializeString = new Lazy<String>(() => { return GetStringFromDatabase(); });
而该属性是Lazy< String>的类型.不是字符串.你总是需要使用LazyInitializeString.Value访问它的值.
而且,我开放的建议如何缩短.