繁体   English   中英

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

[英]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.csBar.cs (并且每个都可以包含多个不同的部分类。)编译器在一个 go 中为特定程序集提供了编译的所有文件 - 它只查看这些文件。 它不会在文件系统中搜索其他源文件或类似的东西。

当 C# 编译器获取所有文件时,它会扫描所有文件。如果找到具有相同名称且具有部分修饰符的类,则将它们识别为相同的 class 并组装它们并编译它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM