C#中的部分类

时间:2008-10-02 01:44:14

标签: c# partial-classes

在webforms / winforms生成的代码场景之外是否有很好的使用部分类?或者这个功能基本上是为了支持吗?

20 个答案:

答案 0 :(得分:11)

部分支持将生成的代码与程序员代码混合的场景(WebForms,WinForms,LINQ-to-SQL等)。

使用它有更多理由。例如,如果在大型,笨拙的文件中有大类,但是类具有逻辑相关方法组,则可以选择部分类来使文件大小更易于管理。

答案 1 :(得分:7)

代码生成是部分课程背后的驱动力。需要的是拥有一个不断变化的代码生成类,但允许开发人员提供自定义代码作为类的一部分,每次进行更改时都不会覆盖这些代码以强制重新生成类。

以WinForms或Typed-DataSet为例(或任何设计师)。每次对设计器进行更改时,它都会将相应的代码序列化为文件。假设您需要提供一些生成器不知道的其他方法。如果您将其添加到生成的文件中,则更改将在下次生成时丢失。

我目前正在处理的项目使用所有DAL,BLL和业务实体的代码生成。但是,生成器只能获得75%的信息。其余部分必须手动编码(例如,自定义业务逻辑)。我可以假设每个BLL类都有一个SelectAll方法,因此很容易生成。但是我的客户BLL还需要一个SelectAllByLocation方法。我不能把它放在我的生成器中,因为它不是所有BLL类的通用。因此,我将所有类生成为部分类,然后在单独的文件中定义自定义方法。现在,当我的结构发生变化时,或者由于某种原因我需要重新生成BLL时,我的自定义代码将不会被删除。

答案 2 :(得分:6)

我使用partial类作为分离我编写的自定义控件的不同子元素的一种方法。此外,当与实体创建软件一起使用时,它允许LLBLGen等产品创建类的生成版本,以及自定义的用户编辑版本,如果需要重新生成实体,则不会被替换。

答案 3 :(得分:5)

我经常使用partial类为每个嵌套类赋予自己的文件。我已经开发了一些架构,其中大多数实现只需要一个类,因此我们将这些类嵌套在一个类中。通过使用部分类能力并将每个文件拆分成自己的文件,使文件更易于维护是有意义的。

我们还将它们用于分组股票覆盖或隐藏一组股票。像这样的东西。这是一种混合库存变化的简便方法(只需复制文件并将部分类名称更改为目标类 - 当然,只要目标类也是部分类)。

答案 4 :(得分:4)

部分类的另一个可能用途是利用部分方法使方法选择性地使用条件编译消失 - 这对于调试模式诊断代码或专门的单元测试场景非常有用。

您可以声明部分方法类似于抽象方法,然后在其他分部类中,当您键入关键字“partial”时,您可以利用Intellisense创建该方法的实现。

如果用条件构建语句包围一个部分,那么您可以轻松地切断仅调试或测试代码。在下面的示例中,在DEBUG模式下,调用了LogSomethingDebugOnly方法,但是在发布版本中,它就像方法根本不存在 - 这是一种在没有大量分支的情况下使诊断代码远离生产代码的好方法。多个条件编译块。

// Main Part
public partial class Class1
{
    private partial void LogSomethingDebugOnly();

    public void SomeMethod()
    {
        LogSomethingDebugOnly();
        // do the real work
    }
}

// Debug Part - probably in a different file
public partial class Class1
{

    #if DEBUG

    private partial void LogSomethingDebugOnly()
    {
        // Do the logging or diagnostic work
    }

    #endif
}

答案 5 :(得分:3)

LINQ to SQL充分利用了部分类来扩展设计器生成的代码。我想你通常会发现设计师创建的代码使用了这种部分类模式。

答案 6 :(得分:3)

我发现部分课程非常有帮助。通常它们用于扩展自动生成的类。我在一个重型单元测试的项目中使用它们。我的UT类具有复杂的依赖关系,并且跨多个类分隔代码是不太实际的。当然最好使用继承\组合,但在某些情况下,部分类可以是有用的。

答案 7 :(得分:2)

也许为时已晚,但请允许我加上我的2美分:

*。在处理大型项目时,将类分散到单独的文件上允许多个程序员同时处理它。

*。您可以轻松编写VS.NET生成的类的代码(用于扩展功能)。这将允许您编写自己需要的代码,而不会弄乱系统生成的代码

答案 8 :(得分:2)

