无参数重载的构造函数调用参数化的一个?

时间:2014-01-29 18:03:45

标签: c# asp.net .net

你好,抱歉这个令人困惑的标题,我无法正确表达我想说的话。 关于这个问题,我应该如何解释这个片段?

public class Node
{
    public long Id { get; private set; }
    /// Creates a Node which has the supplied id.
    public Node(long id) : this()
    {
        Id = id;
    }
/* */ 
}

如果我没有错;当使用参数化构造函数创建Node时,this关键字应该调用相同的方法,但是没有参数,我认为应该默认为默认(sic),空构造函数。最后看起来这只是另一种调用空的默认构造函数的方法,这种方法毫无意义。 如果构造函数按预期工作,那么Id成员如何实例化?

完整的源代码在这里:http://sourceforge.net/p/satsumagraph/code/ci/master/tree/src/Graph.cs#l38

2 个答案:

答案 0 :(得分:6)

在您的实际代码中,Nodestruct,而不是类。

在这种情况下,需要将调用添加到默认构造函数。没有它,您会收到一条消息,指出该对象“在分配所有字段之前无法使用”,因为您在值类型中使用了自动属性。这是因为编译器添加了一个支持字段,并且必须先初始化该字段,然后才能访问该属性。构造函数尝试在初始化字段之前设置属性。每个struct都包含一个默认构造函数,并将其称为“零初始化”自动属性的支持字段,以使其正常运行。

如您所示,使用class,这将是不必要的(甚至不会编译)。

答案 1 :(得分:0)

根据msdn: -

  

构造函数可以使用this关键字调用同一对象中的另一个构造函数。与base类似,可以使用或不使用参数,构造函数中的任何参数都可以作为参数或作为表达式的一部分使用。

编译上面的代码时,它应该给你一个错误,因为你还没有定义一个无参数的构造函数。

因此,当你这样做时: -

  public Node(long id) : this()
  {
      Id = id;
  }

您正在尝试调用尚未定义的无参数构造函数。