接口扩展方法的C#命名约定

时间:2010-04-23 17:36:19

标签: .net interface naming-conventions extension-methods

我通常将我的C#接口命名为IThing。我正在为IThing创建一个扩展方法类,但我不知道该命名它。一方面,调用它ThingExtensions似乎意味着它是某个Thing类的扩展类,而不是IThing接口。当按字母顺序查看文件时,它还使扩展类与其扩展的接口分开。另一方面,命名它IThingExtensions使它看起来像是一个接口本身,而不是接口的扩展类。你会建议什么?

修改:没有Thing类实现IThing,以回应一些评论。

6 个答案:

答案 0 :(得分:29)

我绝对更喜欢名称ThingExtensions而不是IThingExtensions。原因是大多数程序员在类型上使用I前缀意味着它是一个接口。这是一种非常常见的模式,也是.Net设计指南的一部分。

为扩展方法案例添加I前缀会破坏假设和既定准则。

the Base Class Library中也有优先权。 IEnumerable可用的大部分扩展方法都包含在Enumerable类型中。

答案 1 :(得分:15)

我个人会使用IThingExtensions

从可用性的角度来看,最终用户永远不会看到这个类 - 他们只包含它的命名空间。如果命名空间与IThing相同,则无关紧要 - 他们已经拥有它。

话虽如此,我认为这些是任何IThing的扩展,这使得IThingExtensions最清晰。如果您有一个Thing类,调用此ThingExtensions可能看起来不明确(您是在扩展接口还是实现本身?)。

话虽如此,该框架使用了一种非常不同的方法。框架的方法是使用名为Thing的类来扩展IThing。有关示例,请参阅Enumerable(扩展IEnumerable)和Queryable(扩展IQueryable)。这也是一个非常好的选择。

答案 2 :(得分:3)

我认识的大多数程序员都将应用程序的所有扩展方法放在一个名为ExtensionMethods的静态类(或类似的东西)中,,无论扩展名修改了哪个类,然后他们将这个类放入主程序命名空间

他们的基本原理是,如果你将扩展方法放在与它修改的类相同的命名空间中,你可以将该方法与作为实际类的一部分的方法混淆,这表明扩展方法是原始功能,当它不是。

当然,他们对此并不是普遍的协议。见这里:How do you manage the namespaces of your extension methods?

答案 3 :(得分:3)

我采用了稍微不同的方法,而不是后缀Extension将命名策略转换为前缀包含Extend扩展方法的类;我的理由如下:

  • 正如Reed Copsey's answer中指出的那样,非常(非常)很少客户端代码直接引用包含类,因为扩展方法的最重要的方法是模拟引用方法。他们不会看到这些课程,因此您的课程命名惯例选择应该产生微不足道的影响。
  • 这些类必须是static,因此您永远不会实例化它们。因此,就命名而言,你永远不会得到new ExtendThing()的语义怪异。
  • 您的所有Extend*类都通过alpha文件排序进行可视化分组。
  • 就具体问题而言,没有任何界面命名前缀混淆;您可以ExtendThing ExtendIThing和(IMO)明确他们的意图和目标。
namespace MyCompany.Extensions
{
    public static class ExtendObject { }

    public static class ExtendDateTime { }

    public static class ExtendIEnumerable { }
}

答案 4 :(得分:0)

我更希望将其放在名为Extensions的文件夹(和命名空间)中,并将其命名为IThingExtensions

答案 5 :(得分:0)

我不知道有任何标准惯例。我会使用ThingExtensions或ThingInterfaceExtensions。我建议您远离IThingExtensions。