我想知道为什么C#/VB中甚至存在"部分类"的概念.网我正在开发一个应用程序,我们正在阅读一本(实际上非常好)与我们正在工作中实现的开发平台相关的书.在这本书中,作者围绕平台API提供了一个大型代码库/包装器,并在教授平台开发的不同主题时解释了他是如何开发的.

总之,长话短说——他到处使用分部类,作为在C#(IMO)中伪造多重继承的一种方法.我不明白他为什么不把这些课分成几个班,然后用作文.他将有3个"部分类"文件组成他的基类,每个都有3-500行代码...在他的API中多次这样做.

Do you find this justifiable?如果是我,我会遵循S.R.P.并创建多个类来处理不同的所需行为,然后创建一个基类,其中包含这些类的实例作为成员(例如合成).为什么微软甚至在框架中加入了部分类?他们取消了在C#中扩展/折叠每个作用域级别的所有代码的功能(这在C++中是允许的),因为这显然只是允许坏习惯——在我看来,部分类是一样的.I guess my question is: Can you explain to me when there would be a legitimate reason ever to use a partial class?

EDIT: I'm aware that for Web/WinForms there is no other choice. But outside of this? Why didn't MS just put some different keyword for gluing code-genn'ed classes together? Or is there really a legit design scenario that merits it?

I do not mean this to be a rant / war thread. I'm honestly looking to learn something here. When should partial classes be used in code design? Simple question, no need to close

谢谢

推荐答案

你能给我解释一下什么时候会有合法的理由使用分部类吗?

其中一个最合理、最有用的原因是鼓励将自动生成的代码与您自己的自定义扩展分离.例如,从某种设计器自动生成表单代码是很常见的,但您通常希望向其添加自己的特定行为.这样,如果重新生成自动代码部分,就不会触及具有特定扩展名的部分.

这就是说,很有可能会有太多的好东西.一些小贴士:

  • 不要为了成为partial而让你的班级变成partial.

  • 不要把部分类放在任何地方,除了彼此之外.如果你必须跳转到项目中完全不相关的部分,才能看到课程的另一半,那么你可能做错了.

  • 不要用partial来掩盖班级规模.如果你因为partial课太大而把你的课分成了partial课,你应该重温100课.

  • 如果同一个类有三个或更多的partial个片段,几乎可以保证你滥用了部分片段.二是典型的合理性上限,通常用于从手写代码中分割自动生成的代码.

总之,长话短说——他到处使用分部类,作为在C#(IMO)中伪造多重继承的一种方法.我不明白他为什么不把班级分成几个班,然后用作文.他将有3个"部分类"文件组成他的基类,每个都有3-500行代码...在他的API中多次这样做.

是的,这绝对是对partial的滥用!

.net相关问答推荐

SeriLog LogConext.PushProperty在ASP.NET MVC 5中不能使用OWIN中间件

保存时不保留 XML 格式

如何在 C# 中将 HTTP 发布请求发送到另一个 API?

代码访问安全是否在任何现实世界中使用?

查找所有源硬编码字符串

正则表达式在空格上拆分,除非在引号中

string.Format 如何处理空值?

如何在 WPF 中创建/制作圆角按钮?

Java 和 .NET 技术/框架的类似物

找不到 Assert.Fail 和 Assert.Pass 或等效项

在 ToString() 之前判断 null

如何授予所有用户对我的应用程序创建的文件的完全权限?

String.Split 仅在 C# 中的第一个分隔符上?

什么是 ToString("N0") 格式?

为什么有些对象属性是 UnaryExpression 而有些是 MemberExpression?

从 OpenFileDialog 路径/文件名中提取路径

确定使用 ContextMenuStrip 的控件

如何从文件中删除单个属性(例如只读)?

可以从 C# 调用 C++ 代码吗?

SqlParameter 已被另一个 SqlParameterCollection 包含 - using() {} 作弊吗?