通用类文件名约定

Way*_*inn 49 c# generics

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

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

小智 41

在查找了其他人用于泛型类文件名的约定之后,才发现这个问题.

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

  • 类型参数会比使用Microsoft约定(例如,ClassNameOfT.cs)更多地跳出来 .
  • 它允许您拥有多个类型参数而不会产生太多混淆: Dictionary[TKey, TValue].cs
  • 它不需要您创建任何特殊文件夹,也不需要在特殊命名空间中创建泛型类.如果您只有几个泛型类,那么专用于它们的特殊命名空间就不实用了.

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

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

  • +1我已经使用DOS/Windows近30年了,我从来没有见过任何人在文件名中使用逗号. (42认同)
  • @IJKennedy REAL男子在他们的文件夹名称中使用分号(;)并将它们放在环境变量(PATH)中. (9认同)

Mar*_*ade 36

在微软,他们使用ClassNameOfT.cs.

  • 在ASP.NET MVC 1.0源代码中,他们使用Dictionary`2.cs约定. (10认同)
  • 我想我会想知道他们会怎样做一本字典.DictionaryOfKT? (3认同)
  • `MyClass<TKey, TValue, TConversion, TCallback>` -> `MyClassOfTKeyOfTValueOfTConversionOfTCallback.cs`? (2认同)

Wim*_*ool 12

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

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

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

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

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

  • 这是唯一一个在排序方面让我的强迫症满意的。 (2认同)

小智 5

如果您运行的是 Visual Studio 2008,请不要在通用文件名中使用重音符 `。它们有一个已知问题会导致断点失败:

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


Fre*_*red 5

我个人不会使用重音符号:

Foo.cs
Foo`1.cs
Run Code Online (Sandbox Code Playgroud)

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

NameOfT.cs根据在 GitHub 上的搜索,似乎在 ASP.NET Core 中使用。40 个结果。参考

也用于 .NET Core 运行时。36 个结果。参考

例子:

Foo.cs
FooOfT.cs
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢将`称为反引号,因此,它没有一个可怕的名字。 (3认同)

Kon*_*rad 5

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

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