Skip to content

Initialization and execution order

SyntaxDescription
private int V;No initializer
private int A = 1;Declaration with initializer
private int B = 2 + 3;Initialization by expression
private int V = Max;Using a constant in an initializer
private static int V = 7;Initializing a static field
private int[] A = new int[3];Initializing an array
new Point()Default value of a struct
SyntaxDescriptionErrorReasonInstead
static C() { V = 7; }Static constructorTUKI0001runtimePut it in a field initializer or Start
[ModuleInitializer] static void Init()Module initializerTUKI0001runtimeSame as above
Both static constructors and module initializers assume a mechanism that runs once, when the type is first used or loaded. The runtime has nothing that triggers that one-time run.

Put initialization in a field initializer or Start.

A field without an initializer starts at its default value (0 for int).

using UnityEngine;
using Tsukimi;
public class InNoInit : TsukimiBehaviour
{
void Start()
{
Debug.Log(V); // => 0
}
private int V;
}
using UnityEngine;
using Tsukimi;
public class InFieldOrder : TsukimiBehaviour
{
void Start()
{
Debug.Log(B); // => 2
}
private int A = 1;
private int B = 2;
}
using UnityEngine;
using Tsukimi;
public class InFieldExpr : TsukimiBehaviour
{
void Start()
{
Debug.Log(B); // => 5
}
private int A = 1;
private int B = 2 + 3;
}
using UnityEngine;
using Tsukimi;
public class InConstFirst : TsukimiBehaviour
{
void Start()
{
Debug.Log(V); // => 10
}
private const int Max = 10;
private int V = Max;
}
using UnityEngine;
using Tsukimi;
public class InStaticFieldInit : TsukimiBehaviour
{
void Start()
{
Debug.Log(V); // => 7
}
private static int V = 7;
}
using UnityEngine;
using Tsukimi;
public class InArrayFieldInit : TsukimiBehaviour
{
void Start()
{
Debug.Log(A.Length); // => 3
}
private int[] A = new int[3];
}

A struct created with new starts with all fields at their default values.

using UnityEngine;
using Tsukimi;
public struct Point { public int X; }
public class InStructDefault : TsukimiBehaviour
{
void Start()
{
Point p = new Point();
Debug.Log(p.X); // => 0
}
}