469,317 Members | 1,949 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 469,317 developers. It's quick & easy.

Invoking static constructors in base classes

Hi,

I have a base class with a static constructor and some abstract methods.
Derived classes implement these methods. From articles on the web, it appears
that there is no guarentee that this static constructor of the base class
would be invoked even if a an object of the derived class is created. Is this
correct ? Is there any way to ensure the base class's static constructor is
invoked before the derived class instance is constructed ?

Thanks
Hemanth
May 30 '06 #1
12 3150
Hemanth wrote:
I have a base class with a static constructor and some abstract methods.
Derived classes implement these methods. From articles on the web,
What articles?
it appears
that there is no guarentee that this static constructor of the base class
would be invoked even if a an object of the derived class is created. Is this
correct ?


Most likely not. The static constructor is invoked when the class is loaded.
May 30 '06 #2
Read Jon's article about your point
http://www.yoda.arachsys.com/csharp/constructors.html
I have a base class with a static constructor and some abstract methods.
Derived classes implement these methods. From articles on the web, it appears
that there is no guarentee that this static constructor of the base class
would be invoked even if a an object of the derived class is created. Is this
correct ? Is there any way to ensure the base class's static constructor is
invoked before the derived class instance is constructed ?


--
WBR,
Michael Nemtsev :: blog: http://spaces.msn.com/laflour

"At times one remains faithful to a cause only because its opponents do not
cease to be insipid." (c) Friedrich Nietzsche

May 30 '06 #3
Actually there is two types of invoking a type initializer:
1. At some time before, but not later of calling of any method or access any
filed of the type
or
2. At any time before, but not later of accessing any static field of the
type

How the type initializer is called depends on whether the class is marked
with *beforefieldinit* - 1 if not marked and 2 if marked.

I believe if the type is not marked then this will guarantee that the type
initializer will be called before instatiating the type as long as the
instance constructor falls in the category of "calling an instance method".

C# doesn't provide a straight way to specify whether a class needs to be set
as *beforefieldinit* or not, but C# specs state that if a class has a static
construtor it should neve be marked as *beforefieldinit*.

So, if one want to guarantee that the static fields will be initialized
before the class is instantiated, one should declare static constructor even
if the constructor is empty.

"Göran Andersson" <gu***@guffa.com> wrote in message
news:el****************@TK2MSFTNGP04.phx.gbl...
Hemanth wrote:
I have a base class with a static constructor and some abstract methods.
Derived classes implement these methods. From articles on the web,


What articles?
it appears that there is no guarentee that this static constructor of the
base class would be invoked even if a an object of the derived class is
created. Is this correct ?


Most likely not. The static constructor is invoked when the class is
loaded.

May 30 '06 #4
Hemanth,

Yes, according to the information you provide there is no guarantee.

If you want to make sure you need to access at least one static field the
base class.
--

Stoitcho Goutsev (100)

"Hemanth" <he*****@discussions.microsoft.com> wrote in message
news:CA**********************************@microsof t.com...
Hi,

I have a base class with a static constructor and some abstract methods.
Derived classes implement these methods. From articles on the web, it
appears
that there is no guarentee that this static constructor of the base class
would be invoked even if a an object of the derived class is created. Is
this
correct ? Is there any way to ensure the base class's static constructor
is
invoked before the derived class instance is constructed ?

Thanks
Hemanth

May 30 '06 #5
Hm... True. After some further reading I found that:

* The static constructor is called before an instance of the class is
created.

(ECMA 334 section 17.11)

When an instance of the derived class is created, the constructor of the
base class will also be called. Doesn't that guarantee that the static
constructor of the base class has also been called?

Stoitcho Goutsev (100) wrote:
Actually there is two types of invoking a type initializer:
1. At some time before, but not later of calling of any method or access any
filed of the type
or
2. At any time before, but not later of accessing any static field of the
type

How the type initializer is called depends on whether the class is marked
with *beforefieldinit* - 1 if not marked and 2 if marked.

I believe if the type is not marked then this will guarantee that the type
initializer will be called before instatiating the type as long as the
instance constructor falls in the category of "calling an instance method".

C# doesn't provide a straight way to specify whether a class needs to be set
as *beforefieldinit* or not, but C# specs state that if a class has a static
construtor it should neve be marked as *beforefieldinit*.

So, if one want to guarantee that the static fields will be initialized
before the class is instantiated, one should declare static constructor even
if the constructor is empty.

