我经常发现自己编写了一个懒惰地评估的属性。就像是:
if (backingField == null)
backingField = SomeOperation();
return backingField;
它的代码不多,但如果你有很多属性,它确实会重复很多。
我正在考虑定义一个名为 LazyProperty 的类:
public class LazyProperty<T>
{
private readonly Func<T> getter;
public LazyProperty(Func<T> getter)
{
this.getter = getter;
}
private bool loaded = false;
private T propertyValue;
public T Value
{
get
{
if (!loaded)
{
propertyValue = getter();
loaded = true;
}
return propertyValue;
}
}
public static implicit operator T(LazyProperty<T> rhs)
{
return rhs.Value;
}
}
这将使我能够像这样初始化一个字段:
first = new LazyProperty<HeavyObject>(() => new HeavyObject { MyProperty = Value });
然后属性的主体可以简化为:
public HeavyObject First { get { return first; } }
这将被公司的大多数人使用,因为它将进入我们大多数产品共享的公共类库中。
我无法决定这是否是一个好主意。我认为这些解决方案有一些优点,例如:
- 更少的代码
- 更漂亮的代码
不利的一面是,查看代码并准确确定发生了什么会更加困难——尤其是在开发人员不熟悉 LazyProperty 类的情况下。
你怎么看 ?这是一个好主意还是我应该放弃它?此外,隐式运算符是一个好主意,还是如果您应该使用此类,您是否更愿意显式使用 Value 属性?
欢迎提出意见和建议:-)