为什么在克隆DataTable时会调用那么多构造函数?

时间:2017-05-30 08:09:39

标签: c# constructor datatable

请帮忙! 我有一些继承的类,如下所示:

public class DataTableA : DataTable
{
    // ...
    public DataTable CloneMe()
    {
        DataTable table = this;
        return table.Clone();
    }
}

public class DataTableB : DataTableA
{
    // ...
}

public class DataTableC : DataTableB
{
    // ...

    public void Test()
    {
        DataTable table = this.CloneMe(); 
    }
}

当我调用方法Test(类DataTableC)时,会调用以下构造函数:

  1. DataTable的构造函数
  2. DataTableA的构造函数
  3. DataTableB的构造函数
  4. DataTableC的构造函数
  5. 但为什么呢?我期望只调用“DataTable的构造函数”。

2 个答案:

答案 0 :(得分:1)

通常,在创建类型X的实例,并且该类型具有基类Y时,Y的构造函数将在{{1}的构造函数之前调用}}。任何长度的继承都会继续这种想法。

因此,在您的情况下,为了创建X的实例,需要首先调用DataTableC的构造函数。在调用DataTableB的构造函数之前,需要首先调用DataTableB的构造函数,这需要DataTableA的构造函数运行。

这是创建新实例时的正常行为。但是你在这里使用DataTable,那么你究竟在哪里创建DataTable.Clone的新实例?

这归结为implementation of DataTable.Clone。在内部,它使用DataTable.CreateInstance method,它本身使用反射来创建当前类型的新实例:

DataTableC

在您的情况下,由于当前类型为protected virtual DataTable CreateInstance() { return (DataTable) Activator.CreateInstance(this.GetType(), true); } ,因此正在创建DataTableC的新实例,这解释了为什么调用所有这些构造函数。

答案 1 :(得分:0)

public DataTable CloneMe()
{
  return new DataView(this, "0=1", null, DataViewRowState.CurrentRows).ToTable();
}

此方法克隆DataTable(或派生类的任何对象),而不创建DataTableC(DataTableA,DataTableB)对象。仅显式DataTable对象。