[英]C# - How does the compiler find the another part of the partial class?
我正在使用 VS2010 SP1。
为C# Form应用创建demo工程后,我的解决方案结构有以下信息
Form1.cs
Form1.Designer.cs
Form1.resx
// File Form1.cs
namespace WinFormApp
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
}
}
// File Form1.Designer.cs
namespace WinFormApp
{
partial class Form1
{
private void InitializeComponent()
{
...
}
...
}
}
这是问题,我可以看到Form1是部分class。 但是,编译器如何知道在哪里可以找到它的另一部分? *也就是说,Form1.cs 和 Form1.Designer.cs 文件之间是否存在绑定关系? * 这里,如你所见,另一部分是在Form1.Designer.cs里面定义的。 我假设那里有提示,以便编译器可以快速找到部分 class 的所有实现代码。 请纠正我。
谢谢
C# 编译器是“两通”编译器。 项目系统为编译器提供了项目中所有文件的列表。 编译器首先对所有文件进行“顶级”扫描,并建立一个表格,其中包含哪些文件包含哪些名称空间、类型、方法、属性、事件、字段等,但它不查看方法体。
建立该表后,我们可以使用它对整个程序进行“顶级”检查。 我们当时就知道哪些部分声明是真正的“同一类”。 在这个阶段,我们解决了部分性,我们解决了泛型参数的基本类型和约束,我们确保所有“覆盖”方法实际上覆盖了匹配的虚拟方法,等等。
一旦完成了“顶层”分析,我们才分析方法体。
文件名无关紧要; 编译器仅将它们用于错误报告。 在每个文件中拥有十几个类和一百个文件以及每个 class 的部分声明是完全合法的。 (尽管实际上请不要这样做;当人们这样做时,它会极大地增加 IDE 的负担,因为我们很难在您输入更改时快速弄清楚 class 的所有成员是什么!)
所有文件都发送到编译器,这里没有魔法。
对文件的名称没有要求。 你可以有Foo.cs
和Bar.cs
。 (并且每个都可以包含多个不同的部分类。)编译器在一个 go 中为特定程序集提供了编译的所有文件 - 它只查看这些文件。 它不会在文件系统中搜索其他源文件或类似的东西。
当 C# 编译器获取所有文件时,它会扫描所有文件。如果找到具有相同名称且具有部分修饰符的类,则将它们识别为相同的 class 并组装它们并编译它们。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.