深入解析泛型

一、泛型的诞生

        在C#1 中我们还没有泛型的时候我们收集数据通常需要使用到数组,或者使用封装好的数组集合Hashtable  ArrayList。

举个例子:

        我们在读取文件的时候就会需要一个数组来储存读取的数据的内容  但我们并不知数据的具体长度也就无法在声明的时候附上准确的数组长度。

        这时我们可以使用一种较为繁琐的方法 就是声明一个数组,如果当前的数组已经被填满,那么将当前数组的数据复制到一个更加大的数组当中 ,直到数组没有被填满就将当前数组的实际有效内容复制到一个正好大小的数组当中。

    /// <summary>
    /// 输出数组中的所有元素
    /// </summary>
    /// <param name="arrayList"></param>
    static void WrileArray(System.Collections.ArrayList arrayList)
    {
        foreach (int item in arrayList)
        {
            System.Console.WriteLine(item);
        }
    }

调用:

  static void Main()
  {
      WrileArray(new System.Collections.ArrayList() { 1, 5, 7, 8, 9 });
      System.Console.ReadLine();
  }

提示: 在我们集合中如果一直是int数据当然不会发生任何问题,但一旦我们的集合当中有非int类型的数据则就会抛出异常。 

这种情况下我们也可以自定义一个集合类指定集合只能接收某种类型。

举个例子:

class MYcollections : System.Collections.CollectionBase
{
    public void Add(int str) => List.Add(str);

    public void Remove(int Itemm) => List.Remove(Itemm);

    public int MycollectionsCount => List.Count;
}

使用方式:

  static void Main()
  {
      WrileArray(new MYcollections() { 1, 5, 7, 8, 9 });
      System.Console.ReadLine();
  }

注意:这时候您在想添加非int类型的数组则不会通过编译器,但上述方法还是有点繁琐,于是我门C#2当中就推出了泛型这一概念。可以完美解决上述问题。

二、泛型

使用泛型完成上述一致的效果:

 static void Main()
 {
     WrileArray<int>(new List<int>  { 1, 5, 7, 8, 9 });
     System.Console.ReadLine();
 }
 /// <summary>
 /// 输出数组中的所有元素
 /// </summary>
 /// <param name="arrayList"></param>
 static void WrileArray<T>(List<T> arrayList)
 {
     foreach (T item in arrayList)
     {
         System.Console.WriteLine(item);
     }
 }

示例解释:

         我们创建了一个List的泛型类型作为WriteAay方法的参数,其中T泛型参数的标识符代表可以为任何类型,在我们传递了类型实参的时候,泛型方法中的类型形参类型都将是类型实参的类型,如我们传递了int类型那么泛型方法当中的所有这个类型形参都将为int类型。

类型形参 类型实参 

提示:在泛型方法中,可以使用泛型类型参数作为其他泛型类或方法的类型实参。这可以使得泛型方法更加灵活和通用。如下图所示:


泛型度(arrity):指泛型类型当中的泛型形参的个数

泛型的适用范围:

        以下成员是不可能声明为泛型:字段、属性、索引器、构造器、事件、终结器。判断一个是否为泛型的唯一标准是看当前的泛型形参是否首次声明。

类型推断:

        在泛型类型中,对类型形参传输了类型实参的情况下。当前对应的类型形参,将直接为当前类型也就不在需要再次声明当前的类型形参的类型。

类型约束:

文章:C#泛型(详解)-CSDN博客


default运算符:

        default关键字可以获取当前数据类型的默认数据。如果是可空类型默认值则为Null。如果是非空类型则是类型对应的0值。

        default运算符可以用于类型形参、类型实参、用于泛型也涉及泛型形参、用于泛型也涉及泛型实参


1 对于类型形参:当在泛型类、泛型方法或泛型委托中使用泛型形参时,可以使用 default 运算符得到类型参数的默认值。例如:

T defaultValue = default(T);

2 对于类型实参:default 运算符可以用于对特定类型的实参获取默认值。例如: 

int defaultValue = default(int);

