无论如何,进一步缩写此代码
本文关键字:代码 缩写 进一步 无论如何 | 更新日期: 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
,这是非惯用的,需要调用者知道隐式转换的存在。