加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C#应该有一个懒惰的关键词

发布时间:2020-12-15 06:41:52 所属栏目:百科 来源:网络整理
导读:C#应该有一个懒惰的关键字来使懒惰初始化更容易吗? 例如. public lazy string LazyInitializeString = GetStringFromDatabase(); 代替 private string _backingField; public string LazyInitializeString { get { if (_backingField == null) _backingFiel
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访问它的值.

而且,我开放的建议如何缩短.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读