我读过最新的部分方法 C#语言规范, ,所以我理解这些原理,但我想知道人们实际上是如何使用它们的。是否存在受益于部分方法的特定设计模式?

有帮助吗?

解决方案

引入部分方法的原因与 .Net 2 中引入部分类的原因类似。

分部类是一种可以拆分为多个文件的类 - 编译器在运行时将它们全部构建到一个文件中。

这样做的优点是 Visual Studio 可以为类的一部分提供图形设计器,而编码人员则可以处理其他部分。

最常见的例子是表单设计器。开发人员不想在大多数时间手动定位按钮、输入框等。

  • 在 .Net 1 中,它是自动生成的代码 #region 堵塞
  • 在 .Net 2 中,这些成为单独的设计器类 - 表单仍然是一个类,它只是分为一个由开发人员编辑的文件和一个由表单设计器编辑的文件

这使得维护两者变得更加容易。合并更简单,VS 表单设计者意外撤消编码人员手动更改的风险也更小。

在.Net 3.5中引入了Linq。Linq 有一个 DBML 设计器,用于构建数据结构,并生成自动代码。

这里额外的一点是需要提供开发人员可能想要填写的方法的代码。

由于开发人员将扩展这些类(使用额外的部分文件),因此他们不能在此处使用抽象方法。

另一个问题是,大多数时候这些方法不会被调用,调用空方法是浪费时间。

空方法 没有被优化掉.

因此 Linq 生成空的部分方法。如果您不创建自己的部分来完成它们,C# 编译器只会优化它们。

这样它就可以做到这个部分方法总是返回 void。

如果您创建一个新的 Linq DBML 文件,它将自动生成一个部分类,例如

[System.Data.Linq.Mapping.DatabaseAttribute(Name="MyDB")]
public partial class MyDataContext : System.Data.Linq.DataContext
{
    ...

    partial void OnCreated();
    partial void InsertMyTable(MyTable instance);
    partial void UpdateMyTable(MyTable instance);
    partial void DeleteMyTable(MyTable instance);

    ...

然后在你自己的部分文件中你可以扩展它:

public partial class MyDataContext
{
    partial void OnCreated() {
        //do something on data context creation
    }
}

如果您不扩展这些方法,它们就会立即得到优化。

部分方法不能是公共的 - 因为这样它们就必须存在以供其他类调用。如果你编写自己的代码生成器,我可以看到它们很有用,但除此之外它们只对 VS 设计者真正有用。

我之前提到的例子是一种可能性:

//this code will get optimised out if no body is implemented
partial void DoSomethingIfCompFlag();

#if COMPILER_FLAG
//this code won't exist if the flag is off
partial void DoSomethingIfCompFlag() {
    //your code
}
#endif

另一个潜在的用途是,如果您有一个大型且复杂的类分布在多个文件中,您可能需要在调用文件中进行部分引用。不过我认为在这种情况下你应该首先考虑简化课程。

其他提示

部分方法在概念上与 GoF 非常相似 模板法 行为模式(设计模式, ,第 325 页)。

它们允许在一个地方定义算法或操作的行为,并在其他地方实现或更改,从而实现可扩展性和定制。我开始在 C# 3.0 中使用部分方法而不是模板方法,因为我认为代码更干净。

一个很好的功能是,未实现的部分方法在编译时不会产生运行时开销。

代码生成 是它们存在的主要原因之一,也是使用它们的主要原因之一。


编辑:尽管该链接指向特定于 Visual Basic 的信息,但相同的基本原则也适用于 C#。

我认为它们是轻量级的活动。您可以拥有一个可重用的代码文件(通常是自动生成的,但不一定),并且对于每个实现,只需处理您在部分类中关心的事件。事实上,这就是它在 LINQ to SQL 中的使用方式(也是发明该语言功能的原因)。

以下是 C#.NET 3.0 中部分类的最佳资源: http://msdn.microsoft.com/en-us/library/wa80x488(VS.85).aspx

我尽量避免使用分部类(Visual Studio 为设计器文件创建的分部类除外;那些都很棒)。对我来说,将一个类的所有代码放在一个地方更重要。如果你的类设计得很好并且代表了一件事(单一责任原则),那么该一件事的所有代码都应该位于一处。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top