if the compiler can prove, by a particular static flow analysis (?2.3.3),
that the variable has been
automatically initialized or has been the target of at least one
assignment. [Note: Informally stated, the rules
of definite assignment are:
?An initially assigned variable (?2.3.1) is always considered definitely
assigned.
?An initially unassigned variable (?2.3.2) is considered definitely
assigned at a given location if all
possible execution paths leading to that location contain at least one of
the following:
A simple assignment (?4.13.1) in which the variable is the left operand.
An invocation expression (?4.5.5) or object creation expression (?4.5.10.1)
that passes the variable as an
output parameter.
For a local variable, a local variable declaration (?5.5) that includes a
variable initializer.
The formal specification underlying the above informal rules is described
in ?2.3.1, ?2.3.2, and ?2.3.3.
end note]
The definite assignment states of instance variables of a struct-type
variable are tracked individually as well
as collectively. In additional to the rules above, the following rules
apply to struct-type variables and their
instance variables:
?An instance variable is considered definitely assigned if its containing
struct-type variable is considered
definitely assigned.
?A struct-type variable is considered definitely assigned if each of its
instance variables is considered
definitely assigned.
Definite assignment is a requirement in the following contexts:
?A variable must be definitely assigned at each location where its value
is obtained. [Note: This ensures
that undefined values never occur. end note] The occurrence of a variable
in an expression is considered
to obtain the value of the variable, except when
the variable is the left operand of a simple assignment,
the variable is passed as an output parameter, or
the variable is a struct-type variable and occurs as the left operand of a
member access.
?A variable must be definitely assigned at each location where it is
passed as a reference parameter.
[Note: This ensures that the function member being invoked can consider the
reference parameter
initially assigned. end note]
?All output parameters of a function member must be definitely assigned at
each location where the
function member returns (through a return statement or through execution
reaching the end of the
function member body). [Note: This ensures that function members do not
return undefined values in
output parameters, thus enabling the compiler to consider a function member
invocation that takes a
variable as an output parameter equivalent to an assignment to the
variable. end note]
?The this variable of a struct-type instance constructor must be
definitely assigned at each location
where that instance constructor returns.
that the variable has been
automatically initialized or has been the target of at least one
assignment. [Note: Informally stated, the rules
of definite assignment are:
?An initially assigned variable (?2.3.1) is always considered definitely
assigned.
?An initially unassigned variable (?2.3.2) is considered definitely
assigned at a given location if all
possible execution paths leading to that location contain at least one of
the following:
A simple assignment (?4.13.1) in which the variable is the left operand.
An invocation expression (?4.5.5) or object creation expression (?4.5.10.1)
that passes the variable as an
output parameter.
For a local variable, a local variable declaration (?5.5) that includes a
variable initializer.
The formal specification underlying the above informal rules is described
in ?2.3.1, ?2.3.2, and ?2.3.3.
end note]
The definite assignment states of instance variables of a struct-type
variable are tracked individually as well
as collectively. In additional to the rules above, the following rules
apply to struct-type variables and their
instance variables:
?An instance variable is considered definitely assigned if its containing
struct-type variable is considered
definitely assigned.
?A struct-type variable is considered definitely assigned if each of its
instance variables is considered
definitely assigned.
Definite assignment is a requirement in the following contexts:
?A variable must be definitely assigned at each location where its value
is obtained. [Note: This ensures
that undefined values never occur. end note] The occurrence of a variable
in an expression is considered
to obtain the value of the variable, except when
the variable is the left operand of a simple assignment,
the variable is passed as an output parameter, or
the variable is a struct-type variable and occurs as the left operand of a
member access.
?A variable must be definitely assigned at each location where it is
passed as a reference parameter.
[Note: This ensures that the function member being invoked can consider the
reference parameter
initially assigned. end note]
?All output parameters of a function member must be definitely assigned at
each location where the
function member returns (through a return statement or through execution
reaching the end of the
function member body). [Note: This ensures that function members do not
return undefined values in
output parameters, thus enabling the compiler to consider a function member
invocation that takes a
variable as an output parameter equivalent to an assignment to the
variable. end note]
?The this variable of a struct-type instance constructor must be
definitely assigned at each location
where that instance constructor returns.