(Bar) という名前のプロパティを遅延ロードするクラス (Foo) があります。初期化されていないバッキング フィールドを (インテリセンスまたは経験の浅いスタッフによる) 誤った使用から保護するための優先する方法は何ですか?
私は3つのオプションを考えることができます:
class Foo {
// option 1 - Easy to use this.bar by mistake.
string bar;
string Bar {
get {
// logic to lazy load bar
return bar;
}
}
// option 2 - Harder to use this._bar by mistake. It is more obscure.
string _bar2;
string Bar2 {
get {
// logic to lazy load bar2
return _bar2;
}
}
//option 3 - Very hard to use the backing field by mistake.
class BackingFields {
public string bar;
}
BackingFields fields = new BackingFields();
string Bar3 {
get {
// logic to lazy load bar
return fields.bar;
}
}
}
バッキング フィールド バーをいじくり回してほしい唯一の場所は、プロパティのセッターとゲッターであることを覚えておいてください。クラスの他の場所では、常に this.Bar を使用する必要があります
アップデート
私は現在、次の Lazy 実装を使用しています(バッキング フィールドを持つすべてのプロパティではなく、遅延読み込み、同期、および通知を必要とする一部のプロパティに対して)。先物もサポートするように拡張できます(後で別のスレッドで評価を強制します)
注私の実装は、外部セットをサポートしているため、読み取り時にロックされます。
また、これはRuby などで克服できる言語の制限だと思います。
この方法で遅延を実装できます。
x = lazy do
puts "<<< Evaluating lazy value >>>"
"lazy value"
end
puts x
# <<< Evaluating lazy value >>>
# lazy value