Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 指南-扩展方法与部分类_C#_Extension Methods_Partial Classes - Fatal编程技术网

C# 指南-扩展方法与部分类

C# 指南-扩展方法与部分类,c#,extension-methods,partial-classes,C#,Extension Methods,Partial Classes,我们正在讨论为实体类定义方法的最佳方式——作为扩展方法还是使用分部类。我们讨论的那种方法不会修改实体的状态,它们纯粹是询问状态并返回值的“助手”方法 这两种方法的主要好处是保持实体类干净,同时仍然为客户机代码提供intellisense支持 我对这两种方式都没有强烈的偏好,但我很想知道其他人是否对其中一种有偏好(或知道记录在案的指导方针) 我开始为我能想到的每种方法列出优点清单,但最后我想到的是: 部分类 方法定义驻留在类中(即使它是另一个文件),因此Visual Studio工具对“find

我们正在讨论为实体类定义方法的最佳方式——作为扩展方法还是使用分部类。我们讨论的那种方法不会修改实体的状态,它们纯粹是询问状态并返回值的“助手”方法

这两种方法的主要好处是保持实体类干净,同时仍然为客户机代码提供intellisense支持

我对这两种方式都没有强烈的偏好,但我很想知道其他人是否对其中一种有偏好(或知道记录在案的指导方针)

我开始为我能想到的每种方法列出优点清单,但最后我想到的是:

部分类

  • 方法定义驻留在类中(即使它是另一个文件),因此Visual Studio工具对“find method”的支持(例如,resharper中的ALT-\n)将定位该方法

  • 由于使用了partial关键字,一旦打开实体类,包含辅助方法的其他文件的存在就显而易见了

扩展方法

  • 文件的命名(“entityNameExtension”)及其在项目中的位置(在“Extensions”子文件夹中)直观且易于搜索
其他人能补充他们的观点吗

PS我不认为这是以下问题的重复,因为该问题的提问者满足于将概述了功能差异的回答标记为正确答案,而这并没有回答关于在这种情况下哪种方法是最佳实践的问题:


编辑-我正在寻找人们对一种方法或另一种方法的偏好,因为我们找不到针对这一特定场景的书面指南。这两种方法都是可能的,并且都没有违反任何设计原则,因此这是一个偏好的问题,我想知道您的。

我不知道如果原始类已超出其用途,您为什么要创建一个分部类。看看你想要扩展的类,它们是真的在做一件事,还是在做很多事情。看看单一责任原则()


如果您可以创建其他类可以利用的方法,我建议您创建一个扩展类。它将扩展其他类的功能,使工具箱更加灵活

在我看来,扩展方法有两个好处。首先,当您将它们应用于接口时,它会让您产生一种错觉,即编写一个抽象基类来定义一些常用方法,但它更灵活,因为一个类只能有一个基类,但可以实现多个接口。第二,如果你把它应用到普通的课堂上,那么我倾向于把它看作某种黑客行为。当原始类缺少一些方法时,您真的觉得它们应该有这些方法,但它们没有,并且您无法实现它们,因此您被迫在其他地方实现它们,作为实用方法,这会让您产生一种错觉,认为它实际上就在那里

这两种情况最终都是语法上的甜点,但是扩展接口对我来说更有意义,如果我只看一下LINQ的可枚举类的话。我已经在几十个完全不同的类上使用了这些扩展方法,所以它确实得到了回报。类扩展方法的一个例子是,在将string.IsNullOrWhitespace添加到框架之前,我创建了自己的string.IsNullOrWhitespace

扩展接口似乎是正确的,因为接口定义了一个约定,您可以在扩展方法中依赖该约定,但是当您扩展一个常规类时,它可能会更改并破坏您的扩展方法。当然,接口也可能会发生变化,但我认为它们的设计更为彻底,但我没有任何统计数据

然后是面向对象编程的例子。你觉得你的方法应该去哪里,谁使用这些额外的方法,边界在哪里。如果你认为一个方法属于一个类,那么把它放在类中。这很有道理,很简单。在扩展方法发明之前,人们写了非常好的课程,他们把所有东西都放在它应该放的地方,生活也很好,哈哈

分部类之所以很酷,是因为它们不像扩展方法那样是个大问题。它们不是糖,也不是魔法。这仅仅是处理自动生成类的最好和最简单的方法,所以我不太重视它。我已经编写了一些代码生成器,它们会发出一些区域,在这些区域中,人类可以编写自己的东西,并且在后续代码生成中不会被覆盖。这样比较舒服,但仅此而已。我无法改变.NET工具生成代码的方式,而且它们也不是这样做的,所以分部类是次好的选择


总而言之,我的意见是只在必要时使用扩展方法,并尽可能使用分部类。

Hi-emedbo,正如前面提到的,它们是实体类,建议的方法只是检索状态的助手。所以没有违反SRP。这些方法是特定于这个实体的,所以它们不能泛化为用于其他类。答案很好。谢谢你的意见!