【问题标题】:Fail to initiate static variables in c# of UnityUnity的c#启动静态变量失败
【发布时间】:2018-04-29 10:39:21
【问题描述】:

我试图在 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"。然后我删除了两个“只读”修饰符,留下“静态”,仍然得到两个零。

这个单例的初始化或构造发生了什么?如何正确地将值赋予静态变量?与Unity有什么关系吗? (我在构建项目的时候选择了il2cpp,不过这个是在Editor Mode下测试的)

顺便说一下,我发现变量 "instance" 的初始化直到第一次调用才开始(我以前认为所有静态变量都会在加载程序集时初始化.)。这也是 Unity 的另一个功能还是只是普通功能?

【问题讨论】:

  • 正常。这就是 .Net 的工作原理。
  • 你所说的“正常”是什么意思?延迟启动?还是意外的值?
  • 欢迎来到 SO。您不必修改您的问题并说它已解决。当您接受答案时,人们会知道它已解决,而您在这种情况下也这样做了。
  • 直到第一个引用是正常的 C# 事情之前,静态不会初始化。就个人而言,我对单例使用惰性加载器模式。

标签: c# unity3d static


【解决方案1】:

这些字段按照它们被声明的顺序进行初始化......因此,由于您的实例首先出现,因此您的其他值为零。如果您将它们移到您的实例上方,它们将具有您期望的值

【讨论】:

  • 是的,这行得通。我已经被告知,静态的启动没有命令。应该意识到静态的依赖会弄得一团糟。谢谢。
【解决方案2】:

来自 C# 语言规范

§10.5.5.1

静态字段初始化

类的静态字段变量初始化器对应于 按文本顺序执行的赋值序列 它们出现在类声明中。 如果是静态构造函数 (§10.12) 存在于类中,执行静态字段 初始化器在执行该静态之前立即发生 构造函数。否则,静态字段初始值设定项在 在第一次使用静态之前的依赖于实现的时间 该类的字段。

所以基本上,因为你先写了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);
    }
}

【讨论】:

    【解决方案3】:

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

    添加一个静态构造函数来初始化你的静态变量

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-07
      • 2018-09-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-24
      相关资源
      最近更新 更多