泛型类型代码中是否存在类型参数的命名约定(bracy flavoured)

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)

在这种情况下使用其他任何东西都可能会让任何阅读代码的人感到困惑.在看到T1T2,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.

  • +1:这种情况对于统一使用的参数是常见的,另外一个可以命名具有更多含义的类型,如对于`Func <T1,T2,T3,TResult>` - 结果的特殊情况,因为几乎不可能猜测是否第一个或最后一个类型表示结果. (4认同)
  • `Dictionary <TKey,TValue> Class`将是另一个使用[here]的描述性名称的好例子(http://msdn.microsoft.com/en-us/library/xfhwa508%28v=vs.110%29.aspx ).我认为这种方法比T1,T2等更常见. (3认同)