[Mono-devel-list] possible bug in static constructor evaluation order
Michal Moskal
malekith at pld-linux.org
Sun May 4 17:29:31 EDT 2003
On Sun, May 04, 2003 at 03:20:09PM -0500, 2a5gjx302 at sneakemail.com wrote:
> My C# specification (the 'C# Language Specification.doc' file
> distributed with VS.NET) does not have a section 17.11. The entire
> section 17 is about attributes.
Hmm, I should have given a link:
http://www.jaggersoft.com/csharp_standard/17.11.htm
> I should point out that, as far as I understand it, this is no bug. The
> specification does not state precisely when static construction occurs,
> only that it must occur prior to any use of the class.
>
> My specification states these things:
> - A static constructor for a type is run at most once per application
> domain.
> - Static variables come into existence at some undetermined time prior
> to the execution of the static constructor.
> - The static field variable initializers of a class correspond to a
> sequence of assignments that are executed at an
> implementation-dependent time prior to the static constructor of the
> class (if any) and prior to the first use of a static field of that
> class.
Ok, modulo ^^^^:
If a class contains any static fields with initializers, those
initializers are executed in textual order immediately prior to
^^^^^^^^^^^^^
executing the static constructor.
> ..and most importantly:
>
> The exact timing of static constructor execution is
> implementation-dependent, but is subject to the following rules:
> - The static constructor for a class executes before any instance of
> the class is created.
> - The static constructor for a class executes before any of the static
> members for the class are referenced.
> - The static constructor for a class executes after the static field
> initializers (if any) for the class.
> - The static constructor for a class executes at most one time during a
> single program instantiation.
Consider Example in http://www.jaggersoft.com/csharp_standard/17.11.htm.
It *must* produce output:
Init A
A.F
Init B
B.F
But according to what you wrote, it could be also:
Init A
Init B
A.F
B.F
or:
Init B
Init A
A.F
B.F
This is where I took impression that static constructors are executed
just before first access to class.
Also Paragraph 6 states:
(1) The static constructor for a class executes at most once in a given
application domain. (2) The execution of a static constructor is triggered
by the first of the following events to occur within an application
domain:
* (3) An instance of the class is created.
* (4) Any of the static members of the class are referenced.
I would interpret 'A is triggered by B' as: A occurs just before B.
Ah, and what do I need it for. I want to formally define some aspects of
class loading using operational semantics, so I need precise rules.
--
: Michal Moskal :: http://www.kernel.pl/~malekith : GCS {C,UL}++++$ a? !tv
: PLD Linux ::::::::: Wroclaw University, CS Dept : {E-,w}-- {b++,e}>+++ h
More information about the Mono-devel-list
mailing list