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

本文关键字:构造函数 | 更新日期: 2023-09-27 18:35:57

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

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

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

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

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

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)方法。上述调用该方法的方式称为初始值设定项。我们最多可以在方法中以这种方式拥有一个初始值设定项。

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

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

这是一个

构造函数初始值设定项,它在构造函数主体之前调用另一个实例构造函数。构造函数初始值设定项有两种形式: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;
   }
}

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

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

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

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

在定义对属性使用 C# 速记表示法的结构时,对默认构造函数的调用非常有用(并且是必需的)。 例如:

public struct Foo
{
    public int X{get;set;}
    public Foo(int x)
    {
        X = x;
    }
}

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

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