C#-编译器如何找到分部类的另一部分

本文关键字:另一部 一部分 编译器 何找 C#- | 更新日期: 2023-09-27 17:57:34

我使用的是VS2010 SP1。

在为C#窗体应用程序创建了一个演示项目后,我的解决方案结构具有以下信息

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是一个偏类。然而,编译器如何知道在哪里可以找到它的另一部分*换句话说,文件Form1.cs和Form1.Designer.cs之间是否有绑定*正如你所看到的,这里的另一个部分是在Form1.Designer.cs中定义的。我认为那里有一些提示,编译器可以快速找到分部类的所有实现代码。请纠正我。

感谢

C#-编译器如何找到分部类的另一部分

C#编译器是一个"两遍"编译器。项目系统向编译器提供项目中所有文件的列表。编译器首先对所有文件进行"顶级"扫描,并建立一个表,列出哪些文件包含哪些名称空间、类型、方法、属性、事件、字段等,但不查看方法体。

当这个表建立起来时,我们可以用它来对整个程序进行"顶级"检查。在那个时候,我们会发现哪些分部声明实际上是"同一个类"。在这个阶段,我们解决偏倚,我们解决基本类型和通用参数的约束,我们确保所有"覆盖"方法实际上覆盖匹配的虚拟方法,等等

一旦完成了"顶级"分析,我们才能分析方法体。

文件名不相关;编译器仅将它们用于错误报告。拥有十几个类和一百个文件以及每个文件中每个类的部分声明是完全合法的。(尽管请不要真的这么做;当人们做这样的事情时,它会极大地增加IDE的负担,因为当你输入更改时,我们很难快速弄清楚一个类的所有成员是什么!)

所有文件都被发送到编译器,这里没有魔法。

对于文件的名称没有任何要求。你可以有Foo.csBar.cs。(每一个都可能包含多个不同的分部类。)编译器会一次性为特定程序集提供所有文件,并且只查看这些文件。它不会在文件系统中搜索其他源文件或类似的文件。

当C#编译器获取所有文件时,它会扫描所有文件。若它发现具有相同名称并且具有分部修饰符的类,那个么它将它们识别为相同的类,并对它们进行汇编和编译。

相关文章: