C# 部分方法被认为是有害的吗?

C# 部分方法被认为是有害的吗?,c#,class-design,C#,Class Design,在C#3.0中,微软引入了对一种叫做 你用它们吗?你能描述一下如何以及为什么吗 你认为使用部分方法好的编程实践,不是吗? 部分方法主要用于扩展工具生成的代码的行为,在不使用这种可扩展性的情况下,在运行时评估或用户可见代码中都不会产生成本 因此,它们的使用是明智的,并且在必要时应予以鼓励,但对于大多数用户(他们不是编写工具来生成代码)来说,这种情况相对少见。 如果您正在编写这样一个工具,那么应该考虑人们可能在哪里与您生成的代码流进行交互,以及在实现预期性能和可用性目标的同时,是否无法通过类似事件的

在C#3.0中,微软引入了对一种叫做

你用它们吗?你能描述一下如何以及为什么吗


你认为使用部分方法好的编程实践,不是吗? 部分方法主要用于扩展工具生成的代码的行为,在不使用这种可扩展性的情况下,在运行时评估或用户可见代码中都不会产生成本

因此,它们的使用是明智的,并且在必要时应予以鼓励,但对于大多数用户(他们不是编写工具来生成代码)来说,这种情况相对少见。 如果您正在编写这样一个工具,那么应该考虑人们可能在哪里与您生成的代码流进行交互,以及在实现预期性能和可用性目标的同时,是否无法通过类似事件的机制轻松处理这种使用。事件本质上是多播的,这种结构可能本质上违背API的预期设计。或者,可能需要一个复杂的返回值,或者与ref/out参数的交互,最后,扩展可能是复杂的/脆弱的,尽管它很有用,因此只有部分类实现者能够充分处理这个问题。所有这些原因都有其特殊性,如果不常见,局部方法可以有效地解决这些问题

实现分部方法的使用者应该按照工具生成的代码的要求使用它们(如果提供了扩展点,并且您需要它,请使用它)。
要避免这样做,因为您会觉得该功能令人困惑,这将是语言和API的糟糕使用,因为这显然是预期的扩展点。

与分部类本身一样,它们仅在与工具(设计器)生成的代码结合使用时才有用。在那里,它们提供了一种简单、轻量级的事件替代方案

微软编程文化一直倾向于采用更宽松的“管道胶带”方法。这至少可以追溯到Quick BASIC vs.Turbo Pascal战争。Microsoft语言允许快捷方式。以委托为例:委托基本上是一个您忘记在其中设计的接口。部分方法只是更相似而已

你问题的标题是指埃德斯格·迪克斯特拉给CACM的那封臭名昭著的信,这封信非常贴切。迪克斯特拉的信是结构化编程战争的正式出发点。就我个人而言,我不认为你会在所有情况下通过提倡一条结构化或非结构化的道路找到智慧

我一直认为这场冲突是工程学和计算机科学观点不同的产物。早期的微软程序员整天都在编写裸机程序。在编写了足够多的汇编程序之后,结构化编程的指令似乎有点愚蠢

折衷可以归结为:您希望有足够的绳子来吊死自己,还是希望被迫重写架构的某些部分以满足语言的不灵活性?一个纪律严明的团队可以在任何一种环境中编写好的代码,而且没有通用的正确答案


回到手头的问题:我不认为分部方法是一种很好的语言特性,但如果它们是使LINQ工作所必需的,它们绝对值得容忍。

我曾在我编写的类库中使用分部方法。通过使用定义的常量,可以将库编译成几个不同版本中的一个,这些版本将编译入或编译出不同的函数块

但是在所有选项的组合中,在代码中乱扔#if/#endif,再加上紧凑框架和桌面框架,会导致一些混乱的东西

我使用了部分方法来简化这一部分——比如说不可见的或隐式的#if/#endif。据我所知,这与LINQ中使用它们的方式类似


另一方面,在运行时,我没有像LINQ那样添加这些方法,或者说是这样做的。与linq模型不同的是,在我的类库中,有一个单独的DLL为每个选项组合构建,linq模型中有可分离的程序集,当组合在一起时,您会得到额外的函数。这是为了使部署和使用更容易

>部分类使C++和VB工作更像C和C++,在这里,您可以在不同的文件中分散实现类的代码,如您所见。他们的主要目的是为WPF之类的可视化设计提供干净的支持。我认为这是对部分类的好用法。


我看到的另一个用途是将大型源文件拆分为逻辑部分。例如,
类BigForm
可能跨越BigForm-BillingInfo.cs、BigForm-ShippingInfo.cs和BigForm-LineItems.cs文件。这通常不利于使用分部类,因为重构为多个类或控件是更好的OOP设计(为了可重用性等)。

分部类是非常有用的功能,例如,当您有一个客户机和一个服务器,它们都需要为业务对象持久性共享数据类型时。你有你的常规类服务器端,你用你的web服务在客户端公开它,如果你想在客户端装饰东西,非常漂亮,你可以制作你的类的部分版本(客户端你有一个通过代理生成的服务器版本的代码生成版本等等)

我只想说这个例子,因为我扩展了部分功能,现在,我正在处理一个silverlight项目,持久化断开连接的对象:)


//很抱歉没有注意到这个问题明确地提到了方法。分部方法对于在特定场景中自动生成的事件处理程序中编织代码功能非常有用

“委托基本上是一个你忘记设计的接口”,这完全是错误的,我邀请你考虑为什么微软不必费心去与java相比,在C语言中实现ANNO接口实现,为什么LAMBDAS是微不足道的。