C# 泛型

一、定义

1、泛型允许您编写一个可以与任何数据类型一起工作的类或方法
2、优点 
类型安全,增强性能,代码复用

使用泛型是一种增强程序功能的技术,具体表现在以下几个方面:

  • 它有助于最大限度地重用代码、保护类型的安全以及提高性能。
  • 可以创建泛型集合类。.NET 框架类库在 System.Collections.Generic 命名空间中包含了一些新的泛型集合类。您可以使用这些泛型集合类来替代 System.Collections 中的集合类。
  • 可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托。
  • 可以对泛型类进行约束以访问特定数据类型的方法。
  • 关于泛型数据类型中使用的类型的信息可在运行时通过使用反射获取  

二、泛型种类

1、泛型方法
    /// <summary>
    /// 泛型方法
    /// </summary>
    public class GenericsMethord
    {
        //这里介绍泛型方法,在之前02-泛型的引入中,使用的就是泛型方法,这里再重复一次
        /*
        详解:T为泛型的一个代表,换成别的字母同样可以
              T和A代表的类型在使用时才声明,俗称“延迟声明”
        */
        public static void ShowModel<T, A>(T model1, A model2)
            where T : ModelFather
            where A : model3
        {
            Console.WriteLine("id值为:" + model1.id + "  name值为:" + model1.name);
            Console.WriteLine("id值为:" + model2.id + "  name值为:" + model2.name);
        }
    }
2、泛型类
    /// <summary>
    /// 泛型类
    /// </summary>
    public class GenericsClass<T>
    {
        public string id { get; set; }
        public string name { get; set; }

        public void Test(T t)
        {
            Console.WriteLine(t.GetType());
        }
    }
3、泛型接口
    /// <summary>
    /// 泛型接口
    /// </summary>
    public class GenericsInterface
    {
        public interface IGet<T>
        { }
    }
4、泛型委托
    /// <summary>
    /// 泛型委托
    /// </summary>
    public class GenericsDelegate
    {
        public delegate void GetHandler<T>();

    }

三、泛型约束

  1. 基类约束:where T:<基类名>

  2. 接口约束:where T:<接口名称> 约束的接口也可以是泛型的

  3. 无参构造函数约束:where T: new() 提供的任何类型参数都必须具有可访问的无参数(或默认)构造函数。当与其他约束一起使用时,new() 约束必须最后指定

  4. 值类型约束:where T:struct 类型参数必须是值类型,可以指定除 Nullable 以外的任何值类型。

  5. 引用类型约束: where T:class 类型参数必须是引用类型,也适用于任何类、接口、委托或数组类型。当与其他约束一起使用时,class 约束必须最先指定。

注意:多参数约束、多条件约束  

public static void ShowModel<T, A>(T model1, A model2)

    where T : ModelFather

    where A : model3
public void ShowManyCon<T>(T t) where T : class, IWork, ISport, new()


四、原理和好处

1、原理
延时声明,在运行时进行编译
2、好处、

       1.减少代码冗余量,精简代码

  2.避免了拆箱和装箱过程(类型转换)中代理的性能损失使用Object类型

  3.结合IDE的只能提示,提高了开发效率

五、default(T)

      1.  在泛型中如果需要返回泛型类型的默认值则会用到这个关键字。

  2. T是值类型而非结构的则default(T) 数值类型返回0,字符串返回空。

  3.  是非引用类型是结构时候返回初始化为零或空的每个结构成员。

  4.  引用类型返回NULL

  5. 其实就是为了返回默认值,比如int i =0;这样是可以的,但是int i=null是不可以的,但是泛型的时候不知道是值类型还是引用类型所以不知道如何赋默认值。

用这个关键字就解决了这个问题

六、泛型缓存

       对于泛型类而言,不同类型都会生成不同的副本(即都要调用静态的构造函数和静态字段),但相同的类型,实例化一次后,再次实例化,将不会在生成副本(即不再调用静态类和静态构造函数),这就是泛型缓存。



posted @ 2023-08-28 10:39  不争丶  阅读(26)  评论(0编辑  收藏  举报