Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
C-sharp language specification.2004.pdf
Скачиваний:
14
Добавлен:
23.08.2013
Размер:
2.55 Mб
Скачать

Chapter 12 Variables

112.3.1 Initially assigned variables

2The following categories of variables are classified as initially assigned:

3Static variables.

4Instance variables of class instances.

5Instance variables of initially assigned struct variables.

6Array elements.

7Value parameters.

8Reference parameters.

9Variables declared by a catch clause, a foreach statement, or a using statement.

1012.3.2 Initially unassigned variables

11The following categories of variables are classified as initially unassigned:

12Instance variables of initially unassigned struct variables.

13Output parameters, including the this variable of struct instance constructors without a constructor

14initializer.

15Local variables, except those declared in a catch clause, a foreach statement, or a using statement.

1612.3.3 Precise rules for determining definite assignment

17In order to determine that each used variable is definitely assigned, the compiler shall use a process that is

18equivalent to the one described in this subclause.

19The compiler processes the body of each function member that has one or more initially unassigned

20variables. For each initially unassigned variable v, the compiler determines a definite assignment state for v

21at each of the following points in the function member:

22At the beginning of each statement

23At the end point (§15.1) of each statement

24On each arc which transfers control to another statement or to the end point of a statement

25At the beginning of each expression

26At the end of each expression

27The definite assignment state of v can be either:

28Definitely assigned. This indicates that on all possible control flows to this point, v has been assigned a

29value.

30Not definitely assigned. For the state of a variable at the end of an expression of type bool, the state of a

31variable that isn’t definitely assigned might (but doesn’t necessarily) fall into one of the following sub-

32states:

33o Definitely assigned after true expression. This state indicates that v is definitely assigned if the

34boolean expression evaluated as true, but is not necessarily assigned if the boolean expression

35evaluated as false.

36o Definitely assigned after false expression. This state indicates that v is definitely assigned if the

37boolean expression evaluated as false, but is not necessarily assigned if the boolean expression

38evaluated as true.

39The following rules govern how the state of a variable v is determined at each location.

119

C# LANGUAGE SPECIFICATION

112.3.3.1 General rules for statements

2v is not definitely assigned at the beginning of a function member body.

3v is definitely assigned at the beginning of any unreachable statement.

4The definite assignment state of v at the beginning of any other statement is determined by checking the

5definite assignment state of v on all control flow transfers that target the beginning of that statement. If

6(and only if) v is definitely assigned on all such control flow transfers, then v is definitely assigned at the

7beginning of the statement. The set of possible control flow transfers is determined in the same way as

8for checking statement reachability (§15.1).

9The definite assignment state of v at the end point of a block, checked, unchecked, if, while, do,

10for, foreach, lock, using, or switch statement is determined by checking the definite assignment

11state of v on all control flow transfers that target the end point of that statement. If v is definitely

12assigned on all such control flow transfers, then v is definitely assigned at the end point of the statement.

13Otherwise, v is not definitely assigned at the end point of the statement. The set of possible control flow

14transfers is determined in the same way as for checking statement reachability (§15.1).

1512.3.3.2 Block statements, checked, and unchecked statements

16The definite assignment state of v on the control transfer to the first statement of the statement list in the

17block (or to the end point of the block, if the statement list is empty) is the same as the definite assignment

18statement of v before the block, checked, or unchecked statement.

1912.3.3.3 Expression statements

20For an expression statement stmt that consists of the expression expr:

21v has the same definite assignment state at the beginning of expr as at the beginning of stmt.

22If v if definitely assigned at the end of expr, it is definitely assigned at the end point of stmt; otherwise, it

23is not definitely assigned at the end point of stmt.

2412.3.3.4 Declaration statements

25If stmt is a declaration statement without initializers, then v has the same definite assignment state at the

26end point of stmt as at the beginning of stmt.

27If stmt is a declaration statement with initializers, then the definite assignment state for v is determined

28as if stmt were a statement list, with one assignment statement for each declaration with an initializer (in

29the order of declaration).

3012.3.3.5 If statements

31For an if statement stmt of the form:

32if ( expr ) then-stmt else else-stmt

33v has the same definite assignment state at the beginning of expr as at the beginning of stmt.

34If v is definitely assigned at the end of expr, then it is definitely assigned on the control flow transfer to

35then-stmt and to either else-stmt or to the end-point of stmt if there is no else clause.

36If v has the state “definitely assigned after true expression” at the end of expr, then it is definitely

37assigned on the control flow transfer to then-stmt, and not definitely assigned on the control flow

