代码之家  ›  专栏  ›  技术社区  ›  Eric Z Beard

如何在C#3.0中使用分部方法?

  •  18
  • Eric Z Beard  · 技术社区  · 16 年前

    我在最近的一篇文章中读到了部分方法 C# language specification ,所以我理解这些原则,但我想知道人们实际上是如何使用它们的。是否有一种特定的设计模式可以从局部方法中获益?

    5 回复  |  直到 16 年前
        1
  •  23
  •   Community CDub    7 年前

    引入分部方法的原因与.NET2中使用分部类的原因类似。

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

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

    • 在.NET1中,它是在 #region
    • 在.NET2中,这些成为了独立的设计器类-表单仍然是一个类,它只是被开发人员编辑成一个文件,由表单设计器编辑成一个文件

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

    这里的额外部分是提供开发人员可能需要填写的方法所需的代码。

    另一个问题是,这些方法大部分时间不会被调用,而调用空方法是浪费时间。

    空方法 are not optimised out

    所以Linq生成空的部分方法。如果您不创建自己的分部代码来完成它们,C#编译器只会对它们进行优化。

    所以它可以做到这一点,部分方法总是返回void。

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

    [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
        }
    }
    

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

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

    //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
    

    另一个潜在用途是,如果有一个大型复杂的类跨越多个文件,则可能需要在调用文件中使用部分引用。不过,我认为,在这种情况下,你应该考虑简化班级第一。

        2
  •  10
  •   Jonathan Webb    16 年前

    Template Method 行为模式( Design Patterns ,第325页)。

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

        3
  •  2
  •   Jason Bunting    16 年前

    Code generation 是它们存在的主要原因之一,也是使用它们的主要原因之一。


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

        4
  •  2
  •   Mark Cidade    16 年前

        5
  •  0
  •   Ed Schwehm    16 年前
    推荐文章