C#中的泛型

本文介绍了C#中的泛型概念,包括如何使用泛型创建类型安全的代码,泛型度作为区分同名泛型的指标,以及类型约束在限制泛型参数类型时的作用。此外,还讨论了default运算符和typeof运算符在泛型类型初始化和状态中的应用。
摘要由CSDN通过智能技术生成

一、C#中的泛型

 在C#中使用泛型可以编写在编译时类型安全的通用代码,无需事先知道要使用的具体类型即可在不同位置表示相同类型。

 泛型是语言层面支持的,编译器替开发者推断实参的类型,并检查所有不同位置和该实参关联的元素类型,确保生成的IL代码内所有类型都是明确的。

//泛型类、泛型集合和泛型方法
class GenericCounter<T>
{
    public static List<T> CopyAtMost<T>(List<T> input, int maxElements)
    {
        int ct = Math.Min(input.Count,maxElements);
        List<T> ret = new List<T>();
        for (int i = 0; i < ct ; i++)
        {
            ret.Add(input(i));
        }
    }
}

二、泛型度和类型约束

1. 泛型度

 泛型度是泛型声明中类型形参的数量,和重载方法一样,是区分同名泛型声明的有效指标。

//泛型度
public void Method(){}         //泛型度为0
public void Method<T>(){}      //泛型度为1
public void Method<T1,t2>(){}  //泛型度为2

2. 类型约束

 一个类型如果引入了新的类型形参,则它就是泛型,以下类型成员不是泛型:字段、属性、索引器、构造器、事件以及终结器。

 在泛型类型和泛型方法声明类型形参时可以使用类型约束来限定哪些类型可以用作泛型形参的实参:

  static void PrintItems<T>(List<T> items) where T : IFormattable  //使用IFormattable  接口约束T类型,方法只接受实现该接口的实参。

除了接口,还可以约束以下类型:

  • 引用类型约束 where T : class。类型实参必须是一个引用类型
  • 值类型约束 where T : struct。类型实参必须是非可空值类型
  • 构造函数约束 where T : new()。类型实参必须是公共的无参构造函数
  • 转换约束 where T : SomeType。类型实参必须是SomeType类型或由它派生出来的类。

 类型一旦被约束,那么约束类型的非私有类型成员也可以被泛型使用:

static void PrintItems<T>(List<T> items) where T : IFormattable
{
    CultureInfo culture = CultureInfo.InvariantCulture;
    foreach (T item in items)
    {
        Console.WriteLine(item.Tostring(null,culture ));//item可以访问到IFormattable的Tostring方法
    }
}

三. 泛型类型初始化和状态

1. default运算符和typeof运算符

 typeof运算符获取类型的名称,default运算符可以获取类型的默认值,接下来我们用这两个运算符来验证泛型类型的初始值和实际类型。

2. 泛型类型初始化与状态

 试想一下,List< int >和List< string >是同一类型吗?

Console.WriteLine("typeof(List<string>) : {0}", typeof(List<string>));
Console.WriteLine("typeof(List<int>) : {0}", typeof(List<int>));

 运行结果:

typeof(List<string>) : System.Collections.Generic.List`1[System.String]
typeof(List<int>) : System.Collections.Generic.List`1[System.Int32]

 显然List< string >和List< int >是两种不同的类型,每个封闭的、已构造类型都会被单独初始化,并且拥有各自的静态域

 C#后来推出的很多有用的特性都使用了泛型,例如集合、委托、异步、可空值类型等,接下来会重点学习常用的几个。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穷的捡破烂儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值