有没有办法强制在C#中初始化静态字段?

请考虑以下代码:

class Program
{
    static Program() {
        Program.program1.Value = 5;
    }

    static List<Program> values = new List<Program>();
    int value;
    int Value
    {
        get { return value; }
        set { 
            this.value = value;
            Program.values.Add(this);
        }
    }

    static Program program1 = new Program { value = 1 };
    static Program program2 = new Program { value = 2 };
    static Program program3 = new Program { value = 3 };

    static void Main(string[] args)
    {
        if (Program.values.Count == 0) Console.WriteLine("Empty");
        foreach (var value in Program.values)
            Console.WriteLine(value.Value);
        Console.ReadKey();
    }
}

它仅打印数字5,如果删除静态构造函数中的代码,则打印“空”.

是否有办法强制静态字段初始化,即使是否尚未使用?

我需要一个名为Values的静态属性,返回引用类型的所有实例.

我尝试了这些代码的一些变体,有些适用于某些类型,但不适用于其他类型.

编辑:上面的示例被破坏,尝试这一个:

class Subclass<T> {
    static Subclass()
    {
        Values = new List<Subclass<T>>();
    }
    public Subclass()
    {
        if (!Values.Any(i => i.Value.Equals(this.Value)))
        {
            Values.Add(this);
        } 
    }

    public T Value { get; set; }

    public static List<Subclass<T>> Values { get; private set; }
}

class Superclass : Subclass<int>
{
    public static Superclass SuperclassA1 = new Superclass { Value = 1 };
    public static Superclass SuperclassA2 = new Superclass { Value = 2 };
    public static Superclass SuperclassA3 = new Superclass { Value = 3 };
    public static Superclass SuperclassA4 = new Superclass { Value = 4 }; 
}

class Program
{
    static void Main(string[] args)
    {
        //Console.WriteLine(Superclass.SuperclassA1); //UNCOMMENT THIS LINE AND IT WORKS
        foreach (var value in Superclass.Values)
        {
            Console.WriteLine(value.Value);
        }
        Console.ReadKey();
    }
}
最佳答案
你的问题的答案是“好吧,是的”.但是,“强迫”它的两种方式之一就是你已经在做的事情.

语言规范中的相关部分是10.11 Static constructors,具体为:

“类的静态构造函数在给定的应用程序域中最多执行一次.静态构造函数的执行由应用程序域中发生的以下第一个事件触发:

>创建类的实例.
>引用该类的任何静态成员.

如果一个类包含执行开始的Main方法(第3.1节),则该类的静态构造函数在调用Main方法之前执行.如果一个类包含带有初始化器的任何静态字段,那么这些初始化器在执行静态构造函数之前立即以文本顺序执行.“

转载注明原文:有没有办法强制在C#中初始化静态字段? - 代码日志