构造和命名包含具有相同名称的通用类的文件的最佳方法是什么?


14

在我当前的项目中,我遇到了创建具有相同名称但数量不同的泛型参数的泛型类的要求。例如:

MyClass<T1>
MyClass<T1, T2>
MyClass<T1, T2, T3>

考虑到我希望所有这些都在同一个命名空间中,我对如何构造和命名我的类和文件感到困惑。

如果我们遵循这样的想法,即每个文件应该限制一个类,并且文件应采用表示命名空间层次结构的文件夹结构,并且文件名应与该类的名称匹配,那么我该如何处理这种情况?

什么我真的问这里是我应该怎么命名文件包含MyClass<T1>,和我应该怎么命名文件包含MyClass<T1, T2>?我没有问类型参数的名称应该是什么。


给我们一些具体的例子,以更详细地描述问题。您提供的示例也是如此... erm,通用。 “如何构造和命名我的类和文件”是什么意思?
罗伯特·哈维

Microsoft只是通过在type参数后面附加一个数字来完成此操作。请参阅元组文档:msdn.microsoft.com/en-us/library/…–
Pete

@Pete:那真的只适用于Tuple。Microsoft也使用该TKey, TValue约定。Func具有TResult类型参数。尽管我确实同意您可以使用T1T2等等来输入可变数量的输入参数,否则这些输入参数就没有像TKeyand 这样的特定用途TValue
罗伯特·哈维

@RobertHarvey好吧,是的,但是仅在诸如字典之类的实际键/值集合的上下文中。对于由可变数量的类型组成的任何内容,它们都会附加一个数字。这是另一个示例:msdn.microsoft.com/en-us/library/dd402872(v=vs.110).aspx
Pete

1
好吧,您的编辑使一些评论过时了。:)为什么不能只将类保留在同一物理文件中?如果它们是如此不同,以至于您需要将它们保存在单独的文件中,那么您能否告诉我们是什么使它们与众不同?
皮特

Answers:


14
MyGenericClass`1.cs
MyGenericClass`2.cs
MyGenericClass`3.cs

依此类推,反引号后面的数字是泛型类型参数的数目。Microsoft使用此约定。

或者,您可以使用类似

MyGenericCollectionClass[TKey, TValue].cs

它不仅保留了泛型类型参数的数量,还保留了它们的特定名称。当然,它不保留尖括号,但是我们不能拥有生活中想要的一切,可以吗?


1
编译器在内部处理通用类型的名称,添加反引号和通用参数的数量,因为.NET不允许具有相同名称的多个类型使用不同数量的通用参数,但C#允许。因此,文件命名约定与编译器的工作匹配。
CodesInChaos

1
我想证明您错了,但实际上您是正确的: github.com/dotnet/corefx/tree/master/src / ... 我不喜欢这个约定。

1
@Den,看来他们现在对该公约感到遗憾。也许暗示了一些问题?github.com/dotnet/corefx/commit/…–
山姆(Sam)

@Sam希望不是Microsoft团队之间的沟通问题。因为没有人在做。在我看来,还取决于编译器团队,而不是库团队。

我没有在文件名中使用“`”的提示。
Cristian E.

4

在的情况下,TupleAction皮特已经提到,微软本身使用一个单一的文件-见Tuple.csAction.cs

我认为这部分取决于所有类的功能是否基本相同。我个人不喜欢将类集中到一个文件中,但这可能是一个例外。在我工作的源代码中,我添加了一个自动生成的(使用T4)NamedTuple类,该类的行为与相同Tuple,但是将字符串名称作为构造函数的第一个参数。

要回答您的问题,如果不想使用单个文件,则可以将MyClass_1.cs用于MyClass<T1>,将MyClass_2.cs用于MyClass<T1, T2>等。

不过,这两个选项都不是理想的选择,因此我倾向于建议“ Microsoft这样做,所以...”的论点。


2
Tuple并且Action都是代表; 它们没有任何实现代码,因此将所有版本都放在单独的文件中将毫无意义。只是证明每条规则都有例外。
罗伯特·哈维

是的,一般来说,将多个公共代表放在同一个文件中被认为是可以的(只要它们是相关的)。
斯蒂芬

1
@RobertHarvey Tuple不是委托,但是每个实现都很简短。
Arturo TorresSánchez2015年

@ArturoTorresSánchez:对,我在想Func
罗伯特·哈维

0

您是否问过自己,这些课程是否真的有相同的意图?如果一个类比另一个类更通用,则它将是GenericClassMoreGenericClassMostGenericClass。想象一下,一个类的每个类型参数都会为该类添加一个新维度,因此可能有助于询问它是什么维度。

让我们举个例子:

  • Container<Thing>
  • MetricContainer<Thing, Metric>
  • MetricTransportableContainer<Thing, Metric, Transport>

我知道,这不是最好的示例,但是非常具有表现力,可以显示三个维度:

  • 内部尺寸,它可以加载什么
  • 公制尺寸,只能通过事物计数或通过平方度量,立方容量或重量来加载度量
  • 外部尺寸,可以在其中加载。

因此,您可以为汽车运输建模:

Container<Cars>
MetricContainer<Cars, CountMetric>
MetricTransportableContainer<Cars, CountMetric, Ship>

液体运输:

Container<Fluid>
MetricContainer<Fluid, Volume>
MetricTransportableContainer<Fluid, Volume, Shelf>

能源运输:

Container<Energy>
MetricContainer<Energy, ElectricPower>
MetricTransportableContainer<Energy, ElectricPower, Box>

糖,谷物的运输:

Container<CrumblyMaterial>
MetricContainer<CrumblyMaterial, Weight>
MetricTransportableContainer<CrumblyMaterial, Weight, Silo>

哦,真令人惊讶:a List<T>具有一个维,它表示列表可以容纳的内容;这是一个Map<T, S>具有两个维度的,分别代表地图可以容纳的内容和访问键。


1
我认为您不理解这个问题。看问题的最后一段。
罗伯特·哈维

1
@RobertHarvey请仔细阅读问题:类名应等同于文件名。它是可互换的。问题在于对类的错误分析和一般类的错误命名。总结一下我的答案:“命名它是什么,而不是它的外观。”
shylynx


1
@RobertHarvey阅读我的回答:将一堂课变成一个文件!
shylynx

1
我认为您错过了重点。这个问题问:我如何将Tuple<T1>Tuple<T1, T2>Tuple<T1, T2, T3>成为独立的CS文件以标准的方式,没有名字的冲突?
罗伯特·哈维
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.