C# 泛型

一、概念

  什么是泛型?假如你要写两个功能很像的方法,但是只是参数类型不同而已,你会怎么做?泛型就是为这种场景服务的。

二、作用

  泛型的主要目的就是为了简化代码、增强可移植性。ArrayList是一个很方便的容器类,使用中无需更改就可以存储任何引用类型或值类型,但是这种便利是有代价的,这需要把任何一个加入ArrayList的引用类型或值类型都隐式地向上转换成System.Object,中间出现了许多装箱拆箱操作,降低了系统性能。ArrayList和其他相似的类真正需要的是一种途径,能让客户代码在实例化之前指定所需的特定数据类型,直观的来说需要的是类型参数,也就是泛型。泛型最常用的应用场景就是数据集合。

三、定义

泛型在定义时一般用T(A、B、C等大写字母都可以)表示类型参数,客户需要在调用时确定参数类型(int、bool、string等)。

// 定义时
1、List<T> list1 = new List<T>();

// 创建时
2、List<int> list1 = new List<int>();

 注意:在没有给集合添加元素之前,最好不要使用下标来操作,否则有可能会在添加元素时报错(索引越界)。

为了方便理解,可以把 T 看做是一个占位符,在定义的时候是没有任何意义的,而当他想要调用的时候,就需要确定好用什么类型来代替 T。

 

泛型方法:

 public void test<T>(T param){ }

 

 

泛型类:

 class TClass<T>
    {
        public void test(T param)
        { }
    }

 

 

泛型接口:

 interface ITClass<T>
    {
        void test(T param);
    }

 

上面的泛型类可以继承泛型接口:

class TClass<T> : ITClass<T>
    {
        public void test(T param)
        {
            throw new NotImplementedException();
        }
    }

 

 

四、泛型约束

  若要检查表中的一个元素,以确定它是否合法或是否可以与其他元素相比较,那么编译器必须保证:客户代码中可能出现的所有类型参数,都要支持所需调用的操作或方法。这种保证是通过在泛型类的定义中,应用一个或多个约束而得到的。

class MyList<T> where T: Employee
{...}


//可以使用多个约束,约束自身也可以是泛型类
class MyList<T> where T: Employee, IEmployee,  IComparable<T>,  new()

{…}

 

下图是五种约束类型:

约束

描述

where T: struct

类型参数必须为值类型。

where T : class

类型参数必须为引用类型。

where T : new()

类型参数必须有一个公有、无参的构造函数。当于其它约束联合使用时,new()约束必须放在最后。

where T : <base class name>

类型参数必须是指定的基类型或是派生自指定的基类型。

where T : <interface name>

类型参数必须是指定的接口或是指定接口的实现。可以指定多个接口约束。接口约束也可以是泛型的。

posted @   Darius丶段  阅读(103)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示