问题 我应该用通用类定义命名我的文件?


我正在编写几个都有泛型类型参数的类,但是我需要重载类,因为在不同的场景中我需要不同数量的参数。基本上,我有

 public class MyGenericClass<T> { ... }
 public class MyGenericClass<T, K> { ... }
 public class MyGenericClass<T, K, L> { ... }
 // it could go on forever, but it won't...

我希望它们都在同一个命名空间中,但每个类在一个源文件中。我该怎么命名文件?有最好的做法吗?


4824
2018-04-09 23:44


起源

我认为甚至不可能创建具有相同名称但具有不同数量的泛型参数的不同类。编辑:oops,这是C#,而不是Java。我怀疑你能用Java做到这一点,因为它必须处理泛型类的有趣方式。 - Mike Daniels
微软不是这样做的 Tuple 4.0中的课程? - Chris Marisic
例如,参见Tuple <T1> - 表示大小为1元组的元组<T1,T2> - 表示大小为2元组的元组<T,T1,T2,T3> - 表示大小为3的元组 - JasonTrue
可能是公共类A {}公共类A <T> {}公共类A <T,T2> {} - Chris S
除非Microsoft能够做一些特殊的事情,否则Tuple类只有不同的泛型参数具有相同的名称。 - Chris Marisic


答案:


我见过人们用

MyGenericClass`1, MyGenericClass`2 or MyGenericClass`3

(数字是通用参数的数量)。

我认为当你在类上调用.ToString时,你得到的是TypeName。


9
2018-04-09 23:46



XML文档也使用它和IOC定义 - Chris S
该 .ToString() 到目前为止,这个论点是迄今为止我在讨论中看到的最好的。除非在第二天左右出现一些问题,否则这可能就是我要做的。 - Tomas Lycken
同意。这也是代码覆盖率结果中出现的内容。 - Peter T. LaComb Jr.
现在将此标记为我的“正确”答案,因为没有更多令人信服的论据出现。我认为该文件的命名方式与此相同 .ToString() 工作确实使这成为最好的方法。 (事实是这样的 .ToString() 使用可能无处不在的字符是一个不同的讨论......) - Tomas Lycken
@Tomas我一开始也对这个反叛有所怀疑,但与标准撇号不同,它应该是一个有效的角色,几乎无处不在。 - Michael Stum♦


出现这种情况时,我采用了与C#泛型的XML文档注释中使用的相同约定 { 和 } 代替 < 和 > 因为尖括号在XML或文件名中都不友好,但是卷曲的是。所以类似于:

MyClass的横置的.cs

MyClass的{T,K}的.cs

如果你真的有很多参数,那么作为命名方案可能会有点笨拙,所以我倾向于采用反引号的CLR约定,然后是参数计数,例如:

MyClass`1.cs

MyClass`2.cs

或者根据情况混合搭配两种方案。


2
2018-04-10 00:29





我认为你不会在C#社区找到很多教条,他们偏爱具有相同名称的泛型类的每个变体的单独文件;我更喜欢在你描述的情况下使用一个,但是如果代码对于每个变体都必须复杂/冗长,我可以看到你提出的建议。一般来说,我只是使用相关类的名称作为文件名。

如果我要将变体分成单独的文件,我可以看到使用Michael的解决方案,尽管对于我们这些在命令行中使用Unix风格工具的人来说会有点痛苦,例如,Cygwin或AndLinux。我可能会使用下划线或没有标点符号。或者像1P,2P,3P这样的后缀。


1
2018-04-09 23:54





我将它们全部放在同一个文件中,除非它们很大(通常它们不会,除了Ts最多的那个)。

除了你在.NET框架指南中找到的内容之外,命名类并没有真正的最佳实践,因为它是编程创意方面的一部分,不幸的是SSCLI只回到2.0,所以你在那里找不到多少帮助。


1
2018-04-09 23:54





我经常使用 Classname.1.csClassname.2.cs等等...其中数字是泛型参数的数量,类似于`1notation used in the framework documentation (and in XML documentation in your sourcecode). Sometimes you also have a class with no generic arguments (similar toICollection的andICOLlection`在框架中),文件名将只是类名,正如预期的那样。 与使用反引号相比,这样做的好处是文件名中不会包含任何无效字符。并非所有文件系统,版本控制系统,操作系统都允许在名称中使用反引号字符。


1
2018-04-10 00:17