ECMA-334: 12.3 Definite assignment

Microsoft .NET Framework, ASP.NET, Visual C# (CSharp, C Sharp, C-Sharp) Developer Training, Visual Studio


Jump to: navigation, search
C# Language Specification
© 2006 ECMA International

12.3 Definite assignment

At a given location in the executable code of a function member, a variable is said to be definitely assigned if the compiler can prove, by a particular static flow analysis (§12.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 (§12.3.1) is always considered definitely assigned.
  • An initially unassigned variable (§12.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 (§14.14.1) in which the variable is the left operand.
  • An invocation expression (§14.5.5) or object creation expression (§14.5.10.1) that passes the variable as an output parameter.
  • For a local variable, a local variable declaration (§15.5) that includes a variable initializer.

The formal specification underlying the above informal rules is described in §12.3.1, §12.3.2, and §12.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 shall 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 shall 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 shall 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 shall be definitely assigned at each location where that instance constructor returns.

Today's Deals: Electronics

Personal tools