typeof 运算符:

        typeof运算符返回的类型是Type类型,可以用于泛型。使用Type类提供的一些方法和属性我们可以在泛型当中进行类型转换。

以下是 System.Type 类提供的一些常用方法和属性:

  1. GetType(): 返回当前对象的 System.Type

  2. IsAssignableFrom(Type c): 检查当前类型是否可以从指定的类型分配。

  3. IsInstanceOfType(object o): 检查当前类型是否是给定对象的实例。

  4. GetMethod(string name, Type[] parameters): 获取指定名称和参数类型的方法。

  5. GetMethods(): 获取该类型中定义的所有公共方法。

  6. GetProperty(string name): 获取指定名称的属性。

  7. GetProperties(): 获取该类型中定义的所有公共属性。

  8. IsGenericType: 检查当前类型是否为泛型类型。

  9. IsGenericTypeDefinition: 检查当前类型是否为泛型类型的定义。

  10. MakeGenericType(params Type[] typeArguments): 创建一个封闭的泛型类型,通过将类型参数替换为指定的类型参数数组。

下面是一个示例,演示了如何在泛型中使用 System.Type 类进行类型转换和操作:

public class MyGenericClass<T>
{
    public void PrintTypeInformation()
    {
        Type type = typeof(T);
        
        Console.WriteLine("Type name: " + type.Name);
        Console.WriteLine("Is generic type definition: " + type.IsGenericTypeDefinition);
        Console.WriteLine("Is generic type: " + type.IsGenericType);

        if (type.IsGenericType)
        {
            Type[] typeArguments = type.GetGenericArguments();
            Console.WriteLine("Type arguments: ");
            foreach (Type argument in typeArguments)
            {
                Console.WriteLine("- " + argument.Name);
            }

            Type closedType = type.MakeGenericType(typeof(string));
            Console.WriteLine("Closed type: " + closedType.Name);
        }
    }
}

示例解释:

        我们定义了一个名为 MyGenericClass 的泛型类,通过使用 System.Type 类的方法和属性,在 PrintTypeInformation 方法中打印了与泛型相关的类型信息。在这个例子中,我们展示了如何获取泛型参数的类型信息,并使用 MakeGenericType 方法创建了一个封闭的泛型类型,将类型参数替换为 string 类型。 

(typeof(MyGenericClass<int>), obj.GetType());

提示:当前的效果是一致的。 

 1 typeof(T)当前表达式时返回的当前类型形参T对应的类型实参的Type。它返回值永远是一个封闭的,已构造的类型。

举个例子:

public class Pair<T>
{
    public T First { get; set; }
    public T Second { get; set; }

    public Pair(T first, T second)
    {
        First = first;
        Second = second;
    }
}

现在,我们可以创建不同类型的封闭的已构造类型,比如:

Pair<int> intPair = new Pair<int>(10, 20);
Pair<string> stringPair = new Pair<string>("Hello", "World");
Pair<bool> boolPair = new Pair<bool>(true, false);

 示例解释:

        在这些示例中,intPair 是一个封闭的已构造类型,Pair<int> 是通过将泛型类型参数 T 替换为 int 而创建的具体类型。同样,stringPairboolPair 分别是 Pair<string>Pair<bool> 的封闭的已构造类型。

2 typeof(List<>)当前的表达式看似好像是缺少参数但实际上是可以编译的。对于泛型度为1的这么写,对应泛型度为2的typeof(List<,>)泛型度为3的typeof(List<,,,>)。注意当前表达式只在typeof运算符中有效。

举个例子:

  System.Console.WriteLine(typeof(List<>));
  System.Console.ReadLine();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/282841.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2021-05-08 51单片机74HC164、74LS164、74HCT164、74HC154、74HCT154应用三极管控制继电器

74HC164、74HCT164是8位边沿触发式移位寄存器&#xff0c;串行输入数据&#xff0c;然后并行输出。数据通过两个输入端&#xff08;DSA或DSB&#xff09;之一串行输入&#xff1b;任一输入端可以用作高电平使能端&#xff0c;控制另一输入端的数据输入。两个输入端或者连接在一…

