扩展方法是否应该有前缀?

时间:2010-02-24 22:37:34

标签: c#

根据我读到的有关扩展方法的内容,如果基类决定添加与扩展名相同的方法,则会遇到问题。对于特定的类,通常不难选择名称以避免冲突,但是可以将扩展方法添加到接口中,这会增加冲突的可能性。

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

更新

没有人,实际上提到了这一点,但扩展方法aren't virtual。这意味着如果你可以在接口i上使用i.myExtension(),那么它将始终调用接口类方法,因此不会调用子类方法(可能具有不同的意图)。所以,总的来说,使用扩展方法是非常安全的。

4 个答案:

答案 0 :(得分:8)

使用前缀会使代码变得丑陋,从而消除了扩展方法的一些价值。

我建议小心不要创建大量的扩展方法并使用有意义的方法名称。这样,在发生冲突的情况下,更有可能的是,例如,扩展Where方法和冲突的Where方法将具有相似的语义。

答案 1 :(得分:6)

常见的约定是将它们放在各自独立的命名空间中(通常以<something>.Extensions的形式),然后您可以使用它来决定是否在包含类型的任何特定代码段中使用它们扩展通常在运行。

此外,如果确实存在冲突,请记住扩展方法仍然是静态方法,因此在名称冲突的情况下,您始终可以显式调用它们。

但是,如果您发现经常遇到名称冲突,则可能需要重新考虑您选择的名称,以便它们不会干扰该类型上已存在的名称。

总结一下,不,你不应该在C#中加上扩展方法名称的前缀,因为它们只会混淆你的代码并使其更难维护。

答案 2 :(得分:5)

如果基类实现了一个与你的扩展名相同的方法,我猜你会有以下两种情况之一:

  1. 基类实现了您使用扩展方法添加的相同功能。您不再需要扩展方法。删除它并改为使用基类上的方法。
  2. 基类实现了与您想要的不同的东西,但赋予它相同的名称。你或他们使用错误的名字。可能是你。将扩展方法重命名为描述函数实际执行操作的内容。

答案 3 :(得分:1)

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

  • 在大多数情况下,您的方法签名不太可能重复。
  • 如果是,则应始终在单元测试中检测到。
  • 修复应该是微不足道的。

在实施扩展方法时,我通常会选择相对冗长的方法名称,以避免混淆。