如前所述,我也认为这是代码味道。

如果一个类太大而需要拆分成更多文件,则意味着它违反了单一责任原则并做了太多事情。 大班可以分解成一起合作的小班。

如果必须使用部分类或区域来组织代码,请考虑它们是否应该在自己的类中。它提高了可读性,并且您可以获得更多的代码重用。

答案 9 :(得分:1)

几年前我在一个项目上工作过,我们有一个类型化的DataSet类,里面有大量代码:DataTables中的方法,TableAdapters中的方法,TableAdapter实例的声明,你可以命名它。这是项目的一个重要中心点,每个人都必须经常工作,并且对部分类代码文件存在很多源控制争用。

所以我将代码文件拆分为修复或六个部分类文件,按功能分组,以便我们可以处理较小的部分,而不必每次我们不得不更改一些小东西时锁定整个文件。

(当然,我们也可以通过不使用专用锁定源控制系统解决问题,但这是另一个问题。)

答案 10 :(得分:1)

一般来说,我认为这是一种代码味道。

如果您的课程那么复杂,那么它可能会被分解成更小的可重用组件。

或者它意味着没有继承层次结构应该有一个。

对于代码生成方案,它很好,但我认为代码生成是另一种代码味道。

答案 11 :(得分:1)

在相对复杂的UserControl上,我将事件处理内容放在一个文件中,将绘图和属性放在另一个文件中。部分类对此很有用,通常这个类的部分是相对独立的,能够并排编辑绘画和事件处理是很好的。

答案 12 :(得分:1)

我在游戏中迟到了...但只是我的2美分......

一种用法可能是将现有遗留代码库中现有的神类重构为多个分段类。如果对包含部分类的文件名采用适当的命名约定,它可以提高代码的可发现性。这也可以减少源代码存储库 - 解析和合并到一定程度。

理想情况下,上帝班应分为多个小班 - 每个班都有一个单一的责任。有时它会破坏性地执行中到大的重构。在这种情况下,部分课程可以提供暂时的缓解。

答案 13 :(得分:1)

我在哪里,我们有一个程序来处理来自客户端的传入文件。它的设置使每个客户端的代码都在它自己的类库项目中,该项目知道如何处理客户选择使用的任何格式。

主代码通过定义一个相当广泛的接口来使用库,这个接口是库中的类必须实现的(可能应该是一些不同的接口,但现在改变它已经太晚了)。有时,在同一个类中涉及的代码比我们通常认为的谨慎。部分类允许我们稍微分解它们。

答案 14 :(得分:0)

我刚刚找到了部分类的用法。我有一个[DataContract]类,用于将数据传递给客户端。我希望客户端能够以特定的方式显示类(文本输出)。所以我创建了一个分部类并覆盖了ToString方法。

答案 15 :(得分:0)

我在数据访问层中使用它。生成的类像mapper一样查询部分。如果我需要添加一个mapper方法来做一个未生成的花哨负载,我将它添加到自定义类中。

最后,使用业务层中数据层的程序员只能看到一个具有他或她所需功能的类。如果数据源发生变化,可以轻松生成通用部件而不会覆盖自定义内容。

答案 16 :(得分:0)

有时你可能会发现工作中非常古老的代码,这些代码几乎不可能在不破坏现有代码的情况下重构为不同的元素。

如果没有给出选项或时间来创建更真实的体系结构,部分类可以非常容易地将逻辑分离到需要的位置。这使得现有代码可以继续使用相同的架构,同时您可以更接近更具体的架构。

答案 17 :(得分:0)

您之前使用#region部分的任何地方可能更适合作为部分类中的单独文件。

我个人使用大型类的部分类,其中静态成员放在一个文件中,实例成员放在另一个文件中。

答案 18 :(得分:0)

编辑:Visual Studio的DSL工具使用部分类。

因此,它是许多自动生成的代码使用的功能。 而不是使用#region,自动生成的代码转到一个文件,用户代码(也称为自定义代码)转到另一个文件,甚至在不同的目录中,这样开发人员就不会对这么多无意义的文件感到困惑。

最好有这样的选择,你可以结合 - 但不能强制使用 - 继承

此外,将几个目录中的某些类的逻辑分开可能很方便。当然,对于机器来说,它是相同的,但它增强了用户的可读性体验。

答案 19 :(得分:0)

正如马特指出的那样,校正的两侧部分需要在同一个组件中。 我的坏。