在 .NET 4 中,还可以使用以下带有缓存属性的代码片段编写System.Lazy<T> http://msdn.microsoft.com/en-us/library/dd642331%28VS.100%29.aspx班级。我测量了两种方法的性能,结果几乎相同。为什么我应该使用其中一种而不是另一种,有什么真正的好处或魔力吗?
缓存属性
public static class Brushes
{
private static LinearGradientBrush _myBrush;
public static LinearGradientBrush MyBrush
{
get
{
if (_myBrush == null)
{
var linearGradientBrush = new LinearGradientBrush { ...};
linearGradientBrush.GradientStops.Add( ... );
linearGradientBrush.GradientStops.Add( ... );
_myBrush = linearGradientBrush;
}
return _myBrush;
}
}
}
懒惰
public static class Brushes
{
private static readonly Lazy<LinearGradientBrush> _myBrush =
new Lazy<LinearGradientBrush>(() =>
{
var linearGradientBrush = new LinearGradientBrush { ...};
linearGradientBrush.GradientStops.Add( ... );
linearGradientBrush.GradientStops.Add( ... );
return linearGradientBrush;
}
);
public static LinearGradientBrush MyBrush
{
get { return _myBrush.Value; }
}
}
我会用Lazy<T>
一般来说:
- 它是线程安全的(在这种情况下可能不是问题,但在其他情况下会是问题)
- 仅通过名称就可以清楚地看出发生了什么
- 它允许 null 为有效值
请注意,你不have对委托使用 lambda 表达式。例如,这是一种可能稍微干净一点的方法:
public static class Brushes
{
private static readonly Lazy<LinearGradientBrush> _myBrush =
new Lazy<LinearGradientBrush>(CreateMyBrush);
private static LinearGradientBrush CreateMyBrush()
{
var linearGradientBrush = new LinearGradientBrush { ...};
linearGradientBrush.GradientStops.Add( ... );
linearGradientBrush.GradientStops.Add( ... );
return linearGradientBrush;
}
public static LinearGradientBrush MyBrush
{
get { return _myBrush.Value; }
}
}
当创建过程因循环等而变得复杂时,这特别方便。请注意,从外观上看,您可以使用集合初始值设定项GradientStops
在您的创建代码中。
另一种选择是not当然,要惰性地执行此操作...除非您的类中有多个此类属性,并且您只想一一创建相关对象,否则在许多情况下您可以依赖惰性类初始化。
正如 DoubleDown 的回答中所指出的,没有办法重置它来强制重新计算(除非你使Lazy<T>
字段不是只读的) - 但我很少发现这很重要。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)