c# - C# 应该有惰性关键字吗

标签 c# .net lazy-initialization

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 expressionmethod提供值(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/

相关文章:

c# - 使用 NUnit 使用异步/等待方法进行单元测试

c# - 如何格式化具有固定宽度字段的字符串

c# - 我的客户列表已填充,但不会显示在服务器端 Blazor 的 Foreach 循环中

java - JPA 延迟获取列表调用 setter 中的 SELECT 查询

c# - ListView 的备用行颜色 - uwp

c# - System.Diagnostics Traces 源名称的通配符

C#/.NET 4.0 创建自定义 configElements 和 configCollection

c# - 如何拥有 C# 只读功能但不限于构造函数?

c++ - boost.serialization 和惰性初始化

c# - 在不使用容器的情况下从配置中统一拦截