c# - 如何在同一程序集中成功编译自引用类或循环引用类

标签 c# .net compiler-construction circular-reference self-reference

我想知道 C# 和 .Net 编译器如何能够在同一程序集中成功编译自引用类或循环引用类。

考虑以下代码存在于同一个程序集中。

class X{ X x; }
class Y{ Z z; }
class Z{ Y y; }

当然,这段代码编译成功了。
但是如何?我想知道编译器是如何首次在这些情况下解析类的。
例如,当编译器遇到类 Y 时,它还不知道类 Z。它是如何解析 Class Y 中的子属性 z 的?
请解释编译代码时后台究竟发生了什么。 可能有一些关于编译器如何解析类和类型的合适文章

最佳答案

this 中所述文章中,C# 编译器执行“两次通过”,即

  1. 在第一遍中,它计算元数据:“顶级”内容,如命名空间、类、结构、枚举、接口(interface)、委托(delegate)、方法、类型参数、形式参数、构造函数、事件、属性等.

  2. 第二遍计算 IL:进入方法体、构造函数体等的代码。

C#的编译方式不同于C/C++,类、方法、宏等都是在头文件中声明的,这有助于它通过读取头文件一次性获得类、方法等所有信息。与 C# 相比,它没有头文件,而是使用 Two Pass 技术编译所有代码。

关于c# - 如何在同一程序集中成功编译自引用类或循环引用类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37803841/

相关文章:

c# - EF Core - 添加唯一索引

c# - 为 View 模型中的所有属性生成标签、文本框、验证消息

c# - Windows 上的 Kestrel 和 macOS/Linux 上的 Kestrel 之间的日期反序列化差异

c# - 将字典中的数据批量设置到 Redis

c# - 如何从外部 javascript 文件获取值到代码隐藏文件?

compiler-construction - 分词器应该返回语言关键字吗?

c++ - 如何根据 LLVM 中 LoadInst 的结果解析 AllocaInst?

c# - `where T : Delegate` 还是 `where T : MulticastDelegate` ?

asp.net - 尝试运行 vNext 示例应用程序时出现 kpm restore 问题

c++ - 当第三方代码中没有警告时,为什么不完全将所有警告都视为错误?