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

.net 接口扩展方法的C#命名约定,.net,interface,naming-conventions,extension-methods,.net,Interface,Naming Conventions,Extension Methods,我通常将我的C#接口命名为IThing。我正在为IThing创建一个扩展方法类,但我不知道该如何命名。一方面,将其称为ThingExtensions似乎意味着它是某个事物类的扩展类,而不是IThing接口的扩展类。当按字母顺序查看文件时,它还使扩展类与它扩展的接口分开排序。另一方面,将其命名为i ingextensions使其看起来像是接口本身,而不是接口的扩展类。你有什么建议 Edit:没有一个东西类实现了IThing,以响应一些评论。我更喜欢将它放在文件夹(和命名空间)中调用Extensio

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


Edit:没有一个
东西
类实现了
IThing
,以响应一些评论。

我更喜欢将它放在文件夹(和命名空间)中调用
Extensions
并将其命名为
I ingextensions
I ingextensions
相比,我更喜欢
ThingExtensions
这个名称。原因是对大多数程序员来说,类型上的
I
前缀意味着它是一个接口。这是一种非常常见的模式,也是.Net设计指南的一部分

为扩展方法案例添加一个
I
前缀打破了假设和既定准则


在这方面也有优先权。可用于的大多数扩展方法都包含在类型中

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

他们的基本原理是,如果将扩展方法与其修改的类放在同一名称空间中,则可能会将该方法与实际类中的方法混淆,这表明扩展方法不是原始功能的一部分,而是原始功能的一部分


当然,他们在这一点上并没有达成普遍共识。请参见此处:

我个人会使用
I扩展名

从可用性的角度来看,最终用户从未见过这个类——他们只包含它的名称空间。如果名称空间与IThing相同,那么这无关紧要——他们已经拥有了它

话虽如此,我认为这些都是任何
IThing
的扩展,这使得
IThingExtensions
最为清晰。如果您有一个
Thing
类,那么调用此
ThingExtensions
可能会显得模棱两可(您是在扩展接口还是扩展实现本身?)


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

我不知道这方面有任何标准惯例。我会使用ThingExtensions或ThingInterfaceExtensions。我不会像你建议的那样使用扩展。

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

  • 正如中所指出的,客户机代码很少直接引用包含类,因为扩展方法的关键是模拟引用方法。他们不会看到类,因此您的类命名约定选择应该没有什么影响
  • 这些类必须是静态的,因此您永远不会实例化它们。因此,就命名而言,您永远不会遇到
    newextendthing()
    的语义奇怪
  • 所有的
    Extend*
    类都通过alpha文件排序进行可视化分组
  • 特别是关于你的问题,没有任何接口命名前缀混淆;您可以使用
    ExtendThing
    extenditing
    和(IMO)它们的意图和目标是明确的


我想象有一个名为
Thing
的类,它实现了
IThing
,因此如果它被称为
ThingExtensions
,但却在
IThing
上工作,那就很混乱了。但是,@Sarah Vessers没有指定这个…@klausbyskov:实际上没有一个
东西
类来实现
信息
。我将更新我的问题。我认为“扩展”后缀可以消除这种歧义?我在项目中遵循框架的方法。还没有导致任何令人讨厌的副作用。@编程:如果您没有名为
Thing
IThing
的默认实现,它的效果非常好。……我仍然不喜欢这种方法,因为它违反了类型命名的设计准则。特别是,如果类型名称实际上是一个接口,则仅在其前面加上I@JaredPar:是的,但不幸的是,设计指南并没有关于命名扩展方法类的任何指导——它们实际上只是讨论何时使用它们(即:)使用Thing是我的首选,除非您正在创建一个Thing类——在这种情况下,ThingExtensions会变得混乱。。。幸运的是,用户从不使用类名,因此扩展方法类名(实际上)是一个实现细节,而不是API的一部分。用户只直接“使用”和“知道”名称空间名称。应该迁移到,因为它不处理编码问题,而是与开发实践(如何命名扩展方法)有关。来这里是为了寻找一个明确的成功答案,实际上,没有发现一个答案并不奇怪。。。我被迫对你的两个问题都投了赞成票
namespace MyCompany.Extensions
{
    public static class ExtendObject { }

    public static class ExtendDateTime { }

    public static class ExtendIEnumerable { }
}