"Göran Andersson" <gu***@guffa.com> wrote in message
news:el****************@TK2MSFTNGP04.phx.gbl...
Hemanth wrote:
I have a base class with a static constructor and some abstract methods.
Derived classes implement these methods. From articles on the web,

What articles?
it appears that there is no guarentee that this static constructor of the
base class would be invoked even if a an object of the derived class is
created. Is this correct ?

Most likely not. The static constructor is invoked when the class is
loaded.


May 30 '06 #6
This is where the confusion starts.
Static constructor is a language constrcution, .NET types have type
initializers. The difference is that c# class may not have static
constructor and at the same time the type to have type initializer.

Here is an example:

class Foo
{
public static int a = 10;
}

The class doesn't have static constructor, but the type will have type
initializer '.cctor'.

The big difference is that when the class has static constructor it also
will have type initializer, but the spec state that in this case the type
won't be marked as *beforefieldinit* which means the static construcotor
(will be called before instnace is created), however some of the base
classes may have type initializer, but not static constructor. For such base
class I don't think that there is guarantee that the static fields will be
initialized before isntatiating an object.
--
HTH
Stoitcho Goutsev (100)

"Göran Andersson" <gu***@guffa.com> wrote in message
news:uM**************@TK2MSFTNGP03.phx.gbl...
Hm... True. After some further reading I found that:

* The static constructor is called before an instance of the class is
created.

(ECMA 334 section 17.11)

When an instance of the derived class is created, the constructor of the
base class will also be called. Doesn't that guarantee that the static
constructor of the base class has also been called?

Stoitcho Goutsev (100) wrote:
Actually there is two types of invoking a type initializer:
1. At some time before, but not later of calling of any method or access
any filed of the type
or
2. At any time before, but not later of accessing any static field of the
type

How the type initializer is called depends on whether the class is marked
with *beforefieldinit* - 1 if not marked and 2 if marked.

I believe if the type is not marked then this will guarantee that the
type initializer will be called before instatiating the type as long as
the instance constructor falls in the category of "calling an instance
method".

C# doesn't provide a straight way to specify whether a class needs to be
set as *beforefieldinit* or not, but C# specs state that if a class has a
static construtor it should neve be marked as *beforefieldinit*.

So, if one want to guarantee that the static fields will be initialized
before the class is instantiated, one should declare static constructor
even if the constructor is empty.

"Göran Andersson" <gu***@guffa.com> wrote in message
news:el****************@TK2MSFTNGP04.phx.gbl...
Hemanth wrote:
I have a base class with a static constructor and some abstract
methods. Derived classes implement these methods. From articles on the
web,
What articles?

it appears that there is no guarentee that this static constructor of
the base class would be invoked even if a an object of the derived
class is created. Is this correct ?
Most likely not. The static constructor is invoked when the class is
loaded.


May 30 '06 #7
Yes, I know that, but you are getting away from the original question.

The base class *does* have a static constructor. Hemanth wrote: "I have
a base class with a static constructor".

When the constructor of that base class is called, isn't it certain that
it's static constructor has been executed?

Stoitcho Goutsev (100) wrote:
This is where the confusion starts.
Static constructor is a language constrcution, .NET types have type
initializers. The difference is that c# class may not have static
constructor and at the same time the type to have type initializer.

Here is an example:

class Foo
{
public static int a = 10;
}

The class doesn't have static constructor, but the type will have type
initializer '.cctor'.

The big difference is that when the class has static constructor it also
will have type initializer, but the spec state that in this case the type
won't be marked as *beforefieldinit* which means the static construcotor
(will be called before instnace is created), however some of the base
classes may have type initializer, but not static constructor. For such base
class I don't think that there is guarantee that the static fields will be
initialized before isntatiating an object.

May 30 '06 #8
Goran,

Responses inline.

"Göran Andersson" wrote:
Hemanth wrote:
I have a base class with a static constructor and some abstract methods.
Derived classes implement these methods. From articles on the web,
What articles?


http://www.ondotnet.com/pub/a/dotnet...taticxtor.html is one
example. Specifically searching for the string "Base Classes Static
Variables?" refers to what I wrote about.
it appears
that there is no guarentee that this static constructor of the base class
would be invoked even if a an object of the derived class is created. Is this
correct ?


Most likely not. The static constructor is invoked when the class is loaded.


My concern was specifically about whether the base class static constructor
is invoked when an object of the derived class is created. I think in other
responses I received, this point is discussed. Let me respond there.

