分部方法(Partial Methods)

什么是分部方法?

在C# 3.0里有一个叫做“分部方法”的新特性,在分部类或结构中可以包含分部方法,一个分部类中包含分部方法的声明,另一个分部类中包含分部方法的实现。分部方法使得对轻量级事件的处理变得可行。

// Definition in file1.cs
partial void onNameChanged();

// Implementation in file2.cs
partial void onNameChanged()
{
  // method body
}

在上面的例子中,onNameChanged方法分别在file1.cs和file2.cs中定义,在file1.cs中这个方法只有声明,而在file2.cs中才给出这个方法的实现。如果在file2.cs中没有实现onNameChanged,那么在编译的时候所有onNameChanged的调用会被删除掉。

下面几点是值得注意的地方:

  • 分部方法必须在分部类(partial class)中定义。
  • 分部方法定义前要有partial限定符。
  • 分部方法不一定要有方法体。
  • 分部方法必须返回void。
  • 分部方法可以为静态方法。
  • 分部方法可以有参数(包括this,ref,params修饰符,但不能用out)。
  • 分部方法必须是private的。

为什么会有分部方法?

那么如何使用分部方法呢?最常见的情况是使用它们做轻量级的事件处理。比如一个工具生成的代码中可能希望在执行的时候能挂上用户自定义的代码。又如,试想一个工具为一个表示客户(customer)的类生成了如下代码:

partial class Customer
{
    string name;
    public string Name
    {
        get { return name; }
        set
        {
            OnBeforeUpdateName();
            OnUpdateName();
            name = value;
            OnAfterUpdateName();
        }
    }
    partial void OnBeforeUpdateName();
    partial void OnUpdateName();
    partial void OnAfterUpdateName();
}

如果用户没有添加任何实现定义,那么上面的代码等同于:

partial class Customer
{
    string name;
    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}

可以看到没有了那些无用的指令。如果用户侦听 OnUpdateName “事件”:

partial class Customer
{
    partial void OnUpdateName()
    {
        DoSomething();
    }
} 

那么最初的定义就会等同于如下代码:

partial class Customer
{
    string name;
    public string Name
    {
        get { return name; }
        set
        {
            OnUpdateName();
            name = value;
        }
    }
    partial void OnUpdateName();
}

发表评论