Skip to main content

...

....

C# Snippet Tutorial - Static Constructors [Beginner]


I'm going to guess that pretty much everyone who reads this blog knows about constructors and how they work. And I bet everyone knows about static variables and functions as well. But did you know that there is such a thing as a static constructor in C#? Yup, a static constructor. And that's what we are going to take a look at today.

The concept behind them is actually pretty simple. A static constructor in C# is a chunk of code that is executed right after all the static variables for a class are initialized. You declare it similar to the way you declare a regular constructor (except that it is declared static). So in many ways, they act exactly like a class constructor, except for statics. Don't worry, if that didn't make perfect sense, there are plenty of examples to come.

Lets take a look at a really simple class with a static constructor:
public class StaticTest
{
  public static int SomeVarA;

  static StaticTest()
  {
    SomeVarA = 1; 
  }
}
 
Granted, that is a pretty silly constructor, since I could have initialized SomeVarA right up in the field declaration. But it gets the point across. The static constructor has to follow all the rules of a normal static function, i.e., no this keyword and things like that. In addition, it doesn't have a private/public/protected modifier. This is because those modifiers don't make sense in this context - no one can ever directly call this function. Also, it can't take any arguments - again, because no one ever actually directly calls this function.

If no one ever directly calls this function, when does it actually get run? Well, that is a good question. Essentially, the first time someone touches the class, by creating an instance, or by touching some static variable or function, the static constructor gets run. We can actually see this in action:
public class Program
{
  static void Main(string[] args)
  {
    Debug.WriteLine("Start Time: " + Environment.TickCount);
    Debug.WriteLine("StaticTest Static Field At: " + StaticTest.AFieldToAccess);
  }
}

public class StaticTest
{
  public static long AFieldToAccess = Environment.TickCount;

  static StaticTest()
  {
    Debug.WriteLine("StaticTest Static Constructor At: " + Environment.TickCount);
  }
}
 
Running this code produces the following output (or something similar, depending on your current computer time):
Start Time: 167393939
StaticTest Static Constructor At: 167393959
StaticTest Static Field At: 167393959
 
So we hit the start time first, as expected, and then because we are hitting on the StaticTest class for the first time (we are trying to access AFieldToAccess), the static constructor runs.

Creating an instance of StaticTest would have the same affect:
public class Program
{
  static void Main(string[] args)
  {
    Debug.WriteLine("Start Time: " + Environment.TickCount);
    new StaticTest();
    new StaticTest();
    new StaticTest();
  }
}

public class StaticTest
{
  public static long AFieldToAccess = Environment.TickCount;

  static StaticTest()
  {
    Debug.WriteLine("StaticTest Static Constructor At: " + Environment.TickCount);
  }

  public StaticTest()
  {
    Debug.WriteLine("StaticTest Regular Constructor At: " + Environment.TickCount);
  }
}
 
This produces the output:
Start Time: 167855613
StaticTest Static Constructor At: 167855633
StaticTest Regular Constructor At: 167855633
StaticTest Regular Constructor At: 167855633
StaticTest Regular Constructor At: 167855633
 
As expected, the static constructor runs only once, right before any of the StaticTest objects get instantiated.

So What happens if StaticTest is never referred to? Well, the static constructor never gets run:
public class Program
{
  static void Main(string[] args)
  {
    Debug.WriteLine("Start Time: " + Environment.TickCount);
  }
}

public class StaticTest
{
  public static long AFieldToAccess = Environment.TickCount;

  static StaticTest()
  {
    Debug.WriteLine("StaticTest Static Constructor At: " + Environment.TickCount);
  }
}
 
In this case, the only output is:
Start Time: 168189944
 
This shows that static constructors don't 'just run' - they are only triggered when code touches a class for the first time.

What are static constructors useful for? They have come in handy every once in a while when I have needed to initialize some static fields in a complex way. For example, say you have a static class that the rest of your code uses to do database access. A static constructor is a handy place to initialize that database connection, because it means that the connection will get created right before it is first needed. There are plenty of other uses for them as well - that just happens to be the fist one that popped into my head.

That is it for this short primer on static constructors C#. Thanks for reading.

Comments

Popular posts from this blog

C# Snippet - Shuffling a Dictionary [Beginner]

Randomizing something can be a daunting task, especially with all the algorithms out there. However, sometimes you just need to shuffle things up, in a simple, yet effective manner. Today we are going to take a quick look at an easy and simple way to randomize a dictionary, which is most likely something that you may be using in a complex application. The tricky thing about ordering dictionaries is that...well they are not ordered to begin with. Typically they are a chaotic collection of key/value pairs. There is no first element or last element, just elements. This is why it is a little tricky to randomize them. Before we get started, we need to build a quick dictionary. For this tutorial, we will be doing an extremely simple string/int dictionary, but rest assured the steps we take can be used for any kind of dictionary you can come up with, no matter what object types you use. Dictionary < String , int > origin = new Dictionary < string , int >();

C# WPF Printing Part 2 - Pagination [Intermediate]

About two weeks ago, we had a tutorial here at SOTC on the basics of printing in WPF . It covered the standard stuff, like popping the print dialog, and what you needed to do to print visuals (both created in XAML and on the fly). But really, that's barely scratching the surface - any decent printing system in pretty much any application needs to be able to do a lot more than that. So today, we are going to take one more baby step forward into the world of printing - we are going to take a look at pagination. The main class that we will need to do pagination is the DocumentPaginator . I mentioned this class very briefly in the previous tutorial, but only in the context of the printing methods on PrintDialog , PrintVisual (which we focused on last time) and PrintDocument (which we will be focusing on today). This PrintDocument function takes a DocumentPaginator to print - and this is why we need to create one. Unfortunately, making a DocumentPaginator is not as easy as

C# WPF Tutorial - Implementing IScrollInfo [Advanced]

The ScrollViewer in WPF is pretty handy (and quite flexible) - especially when compared to what you had to work with in WinForms ( ScrollableControl ). 98% of the time, I can make the ScrollViewer do what I need it to for the given situation. Those other 2 percent, though, can get kind of hairy. Fortunately, WPF provides the IScrollInfo interface - which is what we will be talking about today. So what is IScrollInfo ? Well, it is a way to take over the logic behind scrolling, while still maintaining the look and feel of the standard ScrollViewer . Now, first off, why in the world would we want to do that? To answer that question, I'm going to take a an example from a tutorial that is over a year old now - Creating a Custom Panel Control . In that tutorial, we created our own custom WPF panel (that animated!). One of the issues with that panel though (and the WPF WrapPanel in general) is that you have to disable the horizontal scrollbar if you put the panel in a ScrollV