c#中类型或成员的声明顺序
Declaration order of types or members in c#
我对一些关于 C# 中类型或成员的声明顺序的活跃讨论感到非常困惑。
有一个热门问题,这个问题的输出是什么,为什么?
场景一:
class Program
{
static readonly int A = Method();
static readonly int B = 42;
static int Method() => B;
static void Main()
{
Console.WriteLine(A); // 0
}
}
如果假设,我更新上面的代码并将其变成这样:
场景二:
class Program
{
static readonly int B = 42;
static int Method() => B;
static readonly int A = Method();
static void Main()
{
Console.WriteLine(A); // 42
}
}
Scenario 1
的输出是 0
而 Scenario 2
的输出是 42。这个输出是零还是 42?
我检查了几个答案,但无法理解这些答案是 0 和 42 的方式和原因。
link 1 link 2
当你这样写的时候:
class Program
{
static readonly int A = Method();
static readonly int B = 42;
static int Method() => B;
static void Main()
{
Console.WriteLine(A); // 0
}
}
编译器会为你生成一个静态构造函数,为你的各个字段赋初值。这些赋值的顺序与字段声明的顺序相匹配:
class Program
{
static readonly int A;
static readonly int B;
static Program()
{
A = Method();
B = 42;
}
static int Method() => B;
static void Main()
{
Console.WriteLine(A); // 0
}
}
当静态构造函数运行时,很明显 Method()
被执行,A
被赋值,然后 B
被赋值。在分配任何内容之前,字段的初始值为 0。所以 Method()
将 return 0.
按照第二个场景的相同逻辑,您将看到它有何不同。
我对一些关于 C# 中类型或成员的声明顺序的活跃讨论感到非常困惑。
有一个热门问题,这个问题的输出是什么,为什么?
场景一:
class Program
{
static readonly int A = Method();
static readonly int B = 42;
static int Method() => B;
static void Main()
{
Console.WriteLine(A); // 0
}
}
如果假设,我更新上面的代码并将其变成这样:
场景二:
class Program
{
static readonly int B = 42;
static int Method() => B;
static readonly int A = Method();
static void Main()
{
Console.WriteLine(A); // 42
}
}
Scenario 1
的输出是 0
而 Scenario 2
的输出是 42。这个输出是零还是 42?
我检查了几个答案,但无法理解这些答案是 0 和 42 的方式和原因。
link 1 link 2
当你这样写的时候:
class Program
{
static readonly int A = Method();
static readonly int B = 42;
static int Method() => B;
static void Main()
{
Console.WriteLine(A); // 0
}
}
编译器会为你生成一个静态构造函数,为你的各个字段赋初值。这些赋值的顺序与字段声明的顺序相匹配:
class Program
{
static readonly int A;
static readonly int B;
static Program()
{
A = Method();
B = 42;
}
static int Method() => B;
static void Main()
{
Console.WriteLine(A); // 0
}
}
当静态构造函数运行时,很明显 Method()
被执行,A
被赋值,然后 B
被赋值。在分配任何内容之前,字段的初始值为 0。所以 Method()
将 return 0.
按照第二个场景的相同逻辑,您将看到它有何不同。