【问题标题】:C# - How does the compiler find the another part of the partial class?C# - 编译器如何找到分部类的另一部分?
【发布时间】:2011-05-25 12:55:40
【问题描述】:

我正在使用 VS2010 SP1。

为 C# Form 应用程序创建演示项目后,我的解决方案结构有以下信息

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 之间是否存在绑定? em>* 这里可以看到,另一部分是在Form1.Designer.cs里面定义的。我假设那里有提示,以便编译器可以快速找到部分类的所有实现代码。请纠正我。

谢谢

【问题讨论】:

  • 它找到它的方式与它找到所有代码的方式相同,因为它在你的项目中
  • @David,我最初认为它可能有提示,例如在 C++ 中包含文件以加快搜索速度:)。据我所知,除了部分方法之外,没有 C# 包含文件。

标签: c#


【解决方案1】:

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

当建立该表时,我们可以使用它对整个程序进行“顶级”检查。我们当时就知道哪些部分声明是真正的“同一类”。在这个阶段,我们解决了部分性,我们解决了泛型参数的基本类型和约束,我们确保所有“覆盖”方法实际上覆盖了匹配的虚拟方法,等等。

一旦“顶层”分析完成,我们才分析方法体。

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

【讨论】:

  • 很高兴知道你是 MS 家伙:) 难怪这个官方回答! -- 非常感谢
  • 您的注释说明了我们在处理我们的大型 DataRepository 类时遇到的 IDE 缓慢,该类分为几十个部分类...
  • @James:嗯,它可能解释它。多年前,我们在 IDE 中有一个错误,在这种情况下,我们非常不理想,我们必须检查数十个分部类以查看它们是否包含任何扩展方法,其中每个分部类分布在数百个文件中。我们解决了这个问题,但如果您遇到非常糟糕的缓慢,可能还有其他一些我们应该知道的问题。如果您还没有,请考虑在 connect.microsoft.com 上输入一份报告,IDE 测试团队会进行查看。
  • 顺便恭喜你达到 100k。抱歉,我错过了,但从技术上讲,我没有,因为实际数字仍然小于 101,该网站只是将其四舍五入:O 感谢您改变了人们的生活。 SO 社区和/或网站应该给你一份严肃的礼物,也许就像一台你可以享受的强大电脑。
  • @Joan:谢谢!这是我的荣幸。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-16
        • 2014-07-11
        • 1970-01-01
        • 2016-10-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多