【低代码平台】10个开源免费Airtable 的替代方案

Airtable是一个易于使用的简单低代码平台&#xff0c;有助于团队协作管理复杂的数据表&#xff0c;并创建定制的工作流程。把它想象成一个类固醇上的云电子表格。 Airtable还简化了数据输入过程&#xff0c;连接和集成第三方服务和应用程序&#xff0c;并提供了许多数据导入/导…

web综合大实验!!!

目录 一、要求 二、操作步骤 第一步&#xff1a;关闭防火墙&#xff0b;SeLinux 第二步&#xff1a;挂载 第三步&#xff1a;编辑配置文件 第四步&#xff1a;安装软件包 1、安装httpd 2、安装mod_ssl模块 第五步&#xff1a;定义主配置文件 1、创建首页文件 2、重启…

7.java——异常

异常——error&#xff08;资源耗尽&#xff0c;JVM内部系统错误&#xff0c;代码一般处理不了&#xff09;和excption&#xff08;数组越界&#xff0c;空指针访问&#xff0c;代码可以处理&#xff09; java.lang.Throwable;异常体系的根父类 -------java.lang.Error:错误。…

第三部分 连续型需要的积分

目录 温馨提示&#xff1a; 求积分 求分段函数在确定区间的定积分 方法&#xff1a; 例1 例2 例3 例4 例5 例6 例7 求分段函数在到未知数的定积分 方法&#xff1a; 例8 求简单的二重积分 方法&#xff1a; 例9 例10 例11 求f(x,y)的二重积分 方法&#xff1a; 例12 例13 …

软件工程总复习笔记

软件工程课程复习提纲 文章目录 软件工程课程复习提纲一、基本知识点1. 软件工程的概念及目标2. 软件危机的概念及典型表现3. 瀑布模型的概念及特点4. 快速原型模型的特点5. 螺旋模型的基本思想6. 软件生命周期的概念及划分为哪几个阶段7. 软件需求的定义8. 常见的软件需求获取…

Go 泛型之明确使用时机与泛型实现原理

Go 泛型之明确使用时机与泛型实现原理 文章目录 Go 泛型之明确使用时机与泛型实现原理一、引入二、何时适合使用泛型&#xff1f;场景一&#xff1a;编写通用数据结构时场景二&#xff1a;函数操作的是 Go 原生的容器类型时场景三&#xff1a;不同类型实现一些方法的逻辑相同时…

FL Studio 21.2.2官方中文版重磅发布

纯正简体中文支持&#xff0c;更快捷的音频剪辑及素材管理器&#xff0c;多样主题随心换&#xff01; Mac版新增对苹果M2/1家族芯片原生支持。 丰富的主题换肤 现在大家可以通过控制色调、饱和度、亮度、文本、仪表和步进序列器的颜色来改变你的DAW外观&#xff0c; DAW“情绪…

VSCode使用Remote SSH远程连接Windows 7

结论 VSCode Server不能启动&#xff0c;无法建立连接。 原因 .vscode-server 目录中的 node.exe 无法运行。 原因是Node.js仅在Windows 8.1、Windows Server 2012 R2或更高版本上受支持。 由于vscode基于node.js v14&#xff0c;不支持Windows 7操作系统。 另&#xff…

普中STM32-PZ6806L 使用FlyMcu串口烧录程序

简介 我的串口下载电路坏掉了, 所以研究了下如何通过USB转TTL进行程序的下载, 为后续Bootloader部分做准备;连接 我的板几乎是十年前买的&#xff0c; 所以电路与现有网上的资料有些差异, 所以仅供参考 USB 转 TTL线 与开发板 连接&#xff0c; 如图图中 ①, 需要去掉第一个…

基于STM/APM32F072制作的J-Link OB调试器项目验证

