扩展方法是否只应用于您无法访问其代码的类?

时间:2011-07-26 03:59:37

标签: c# .net extension-methods

扩展方法是否只应用于您无法访问其代码的类?

我很难想出一个扩展方法的理由,而不是让它变成局部并在外部文件中添加类。

我的具体方案如下:我有通过EF表示数据库中实体的类。我正在辩论制作它所呈现的部分类并添加我自己的方法。扩展方法是一种更有效的替代方法,还是在您可以访问要扩展的类的代码时不打算使用它们?

5 个答案:

答案 0 :(得分:4)

规范的反例是接口上的扩展方法,因为即使你控制了源,也没有实现。见:Linq。

但是,是的,一般来说,如果你控制具体类的来源,那么期望直接将类功能添加到类中而不是使用扩展方法是不合理的,如果实际上对功能有意义的话成为类实例的一部分。

另一方面,回到你的情况,你可能不会考虑任何方法。您的实体是数据模型,我不会将方法添加到这些模型中,而是将该功能封装在其他地方。这些模型用于封装您的数据,可能在这些数据中运行的逻辑可能更好地在不同的单元中提供。但这实际上取决于你的方法正在做什么,并且还假设它们不是像一个或多个属性的简单包装器那样的东西,例如。

答案 1 :(得分:2)

除了能够为接口提供扩展之外,我还使用扩展方法将“成员”添加到仅使用类的公共接口工作的类中。因此,如果方法需要访问私有/受保护成员,它将成为类成员,如果不是扩展方法。这使得课程本身变得小而且集中......

答案 2 :(得分:1)

没有

您可能有一个在90%的项目中都能正常工作的课程。通过添加扩展方法,您不会“污染”原始类,但仍可以在其他10%的项目中使用它。

答案 3 :(得分:0)

  

扩展方法是否只应用于您无法访问其代码的类?

不一定。在某些情况下,扩展方法仍然可以提供帮助。我最近遇到了xml序列化程序的问题,它可以序列化一个具有使用linq / lamba表达式的方法的对象。将方法移动到扩展方法已解析 。我也喜欢在DTO上使用扩展方法。

答案 4 :(得分:0)

您可能需要查看How Non-Member Functions Improve Encapsulation。有一些C ++细节,但主要思想也适用于其他OO语言。简而言之:你在课堂上掌握的方法越少,就越容易理解改变私人阶级状态的人和方式。