Thanks
Hemanth
May 31 '06 #9
Hemanth <he*****@discussions.microsoft.com> wrote:
I have a base class with a static constructor and some abstract methods.
Derived classes implement these methods. From articles on the web, it appears
that there is no guarentee that this static constructor of the base class
would be invoked even if a an object of the derived class is created. Is this
correct ? Is there any way to ensure the base class's static constructor is
invoked before the derived class instance is constructed ?


An instance of the derived class *is* an instance of the base class, so
I would say that if the static constructor isn't executed, that would
count as a bug in the CLR.

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
May 31 '06 #10
Goran,

This is exactly the same question that did come to my mind as well. You are
correct - I do have a static constructor in the base class. Both the base and
derived classes have no explicitly defined constructors - so the compiler
would have defined the default constructors for them. So, if the base class
constructor is called when the object is created, I was assuming that the
static constructor would be called as well. That doesn't seem to be happening.

I am not sure what more is required to be done.

Hemanth

"Göran Andersson" wrote:
Yes, I know that, but you are getting away from the original question.

The base class *does* have a static constructor. Hemanth wrote: "I have
a base class with a static constructor".

When the constructor of that base class is called, isn't it certain that
it's static constructor has been executed?

Stoitcho Goutsev (100) wrote:
This is where the confusion starts.
Static constructor is a language constrcution, .NET types have type
initializers. The difference is that c# class may not have static
constructor and at the same time the type to have type initializer.

Here is an example:

class Foo
{
public static int a = 10;
}

The class doesn't have static constructor, but the type will have type
initializer '.cctor'.

The big difference is that when the class has static constructor it also
will have type initializer, but the spec state that in this case the type
won't be marked as *beforefieldinit* which means the static construcotor
(will be called before instnace is created), however some of the base
classes may have type initializer, but not static constructor. For such base
class I don't think that there is guarantee that the static fields will be
initialized before isntatiating an object.

May 31 '06 #11
Stoitcho,

Thanks for the response. I shall try this and see if it works.

Hemanth

"Stoitcho Goutsev (100)" wrote:
Hemanth,

Yes, according to the information you provide there is no guarantee.

If you want to make sure you need to access at least one static field the
base class.
--

Stoitcho Goutsev (100)

"Hemanth" <he*****@discussions.microsoft.com> wrote in message
news:CA**********************************@microsof t.com...
Hi,

I have a base class with a static constructor and some abstract methods.
Derived classes implement these methods. From articles on the web, it
appears
that there is no guarentee that this static constructor of the base class
would be invoked even if a an object of the derived class is created. Is
this
correct ? Is there any way to ensure the base class's static constructor
is
invoked before the derived class instance is constructed ?

Thanks
Hemanth


May 31 '06 #12
Hemanth <he*****@discussions.microsoft.com> wrote:
This is exactly the same question that did come to my mind as well. You are
correct - I do have a static constructor in the base class. Both the base and
derived classes have no explicitly defined constructors - so the compiler
would have defined the default constructors for them. So, if the base class
constructor is called when the object is created, I was assuming that the
static constructor would be called as well. That doesn't seem to be happening.


Could you post a short but complete program which demonstrates the
problem?

See http://www.pobox.com/~skeet/csharp/complete.html for details of
what I mean by that.

Here's an example which *does* execute both static constructors:

using System;

class Base
{
static Base() { Console.WriteLine ("Base.cctor"); }
}

class Derived : Base
{
static Derived() { Console.WriteLine ("Derived.cctor"); }
}

class Test
{
static void Main()
{
new Derived();
}
}

--
Jon Skeet - <sk***@pobox.com>
http://www.pobox.com/~skeet Blog: http://www.msmvps.com/jon.skeet
If replying to the group, please do not mail me too
May 31 '06 #13

This discussion thread is closed

Replies have been disabled for this discussion.

Similar topics

7 posts views Thread by Beach Potato | last post: by
42 posts views Thread by Edward Diener | last post: by
8 posts views Thread by Ernst Murnleitner | last post: by
13 posts views Thread by Adam H. Peterson | last post: by
7 posts views Thread by Sunny | last post: by
2 posts views Thread by Mark | last post: by
6 posts views Thread by Tamir Khason | last post: by
6 posts views Thread by ketan | last post: by
1 post views Thread by CARIGAR | last post: by
reply views Thread by suresh191 | last post: by
1 post views Thread by Geralt96 | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.