我很想写这样的代码:
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
块中的代码,之后只返回它的值。
我的问题:
我没有开始讨论如何将其纳入图书馆的下一个版本,但我很好奇这个功能需要考虑什么样的考虑因素。
答案 0 :(得分:56)
答案 1 :(得分:5)
系统库已经有了一个可以满足您需求的类:System.Lazy<T>
我确信它可以集成到该语言中,但正如Eric Lippert将告诉您为某种语言添加功能并不是一件容易接受的事情。必须考虑许多事情,并且利益/成本比率必须非常好。由于System.Lazy
已经很好地处理了这个问题,我怀疑我们会很快看到这个。
答案 2 :(得分:3)
您知道.Net 4.0中添加的Lazy<T>
类吗?
http://sankarsan.wordpress.com/2009/10/04/laziness-in-c-4-0-lazyt/
答案 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)
如果您不介意使用后期编译器,CciSharp有this feature:
class Zebra {
[Lazy] public int StripeCount {
get { return ExpensiveCountingMethodThatReallyOnlyNeedsToBeRunOnce(); }
}
}
答案 6 :(得分:2)
查看Lazy<T>
类型。另外请Eric Lippert将这样的事情添加到语言中,毫无疑问他会有这样的看法。