c# - 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
是420
的输出Scenario 2
。这个输出是 0 还是 42?
我检查了几个答案,但无法理解这些答案是 0 和 42 的方式和原因。
解决方案
当你写这个:
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()
会返回 0。
对第二种情况遵循相同的逻辑,您将看到它有何不同。
推荐阅读
- laravel - Laravel web.php 仍然相关吗?
- python - 单击扫描ble的按钮后如何加载组合框?
- architecture - 使用 AWS Lambda 的应用程序架构
- mongodb - Mongodb - 投影会增加执行时间吗?
- vb.net - msg 选定项目列表框 VB.net
- node.js - mongodb find() in insertOne() via nodejs
- facebook-graph-api - 使用 Facebook API 获取未读通知计数
- c# - 将函数注册到 .NET Core 中的事件时,“此平台不支持操作”
- mercurial - 检测 mercurial 中的新行
- xamarin - 是否有任何理由混淆 Xamarin Forms、Android 应用程序?