向C#添加`lazy`关键字的问题

时间:2011-05-11 14:32:56

标签: c# properties keyword

我很想写这样的代码:

class Zebra
{
    public lazy int StripeCount
    {
        get { return ExpensiveCountingMethodThatReallyOnlyNeedsToBeRunOnce(); }
    }
}
编辑:为什么?我认为它看起来比:

更好
class Zebra
{
    private Lazy<int> _StripeCount;

    public Zebra()
    {
        this._StripeCount = new Lazy(() => ExpensiveCountingMethodThatReallyOnlyNeedsToBeRunOnce());
    }

    public lazy int StripeCount
    {
        get { return this._StripeCount.Value; }
    }
}

第一次调用属性时,它将运行get块中的代码,之后只返回它的值。

我的问题:

  1. 将此类关键字添加到库中会涉及哪些成本?
  2. 这会出现什么问题呢?
  3. 你觉得这有用吗?
  4. 我没有开始讨论如何将其纳入图书馆的下一个版本,但我很好奇这个功能需要考虑什么样的考虑因素。

7 个答案:

答案 0 :(得分:56)

答案 1 :(得分:5)

系统库已经有了一个可以满足您需求的类:System.Lazy<T>

我确信它可以集成到该语言中,但正如Eric Lippert将告诉您为某种语言添加功能并不是一件容易接受的事情。必须考虑许多事情,并且利益/成本比率必须非常好。由于System.Lazy已经很好地处理了这个问题,我怀疑我们会很快看到这个。

答案 2 :(得分:3)

答案 3 :(得分:3)

这不太可能被添加到C#语言中,因为即使没有Lazy<T>,您也可以轻松地自行完成。

一个简单的但不是线程安全的,例如:

class Zebra
{
    private int? stripeCount;

    public int StripeCount
    {
        get
        {
            if (this.stripeCount == null)
            {
                this.stripeCount = ExpensiveCountingMethodThatReallyOnlyNeedsToBeRunOnce();
            }
            return this.stripeCount;
        }
    }
}

答案 4 :(得分:3)

你试过吗?你的意思是这个吗?

private Lazy<int> MyExpensiveCountingValue = new Lazy<int>(new Func<int>(()=> ExpensiveCountingMethodThatReallyOnlyNeedsToBeRunOnce()));
        public int StripeCount
        {
            get
            {
                return MyExpensiveCountingValue.Value;
            }
        }

编辑:

在你的帖子编辑后我会补充一点,你的想法肯定更优雅,但仍然具有相同的功能!!!。

答案 5 :(得分:3)

如果您不介意使用后期编译器,CciSharpthis feature

class Zebra {
  [Lazy] public int StripeCount {
    get { return ExpensiveCountingMethodThatReallyOnlyNeedsToBeRunOnce(); }
  } 
} 

答案 6 :(得分:2)

查看Lazy<T>类型。另外请Eric Lippert将这样的事情添加到语言中,毫无疑问他会有这样的看法。