8

単純な裸の違いがわかりません

Public ClassName() {}

Public ClassName() : this(null) {}

+1オーバーロードされたctorがある場合にのみ使用できることは知っていますが、defining the parameterless constructorこの方法の利点は理解できません。

4

3 に答える 3

10

これにより、単一パラメーターのコンストラクターがすべてのロジックを持つことができるため、繰り返されません。

public ClassName() : this(null) {}

public ClassName(string s)
{
    // logic (code)
    if (s != null) {
        // more logic
    }
    // Even more logic
}

「ロジック」と「さらに多くのロジック」は、this(null).

于 2013-02-13T18:52:08.710 に答える
3

非常に便利なケースの 1 つは、WinForms のような状況で、デザイナーにはパラメーターのないコンストラクターが必要ですが、フォームにはコンストラクターが必要な場合です。

public partial SomeForm : Form
{
    private SomeForm() : this(null)
    {
    }

    public SomeForm(SomeClass initData)
    {
        InitializeComponent();

        //Do some work here that does not rely on initData.           

        if(initData != null)
        {
           //do somtehing with initData, this section would be skipped over by the winforms designer.
        } 
    }
}
于 2013-02-13T18:55:24.137 に答える
1

コンストラクター注入というパターンがあります。このパターンは、主に単体テストとロジックの共有に役立ちます。ここに例があります

public class SomeClass 
{
   private ISomeInterface _someInterface;
   public SomeClass() : this (null){} //here mostly we pass concrete implementation 
   //of the interface like this( new SomeImplementation())

   public SomeClass(ISomeInterface someInterface)
   {
      _someInterface = someInterface;       
      //Do other logics here
   }
}

このように、単体テストは偽の実装を渡すことで簡単になります。さらに、ロジックは共有 ( DRY ) されています。そして、最大数のパラメーターを取るコンストラクター内のすべてのロジックを実行します

しかし、あなたの場合、 null が渡されているため、コンテキストベースです。私はあなたの文脈が何であるかを知らなければなりません。

于 2013-02-13T18:58:50.247 に答える