27

可能重复:
C# 构造函数执行顺序

class Foo
{
    public int abc;
    Foo()
    {
       abc = 3;
    }

}

class Bar : Foo
{
    Bar() : base()
    {
       abc = 2;
    }
}

在上面的例子中,当 Bar 的对象被创建时,BarObject.abc 的值是多少?是首先调用基本构造函数,还是 Bar() 运行,/然后/ base() 构造函数?

4

6 回答 6

46

它将是 2。构造函数按从基类第一个到继承类最后一个的顺序运行。

请注意,初始化程序(静态变量和实例变量)以相反的方向运行。

完整的序列在这里:http ://www.csharp411.com/c-object-initialization/

于 2010-01-07T15:33:06.823 回答
4

首先调用基类构造函数,然后调用派生类构造函数。结果是 2。您应该明确说明该类变量的可访问性。它是受保护的、私有的还是公共的?

我看到您现在将其更改为公开,所以它将是 2。

此链接将进一步帮助您了解构造函数、它们的使用方式、调用时间以及使用继承时构造函数调用的顺序:

http://www.yoda.arachsys.com/csharp/constructors.html

此外,您可能想亲自尝试一下,您将通过练习和编写代码然后阅读它来了解更多信息。

尝试声明 Bar 并输出它的值。使用一些属性:

 class Foo
    {
        public int abc;
        public Foo()
        {
            abc = 3;
        }

        public int ABC
        {
            get { return abc; }
            set { abc = value; }
        }

    }

    class Bar : Foo
    {
        public Bar() : base()
        {
            abc = 2;
        }
    } 


    class Program
    {
        static void Main(string[] args)
        {
            Bar b = new Bar();
            Console.WriteLine(b.ABC);
            Console.ReadLine();

        }
    }

一个简单的打印输出将产生您正在寻找的结果。这是输出:

替代文字

你不只是爱我的namespace:-)。顺便说一句,您还可以使用自动属性,以便该属性只是 public int ABC {get;set;}。

于 2010-01-07T15:31:39.790 回答
2

假设您使 abc protected 编译,它将是 2;但是,base()首先调用。

对于这样的事情,编写一个简单的测试应用程序并设置一些断点来找到答案。

于 2010-01-07T15:35:30.360 回答
1

变量 abc 将设置为 3,然后更改为 2(首先调用基本构造函数)。

于 2010-01-07T15:31:10.853 回答
1

将首先调用基本构造函数,但此代码不会编译。子类不能访问私有字段。至少必须保护一个字段才能在子类中使用。

但是即使知道这一点,您尝试的行为也会令人困惑,因为它令人惊讶。只是你不得不问事情进入哪个订单这一事实意味着当订单被遗忘时它会变得一团糟。

于 2010-01-07T15:32:48.633 回答
1

首先调用基本构造函数,abc 的值为 2

于 2010-01-07T15:34:17.540 回答