CSharp Basic Tutorial Chapter-3-11 泛型为什么存在 类型参数 默认值


泛型简介

泛型的作用

  • 跨类型可复用的代码:继承 和 泛型。
  • 继承 –> 基类
  • 泛型 –> 带有“(类型)占位符” 的“模板”

泛型类型(Generic Types)

  • 泛型会声明类型参数 – 泛型的消费者需要提供类型参数(argument)来把占位符类型填充上。

genericTypes1
genericTypes2
genericTypes3

Open Type & Closed Type

  • Stack Open Type(开放类型)
  • Stack Closed Type(封闭类型)
  • 在运行时,所有的泛型类型实例都是封闭的(占位符类型已被填充了)

OpenClose

为什么泛型会出现?
whygeneric

  • 需要装箱和向下转换,这种转换在编译时无法进行检查

whygeneric2

泛型方法

  • 泛型方法在方法的签名内也可以声明类型参数

genericMethod1
genericMethod2
genericMethod3

  • 在泛型类型里面的方法,除非也引入了类型参数(type parameters),否则是不会归为泛型方法的。
  • 只有类型和方法可以引入类型参数,属性、索引器、事件、字段、构造函数、操作符等都不可以声明类型参数。但是他们可以使用他们所在的泛型类型的类型参数。

genericMethod4

声明类型参数

  • 在声明class、struct、interface、delegate的时候可以引入类型参数(Type parameters)。
  • 其它的例如属性,就不可以引入类型参数,但是可以使用类型参数。
public struct Nullable
{
  public T Value {get;}
}

声明类型参数

  • 泛型类型/泛型方法可以有多个类型参数:

declaregeneric1

声明泛型类型

  • 泛型类型/泛型方法的名称可以被重载,条件是参数类型的个数不同:
class A {}
class A {}
class A {}
  • 按约定,泛型类型/泛型方法如果只有一个类型参数,那么就叫T。
  • 当使用多个类型参数的时候,每个类型参数都使用T作为前缀,随后跟着具有描述性的一个名字。

Typeof 与 未绑定的泛型类型

  • 开放的泛型类型在编译后就变成了封闭的泛型类型。
  • 但是如果作为Type对象,那么未绑定的泛型类型在运行时是可以存在的。(只能通过typeof操作符来实现)

unbinding

泛型的默认值

  • 使用default关键字来获取泛型类型参数的默认值
    default

文章作者: Chaoqiang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Chaoqiang !
评论
 上一篇
CSharp Basic Tutorial Chapter-3-12 泛型约束  子类  自引用  静态数据  转换 CSharp Basic Tutorial Chapter-3-12 泛型约束 子类 自引用 静态数据 转换
泛型的约束 默认情况下,泛型的类型参数(parameter)可以是任何类型的。 如果只允许使用特定的类型参数(argument),就可以指定约束。 泛型约束 例子 泛型约束T是不可空的值类型 这个泛型代表了可空值类型 T有一个无参的构
下一篇 
CSharp Basic Tutorial Chapter-3-10 枚举和嵌套类型 CSharp Basic Tutorial Chapter-3-10 枚举和嵌套类型
枚举简介 枚举是一个特殊的值类型,它可以让你指定一组命名的数值常量。 枚举的底层原理 每个枚举都对应一个底层的整形数值(Enum.GetUnderlyingType())。默认: 是int类型 0,1,2…会按照枚举成员的声明顺序自动赋
  目录