- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
通用类型代码的类型参数是否有命名约定?
我现在正在做一些 TypeScript,但它具有与 C#、Java、AS3 等相同的类型参数化风格。
我看到最常用的 T
,还有:
interface Container<T> {
getContent(): List<T>;
}
但是如果您需要不止一种类型怎么办?我看到单个字母,通常是 T、U 和 V。有时 K、V 用于映射的键和值。
当然必须有最佳实践吗?
最佳答案
广泛采用的标准是 T1
, T2
, T3
等等,如果有超过 1 个 unpurpose 泛型类型参数(也就是说,从类本身内部不知道参数的预期目的,所以你不能真正给它们更多描述性名称)。
参见 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
是,但它确实知道它们代表键和值,因此将这些信息放在参数名称中是有意义的。
Microsoft 有一些(旧的!)命名指南 here ,他们在其中介绍了另一个有趣的案例。他们建议在参数本身的名称中指示对类型参数的约束,如下所示:
public interface ISessionChannel<TSession> where TSession : ISession
{
TSession Session { get; }
}
在这种情况下,因为泛型参数被限制为 ISession
, 通过命名参数 TSession
来传达这一点是有意义的.
关于c# - 通用类型代码中的类型参数是否有命名约定(bracy flavoured),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22776556/
通用类型代码的类型参数是否有命名约定? 我现在正在做一些 TypeScript,但它具有与 C#、Java、AS3 等相同的类型参数化风格。 我看到最常用的 T,还有: interface Conta
我是一名优秀的程序员,十分优秀!