泛型类型代码的类型参数是否有命名约定?
我现在正在做一些TypeScript,但它具有与C#,Java,AS3等相同类型的参数化。
我看到最常用的T
,als in:
interface Container<T> {
getContent(): List<T>;
}
但如果您需要超过1种类型怎么办?我看到单个字母,通常是T,U和V.有时K,V用于映射的键和值。
当然必须有最好的做法吗?
答案 0 :(得分:10)
广泛采用的标准是T1
,T2
,T3
等,如果有超过1个未经调整的泛型类型参数(即,这些参数的预期目的在类本身内部是未知的,因此您无法真正为它们提供更具描述性的名称。)
请参阅Tuple
课程,作为一个很好的例子here。
Tuple
具有以下形式:
Tuple<T1>
Tuple<T1, T2>
Tuple<T1, T2, T3>
Tuple<T1, T2, T3, T4>
Tuple<T1, T2, T3, T4, T5>
Tuple<T1, T2, T3, T4, T5, T6>
Tuple<T1, T2, T3, T4, T5, T6, T7>
在这种情况下使用其他任何内容都可能会让任何阅读代码的人感到困惑。看到T1
,T2
,T3
后,每个人都会知道它们是通用类型参数。
但是,对于具有预定义目的的通用参数,特定名称更合适。正如@AlexeiLevenkov指出的那样,对于返回值,使用TResult
将其与任何其他类型参数区分开来也很常见。 Func
提供了一个很好的示例,如文档here中所述,示例如下:
public delegate TResult Func<in T, out TResult>(
T arg
)
沿着类似的方向,Dictionary
使用<TKey, TValue>
作为其类型参数。那是因为需要立即明确哪个是哪个。类代码不知道 TKey
或TValue
是什么,但 知道它们代表键和值,所以它将该信息放在参数名称中的意义。
微软有一些(旧的!)命名指南here,其中包含另一个有趣的案例。他们建议将约束放在参数本身名称中的类型参数上,如下所示:
public interface ISessionChannel<TSession> where TSession : ISession
{
TSession Session { get; }
}
在这种情况下,由于泛型参数被约束为ISession
,因此通过命名参数TSession
进行通信是有意义的。