为什么输出是yyxz

本文关键字:yyxz 输出 为什么 | 更新日期: 2023-09-27 18:25:31

我已经编写了以下代码,但我对以下代码的输出有疑问。

第一个疑问是,当我们初始化子类对象时,首先调用基类构造函数,因此OutPut应该仅为xz。不应调用Y类的构造函数。

第二个疑问是Y被调用,那么顺序应该由yxyz调用。

请澄清我的疑虑。

   class X
        {
            Y y = new Y();
            public X()
            {
                Console.Write("x");
            }
        }
        class Y
        {
            public Y()
            {
                Console.Write("y");
            }
        }
        class Z: X
        {
            Y y = new Y();
            public Z()
            {
                Console.Write("z");
            }
        }
        public static void Main()
        {
            new Z();
        }

为什么输出是yyxz

如果你在MSDN上查看这个链接,你会看到操作是如何执行的:

变量初始值设定项被转换为赋值语句,这些赋值语句在调用基类实例构造函数之前执行。这种排序确保所有实例字段在执行任何有权访问该实例的语句之前都由其变量初始值设定项初始化

这意味着你的执行顺序是:

  1. 从打印y的类Z调用类Y构造函数
  2. 基类X构造函数是从类Z调用的,但它首先初始化类Y的变量,该变量打印另一个y
  3. 基类X构造函数是从打印x的类Z调用的
  4. 调用了Z类的构造函数,该构造函数打印z

非常简单:字段初始化程序在构造函数之前处理。在调用任何一个构造函数之前,行Y y = new Y();都在ZX中运行。