【问题标题】:Use of colon in C# constructor header在 C# 构造函数头中使用冒号
【发布时间】:2012-06-01 15:13:23
【问题描述】:

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

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

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

【问题讨论】:

标签: c# constructor


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 实际上在设置值之前调用了默认构造函数。
    【解决方案3】:

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

    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;
       }
    }
    

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 请务必在提供新答案之前查看现有答案。在这种情况下,有几个答案提到了构造函数链接,虽然公认的答案(八年前)没有提到它的名字,但它清楚地展示了这个概念。
        • 如果您仔细阅读,您会看到我的示例为超类构造链接提供了不同的方法。感谢您的评论。
        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-09-25
            • 1970-01-01
            • 2018-10-20
            • 2011-01-21
            • 1970-01-01
            • 1970-01-01
            • 2010-11-19
            相关资源
            最近更新 更多