可能重复:
C# 构造函数执行顺序
class Foo
{
public int abc;
Foo()
{
abc = 3;
}
}
class Bar : Foo
{
Bar() : base()
{
abc = 2;
}
}
在上面的例子中,当 Bar 的对象被创建时,BarObject.abc 的值是多少?是首先调用基本构造函数,还是 Bar() 运行,/然后/ base() 构造函数?
可能重复:
C# 构造函数执行顺序
class Foo
{
public int abc;
Foo()
{
abc = 3;
}
}
class Bar : Foo
{
Bar() : base()
{
abc = 2;
}
}
在上面的例子中,当 Bar 的对象被创建时,BarObject.abc 的值是多少?是首先调用基本构造函数,还是 Bar() 运行,/然后/ base() 构造函数?
它将是 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;}。
假设您使 abc protected 编译,它将是 2;但是,base()
首先调用。
对于这样的事情,编写一个简单的测试应用程序并设置一些断点来找到答案。
变量 abc 将设置为 3,然后更改为 2(首先调用基本构造函数)。
首先调用基本构造函数,abc 的值为 2