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

时间:2009-04-21 03:15:25

标签: c# .net generics naming-conventions

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

例如:

public class Stack<T>
{


}

public class EntityCollection<TEntity>
{


}

您如何决定使用哪个名称?

由于

7 个答案:

答案 0 :(得分:28)

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

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

grep -nohrP "class \w+<T\w*>" | sed -e 's/.*\<//' -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

答案 1 :(得分:27)

这是我的一套规则

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

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

答案 2 :(得分:7)

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

public class MyDictionary<T1, T2>
{ }

可能没有

那么有用
public class MyDictionary<KeyType, ValueType>

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

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

答案 3 :(得分:2)

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

  1. 有多少个类型的参数?
  2. 它们上是否有约束
  3. 他们是否使用来处理特定的事情?
  4. 一般来说,我总是在我的类型参数前加上T,并使它们“足够描述”,这意味着他们需要了解他们所做的事情,和/或需要什么。他们,当我在六个月内查看代码时。

    在我看来,

    几个例子,类型参数的良好命名(在此列表中编号,与上面的编号无关):

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

      List<T>
      

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

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

      IDictionary<TKey, TValue>
      

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

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

      Repository<TEntity> where TEntity : class, IEntity
      

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

答案 4 :(得分:1)

Microsoft的示例:

public interface IDictionary<TKey, TValue>

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

答案 5 :(得分:0)

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

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

  • T用于单一类型参数
  • K表示第二个类型参数,U表示第三个参数,例如SomeGeneric<T, K, U>
  • T以及第二个和第三个类型参数的数字,例如SomeGeneric<T1, T2, T3>

我认为仿制药已经足够新,尚未建立共同的行业惯例。

答案 6 :(得分:0)

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

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

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

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

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