C#中的部分类

Bri*_*n G 14 c# partial-classes

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

yfe*_*lum 11

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

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

  • "如果你在庞大,笨拙的文件中有大班"那么你真的需要重新考虑你的设计. (19认同)
  • @Roger:我不同意.如果您的类具有完全有效封装原因的嵌套类型,则会创建大且难以处理的文件,这些文件保证使用部分但不表示需要重新设计. (3认同)
  • @sweeney:如果您认为您的类足够大且笨重,足以考虑部分,那么它们可能足够大且笨重,足以考虑您的设计,无论您的“大且笨重”指标是什么。 (2认同)

Mic*_*cah 7

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

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

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


Mag*_*Kat 6

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


Jef*_*tes 5

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

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


Dav*_*ike 5

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

您可以像抽象方法一样声明一个分部方法,然后在另一个分部类中,当您键入关键字“partial”时,您可以利用智能感知来创建该方法的实现。

如果您用条件构建语句包围一个部分,那么您可以轻松地切断仅调试或测试代码。在下面的示例中,在 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
}
Run Code Online (Sandbox Code Playgroud)