17.10.3 Constructor execution

本文解析了C#中变量初始化的执行顺序及实例。详细说明了变量初始化器如何转换为赋值语句,并在基类实例构造函数调用前执行,确保所有实例字段在执行可访问该实例的语句之前被初始化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Variable initializers are transformed into assignment statements, and these
assignment statements are executed
before the invocation of the base class instance constructor. This ordering
ensures that all instance fields are
initialized by their variable initializers before any statements that have
access to that instance are executed.
[Example: For example:
C# LANGUAGE SPECIFICATION
260
using System;
class A
{
public A() {
PrintFields();
}
public virtual void PrintFields() {}
}
class B: A
{
int x = 1;
int y;
public B() {
y = -1;
}
public override void PrintFields() {
Console.WriteLine("x = {0}, y = {1}", x, y);
}
}
When new B() is used to create an instance of B, the following output is
produced:
x = 1, y = 0
The value of x is 1 because the variable initializer is executed before the
base class instance constructor is
invoked. However, the value of y is 0 (the default value of an int) because
the assignment to y is not executed
until after the base class constructor returns.
It is useful to think of instance variable initializers and constructor
initializers as statements that are automatically
inserted before the constructor-body. The example
using System;
using System.Collections;
class A
{
int x = 1, y = -1, count;
public A() {
count = 0;
}
public A(int n) {
count = n;
}
}
class B: A
{
double sqrt2 = Math.Sqrt(2.0);
ArrayList items = new ArrayList(100);
int max;
public B(): this(100) {
items.Add("default");
}
public B(int n): base(n ? 1) {
max = n;
}
}
contains several variable initializers; it also contains constructor
initializers of both forms (base and this). The
example corresponds to the code shown below, where each comment indicates
an automatically inserted
statement (the syntax used for the automatically inserted constructor
invocations isn?t valid, but merely serves to
illustrate the mechanism).
using System.Collections;
Chapter 17 Classes
261
class A
{
int x, y, count;
public A() {
x = 1; // Variable initializer
y = -1; // Variable initializer
object(); // Invoke object() constructor
count = 0;
}
public A(int n) {
x = 1; // Variable initializer
y = -1; // Variable initializer
object(); // Invoke object() constructor
count = n;
}
}
class B: A
{
double sqrt2;
ArrayList items;
int max;
public B(): this(100) {
B(100); // Invoke B(int) constructor
items.Add("default");
}
public B(int n): base(n ? 1) {
sqrt2 = Math.Sqrt(2.0); // Variable initializer
items = new ArrayList(100); // Variable initializer
A(n ? 1); // Invoke A(int) constructor
max = n;
}
}
end example]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值