I have a static class with a static constructor that takes some time (10-15 seconds) to execute and fully initialize the class. In order to improve performance, I've decided to enable this static class to be explicitly initialized instead of when it is first needed so that it is ready to go when it actually needs to be used.
My first thought was to create an Initialize()
method for the class, but since I already have a static constructor, this method doesn't seem to need to do anything other than be the method to call to explicitly initialize the class without accessing any of its other public methods or properties. Having a method that does nothing directly doesn't seem right to me.
Then I thought I can just move the code from the static constructor into this Initialize()
method, but I'd also like the class to be initialized when it is first needed and the Initialize()
method wasn't explicitly called.
To summarize, I want the following criteria to be observed:
- I want to allow the static class to be explicitly initialized (likely by using a public
Initialize()
method). - I don't want to have to access any other public methods or properties on the class when I don't need them, even though this would initialize the static class.
- If the class has not been explicitly initialized, I still want to initialize it when it is first needed (i.e. when accessing other public methods or properties with the intent of using the functionality or data they provide).
- This is a helper class and using the Singleton design pattern is not necessary for my purposes.
What would be the proper way to observe the above criteria for a static class written in C#? This can also apply to other programming languages (e.g. Java), but I'm personally interested in a solution written in C#.
Two work-arounds:
Move the constructor code to
Initialize()
so you can call explicitly. And replace the code inside the constructor to just call theInitialize()
method in case the static class is loaded dynamically before you've called it explicitlyThen initialize like this if you want:
Or it will be dynamically initialized the first time it's used
Not as semantically pristine, but you can trigger the organic initialization of a static class just by consuming a property and throwing it in a temporary variable.
So just do this:
Still allows you to call it whenever you need to, but if there is some performance cost on initialization, you can try to invoke it on startup, rather than the first time the user does something that fires that code.
For another helpful outline of static initialization see: Is the order of static class initialization in C# deterministic?
I'm not sure if you can specify when a static constructor is loaded.
From MSDN "A static constructor is called automatically to initialize the class before the first instance is created or any static members are referenced."
http://msdn.microsoft.com/en-us/library/k9x6w0hc(v=vs.80).aspx
*EDIT: * Would adding the singleton pattern help here? The getter can call Initialize() by checking a flag in the class, IsLoaded=true. Subsequent calls will not call Initialize()
The approach doesn't seem icky to me. I might name the method Touch(), give it an empty body, and add an appropriate comment. Would that be sufficient to get you over your feeling that something doesn't feel right about this?
I would go with the initialize method (EDIT: See Jon's answer). But if you really just want to use the constructor, you can do this:
RunClassConstructor
allows you to force the class constructor (static constructor) to run if it already hasn't. If it has already run, say because you used a static member of the class, then this has no effect. Running it additional times has no effect.I would probably just go for the
Initialize
method - and it can do something useful:Initialize
callTypeInitializationException
which you'd normally get.