通用类文件名约定

时间:2009-04-29 20:07:23

标签: c# generics

我希望能够区分类的通用和常规(非泛型)版本。就像.NET框架使用它的几个接口和集合类的通用和非泛型版本一样。 (QueueQueue(T)

我通常喜欢遵循每个文件一个类的约定(如在Java中)。是否存在命名包含单个泛型类的文件的通用约定?我最感兴趣的是Windows(特别是NTFS),但它似乎是一个很好的约定(至少有点)可移植。

11 个答案:

答案 0 :(得分:40)

在查找其他人用于通用类文件名的约定后,才发现这个问题。

最近我一直在使用ClassName[T].cs。我非常喜欢这个惯例,我认为它优于其他惯例,原因如下:

  • 类型参数跳出来了 比他们做的更多 微软惯例(例如, ClassNameOfT.cs)。
  • 它允许你拥有多个 没有太多的类型参数 混淆:Dictionary[TKey, TValue].cs
  • 它不需要您创建任何特殊文件夹,也不需要在特殊命名空间中创建泛型类。如果你只有一些泛型类,那么专用于它们的特殊命名空间就不实用了。

我从Boo的通用语法中借用了这个约定,尽管稍作修改(Boo使用ClassName[of T])。

有些开发人员似乎有一个文件名的恐惧症,其中包含除了字母和下划线之外的任何内容,但是一旦你能够过去,这个约定似乎运作得非常好。

答案 1 :(得分:34)

在Microsoft,他们使用ClassNameOfT.cs

答案 2 :(得分:10)

我看到这个话题已经在一年多前被放弃了,但我仍想分享我对这个惯例的看法。

首先,拥有多个具有相同名称但只是类型参数数量不同的类并不总是向后兼容的情况。当然,你不经常看到它,但.NET的新Action和Func类只是这样设计的,我现在正在实现类似的东西。

为了清晰和可区分,我使用以下约定,该约定仅指定给定类型的泛型参数的数量:

  • MyClass.cs
  • MyClass.T1.cs
  • MyClass.T2.cs

这样,我的文件名仍然简短而简单,同时仍然清楚地传递类名和不同数量的类型参数,代价是一个简单的额外点(根据我的经验,这是一个普遍接受的事情)一个文件名,看起来比逗号和其他非alpanumeric字符好多了,但这只是我想的味道问题。设置类型参数的名称(或首字母缩略词)只会延长文件名,而在此级别我对类型参数的实际名称并不感兴趣...

答案 3 :(得分:4)

如果您运行的是Visual Studio 2008,请不要在通用文件名中使用严重重音符号。这些问题会导致断点失败:

http://connect.microsoft.com/VisualStudio/feedback/details/343042/grave-accent-in-filename-causes-failure-to-recognize-target-language-breakpoints-fail

答案 4 :(得分:1)

怎么样:

Type.cs

TypeGeneric.cs

每当我在过去完成此操作时,我总是将两种类型都放在一个文件中,并使用非泛型类型作为文件名。我认为这使事情变得非常清楚,因为.NET没有像Java那样对每个文件的类型进行约定/限制。

但是如果你必须那么我会提出类似上面的内容,并且使用后缀将使文件一起出现在任何按字母顺序排列的列表中(解决方案资源管理器,Windows资源管理器等)。

这是另一个想法:

Type`1.cs

这将允许您通过它们接受的泛型类型参数的数量来分解不同的泛型类型。它只是一个想法,但我仍然认为将所有类型放在一个文件中会更简单。

答案 5 :(得分:1)

所有新的Microsoft类都使用泛型。在仿制药问世之前,QueueArrayList就在那里。泛型是前进的方向。

每个单一类文件的约定是在类名后面命名文件名(不是通用的)。对于MyClass,你将拥有MyClas.cs。对于每个新命名空间,您需要创建一个新文件夹。这就是Visual Studio的工作原理。

答案 6 :(得分:1)

我可能会将它们放在文件夹中并使用命名空间机制。您可以与System.Collections和System.Collections.Generic进行比较。另一方面,如果类比使用泛型更常见,也许最好指出那些不是。那就是如果你真的想要将泛型类与其他类分开。就个人而言,我通常不愿意这样做,因为我并没有从中看到实际的好处。

答案 7 :(得分:1)

到目前为止,似乎没有达成共识。

在子命名空间(和子文件夹)中使用相同的文件名“Generics”(如System.Collecctions.Generics)是一个选项。但是并不总是需要创建一个新的命名空间。

例如,在具有非泛型类的现有命名空间中,这些类是为向后兼容而维护的,但标记为ObsoleteAttribute,最好将通用版本保留在同一名称空间中。

我认为后缀是一种合理的方式。我采用了一种使用类型参数作为后缀的约定(所以:MyClassT用于MyClass< T>,或MyDictionaryKV用于MyDictionary< K,V>。

答案 8 :(得分:1)

就我个人而言,我不会使用严重的重音符号:

Foo.cs
Foo`1.cs

因为我害怕严重的口音这个简单的原因。它不仅具有可怕的名称,而且我不确定它将如何由不同的文件系统,版本控制系统和URL处理。因此,我宁愿坚持使用常见的字母数字字符。

根据对GitHub的搜索,

NameOfT.cs似乎在ASP.NET Core MVC中使用。 12结果。 Reference

在CoreFX中也有限使用。 3结果。 Reference

示例:

Foo.cs
FooOfT.cs

答案 9 :(得分:0)

我可能在项目中有两个文件夹,比如Gereric,NonGeneric或类似的东西。它们仍然可以位于相同的命名空间中,然后它们都可以具有相同的文件名。只是一个想法...

答案 10 :(得分:0)

有时我也会看到ClassName{T}.cs,但通常会将其命名为ClassNameOfT.cs(就像微软使用它之前提到的那样)

EntityFrameworkCore项目(也是Microsoft的)使用ClassName`.cs