0

以下の C# コード (ピース 1) に出くわしました - わかりやすくするために削減され、インスタンス メソッド、さらに多くのメンバーなどもありました。ここで非常にスマートなプログラミング パターンが欠けているのでしょうか? Address() 型は非常に単純で、実際にはデータ転送オブジェクトです。

ピース 1:

public class MyStuff
{
    private IAddress _address;

    public MyStuff()
    {
            SetAddress(_address = new Address());
    }

    private void SetAddress(IAddress addr)
    {
        _address = addr;
    }
}

ピース 2:

public class MyStuff
{
    private IAddress _address = new Address();

    public MyStuff()
    {
        //The constructor is probably redundant too
    }
}
4

2 に答える 2

2

あなたは明確にしていない_addressDaoので、両方のベースをカバーします:


_addressDao以下は、がどこかに存在し、残る必要があることを前提としています。

のため、これをピース 2 に圧縮することはできません_addressDao。ピース 1 は_addressメソッド呼び出し中にインラインで設定し、次に も設定_addressDaoしています。2 番目のピースは を省略_addressDaoしているため、同等 ではありません。


_addressDao以下は、それがタイプミスであるか、および/またはもう残す必要がないことを前提としています。

部分 2 は、問題がないと仮定する場合、部分 1 の有効な代替手段になる可能性があります_addressDao。それはあなたの状況にとって最善のアプローチではないかもしれませんが、あなたはそれを求めていないので、私はそれについての批判には立ち入りません.


インラインクラスメンバーの初期化は、メモリが機能する場合、コンストラクターで直接初期化する場合と同じものにコンパイルされます。最終的な結果は、コードの見た目が異なるだけで、同じ動作になります。

ピース 2 では、public パラメーターなしのコンストラクターが不要になったことも正しいです。コンストラクターがない場合、これはデフォルトで追加されます。


ここで使用されている潜在的な設計パターンに関しては、IoC または DI での試みである可能性がありますが、どちらでも成功していないようです。

于 2012-07-09T14:53:17.657 に答える
1

理想的には、彼らは同じことをします。実行時にピース 2 で実際に発生するのは、コードまたは this()/base() 呼び出しの前に、_address の初期化が MyStuff() コンストラクターで実行されることです。

ここに良い情報があります: C# メンバー変数の初期化。ベストプラクティス?

2巻の方が読みやすいと思いますが、個人的な好みです。

そうは言っても、最初の部分は _address を 2 回割り当てています。関数を呼び出すときに 1 回、関数自体に 1 回。

于 2012-07-09T14:54:58.540 に答える