C# | Static Classes
Static Classes
Section titled “Static Classes”The “static” keyword when referring to a class has three effects:
- You cannot create an instance of a static class (this even removes the default constructor)
- All properties and methods in the class must be static as well.
- A
staticclass is asealedclass, meaning it cannot be inherited.
public static class Foo{ //Notice there is no constructor as this cannot be an instance public static int Counter { get; set; } public static int GetCount() { return Counter; }}
public class Program{ static void Main(string[] args) { Foo.Counter++; Console.WriteLine(Foo.GetCount()); //this will print 1
//var foo1 = new Foo(); //this line would break the code as the Foo class does not have a constructor }}Static keyword
Section titled “Static keyword”The static keyword means 2 things:
- This value does not change from object to object but rather changes on a class as a whole
- Static properties and methods don’t require an instance.
public class Foo{ public Foo{ Counter++; NonStaticCounter++; }
public static int Counter { get; set; } public int NonStaticCounter { get; set; }}
public class Program{ static void Main(string[] args) { //Create an instance var foo1 = new Foo(); Console.WriteLine(foo1.NonStaticCounter); //this will print "1"
//Notice this next call doesn't access the instance but calls by the class name. Console.WriteLine(Foo.Counter); //this will also print "1"
//Create a second instance var foo2 = new Foo();
Console.WriteLine(foo2.NonStaticCounter); //this will print "1"
Console.WriteLine(Foo.Counter); //this will now print "2" //The static property incremented on both instances and can persist for the whole class
}}Static class lifetime
Section titled “Static class lifetime”A static class is lazily initialized on member access and lives for the duration of the application domain.
void Main(){ Console.WriteLine("Static classes are lazily initialized"); Console.WriteLine("The static constructor is only invoked when the class is first accessed"); Foo.SayHi();
Console.WriteLine("Reflecting on a type won't trigger its static .ctor"); var barType = typeof(Bar);
Console.WriteLine("However, you can manually trigger it with System.Runtime.CompilerServices.RuntimeHelpers"); RuntimeHelpers.RunClassConstructor(barType.TypeHandle);}
// Define other methods and classes herepublic static class Foo{ static Foo() { Console.WriteLine("static Foo.ctor"); } public static void SayHi() { Console.WriteLine("Foo: Hi"); }}public static class Bar{ static Bar() { Console.WriteLine("static Bar.ctor"); }}