【问题标题】:How to simplify multiple constructors?如何简化多个构造函数?
【发布时间】:2012-08-17 05:09:02
【问题描述】:

我希望一个类有两个构造函数,如下:

public MyClass()
{
    // do stuff here
}

public MyClass(int num)
{
    MyClass();
    // do other stuff here
}

以上是实现我目的的正确方法吗?有没有更好的速记方式?

【问题讨论】:

    标签: c# constructor visual-studio-2005 multiple-constructors


    【解决方案1】:

    正确的语法如下所示:

    public MyClass() 
    { 
        // do stuff here 
    } 
    
    public MyClass(int num) : this()
    { 
        // do other stuff here 
    } 
    

    注意第二个构造函数中的this()。这将调用同一个类中的构造函数,不带参数。

    你也可以反过来:

    public MyClass() : this(someReasonableDefaultValueForNum)
    { 
    } 
    
    public MyClass(int num)
    { 
        // do all stuff here 
    } 
    

    在这个地方,除了this,您只能使用另外一个“功能”,即base

    public MyClass(int num) : base(someParameterOnTheBaseClassConstructor)
    {
    }
    

    如果您不想调用基类中的默认无参数构造函数,而是调用带参数的构造函数之一,这很有用。

    【讨论】:

    • 这称为构造函数链。
    【解决方案2】:
    public MyClass()
    {
        // do stuff
    }
    
    public MyClass(int num)
        : this ()
    {
        // do other stuff with num
    }
    

    : this() 位称为构造函数初始化器。 C# 中的每个构造函数都有一个初始化程序,它在构造函数本身之前运行。默认情况下,初始化程序是基类的无参数构造函数(或 Object,如果该类未显式派生自另一个类)。这可确保在构造派生类的其余部分之前正确初始化基类的成员。

    可以通过两种方式覆盖每个构造函数的默认构造函数初始化器。

    1. : this(...) 构造指定同一类中的另一个构造函数作为它所应用的构造函数的启动器。
    2. : base(...) 构造指定基类中的构造函数(通常不是无参数构造函数,因为这是默认构造函数)。

    有关您可能想要的更多详细信息,请参阅 C# 4.0 语言规范第 10.11 节。

    【讨论】:

      【解决方案3】:

      也许使用一个带有参数默认值的构造函数:

      public MyClass(int num = 0)
      {
          MyClass();
          // do other stuff here
      }
      

      【讨论】:

        【解决方案4】:

        你可以这样做:

        public MyClass()
        {
            // do stuff here
        }
        
        public MyClass(int num) : this()
        {
        
            // do other stuff here
        }
        

        【讨论】:

        • 在这种情况下可以用任何其他函数代替this()吗?
        • @CJ7 这不是一个函数。这是一种特殊的语法结构。只有this(..)base(..) 是允许的。见Using Constructors
        【解决方案5】:

        您可以执行以下操作:

        public MyClass()
           : this(1) { }
        
        public MyClass(int num)
        {
           //do stuff here
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-09-16
          • 1970-01-01
          相关资源
          最近更新 更多