8

次のクラスがあるとします。

public class MyClass
{
    private string _param;

    public MyClass ()
    {
        _param = string.Empty;
    }

    public MyClass (string param)
    {
        _param = param;
    }
}

これらのコンストラクターをチェーンする 2 つの方法の間で引き裂かれています。

最初のもの

public MyClass () : this (string.Empty)
{
}

public MyClass (string param)
{
    _param = param;
}

2番目のもの:

public MyClass ()
{
    _param = string.Empty;
}

public MyClass (string param) : this ()
{
    _param = param;
}

では、パラメーターなしのコンストラクターからチェーンする方が良いですか、それともその逆ですか?

4

7 に答える 7

13

あなたの例では、私は最初に行きます。2番目は、明示的に設定する必要があるため、回避しようとしていると思われるコードの重複を実際には排除しません_param。2 番目のアプローチでの空のthis()呼び出しは完全に無償です。

于 2009-09-22T17:58:57.483 に答える
4

私は最初の方が好きです。コンストラクターの動作は常に一貫性があり、予測可能であり、さらにコードの重複が削減されます。

于 2009-09-22T17:59:07.403 に答える
3

pramater less から pramater へのチェーン、

したがって、デフォルトの値を持つlessor paramコンストラクターからより多くのパラメーターへの呼び出し

public MyClass()
{
    MyClass(default value here);
}

public Myclass(value)
{
    _value = value;
}
于 2009-09-22T18:00:07.043 に答える
1

MyClass (string param)あなたの場合の2番目の例は、クラスメンバーの割り当てを複製するため(コンストラクターを使用する場合)、実際には意味がありません。

チェーンされたコンストラクターが「機能を追加」している場合は、2 番目のアプローチがより便利です。

例:

public MyClass ()
{
    _param0 = string.Empty;
}

public MyClass (string param1) : this ()
{
    _param1 = param1;
}

public MyClass (string param1, string param2) : this (param1)
{
    _param2 = param2;
}

あなたの特定のケースでは、同じメンバーへの割り当てが 1 つしかないため、最初の例の方が明らかに適切です。

于 2009-09-22T18:24:31.697 に答える
1

つまり、デフォルト (string.Empty) をパラメーター化されたコンストラクターに渡す方が理にかなっているのに、空の文字列を割り当ててからコンストラクターで特定の文字列を割り当てる理由です。

于 2009-09-22T18:01:11.987 に答える
1

私も最初の方が好きです。単純な基本クラスから継承する複雑な派生クラスと同様に、「複雑な」コンストラクターを「基本的な」コンストラクターの機能に基づいて構築する必要があります。

于 2009-09-22T18:03:57.627 に答える
0

ここで「値が指定されていない場合にデフォルトを提供する」という目標を述べる場合は、明らかに最初のアプローチを使用する必要があります。

一般的なルールは次のようになります。

于 2009-09-22T18:02:38.020 に答える