10.10 Execution order
Execution shall proceed such that the side effects of each executing thread
are preserved at critical execution
points. A side effect is defined as a read or write of a volatile field, a
write to a non-volatile variable, a write
to an external resource, and the throwing of an exception. The critical
execution points at which the order of
these side effects must be preserved are references to volatile fields (?7.4
.3), lock statements (?5.12), and
thread creation and termination. An implementation is free to change the
order of execution of a
C# program, subject to the following constraints:
?Data dependence is preserved within a thread of execution. That is, the
value of each variable is
computed as if all statements in the thread were executed in original
program order.
?Initialization ordering rules are preserved (?7.4.4 and ?7.4.5).
?The ordering of side effects is preserved with respect to volatile reads
and writes (?7.4.3). Additionally,
an implementation need not evaluate part of an expression if it can deduce
that that expression.s value is
not used and that no needed side effects are produced (including any caused
by calling a method or
accessing a volatile field). When program execution is interrupted by an
asynchronous event (such as an
exception thrown by another thread), it is not guaranteed that the
observable side effects are visible in
the original program order.