3.13C#语言的泛型(Generic)

1.泛型类

类型参数跟在类名后面。

class 类名<类型参数>
{
    //类体
}

2.泛型接口

类型参数跟在接口名后面。

interface I接口名<类型参数> 
{
    //接口体
}

3.泛型方法

类型参数跟在方法名后面。

返回类型 方法名<类型参数>(类型 形参) 
{
    //方法体
}

方法调用时,可以根据实参推断出类型参数的类型,无需显式指定。

方法名<类型参数>(实参)
方法名(实参)

4.构造(Constructed)类型

封闭式构造(closed constructed)类型:指定类型参数,例如,Node<int>

开放式构造(open constructed)类型:未指定类型参数,例如,Node<T>

泛型类可继承自封闭式构造或开放式构造基类。

非泛型类(即,具体类)可继承自封闭式构造基类,但不可继承自开放式构造类,因为运行时客户端代码无法提供实例化基类所需的类型参数。

5.类型参数的约束

通过使用 where 上下文关键字指定约束。

约束描述
where T : struct类型参数必须是 非Nullable 的值类型。struct 约束不能与 new() 约束结合使用,也不能与 unmanaged 约束结合使用。
where T : class类型参数必须是 非Nullable 的引用类型。此约束还应用于任何类、接口、委托或数组类型。
where T : class?类型参数必须是 Nullable 或 非Nullable 的引用类型。此约束还应用于任何类、接口、委托或数组类型。
where T : notnull类型参数必须是 非Nullable 的类型。
where T : default重写方法或提供显式接口实现时,如果需要指定不受约束的类型参数,此约束可解决歧义。 default 约束表示基方法,但不包含 class 或 struct 约束。
where T : unmanaged类型参数必须是 非Nullable 的非托管类型。unmanaged 约束表示 struct 约束,且不能与 struct 约束或 new() 约束结合使用。
where T : new()类型参数必须具有public无参数构造函数。 与其它约束一起使用时,new() 约束必须最后指定。 new() 约束不能与 struct 和 unmanaged 约束结合使用。
where T : 基类名类型参数必须是指定的基类或派生自指定的基类。T 必须是从指定基类派生的 非Nullable 的引用类型。
where T : 基类名?类型参数必须是指定的基类或派生自指定的基类。T 可以是从指定基类派生的 Nullable 或 非Nullable 的类型。
where T : 接口名类型参数必须是指定的接口或实现指定的接口。可指定多个接口约束。约束接口也可以是泛型。T 必须是实现指定接口的 非Nullable 的类型。
where T : 接口名?类型参数必须是指定的接口或实现指定的接口。可指定多个接口约束。约束接口也可以是泛型。T 可以是 Nullable 的引用类型、非Nullable 的引用类型、值类型。 T 不能是Nullable 的值类型。
where T : U为 T 提供的类型参数必须是为 U 提供的参数或派生自为 U 提供的参数。如果 U 是 非Nullable 的引用类型,T 必须是 非Nullable 的引用类型。如果 U 是 Nullable 的引用类型,则 T 可以是 Nullable 的引用类型,也可以是 非Nullable 的引用类型。

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/csharp/csharplang/13549.html

(0)
上一篇 2021年3月12日 00:51
下一篇 2021年3月14日 21:18

相关推荐

  • 5.3C#异步编程完整示例

    以下将用”如何烹饪早餐”示例来解释异步: 1.同步阻塞 同步准备的早餐大约花费了 30 分钟,因为总耗时是每个任务耗时的总和。 一个厨师在烹饪第一份早餐的时候,不会同时准备第二份早餐。 此段代码不仅会阻塞方法的调用方,还会阻塞方法内的后续代码执行。 2.异步无阻塞 FryEggsAsync、Fr…

    C#语言教程 2021年5月3日
    06530
  • 3.10C#引用类型之委托(Delegate)

    委托类型派生自 System.Delegate 类。 1.委托声明 委托 表示对具有 特定参数列表 和 返回类型 的方法的引用。 委托 可认为是函数式语言里的“函数类型”,通过委托,可以将方法视为可赋值给变量或作为参数传递的实体。 委托还类似于其它一些语言中存在的“函数指针”概念。 具有相同参数列表和返回类型…

    C#语言教程 2021年3月10日
    05520
  • 2.5C#函数成员之属性(Property)

    1.属性声明 属性的声明方式与字段相似,区别是属性声明以在分隔符 { 和 } 之间写入的 get 访问器或 set 访问器结束,而不是以分号结束。 属性需与字段配套使用,字段是数据成员(定义存储位置),而属性是为了操作private字段而生的函数成员(不定义存储位置)。 自动实现…

    C#语言教程 2021年2月5日
    04940

发表回复

登录后才能评论