-->

在C#分部类(Partial Classes in C#)

2019-08-31 08:31发布

是否有分部类的好用途生成的代码情景web表单/的WinForms之外? 或者是这个功能基本上支持了吗?

Answer 1:

这是部分地支持的场景(的WebForms,的WinForms,LINQ到SQL,等)混合生成的代码与编程代码。

有更多地使用它的原因。 举例来说,如果你有大的,笨拙的文件大类,但类有逻辑相关的方法组,局部类可能是让你的文件大小更易于管理的选项。



Answer 2:

代码生成是部分类的原动力。 需要来自有一个代码生成的类,它是不断变化的,但允许开发人员提供自定义代码是由该强制再生的类不会被覆盖每次修改类的一部分。

举个例子的WinForms或类型化的DataSet(或与此有关的任何设计师)。 每当你做出改变,以它系列化对应的代码到一个文件中的设计师。 比方说,你需要提供一些额外的方法,发电机不知道任何有关。 如果添加它生成的文件的更改将丢失它产生的下一次。

我目前工作的一个项目使用的代码生成所有DAL,BLL,和业务实体。 然而,发电机只能获得在美国的信息75%。 的剩余部分,必须手工编码的(例如自定义业务逻辑)。 我可以假设每个BLL类有一个全选的方法,因此,很容易产生。 但是我的客户也BLL需要有一个SelectAllByLocation方法。 因为它不是通用于所有BLL类,我不能把这个在我的发电机。 因此,我生成所有我的班为部分类,然后在一个单独的文件中我定义我的自定义方法。 现在在路上时,我的结构发生变化,或者我需要重新生成我BLL出于某种原因,我的自定义代码将不会被消灭。



Answer 3:

我用部分类为分离出的定制控件的不同的子元件,我写的手段。 此外,与实体创建软件一起使用时,它可以让产品像LLBLGEN创建的类生成的版本,以及自定义,用户编辑的版本,如果实体需要再生,不会被替换。



Answer 4:

我经常使用分部类给每个嵌套类它自己的文件。 已经有一些架构我已经上大多数实行的是只有一个等级所需的工作,所以我们在一个类嵌套的类。 这是有道理的文件保存的更容易使用部分类能力和分离每一个到它自己的文件来维护。

我们还用它们来分组的股票替代或股票组属性的隐藏。 像这样的东西。 这是在股改(只复制文件并更改部分类名的目标类 - 只要目标类是由局部过,当然)混合的一种方便的方法。



Answer 5:

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

你可以声明的部分方法有点像一个抽象方法,然后在其他部分类,当你输入关键字“局部”你可以把智能感知的优势,创建方法的实现。

如果你周围有有条件的编译语句的一部分,那么你可以很容易地切断调试只或测试代码。 在下面的例子中,在调试模式下,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
}


Answer 6:

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



Answer 7:

我找到了部分课程是非常有帮助的。 通常它们用于能够延长自动生成的类。 我用他们沉重的单元测试一个项目。 我的UT类具有复杂的依赖关系,这是不是很实用,以单独的代码在多个classes.Of当然最好是使用继承\组成,但在某些情况下,部分类可以反弹有帮助。



Answer 8:

正如前面提到的,我也认为这是一个代码味道。

如果一个类是如此之大,它需要被分割为多个文件,意味着它打破了单一职责原则和做的东西太多了。 大型类可以细分成更小的类,共同合作。

如果必须使用部分类或地区代码组织,考虑应否在自己的班级。 它增加了可读性,你会得到更多的代码重用。



Answer 9:

也许为时已晚,但请让我补充我的2美分太:

*。当工作在大型项目中,在不同的文件中传播的一类允许多个程序员同时在它的工作。

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



Answer 10:

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

主代码使用定义库中的类必须实现一个相当广泛的接口库(大概应该是几个不同的接口,但它现在已经太晚了修改)。 有时,包括在同一类很多更多的代码比我们通常认为谨慎。 部分类允许我们打破他们一些。



Answer 11:

在用户控件这是比较复杂的,我把事件处理的东西在一个文件中,而在另一个文件中的绘画和属性。 部分类为这个工作的伟大,通常类的这些部分都是相对独立的,它很高兴能够编辑绘画和事件通过侧手边。



Answer 12:

我几年前进行的项目,我们有一个类型化的DataSet类,有一吨的代码,要在数据表的方法,在TableAdapter的方法,TableAdapter的实例的声明,你的名字。 这是所有人都不得不经常工作在项目的一个巨大的中心点,并有在局部类代码文件很多源代码控制的争夺。

所以我分裂代码文件到修复或六个偏类文件,按功能分组,这样我们就可以在更小的部分工作,而不必每次我们不得不改变一些小东西的时间锁定整个文件。

(当然,我们也已经解决了通过不使用专用锁源代码控制系统的问题,但这是另外一个问题。)



Answer 13:

一般情况下,我认为这是一个代码味道。

如果你的类是复杂的那么大概可以分成更小的可重用组件。

或者,它意味着世界上没有继承层次里应该有一个。

对于代码生成的场景这是很好的,但我认为代码生成是另一码味。



Answer 14:

我在游戏后期......只是我的2美分...

一个用途是在一个现有的传统的代码库中的多个部分类重构现有神级。 它可以提高代码的可发现性 - 如果适当的命名约定遵循对于含有部分类的文件名。 这也可以减少源代码库 - 解决和合并的程度。

理想情况下,神级应该被分解成多个小类别 - 每个都具有单一职责。 有时它是破坏性的执行中到大型的重构​​。 在这种情况下,部分类可以提供一个暂时的缓解。



Answer 15:

校正,马特指出的,所述部分需要双方在相同的组件。 我的错。



Answer 16:

我用它在数据访问层。 生成的类像映射器和查询的部分。 如果我需要添加一个映射器的方法,例如要做到这一点不是产生一个奇特的负载我把它添加到自定义类。

在最后,在业务层使用数据层程序员只看到了所有他或她需要的功能的一个类。 如果数据源的变化可以很容易地,而不会覆盖定制的东西生成通用部分。



Answer 17:

我刚刚发现了部分类的用途。 我有使用将数据传递到所述客户端的[DataContract]类。 我希望客户能在一个特定的方式(文本输出)显示类。 所以我创建的局部类和推翻ToString方法。



Answer 18:

有时你可能会发现在工作中非常旧代码,使其接近不可能重构出到不同的元素不会破坏现有的代码。

如果你不给出选项,或者创建一个更真实的架构的时候,局部类使它非常容易在那里它需要独立的逻辑。 这使得现有的代码继续使用相同的架构,同时您将获得更接近了一步一个更具体的结构。



Answer 19:

任何地方,你就必须使用#region部分可能更有意义,因为在部分类单独的文件之前。

我个人使用大班其中静态成员走在一个文件和实例成员走在另一个部分类。



Answer 20:

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

因此,它的许多自动生成的代码使用的功能。 而不是使用#区域自动生成的代码进入一个文件和用户代码(也称为自定义代码)转移到另一个,甚至在不同的目录,这样开发商不混淆这么多毫无意义的文件。

这是件好事,这样的选择,你可以结合 - 但并不一定要使用-with继承

此外,它可以很方便一些类的逻辑几个目录中分别出来。 当然,机器,这是相同的,但是它增强了用户体验的可读性。



文章来源: Partial Classes in C#