在C#构造函数头中使用冒号

时间:2012-06-01 15:13:23

标签: c# constructor

下面是struct名为Complex的构造函数,它包含两个成员变量,Real和Imaginary:

public Complex(double real, double imaginary) : this()
{
 Real = real;
 Imaginary = imaginary;
}

函数头中冒号后的部分有什么用?

7 个答案:

答案 0 :(得分:20)

您始终可以从另一个构建函数中调用一个构造函数。比方说,例如:

public class mySampleClass
{
    public mySampleClass(): this(10)
    {
        // This is the no parameter constructor method.
        // First Constructor
    }

    public mySampleClass(int Age) 
    {
        // This is the constructor with one parameter.
        // Second Constructor
    }
}

this指的是同一个类,所以当我们说this(10)时,我们实际上是指执行public mySampleClass(int Age)方法。上述调用方法的方法称为初始化程序。我们可以在方法中以这种方式使用最多一个初始化器。

在您的情况下,它将调用默认构造函数而不带任何参数

答案 1 :(得分:17)

它被称为构造函数链接 - 它实际上调用另一个构造函数(在这种情况下不接受参数),然后返回并在此构造函数中执行任何其他工作(在这种情况下设置Real的值和Imaginary)。

答案 2 :(得分:7)

这是constructor-initializer,它在构造函数体之前立即调用另一个实例构造函数。构造函数初始值设定项有两种形式:thisbase

base构造函数初始化程序导致调用直接基类的实例构造函数。

this构造函数初始化程序会导致调用类本身的实例构造函数。当构造函数初始值设定项没有参数时,则调用无参数构造函数。

class Complex
{
   public Complex() // this constructor will be invoked
   {    
   }

   public Complex(double real, double imaginary) : this()
   {
      Real = real;
      Imaginary = imaginary;
   }
}

BTW通常构造函数链接是从具有较少参数计数的构造函数到具有更多参数的构造函数完成的(通过提供默认值):

class Complex
{
   public Complex() : this(0, 0)
   {    
   }

   public Complex(double real, double imaginary)
   {
      Real = real;
      Imaginary = imaginary;
   }
}

答案 3 :(得分:2)

: this()指示编译器在执行此构造函数中的代码之前调用类的默认构造函数。如果默认构造函数为空,则它没有实际效果。

答案 4 :(得分:0)

它的构造函数链接调用同一类的默认或无参数构造函数。

答案 5 :(得分:0)

在定义对属性使用C#简写表示法的结构时,对默认构造函数的调用很有用(也是必需的)。例如:

public struct Foo
{
    public int X{get;set;}

    public Foo(int x)
    {
        X = x;
    }
}

编译器将在此处引发错误,因为在指定了所有结构字段之前,不能在构造函数中使用“this”对象来指定X.在幕后,会自动创建一个字段作为属性X的后备存储,并调用struct的默认构造函数初始化此字段(在这种情况下为默认值0)。

有关详细信息,请参阅此问题:Automatically implemented property in struct can not be assigned

答案 6 :(得分:0)

这称为构造函数链接。在构造函数中使用它来调用另一个构造函数。 您也可以将其用于类继承,例如:

public class MyException : Exception
{
    public MyException(string message) : base(message){}
}