C# 是否应该有一个 lazy 关键字来使延迟初始化更容易?
例如
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 的正式组成部分。
- 它允许延迟加载
member
的值. - 它支持
lambda expression
或method
提供值(value)。
示例:
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>
不是 String
.您始终需要使用 LazyInitializeString.Value
访问它的值.
而且,我愿意就如何缩短它提出建议。
关于c# - C# 应该有惰性关键字吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4332189/