65.9K
CodeProject 正在变化。 阅读更多。
Home

Partial 类和 Partial 方法的四个真实世界应用

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.83/5 (80投票s)

2012年1月11日

CPOL

5分钟阅读

viewsIcon

287246

在本文中,我们将解释 Partial 类和 partial 方法的实际应用。

目录

引言

最近我一直在研究 Partial 类及其在实际中的应用。在 Google 上找到的许多帖子都讨论了 Partial 类和 partial 方法的概念,但很少有人强调在哪些场景下使用它们。

在本文中,我们将首先介绍 Partial 类和方法的概念,然后讨论四个实际应用。我还在这里创建了一个视频,其中讨论了 Partial 类并展示了它们的实际应用。

Partial 类的基础知识

Partial 类允许将一个类分成两个独立的文件。在编译时,这些文件会被编译成一个类。例如,在下面的图中,我们将 customer 类分成了两个不同的文件“customer1.cs”和“customer2.cs”。

在编译时,这些文件会被内部编译成一个类。因此,当你创建一个 Customer 类的对象时,你将能够看到存在于两个物理文件中的方法。例如,你可以看到 Add 方法属于 customer1.cs,而 Delete 方法属于 customer2.cs,但在创建 Customer 对象时,我们可以看到 AddDelete 方法。

Partial 方法的基础知识

Partial 类还有一个重要的概念叫做 partial 方法。Partial 方法帮助我们在一个物理文件中定义一个方法,并在另一个物理文件中实现该方法,如下面的图所示。

在图中,你可以看到我们在 Customer1.cs 中定义了 Validate 方法,并在 Customer2.cs 中实现了这个 Validate 方法。请注意,这两个方法都带有 partial 关键字。

用法一:ASP.NET 自动生成代码

Partial 类最大的用途是在存在代码生成技术的场景中。微软团队自身在 ASP.NET、LINQ 和 EF 代码生成中就使用了 Partial 类。例如,当我们查看 ASP.NET 时,它有两个部分:页面的自动生成代码和用于编写自定义逻辑的代码隐藏文件。

自定义逻辑写在“.aspx.cs”文件中,而自动生成的逻辑写在“.aspx.designer.cs”文件中,如下面的图所示。

作为开发人员,你会希望自动生成的代码完成它的工作,即当你将一个按钮拖放到 ASP.NET 设计器时生成代码。

下面是自动生成代码的样子

public partial class WebForm1 {
        
    /// <summary>
    /// form1 control.
    /// 
    /// <remarks>
    /// Auto-generated field.
    /// To modify move field declaration from designer file to code-behind file.
    /// </remarks>
    protected global::System.Web.UI.HtmlControls.HtmlForm form1;
    
    /// <summary>
    /// Button1 control.
    /// </summary>
    /// <remarks>
    /// Auto-generated field.
    /// To modify move field declaration from designer file to code-behind file.
    /// </remarks>
    protected global::System.Web.UI.WebControls.Button Button1;
        
    /// <summary>
    /// Label1 control.
    /// </summary>
    /// <remarks>
    /// Auto-generated field.
    /// To modify move field declaration from designer file to code-behind file.
    /// </remarks>
    protected global::System.Web.UI.WebControls.Label Label1;
}

同时,你还希望在另一个文件中自定义代码,而不干扰自动生成部分。为此,ASP.NET 提供了“.aspx.cs”文件,这是一个 partial 类,你可以在其中放置自己的自定义逻辑。

public partial class WebForm1 : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        // Your custom logic
    }
}

这只有在类被拆分成两个物理文件但通过 partial 关键字联合起来时才可能。所以,如果你查看任何 ASP.NET 代码隐藏类文件,它都会带有 partial 关键字。

通过在 ASP.NET 中使用 partial 关键字,微软团队让 VS 和开发人员协同工作,互不干扰代码,从而提高了生产力。

用法二:LINQ 和 Entity Framework

LINQ 和 EF 也大量使用 Partial 类和 partial 方法,因为这些技术具有自动生成的特性。因此,当你将表拖放到这些框架中时,它们会生成自动生成的类,如下面的图所示。

在图中,你可以看到自动生成的代码是如何包含 partial 类和 partial 方法的。

稍后可以使用 partial 方法来添加自定义逻辑。例如,在下面的代码中,对于上面自动生成的 tblCustomer 类,我们使用了 partial 方法来重写 OnCustomerCodeChanged 事件,以确保客户代码不超过 8 个字符。

public partial class tblCustomer
{
    partial void OnCustomerCodeChanged()
    {
        if (_CustomerCode.Length > 8)
        {
            throw new Exception("Customer code can not be greater than 8");
        }
    }
}

因此,通过使用 Partial 类和 partial 方法,LINQ 和 EF 可以持续生成类,并通过使用 partial 方法,我们可以用自己的逻辑自定义这些类。

用法三:通过压缩大型类来改进维护性

Partial 类另一个重要的用途是改进项目的可维护性。如果你有一个包含大量方法的类,如下图所示,那么维护这些类会有些麻烦。

通过使用 Partial 类,你可以将它们拆分成物理文件,如下面的图所示,从而使你的项目更好、更容易维护。

用法四:多人处理同一个类

我看到的 Partial 类的最后一个实际应用是当我们希望开发人员能够同时处理同一个类时。我同意这可能是一个非常罕见的情况,因为有更好的选择,例如使用像 TFS 或 Subversion 这样的版本控制软件,但如果你想要一个快速且本地化的解决方案,这个选项也并非不好。

如需进一步阅读,请观看以下面试准备视频和分步视频系列。

© . All rights reserved.