I would say it's a novel idea (at least for me). But I would classify it as
dangerous. Have you actually tried to use it?
Here is an explanation:
Are you positive that .NET library is properly initialized at the point when
static constructor called?
I mean that your
System.Configuration.ConfigurationSettings.AppSettings["ConnectionString"];
will actually work correctly.
I would imagine that when application is loaded into memory .NET must do a
lot of work before this line can be executed... Like load web.config for
example. Or even determine that it must be web.config and not
executablename.config...
And static constructor is executed first thing application is loaded into
memory and only then execution point is given to WinMain or whatever it is
in ASP.NET world.
------------------------------------------------------------------
I apologize, I hate to be the downer here.... But I would stick with calling
it in Application_Start. Nobody wants it's application suddenly stop working
(even if it does now) when you switch to new version of .NET
PS: I know those problems first hand when I worked on C++ (long time ago)
and application would blow up when i called printf in static constructor.
Thanks
George.
Hi George,
Hi George,
With all respect, i must say you're talking rubbish. I have used "static"
approach in .NET many times without any problems, I also come from C++ world
but things look different in .NET, let me start from the beginning. .NET
static constructor is used to initialize static data members as soon as the
class is referenced first time, whereas an instance constructor is used to
create an instance of that class with <new> keyword (it is called “lazy
initialization”), not as you said "static constructor is executed first
thing application is loaded into memory and only then execution point is
given to WinMain or whatever it is in ASP.NET world". It is a big difference
because it will not be run if you have not used it anywhere. In addition,
ConfigurationManager (which is actually called from WebConfigurationManager)
uses “lazy initialization” as well meaning it loads the contents of the web
config only if it has been requested. As you may expect, ASP.NET gets many
things from the web config anyway. Initialization on demand fixes "static
initialization order fiasco" in C++, which you pointed out. So don't worry
about this issue as it does not exist in C#.
King regards
Milosz

Signature
Milosz
> I would say it's a novel idea (at least for me). But I would classify it as
> dangerous. Have you actually tried to use it?
[quoted text clipped - 96 lines]
> >> >>
> >> >> Your comments and thoughts are appreciated.
George Ter-Saakov - 25 Apr 2008 13:56 GMT
I did talked about thing I am not sure about.
".NET static constructor is used to initialize static data members as soon
as the class is referenced first time"
I did not know that... I just knew that it was not the case in C++ so I kind
of assumed C# has the same behavior.
That phrase does change it all.... I just did not see those specific in MSDN
documentation.
--------------------------------------------------------------------------------------------
Wonder how does .NET solves concurrency problem if 2 separate threads access
my static clsGlobal._sConnection? Is .NET smart enough to put a lock on the
class to run static constructor only once?
How does .NET knows that static constructor ran already? Does .NET checks if
static constructor ran every time you access the static variable? Seems to
me unnecessary performance hit.
Thanks
George.
> Hi George,
>
[quoted text clipped - 138 lines]
>> >> >>
>> >> >> Your comments and thoughts are appreciated.
Milosz Skalecki [MCAD] - 26 Apr 2008 00:05 GMT
Hi George,
No probs. I'm not sure how CLR deals with static constructor initialization
internally, but i'm sure it is thread safe (i can only guess, but i reckon it
is synchronised boolean flag check & static constructor execution, the same
as Scott pointed out here
http://odetocode.com/Blogs/scott/archive/2004/07/29/360.aspx), and some more
details
http://bartdesmet.net/blogs/bart/archive/2006/10/30/Answers-to-C_2300_-Quiz-_2D0
0_-Static-constructors-and-type-initialization-.aspx
I addition, in my example ConnectionString static property was marked as
readonly (which means it can only be initialized in constructor or inline)
and set in static constructor which is not lazy init (well, not explicitly,
implicitly through lazy static constructor) so it is thread safe, because
simply no one can change its value :). Anyway, have a nice weekend.

Signature
Milosz
> I did talked about thing I am not sure about.
> ".NET static constructor is used to initialize static data members as soon
[quoted text clipped - 158 lines]
> >> >> >>
> >> >> >> Your comments and thoughts are appreciated.
George Ter-Saakov - 28 Apr 2008 14:02 GMT
Good info...
Thanks a lot
George.
> Hi George,
>
[quoted text clipped - 207 lines]
>> >> >> >>
>> >> >> >> Your comments and thoughts are appreciated.