无论如何,进一步缩写此代码

本文关键字:代码 缩写 进一步 无论如何 | 更新日期: 2023-09-27 18:31:29

我有一个这样的属性:

private DataSet dsFoo = null;
public DataSet Foo {
    get {
        if (dsFoo == null) {
             dsFoo = PopulateFoo();
        }
        return dsFoo;  
    }
}

感谢 C# 6,我将其缩写为:

private DataSet dsFoo = null;
public DataSet Foo => dsFoo ?? (dsFoo = PopulateFoo());  

有没有办法进一步缩写这个属性,以便dsFoo的声明与属性声明相同? 还是就

无论如何,进一步缩写此代码

这么说了?

有没有办法进一步缩写这个属性,以便dsFoo的声明与属性声明在同一行?

最终,您将需要一个支持字段。 为了反映延迟创建的值的语义,您可以使用如下Lazy<T>

private Lazy<DataSet> foo = new Lazy<DataSet>(PopulateFoo);
public DataSet Foo => foo.Value;

作为在单个语句中复制上述内容的学术(不推荐)解决方案,可以在 C# 6 中通过以下方式实现类似的行为:

public LazyImplicit<DataSet> Foo { get; } = new LazyImplicit<DataSet>(PopulateFoo);

其中LazyImplicit定义为:

class LazyImplicit<T> : Lazy<T>
{
    public LazyImplicit(Func<T> valueFactory) : base(valueFactory) { }
    public static implicit operator T(LazyImplicit<T> obj) => obj.Value;
}

LazyImplicit<T>T 的隐式转换允许您声明DataSet n = YourClass.Foo,同时确保仅按需调用PopulateFoo,并且每个实例不超过一次。 但是,方法签名将显示返回LazyImplicit<DataSet>而不是DataSet Foo,这是非惯用的,需要调用者知道隐式转换的存在。