Bar*_*vds 8 c# generics typescript
泛型类型代码的类型参数是否有命名约定?
我现在正在做一些TypeScript,但它具有与C#,Java,AS3等相同类型的参数化.
我看到最常用的T
,als in:
interface Container<T> {
getContent(): List<T>;
}
Run Code Online (Sandbox Code Playgroud)
但是如果你需要超过1种类型怎么办?我看到单个字母,通常是T,U和V.有时K,V用于映射的键和值.
当然必须有一个最好的做法吗?
Bal*_*ick 11
一个被广泛采用的标准是T1
,T2
,T3
,等,如果有超过1个unpurposed泛型类型参数(即,其中参数的预期目的不是从阶级本身已知的,所以你不能真正给他们一个更描述性名称).
见Tuple
类,作为一个很好的例子在这里.
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>
Run Code Online (Sandbox Code Playgroud)
在这种情况下使用其他任何东西都可能会让任何阅读代码的人感到困惑.在看到T1
时T2
,T3
每个人都会知道它们是通用类型参数.
但是,对于具有预定义目的的通用参数,特定名称更合适.正如@AlexeiLevenkov所指出的,对于返回值,使用TResult
它来区分任何其他类型的参数也很常见.Func
提供了一个很好的例子,如这里的文档所述,下面是一个例子:
public delegate TResult Func<in T, out TResult>(
T arg
)
Run Code Online (Sandbox Code Playgroud)
沿着类似的线,Dictionary
使用<TKey, TValue>
作为其类型参数.那是因为需要立即明确哪个是哪个.类代码不知道是什么 TKey
或者TValue
是什么,但它确实知道它们代表键和值,因此将这些信息放在参数名称中是有意义的.
微软在这里有一些(旧的!)命名指南,它们涵盖了另一个有趣的案例.他们建议在参数本身的名称中指出对类型参数的约束,如下所示:
public interface ISessionChannel<TSession> where TSession : ISession
{
TSession Session { get; }
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,因为泛型参数被约束为a ISession
,所以通过命名参数来进行通信是有意义的TSession
.