我注意到,除了在Essential C# 3.0一书中看到,参数通常被定义为 T 或 TEntity
例如:
public class Stack<T>
{
}
或
public class EntityCollection<TEntity>
{
}
您如何决定使用哪个名称?
由于
答案 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)
这是我的一套规则
对于半官方意见,值得研究有关该主题的框架设计指南:
答案 2 :(得分:7)
最后,它并不重要。使用有意义的命名约定。
public class MyDictionary<T1, T2>
{ }
可能没有
那么有用public class MyDictionary<KeyType, ValueType>
(或TKey,TValue,如果您愿意的话)。
如果我正在考虑你的实施并且必须考虑“好的,这个'T3'又是什么东西?”然后你没有做好。
答案 3 :(得分:2)
我认为你应该考虑以下几点:
一般来说,我总是在我的类型参数前加上T
,并使它们“足够描述”,这意味着他们需要了解他们所做的事情,和/或需要什么。他们,当我在六个月内查看代码时。
几个例子,类型参数的良好命名(在此列表中编号,与上面的编号无关):
一个参数,从类名(或代码中的上下文中)显而易见,为什么需要类型名称:
List<T>
由于我们可以看到这是T
类型的对象列表,并且T
没有特定的约束,因此不需要为type参数指定更具体的名称。
几个参数,代表泛型类/接口中的不同内容:
IDictionary<TKey, TValue>
我们需要能够区分这两个参数,因此我们不提供值的键类型,反之亦然。因此,命名参数Key
和Value
以及T
前缀似乎是合适的。
我必须强调,这是一个比例如IDictionary<T1, T2>
或IDictionary<T, U>
更好的做法,因为在后两种情况下,没有办法直观地知道哪个参数将被用于什么。
一种类型参数,但类型必须满足某些要求或其他:
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
很好。对于多个类型参数,请为每个参数添加描述性上下文,例如TKey
和TValue
。这是不应该使用类型的另一个原因 - 如果两个类型参数是同一类型会怎么样? TEntity1
和TEntity2
?
如果存在添加所需上下文的类型名称约束,则可以使用T
,U
等或T1
,T2
等因为约束本身显示了上下文,更不用说智能感知了。
所以,我的答案类似于JaredPar和Tomas Lycken的答案,但附加了限定条件,并特别排除了Tomas Lycken的第三条规则,而{(1}}应该用于具有约束的单一类型参数(因为类上下文和IntelliSense)。