何时以及为什么我应该使用ClassName : this(null)?

8
我可以帮助您翻译这段内容。这段话的意思是:我不理解一个简单的裸露标签和一个自闭合标签之间的区别。
Public ClassName() {}

and

Public ClassName() : this(null) {}

我知道只有当我有一个重载了+1的构造函数时才能使用它,但是我不明白以这种方式定义无参构造函数的优点所在。

1
请参见:C# 构造函数链 - Metro Smurf
它通过重用隐含的单参数构造函数,清理了API并减少了代码重复。 - JosephHirn
3个回答

10

这样可以使单参数构造函数具有所有逻辑,避免重复。

public ClassName() : this(null) {}

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

我希望能清晰地表达,如果没有this(null)这个语句,"logic"和"even more logic"就需要在无参构造函数中重复。


谢谢你的回复。你所说的“拥有所有逻辑”是什么意思? - Sergio
1
@Daedalus 假设你需要在构造函数中进行一些设置工作,这些工作与参数完全无关。你可以让无参构造函数调用第二个构造函数,并将设置工作放在那里,而不是复制和粘贴代码两次。 - Scott Chamberlain
1
@Daedalus,与其在两个构造函数中重复代码并进行微小更改以处理一个参数的存在,不如将所有代码放在一个构造函数中,并让另一个构造函数调用具有所有代码和一些默认值的那个构造函数。 - Servy

3

一个非常有用的情况是像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.
        } 
    }
}

好的,但如果我省略了“this(null)”什么也没有改变,在我的眼中… 我错过了什么? - Sergio
2
不,如果你省略this(null),设计师将永远不会调用InitializeComponent() - Scott Chamberlain
@ScottChamberlain 但这是一个未使用的构造函数,因为正如你所说,参数是必需的,无参数的构造函数永远不会被使用;它只是为了让它编译。 - Servy
5
但是它被winforms设计器使用。如果省略构造函数,将无法使用设计器。 - Scott Chamberlain
我在当前项目中有一些表单没有无参构造函数,但是它们可以通过设计师正常工作。设计师实际上并不会实例化你的表单;它只实例化基础的Form类。【更多信息】(http://blogs.msdn.com/b/rprabhu/archive/2004/12/12/280823.aspx)。 - JosephHirn

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,因此这是基于上下文的。我需要知道您的上下文是什么。


构造函数注入用于依赖注入。问题和你的回答都涉及到构造函数链。 - Metro Smurf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接