扩展方法应该加前缀吗?

6
根据我所了解的扩展方法,如果基类决定添加与您的扩展同名的方法,则会遇到问题。对于特定的类,通常不难选择一个名称以避免冲突,但是扩展方法可以添加到接口中,这使得潜在的冲突更加无限。

在Objective-C(使用它们的版本,类别),通过在每个方法之前添加前缀来避免此问题。我知道我们可以在命名空间中定义扩展方法,以便我们可以控制它们是否被导入,但这仅解决了扩展方法之间的冲突问题,而不是扩展方法与基类之间的冲突。

更新:

没有人实际提到过这一点,但扩展方法不是虚拟的。这意味着如果您在接口i上调用i.myExtension(),则它将始终调用接口类的方法,因此不会调用子类方法(可能具有不同的意图)。因此,总体而言,使用扩展方法是非常安全的。

4个回答

7
使用前缀会使代码变得丑陋,这会减少扩展方法的一些价值。
我建议小心谨慎地编写扩展方法,并使用有意义的方法名称。这样,在冲突的情况下,例如扩展方法Where和冲突的Where方法将具有类似的语义,这种情况更有可能发生。

6
通常的约定是将它们放在自己独立的命名空间中(通常采用 <something>.Extensions 的形式),然后您可以使用它们来决定是否在包含扩展方法通常操作的类型的任何特定代码片段中使用它们。
此外,如果出现冲突,请记住扩展方法仍然是静态方法,因此在名称冲突的情况下,您始终可以显式地调用它们。
但是,如果您发现经常遇到名称冲突,则可能需要重新考虑所选择的名称,以使它们不会干扰已存在于该类型上的名称。
总之,在 C# 中,不应该给扩展方法名称添加前缀,因为这只会混淆您的代码并使其更难以维护。

4
如果基类实现了与您的扩展相同名称的方法,我猜您可能会有以下两种情况:
1. 基类使用扩展方法添加了您要添加的相同功能。您不再需要扩展方法。删除它并改用基类上的方法即可。
2. 基类实现了与您所需功能不同但却使用了相同的名称。您或他们中有一个使用的名称是错误的,可能是您。将扩展方法重命名为描述该函数实际执行内容的名称。

同名方法很可能做的事情几乎相同,但它们也有可能在某些细节上略有不同。 - Casebash

1

我倾向于说不应该这样做,除非你有充分的理由怀疑你正在使用的方法签名将被实现。我认为这样做的原因是...

  • 在大多数情况下,你的方法签名很可能不会被复制。
  • 如果确实发生了复制,它应该总是可以在单元测试中检测到。
  • 修复应该很容易。

我通常在实现扩展方法时选择相对详细的方法名称,以避免混淆。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接