【问题标题】:Is there a naming convention for the type parameter in generic typed code (bracy flavoured)泛型类型代码中的类型参数是否有命名约定(bracy 风味)
【发布时间】:2014-04-01 04:01:33
【问题描述】:

泛型类型代码上的类型参数有命名约定吗?

我现在正在做一些 TypeScript,但它的类型参数化风格与 C#、Java、AS3 等相同。

我看到最常用的T,也出现在:

interface Container<T> {
    getContent(): List<T>;
}

但是如果您需要超过 1 种类型怎么办?我看到单个字母,通常是 T、U 和 V。有时 K、V 用于映射的键和值。

肯定有这方面的最佳实践吗?

【问题讨论】:

    标签: c# generics typescript


    【解决方案1】:

    如果有超过 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>
    

    在这种情况下使用其他任何东西可能会让任何阅读您的代码的人感到困惑。看到T1T2T3,大家就知道它们是泛型类型参数。

    但是,对于具有预定义目的的泛型参数,具体名称更合适。正如@AlexeiLevenkov 所指出的,对于返回值,使用TResult 将其与任何其他类型参数区分开来也很常见。 Func 提供了一个很好的示例,如文档here 中所述,示例如下:

    public delegate TResult Func<in T, out TResult>(
        T arg
    )
    

    与此类似,Dictionary 使用&lt;TKey, TValue&gt; 作为其类型参数。那是因为需要立即清楚哪个是哪个。类代码不知道 什么 TKeyTValue 是,但它确实知道它们代表键和值,因此将这些信息放入参数名称。

    Microsoft 有一些(旧的!)命名准则here,其中涵盖了另一个有趣的案例。他们建议在参数本身的名称中指明放置在类型参数上的约束,如下所示:

    public interface ISessionChannel<TSession> where TSession : ISession
    {
        TSession Session { get; }
    }
    

    在这种情况下,由于泛型参数被限制为ISession,因此通过命名参数TSession 来传达这一点是有意义的。

    【讨论】:

    • +1:这种类型对于统一使用的参数很常见,此外,可以命名具有更多含义的类型,如 Func&lt;T1,T2,T3, TResult&gt; 的 don - 结果的特殊情况,因为如果首先猜测几乎不可能或最后一个类型表示结果。
    • Dictionary&lt;TKey, TValue&gt; Class 将是另一个使用来自here 的描述性名称的好例子。这种方法我认为比 T1、T2 等更常见。
    • 这是我第一次看到带编号的类型参数。但它不那么令人困惑是有道理的(部分原因是我问我猜的原因)。像 TKey、TValue、TResult 这样的专业化看起来也很好。让我们看看在我接受之前是否会出现更多信息:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-21
    • 2021-05-25
    • 2017-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多