基于STM/APM32F072制作的J-Link OB调试器项目验证 &#x1f4cd;本文基于github项目&#xff1a;https://github.com/geekchun/Jlink-OB/tree/master⚡申明&#xff1a;仅限个人研究学习&#xff0c;无其他用途。&#x1f33f;采用该项目提供的固件&#xff0c;烧录STM32f4时信…

WeNet语音识别调用通义千问

WeNet语音识别调用通义千问 WeNet语音识别对通义千问&#xff08;Qwen-72B-Chat Bot&#xff09;调用&#xff0c;首先通过WeNet将用户的语音输入转录为文本&#xff0c;然后将此文本输入通用问答模型以获取答案。 本人原创作品&#xff0c;体验一下 连续对话 WeNet语音识别…

Zookeeper实现分布式锁和注册中心

目录 分布式锁 实现方式 分布式锁场景如何选择Redis和zookeeper 用InterProcessMutex实现分布式锁 zookeeper实现注册中心 分布式锁 实现方式 数据库唯一索引Redis的setnxZookeeper创建临时节点及监听机制Zookeeper创建临时有序节点 分布式锁场景如何选择Redis和zookeepe…

为即将到来的量子攻击做好准备的 4 个步骤

当谈到网络和技术领域时&#xff0c;一场风暴正在酝酿——这场风暴有可能摧毁我们数字安全的根本结构。这场风暴被称为 Q-Day&#xff0c;是即将到来的量子计算时代的简写&#xff0c;届时量子计算机的功能将使最复杂的加密算法变得过时。 这场量子革命正以惊人的速度到来&am…

RFC6749-OAuth2.0

前言 最近在项目中需要实现SSO(单点登录)功能,以实现一处注册,即可在任何平台之间登录的功能。我们项目中并没有直接对接第三方认证系统而是通过集成keycloak 完成一系类安全协议的对接工作。如果我们在代码级别自己完成各种安全协议的对接是一项十分大的工程。不仅要走统一的…

论文解读:Coordinate Attention for Efficient Mobile Network Design(CVPR2021)

论文前言 原理其实很简单&#xff0c;但是论文作者说得很抽象&#xff0c;时间紧的建议直接看3.1中原理简述CBMA、原理简述CBMA以及3.2中原理简述coordinate attention block即可。 Abstract 最近关于mobile network设计的研究已经证明了通道注意(例如&#xff0c;the Squee…

【解决复杂链式任务打造全能助手】大模型思维链 CoT 应用:langchain 大模型 结合 做 AutoGPT

大模型思维链 CoT 应用&#xff1a;langchain 大模型 结合 做 AutoGPT&#xff0c;解决复杂链式任务打造全能助手 思维链 CoTlangchainlangchain 大模型结合打造 AutoGPT 思维链 CoT 最初的语言模型都是基于经验的&#xff0c;只能根据词汇之间的相关性输出答案&#xff0c;根…

现阶段SDH,MPLS-VPN,MSTP等广域网几种互联技术介绍

广域网也称远程网&#xff0c;通常跨接很大的物理范围&#xff0c;所覆盖的范围从几十公里到几千公里&#xff0c;它能连接多个城市或国家&#xff0c;或横跨几个洲并能提供远距离通信&#xff0c;形成国际性的远程网络。广域网可以分为公共传输网络、专用传输网络和无线传输网…

学习SpringCloud微服务

SpringCloud 微服务单体框架微服务框架SpringCloud微服务拆分微服务差分原则拆分商品服务拆分购物车服务拆分用户服务拆分交易服务拆分支付服务服务调用RestTemplate远程调用 微服务拆分总结 服务治理注册中心Nacos注册中心服务注册服务发现 OpenFeign实现远程调用快速入门引入…

面向对象基础-类与对象-封装

1、类与对象 1.1 概念 类&#xff1a;类是一个抽象的概念&#xff0c;用于描述一类对象的特点。 对象&#xff1a;根据类的概念所创造的实体。 【思考】一个对象可以没有对应的类嘛&#xff1f; 不可以&#xff0c;因为必须现有类才能创建对象。 1.2 类的内容 类中最基础的内容…