什么是类型参数命名准则?

我注意到,除了在Essential C#3.0书中看到,参数通常被定义为TTEntity

例如:

public class Stack { } 

要么

 public class EntityCollection { } 

你如何决定使用哪个名字?

谢谢

这是我的一套规则

  • 如果有一个参数,我将其命名为T.
  • 如果有多个参数,我选择一个有意义的名称和T前缀。例如TKey,TValue

对于半官方意见,值得研究有关该主题的框架设计指南:

我从http://referencesource.microsoft.com/dotnet46.zip获取了.NET Framework 4.6源代码。 提取它并处理数据以从所有generics类声明中提取通用参数名称。

注意:我只从通用类中提取通用参数名,只有一个通用参数。 因此,这不考虑具有多个通用参数的generics类。

 grep -nohrP "class \w+" | sed -e 's/.*\//' | sort | uniq -cd | sort -bgr 

结果:

 361 T 74 TChannel 51 TKey 33 TResult 30 TSource 28 T_Identifier 18 TElement 12 TEntity 11 TInputOutput 7 TItem 6 TLeftKey 6 TFilterData 5 T_Query 4 T_Tile 4 TInput 3 TValue 3 TRow 3 TOutput 3 TEventArgs 3 TDataReader 3 T1 2 TWrapper 2 TVertex 2 TValidationResult 2 TSyndicationItem 2 TSyndicationFeed 2 TServiceType 2 TServiceModelExtensionElement 2 TResultType 2 TMessage 2 TLocationValue 2 TInnerChannel 2 TextElementType 2 TException 2 TEnum 2 TDuplexChannel 2 TDelegate 2 TData 2 TContract 2 TConfigurationElement 2 TBinder 2 TAttribute 

最后,它并不重要。 使用有意义的命名约定。

 public class MyDictionary { } 

可能没有那么有用

 public class MyDictionary 

(或TKey,TValue,如果你愿意的话)。

如果我正在考虑你的实施并且必须考虑“好的,那又是什么’T3’的东西呢?” 然后你没有做好。

我认为你应该考虑以下几点:

  1. 有多少类型参数?
  2. 他们有任何限制吗?
  3. 它们用于特定的东西吗?

一般来说,我总是在我的类型参数前加上T ,并使它们具有“足够的描述性”,这意味着当我看到它时,我需要了解它们需要了解它们的作用和/或它们需要什么。六个月的代码。

在我看来, 有几个例子可以很好地命名类型参数(在这个列表中编号,与上面的编号无关……):

  1. 一个参数,从类名(或代码中的上下文中)显而易见,为什么需要类型名称:

     List 

    由于我们可以看到这是T类型的对象列表,并且对T没有特定的约束,因此不需要为type参数提供更具体的名称。

  2. 几个参数,代表generics类/接口中的不同内容:

     IDictionary 

    我们需要能够区分这两个参数,因此我们不提供值的键类型,反之亦然。 因此,命名参数KeyValue ,并用T加前缀,似乎是合适的。
    我必须强调,这是比IDictionaryIDictionary更好的做法,因为在后两种情况下,没有办法直观地知道哪个参数将被用于什么。

  3. 一种类型的参数,但类型必须满足一些要求或其他:

     Repository where TEntity : class, IEntity 

    由于我们要求类型实现另一个接口,因此有必要向程序员提出一些正确的说法。 选择一些信息性名称,以帮助您查看类型所需的内容,并在其前面加上T

来自Microsoft的示例:

 public interface IDictionary 

type参数代表了某些东西 ,所以如果你想拥有可读的代码,这个“东西”应该从代码中显而易见(没有额外的注释)。 使用类型名称,如T,V,U不一定是显而易见的(但有时它可以)。

我真的不知道任何关于generics的固定约定。

我见过的样本虽然使用了ff变体之一:

  • T表示单一类型参数
  • K表示第二个类型参数, U表示第三个参数,例如, SomeGeneric
  • T和第二和第三类型参数的数字,例如SomeGeneric

我认为仿制药已经足够新,以至于还没有建立共同的行业惯例。

到目前为止,我已经查看了所有答案,我认为它们都是部分正确的,但是没有充分考虑所有情况。

我的观点是,命名应始终添加上下文值。 因此,命名一个类型参数TEntity因为它的类型是IEntity是错误的,特别是当约束显示其类型时,这在IntelliSense中显示。 这就像命名一个字符串变量_string 。 在现代编程中,我们没有。 变量名称应反映其function角色。 类型参数应该没有什么不同。

在一个类型参数的情况下,上下文通常应该在类中显而易见,因此T很好。 对于多个类型参数,请为每个参数添加描述性上下文,例如TKeyTValue 。 这是不应该使用类型的另一个原因 – 如果两个类型参数是同一类型会怎么样? TEntity1TEntity2

如果存在具有添加所需上下文的类型名称的约束,则可以使用TU等或T1T2等,因为约束本身显示上下文,更不用说IntelliSense。

所以,我的回答类似于JaredPar和Tomas Lycken的答案,但是附加了限定条件,并且特别排除了Tomas Lycken的第三条规则,其中T应该用于具有约束的单一类型参数(因为类上下文和IntelliSense)。