Generic static fields initialization

前端 未结 2 721
我在风中等你
我在风中等你 2021-01-18 20:53

I\'m just getting curious about the following code :

public static class Container
{
    public static readonly T[] EmptyArray = new T[0];
}
         


        
相关标签:
2条回答
  • 2021-01-18 21:14

    The guarantee is that the static field is initialized before you access it. (And also, if there is also a static constructor, then all static fields will be initialized before the static constructor is run.)

    For generic classes, static initialization works on a per-type basis, so Container<int> acts as if it is a completely different class to Container<double>. This is actually true for all static parts of a generic class - each type gets its own 'copy'.

    An example will show this last point more clearly:

    static class Foo<T>
    {
        static int count = 0;
        public static int Increment()
        {
            return ++count;
        }
    }
    
    public class Program
    {
        public static void Main()
        {
            Console.WriteLine(Foo<int>.Increment());
            Console.WriteLine(Foo<int>.Increment());
            Console.WriteLine(Foo<double>.Increment());
        }
    }
    

    Output:

    1
    2
    1
    
    0 讨论(0)
  • 2021-01-18 21:35

    Static field initializers are really moved into the static constructor (type initializer) of the class. So your code compiles into this automagically:

    public static class Container<T>
    {
        public static readonly T[] EmptyArray;
    
        static Container()
        {
            EmptyArray = new T[];
        }
    }
    

    From MSDN about static constructors:

    It [Static Constructor] is called automatically before the first instance is created or any static members are referenced.

    Since Container<string> and Container<bool> are not the same, the static constructor is called once for each type of T.

    0 讨论(0)
提交回复
热议问题