c# - 通用类型代码中的类型参数是否有命名约定(bracy flavoured)

标签 c# generics typescript

通用类型代码的类型参数是否有命名约定?

我现在正在做一些 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>作为它的类型参数。那是因为它需要立即明确哪个是哪个。类代码不知道什么 TKeyTValue是,但它确实知道它们代表键和值,因此将这些信息放在参数名称中是有意义的。

Microsoft 有一些(旧的!)命名指南 here ,他们在其中介绍了另一个有趣的案例。他们建议在参数本身的名称中指示对类型参数的约束,如下所示:

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

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

关于c# - 通用类型代码中的类型参数是否有命名约定(bracy flavoured),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22776556/

相关文章:

c# - SQL Server全文搜索词库

c# - 在 LINQ 查询中创建新对象

带有泛型重载的 Java 删除(不是覆盖)

java - 如何将类型传递给 java 中的泛型类?

javascript - ngIf 无法在 Angular 组件内的 JavaScript 方法中工作

c# - 创建 WPF 属性网格?

使用按钮回发而不是使用 POST 的 C# Webform 文件上传

templates - Kotlin看似递归的编译模板类型

typescript - 类型 'values' 上不存在属性 'ObjectConstructor'

Javascript,异步问题所需的解决方案