Поля
Stati c инициализируются в порядке их объявления. Итак, что происходит:
- Изначально
hello
и name
оба null
. num
является константой. hello
инициализирован. name
по-прежнему null
. Тем не менее, num
является константой, поэтому она подставляется правильно. hello
имеет значение "hola 4"
name
инициализировано.
Почему тот факт, что num
является константой, имеет значение? Помните, что значение const подставляется непосредственно в места, которые он использует, компилятором во время компиляции. Поэтому, если вы посмотрите на то, что генерирует компилятор, вы увидите:
public static class Program
{
internal static readonly string hello = string.Format("hola {0} {1}", name, 4);
internal static readonly string name = string.Format("Juan {0}", 4);
public const int num = 4;
public static void Main()
{
Console.WriteLine(hello);
}
}
(Предоставлено SharpLab )
Обратите внимание, как значение const компилируется в места, где он используется.
Если у вас есть поля * stati c, которые зависят друг от друга, вы должны быть очень осторожны с порядком, в котором они объявлены, или это обычно более безопасно (и более читабельно!) просто использовать конструктор stati c:
public static class Program {
static Program() {
name = $"Juan {num}";
hello = $"hola {name} {num}";
}
public static void Main() {
Console.WriteLine(hello);
}
internal static readonly string hello;
internal static readonly string name;
public const int num = 4;
}