17.10.3 Constructor execution

王朝other·作者佚名  2006-05-21
窄屏简体版  字體: |||超大  

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]

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航