38transfer to either else-stmt or to the end-point of stmt if there is no else clause.

39If v has the state “definitely assigned after false expression” at the end of expr, then it is definitely

40assigned on the control flow transfer to else-stmt, and not definitely assigned on the control flow transfer

41to then-stmt. It is definitely assigned at the end-point of stmt if and only if it is definitely assigned at the

42end-point of then-stmt.

120

Chapter 12 Variables

1Otherwise, v is considered not definitely assigned on the control flow transfer to either the then-stmt or

2else-stmt, or to the end-point of stmt if there is no else clause.

312.3.3.6 Switch statements

4In a switch statement stmt with a controlling expression expr:

5The definite assignment state of v at the beginning of expr is the same as the state of v at the beginning

6of stmt.

7The definite assignment state of v on the control flow transfer to a reachable switch block statement list

8is the same as the definite assignment state of v at the end of expr.

912.3.3.7 While statements

10For a while statement stmt of the form:

11while ( expr ) while-body

12v has the same definite assignment state at the beginning of expr as at the beginning of stmt.

13If v is definitely assigned at the end of expr, then it is definitely assigned on the control flow transfer to

14while-body and to the end point of stmt.

15If v has the state “definitely assigned after true expression” at the end of expr, then it is definitely

16assigned on the control flow transfer to while-body, but not definitely assigned at the end-point of stmt.

17If v has the state “definitely assigned after false expression” at the end of expr, then it is definitely

18assigned on the control flow transfer to the end point of stmt, but not definitely assigned on the control

19flow transfer to while-body.

2012.3.3.8 Do statements

21For a do statement stmt of the form:

22do do-body while ( expr ) ;

23v has the same definite assignment state on the control flow transfer from the beginning of stmt to do-

24body as at the beginning of stmt.

25v has the same definite assignment state at the beginning of expr as at the end point of do-body.

26If v is definitely assigned at the end of expr, then it is definitely assigned on the control flow transfer to

27the end point of stmt.

28If v has the state “definitely assigned after false expression” at the end of expr, then it is definitely

29assigned on the control flow transfer to the end point of stmt, but not definitely assigned on the control

30flow transfer to do-body.

3112.3.3.9 For statements

32Definite assignment checking for a for statement of the form:

33

for ( for-initializer ; for-condition ; for-iterator ) embedded-statement

34is done as if the statement were written:

35{

36

for-initializer ;

37

while ( for-condition ) {

38

embedded-statement ;

39

LLoop:

40

for-iterator ;

41}

42}

121

C# LANGUAGE SPECIFICATION

1with continue statements that target the for statement being translated to goto statements targeting the

2label LLoop. If the for-condition is omitted from the for statement, then evaluation of definite assignment

3proceeds as if for-condition were replaced with true in the above expansion.

412.3.3.10 Break, continue, and goto statements

5The definite assignment state of v on the control flow transfer caused by a break, continue, or goto

6statement is the same as the definite assignment state of v at the beginning of the statement.

712.3.3.11 Throw statements

8For a statement stmt of the form

9throw expr ;

10the definite assignment state of v at the beginning of expr is the same as the definite assignment state of v at

11the beginning of stmt.

1212.3.3.12 Return statements

13For a statement stmt of the form

14return expr ;

15The definite assignment state of v at the beginning of expr is the same as the definite assignment state of

16v at the beginning of stmt.

17If v is an output parameter, then it shall be definitely assigned either:

18o after expr

19o or at the end of the finally block of a try-finally or try-catch-finally that encloses the

20return statement.

21For a statement stmt of the form:

22return ;

23If v is an output parameter, then it shall be definitely assigned either:

24o before stmt

25o or at the end of the finally block of a try-finally or try-catch-finally that encloses the

26return statement.

2712.3.3.13 Try-catch statements

28For a statement stmt of the form:

29try try-block

30catch ( … ) catch-block-1

31

32catch ( … ) catch-block-n

33The definite assignment state of v at the beginning of try-block is the same as the definite assignment

34state of v at the beginning of stmt.

35The definite assignment state of v at the beginning of catch-block-i (for any i) is the same as the definite

36assignment state of v at the beginning of stmt.

37The definite assignment state of v at the end-point of stmt is definitely assigned if (and only if) v is

38definitely assigned at the end-point of try-block and every catch-block-i (for every i from 1 to n).

3912.3.3.14 Try-finally statements

40For a try statement stmt of the form:

122

Соседние файлы в предмете Электротехника