私には奇妙な癖があるようです...少なくとも私の同僚によると。私たちは一緒に小さなプロジェクトに取り組んできました。私がクラスを書いた方法は(単純化された例)です:
[Serializable()]
public class Foo
{
public Foo()
{ }
private Bar _bar;
public Bar Bar
{
get
{
if (_bar == null)
_bar = new Bar();
return _bar;
}
set { _bar = value; }
}
}
したがって、基本的に、ゲッターが呼び出され、フィールドがまだnullである場合にのみ、フィールドを初期化します。これにより、どこでも使用されていないプロパティを初期化しないことで、過負荷を減らすことができると思いました。
ETA:私がこれを行った理由は、私のクラスには別のクラスのインスタンスを返すいくつかのプロパティがあり、さらに多くのクラスを持つプロパティもあるからです。最上位クラスのコンストラクターを呼び出すと、必ずしもすべてが必要なわけではない場合でも、これらすべてのクラスのすべてのコンストラクターが後で呼び出されます。
個人的な好み以外に、この慣行に反対するものはありますか?
更新:私はこの質問に関して多くの異なる意見を検討しました、そして私は私の受け入れられた答えを支持します。しかし、今ではその概念をよりよく理解するようになり、いつ使用するか、いつ使用しないかを決めることができます。
短所:
- スレッドセーフの問題
- 渡された値がnullの場合、「セッター」要求に従わない
- マイクロ最適化
- 例外処理はコンストラクターで行う必要があります
- クラスのコードでnullをチェックする必要があります
長所:
- マイクロ最適化
- プロパティがnullを返すことはありません
- 「重い」オブジェクトの読み込みを遅らせるか回避する
短所のほとんどは私の現在のライブラリには適用できませんが、「マイクロ最適化」が実際に何かを最適化しているかどうかを確認するためにテストする必要があります。
最後の更新:
さて、私は答えを変えました。私の最初の質問は、これが良い習慣であるかどうかでした。そして、私は今ではそうではないと確信しています。たぶん、私は現在のコードのいくつかの部分でそれをまだ使用しますが、無条件にそして間違いなく常にではありません。ですから、習慣を失い、使う前に考えてみます。みんな、ありがとう!