C#应该有一个懒惰的关键字来使懒惰初始化更容易吗?
@H_404_11@解决方法
例如.
- 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!";
- }
- }
测试:
在上面的测试代码中,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访问它的值.
而且,我开放的建议如何缩短.