partial class Foo
{
partial void Bar(); // без реализации
public void DoSomething()
{
// что-то делаем...
Bar(); // Это может быть удалено, если `Bar` нигде не будет реализован
// делаем что-от еще...
}
}
在另一个文件中:
partial class Foo
{
partial void Bar()
{
// что-то делаем...
}
}
当有部分类时,方法签名可以定义在一个文件中,实现在另一个文件中。例如
一个文件可以包含:
在另一个文件中:
这使您可以调用
Bar第一个文件,而不必担心它是否在某个地方实现。如果Bar它从未在任何地方实现,那么它的所有调用都将在编译时被删除(从这里):与partial classes一样,主要用途是处理生成的代码:
因此可以生成调用部分方法的代码(在生成的代码中没有实现定义),并且由开发人员决定他/她是否想要/需要扩展部分类并实现部分方法。
@Matt Burland 答案的翻译
如果问题是关于实际应用的,那么部分方法只能返回 void 的事实非常有限。那些。系统“架构师声明方法,开发人员实施”不能建立在部分之上。
主要有两个用途:
简化处理程序的连接。例如,在 ASP.NET 的 global.asax 中,声明一个具有所需名称的方法就足够了:
它将自动附加到 Start 事件处理程序。
如果您尝试在代码生成器中实现类似的机制,将所有可能的“处理程序”声明为部分方法就足够了,并在适当的位置调用它们。如果编译器找到处理程序的实现,它将离开调用。如果没有,那就剪掉它。
调试用于编写单元测试的调用,尤其是用于抛出异常的调用。例如,您需要编写一个测试来处理 Redis 连接错误,特别是针对套接字错误。仅仅为了测试抛出异常而将所有套接字工作封装在一个包装类中是昂贵且耗时的。您可以在实时代码中进行现场调试:
并编写一个仅存在于调试版本中的实现:
当您使用一些外部库或框架并希望能够扩展在库(或框架)中实现的类的功能同时保持库的源代码不变(例如,在这个库的源代码作为 git 子模块被拉入你的项目,你不想为你的项目保留一个单独的分支)。为此,您可以在项目中创建一个单独的文件,其中包含现有类的部分声明,并向其中添加您需要的功能。
此外,如果您自己正在开发围绕单个类构建的任何库(以单例方式),您可能希望将类的功能物理分离为几个部分,以便于导航和编辑,而不是将其拆分为 2不同的子类(相当退化的例子,但有权存在)。
部分方法可以方便地装饰对象,可选地添加功能,例如验证某些字段,或添加前置或后置操作,这在使用第三方库或框架中的类时也很方便。