C# 要进一步缩写这段代码吗?

C# 要进一步缩写这段代码吗?,c#,C#,我有一个这样的财产: private DataSet dsFoo = null; public DataSet Foo { get { if (dsFoo == null) { dsFoo = PopulateFoo(); } return dsFoo; } } 多亏了C#6,我将其缩写为: private DataSet dsFoo = null; public DataSet Foo =>

我有一个这样的财产:

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的声明与属性声明位于同一行

最终,您将需要一个支持字段。为了反映延迟创建的值的语义,您可以使用如下类似的方法:


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

是的,一行无关的代码确实是一个累赘……我的讽刺放在一边-不,这是最简洁的。如果它不一定是
DataSet
,你可以做
public Lazy Foo{get;}=new Lazy(PopulateFoo)好吧,如果这样做更好的话,您可以删除显式的
null
赋值,因为默认情况下
DataSet
应该已经是
null
。@DStanley对于一些人来说,编码不是一项工作,而是一门艺术。追求卓越应该受到赞扬,而不是嘲笑。我觉得它很美。(现在,如果是在有薪雇主时间,那么雇主有一句话。但我很欣赏他的学术好奇心。没有“嗯……我能做得不同吗……?”就没有任何进步。当然,这些hmm中没有多少能带来进步,但你明白我的观点,对吧?
private Lazy<DataSet> foo = new Lazy<DataSet>(PopulateFoo);
public DataSet Foo => foo.Value;
public LazyImplicit<DataSet> Foo { get; } = new LazyImplicit<DataSet>(PopulateFoo);
class LazyImplicit<T> : Lazy<T>
{
    public LazyImplicit(Func<T> valueFactory) : base(valueFactory) { }
    public static implicit operator T(LazyImplicit<T> obj) => obj.Value;
}