27

下面是struct具有两个成员变量 Real 和 Imaginary 的命名 Complex 的构造函数:

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

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

4

7 回答 7

35

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

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)方法。上述调用方法的方式称为初始化器。这样我们在方法中最多可以有一个初始化器。

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

于 2012-06-01T15:16:17.023 回答
26

它被称为构造函数链接——它实际上是在调用另一个构造函数(在这种情况下不带参数),然后返回并在这个构造函数中做任何额外的工作(在这种情况下设置Realand的值Imaginary)。

于 2012-06-01T15:15:08.443 回答
18

这是一个构造函数初始化器,它在构造函数主体之前立即调用另一个实例构造函数。构造函数初始化器有两种形式:thisbase.

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

this构造函数初始化器导致调用类本身的实例构造函数。当构造函数初始化器没有参数时,调用无参数构造函数。

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

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

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

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

   public Complex(double real, double imaginary)
   {
      Real = real;
      Imaginary = imaginary;
   }
}
于 2012-06-01T15:15:25.233 回答
3

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

于 2012-06-01T15:15:44.073 回答
3

它被称为构造函数链接。在构造函数中使用它来调用另一个构造函数。您也可以为类继承执行此操作,例如:

public class MyException : Exception
{
    public MyException(string message) : base(message){}
}
于 2020-07-03T18:36:48.733 回答
0

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

于 2012-06-01T15:16:19.760 回答
0

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

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

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

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

有关详细信息,请参阅此问题:无法分配结构中的自动实现属性

于 2012-06-01T15:20:07.097 回答