Capture Variables with Closures: C#: Initialize Static Fields: Listing 3
There are several different ways to initialize static fields. In most cases, the worst choice is a static constructor. Handling literals as constants provides the best performance. For values that must be calculated at runtime, just-in-time creation is often the best approach if you have the discipline to always use a property. Otherwise, using a method when calling a method to initialize the static field is usually the best approach.
public class InitializationTest
{
public const string First ="Foo";
public static readonly string Second = "Foo";
public static readonly
ReadOnlyCollection Third = GetInitialValue();
public static readonly ReadOnlyCollection Fourth;
private static ReadOnlyCollection fifthBacking;
public const int Sixth = 1;
public static readonly int Seventh = 1;
public static readonly int Eighth =
GetInitialNumericValue();
public static readonly int Ninth;
static InitializationTest()
{
Console.WriteLine("In Constructor");
var list = new List();
// TODO: Fill List
Fourth = new ReadOnlyCollection(list);
Ninth = 1 + 1 - 1;// Simulate runtime calulation
}
private static ReadOnlyCollection GetInitialValue()
{
Console.WriteLine("In GetInitialValue");
var list = new List() ;
// TODO: Fill List
return new ReadOnlyCollection(list);
}
private static int GetInitialNumericValue()
{
Console.WriteLine("In GetInitialNumericValue");
return 1 + 1 - 1;
}
public static ReadOnlyCollection Fifth
{
get
{
Console.WriteLine("In Fifth");
if (fifthBacking == null)
{
var list = new List();
// TODO: Fill List
fifthBacking = new
ReadOnlyCollection(list);
}
return fifthBacking;
}
}
}