无法在Unity的c#中启动静态变量

时间:2018-04-29 10:39:22

标签: c# unity3d static

我试图在 Unity 2017 中制作一个单身人士。

public class Singleton {

    public static readonly Singleton instance = new Singleton();

    static readonly float FLOAT_VAL = 3.5f;
    static readonly int INT_VAL = 3;

    private Singleton() {
        Debug.Log("FLOAT_VAL = " + FLOAT_VAL);
        Debug.Log("INT_VAL = " + INT_VAL);
    }
}

我希望看到" FLOAT_VAL = 3.5" " INT_VAL = 3" 的输出。但是,它出现了" FLOAT_VAL = 0" " INT_VAL = 0" 的输出。然后我删除了" readonly"修饰语,离开"静态"并且仍然有两个零。

这个单身人士的发起或建造发生了什么?如何正确地将值赋给静态变量?与Unity有什么关系? (我在构建项目时选择了il2cpp,但这是在编辑模式下测试的)

顺便说一下,我发现变量"实例" 的启动直到第一次调用才开始(我曾经认为所有静态变量加载程序集时初始化。它是另一个Unity功能还是正常?

3 个答案:

答案 0 :(得分:2)

字段按照声明的顺序初始化....因此,由于您的实例是第一个,因此其他值为零。如果将它们移到实例之上,它们将具有您期望的值

答案 1 :(得分:1)

来自C#语言规范

§10.5.5.1

  

静态字段初始化

     

类的静态字段变量初始值设定项对应于a   以文本顺序执行 的分配顺序   它们出现在类声明中。 如果是静态构造函数   (§10.12)存在于类中,执行静态字段   初始化程序在执行该静态之前立即发生   constructor.Otherwise,静态字段初始值设定项在。执行   在第一次使用静态之前的实现相关时间   该班的领域。

基本上,因为您先写了instance,所以它会在FLOAT_VALINT_VAL之前初始化。撤消订单,您将看到预期的结果:

public class Singleton {


    static readonly float FLOAT_VAL = 3.5f;
    static readonly int INT_VAL = 3;


    public static readonly Singleton instance = new Singleton();

    private Singleton() {
        Console.WriteLine("FLOAT_VAL = " + FLOAT_VAL);
        Console.WriteLine("INT_VAL = " + INT_VAL);
    }
}

答案 2 :(得分:-1)

  

如果您的类包含静态字段,请提供一个静态构造函数,以便在加载类时初始化它们。[MSDN]

添加静态构造函数以初始化静态变量