遅延評価されるプロパティを記述していることに気付くことがよくあります。何かのようなもの:
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 プロパティを明示的に使用することをお勧めしますか?
意見や提案を歓迎します:-)