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() 构造函数顺序[重复]的主要内容,如果未能解决你的问题,请参考以下文章