C# base() 构造函数顺序[重复]

Posted

技术标签:

【中文标题】C# base() 构造函数顺序[重复]【英文标题】:C# base() constructor order [duplicate] 【发布时间】:2011-01-02 13:03:30 【问题描述】:

可能重复:C# constructor execution order

class Foo

    public int abc;
    Foo()
    
       abc = 3;
    



class Bar : Foo

    Bar() : base()
    
       abc = 2;
    

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

【问题讨论】:

将成员变量公开的不好的做法。你可能想找一本关于开始 C# 对象的好书。 ***.com/questions/1882692/… 的副本,具有极好的接受答案和 cmet 链接 Eric Lippert 博客条目。 【参考方案1】:

它将是 2。构造函数按照从基类到继承类的顺序运行。

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

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

【讨论】:

很高兴知道初始化程序的顺序相反。但是为什么要这样设计,有2个不同的订单呢? @RayLuo 在重复答案的评论中解释。它链接到“第 2 部分”为 here 的页面,并说:“如果构造函数和初始化程序以它们的实际顺序运行,那么在任何可能的调用中,保证引用类型的初始化只读字段不为空。这种保证如果初始化程序按预期顺序运行,则无法满足。”【参考方案2】:

首先调用基类构造函数,然后调用派生类构造函数。 结果是 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;。

【讨论】:

【参考方案3】:

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

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

【讨论】:

+1 建议编写简单的测试【参考方案4】:

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

【讨论】:

这不是他第一次发布问题的时候。我已将其删除以适应他的更新。 alastairs,他发布的时候还没有公开。 这已被编辑,它最初没有声明范围(因此是私有的)。【参考方案5】:

基本构造函数将是called first,但此代码无法编译。子类不能访问私有字段。至少一个字段必须是protected 才能在子类中使用。

但即使知道这一点,您尝试的行为也会令人困惑,因为它令人惊讶。只是你不得不问事情是按什么顺序排列的,这意味着当忘记顺序时它会变得一团糟。

【讨论】:

【参考方案6】:

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

【讨论】:

以上是关于C# base() 构造函数顺序[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c# 子类如何调用父类的构造函数

c#构造函数通过反射获取'base'部分

c#学习-base和this在构造函数中的应用

C++创建派生类对象时,调用构造函数顺序

C#构造函数里的base和this的区别

C#中子类构造函数中如何调用父类构造函数