【问题标题】:C# Constructor chaining: proper usage?C# 构造函数链接:正确使用?
【发布时间】:2013-02-07 23:54:55
【问题描述】:

C# 新手,正在研究构造函数链接。

我有以下课程:

class ConstructorChaining
{
    public string a;
    public string b;
    public int c;

    public ConstructorChaining(string astring, string anotherstring, int anint)
    {
        a = astring;
        b = anotherstring;
        c = anint;
    }

    public ConstructorChaining(string astring) : this("fff", astring, 2)
    {
        a = astring;
    }
}

如果我这样实例化它,并输出字段的值:

ConstructorChaining cc2 = new ConstructorChaining("xyz");
Console.WriteLine(cc2.a);
Console.WriteLine(cc2.b);
Console.WriteLine(cc2.c);

为什么 cc2.a 的值是“xyz”,而不是“fff”?我原以为只有 cc2.b 会得到这个值。

非常感谢

【问题讨论】:

    标签: c# oop design-patterns constructor


    【解决方案1】:

    “链式”构造函数在构造函数主体之前执行。

    因此,首先它在构造函数中使用三个参数将"fff" 分配给a
    在该构造函数执行完成后,将执行带有一个参数的构造函数的主体并将"xyz" 分配给a

    以下是链式构造函数的合理实现:

    class ConstructorChaining
    {
        public string a;
        public string b;
        public int c;
    
        public ConstructorChaining(string astring, string anotherstring, int anint)
        {
            a = astring;
            b = anotherstring;
            c = anint;
        }
    
        public ConstructorChaining(string astring) : this(astring, astring, 2)
        {
        }
    }
    

    【讨论】:

      【解决方案2】:

      因为你设置了a = astring调用了另一个构造函数,所以值被覆盖了。

      【讨论】:

        【解决方案3】:
        this("fff", astring, 2) 
        

        在您的 xyz 构造函数之前运行。 所以 cc2.a 有 valye fff 然后你用 xyz 覆盖它

        class ConstructorChaining
        {
            public string a;
            public string b;
            public int c;
        
            public ConstructorChaining(string astring, string anotherstring, int anint)
            {
                a = astring;
                b = anotherstring;
                c = anint;
            }
        
            public ConstructorChaining(string astring) : this("fff", astring, 2)
            {
                //This code will be executed After your 3 param constructor. 
                a = astring;
            }
        }
        

        【讨论】:

          【解决方案4】:

          因为三参数构造函数在执行一参数构造函数的主体之前执行。

          在伪代码中是这样的:

          public ConstructorChaining(string astring) 
          {
              this("fff", astring, 2)
              a = astring;
          }
          

          不是这样的:

          public ConstructorChaining(string astring) 
          {
              a = astring;
              this("fff", astring, 2)
          }
          

          【讨论】:

            【解决方案5】:

            您在调用超类构造函数之后在构造函数中运行实现,因此您将 cc2.a 覆盖为“xyz”。 最后完成的步骤如下:

            a = astring;        // = fff
            b = anotherstring;  // = xyz
            c = anint;          // = 2
            a = astring;        // = xyz
            

            【讨论】:

              【解决方案6】:

              因为带有一个参数(您调用的)的构造函数集 一个=“fff” b = "xyz" c = 2 这是由带有 3 个参数的构造函数完成的。之后,单参数构造器设置 a = "xyz"

              【讨论】:

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