Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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#_.net_Extension Methods - Fatal编程技术网

C# 扩展方法应该只用于代码不为';你没有访问的权限吗?

C# 扩展方法应该只用于代码不为';你没有访问的权限吗?,c#,.net,extension-methods,C#,.net,Extension Methods,扩展方法应该只用于代码您无权访问的类吗 我很难找到一个理由来使用扩展方法,而不是将其部分化并将类添加到外部文件中 我的具体场景如下:我有通过EF表示数据库中实体的类。我正在讨论如何使它呈现的类成为部分类,并添加我自己的方法。扩展方法是一种更有效的替代方法,还是当您有权访问要扩展的类的代码时不打算使用它们?规范的反例是接口上的扩展方法,因为即使您控制源代码,也没有实现。见:林克 但是,是的,一般来说,如果您控制具体类的源代码,那么期望直接将功能添加到类中而不是使用扩展方法是合理的,前提是功能实际上

扩展方法应该只用于代码您无权访问的类吗

我很难找到一个理由来使用扩展方法,而不是将其部分化并将类添加到外部文件中


我的具体场景如下:我有通过EF表示数据库中实体的类。我正在讨论如何使它呈现的类成为部分类,并添加我自己的方法。扩展方法是一种更有效的替代方法,还是当您有权访问要扩展的类的代码时不打算使用它们?

规范的反例是接口上的扩展方法,因为即使您控制源代码,也没有实现。见:林克

但是,是的,一般来说,如果您控制具体类的源代码,那么期望直接将功能添加到类中而不是使用扩展方法是合理的,前提是功能实际上是类实例的一部分

另一方面,回到你的情况,你可能不考虑任何方法。您的实体是数据模型,我不会向这些模型添加方法,而是将该功能封装到其他地方。这些模型的存在是为了封装您的数据,在不同的单元中可能更好地提供与该数据相关或相反的逻辑。但这实际上取决于您的方法在做什么,并且假设它们不是一个或多个属性上的普通包装器

扩展方法应该只用于代码您无权访问的类吗

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


你可能有一个在你百分之九十的项目中运行良好的类。通过添加扩展方法,您不会“污染”原始类,但仍然可以在其他10%的项目中利用它。

您可能想看看。有一些C++的细节,但是主要的思想也适用于其他的OO语言。简而言之:类中的方法越少,就越容易理解谁以及如何更改私有类状态。

除了能够提供接口扩展之外,我还使用扩展方法向仅使用类的公共接口工作的类添加“成员”。因此,如果一个方法需要访问私有/受保护的成员,它将成为类成员,如果不是扩展方法的话。这样可以使类本身保持小型化和集中化…

当您想向可能在多个类中实现的接口添加功能时,该怎么办?(我想到了IEnumerable)如果您同时拥有(一些没有源代码的类和一些有源代码的类)和/或一些您想要实现并可以在其他类上使用的相当“通用”的功能,那么将此实现为扩展方法是一件好事。。。直接添加方法(当您具有访问权限时)会更改该类的接口,这并不总是一件好事,尤其是在处理由不同团队使用该类的大型项目时