深入解析泛型

一、泛型的诞生

        在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();

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

信息安全概论考试题目

文章目录 一、计算题二、网络安全协议应用(30 分)三、材料分析(15 分)四、系统安全配量(共 15 分) 一、计算题 1、Playfair 算法属于经典对称加密方式。曾经在相当长的一段时期内&#xff0c;Playfair算法被认为是一种牢不可破的加密方法。现有明文 introduction to informati…

python使用openpyxl操作excel

文章目录 前提读取已有excel创建一个excel工作簿对象创建excel工作簿中的工作表获取工作表第一种&#xff1a;.active 方法第二种&#xff1a;通过工作表名获取指定工作表​​​​​​第三种&#xff1a;.get_sheet_name() 修改工作表的名称数据操作写入数据按单元格写入通过指…

Java 基础学习(十九)网络编程、反射

1 Socket编程 1.1 Socket编程概述 1.1.1 Socket简介 在网络编程中&#xff0c;Socket&#xff08;套接字&#xff09;是一种抽象概念&#xff0c;它用于在不同计算机之间进行通信。Socket可以看作是一种通信的端点&#xff0c;可以通过Socket与其他计算机上的程序进行数据传…

2021-06-21 C51的模拟羽毛球游戏设计

缘由C51的模拟羽毛球游戏设计求解_嵌入式-CSDN问答 #include "REG52.h" sbit K2 P1^6; sbit K1 P1^7; bit k1; unsigned char code SmZiFu[]{63,6,91,79,102,109,125,7,127,111,128};//0-9. unsigned char Js0,fen0;//中断计时 unsigned int miao8,dfj0,dfy0; voi…

计算机科学速成课【学习笔记】(2)——电子计算机

本集课程B站链接 2. 电子计算机-Electronic Computing_哔哩哔哩_bilibili2. 电子计算机-Electronic Computing是【计算机科学速成课】[40集全/精校] - Crash Course Computer Science的第2集视频&#xff0c;该合集共计40集&#xff0c;视频收藏或关注UP主&#xff0c;及时了…

FA模板制作流程

1、FA模板制作的流程&#xff08;完整复制模板制作&#xff09; 总结&#xff1a; FA完整复制云桌面模板流程&#xff1a; 1、安装一个全新的Windows&#xff0c;挂载并安装tools 2、关闭防火墙、启动administrator本地超管用户 3、挂载FusionAccess_WindowsDesktop_Instal…

SpringBoot实用篇

SpringBoot实用篇 1、热部署 什么是热部署&#xff1f; 所谓热部署&#xff0c;就是在应用正在运行的时候升级软件&#xff0c;却不需要重新启动应用。对于Java应用程序来说&#xff0c;热部署就是在运行时更新Java类文件。 热部署有什么用&#xff1f; 节约时间&#xff0c;热…

以太网转RS485通讯类库封装

最近选用有人科技的以太网转RS485模块做项目&#xff0c;设备真漂亮&#xff0c;国货之光。调通了通讯的代码&#xff0c;发到网上供大家参考&#xff0c;多多交流。 以下分别是配套的头文件与源文件&#xff1a; /*******************************************************…

【Leetcode】1154. 一年中的第几天

文章目录 题目思路代码 题目 1154. 一年中的第几天链接 思路 题目要求是给定一个字符串 date&#xff0c;它代表一个日期&#xff0c;采用标准的 YYYY-MM-DD 格式。需要计算这个日期是当年的第几天。 首先&#xff0c;我们可以通过字符串的索引来提取年、月和日的数值&…

2023-12-23 LeetCode每日一题(移除石子使总数最小)

2023-12-23每日一题 一、题目编号 1962. 移除石子使总数最小二、题目链接 点击跳转到题目位置 三、题目描述 给你一个整数数组 piles &#xff0c;数组 下标从 0 开始 &#xff0c;其中 piles[i] 表示第 i 堆石子中的石子数量。另给你一个整数 k &#xff0c;请你执行下述…

Centos7:Jenkins+gitlab+node项目启动(2)

Centos7&#xff1a;Jenkinsgitlabnode项目启动(1) Centos7&#xff1a;Jenkinsgitlabnode项目启动(1)-CSDN博客 Centos7&#xff1a;Jenkinsgitlabnode项目启动(2) Centos7&#xff1a;Jenkinsgitlabnode项目启动(2)-CSDN博客 Centos7&#xff1a;Jenkinsgitlabnode项目启…

爬虫工作量由小到大的思维转变---<第三十章 Scrapy Redis 第一步(配置同步redis)>

前言: 要迈向scrapy-redis进行编写了;首要的一步是,如何让他们互通?也就是让多台电脑连一个任务(这后面会讲); 现在来做一个准备工作,配置好redis的同步!! 针对的是windows版本的redis同步,实现主服务和从服务共享一个redis库; 正文: 正常的redis for windows 的安装这里就…

扩散模型基础

扩散模型发展至今日&#xff0c;早已成为各大机器学习顶会的香饽饽。本文简记扩散模型入门相关代码&#xff0c;主要参阅李忻玮、苏步升等人所编著的《扩散模型从原理到实战》 文章目录 1. 简单去噪模型1.1 简单噪声可视化1.2 去噪模型1.3 小结 2 扩散模型2.1 采样过程2.2 上科…

Gin 源码深度解析及实现

介绍 什么是 gin &#xff1f; 一个轻量级高性能 HTTP Web 框架。 Introduction | Gin Web Framework (gin-gonic.com) Gin 是一个用 Go (Golang) 编写的 HTTP Web 框架。 它具有类似 Martini 的 API&#xff0c;但性能比 Martini 快 40 倍。 为什么使用 gin &#xff1f; In…

C#进阶-IIS应用程序池崩溃的解决方案

IIS是微软开发的Web服务器软件&#xff0c;被广泛用于Windows平台上的网站托管。在使用IIS过程中&#xff0c;可能会遇到应用程序池崩溃的问题&#xff0c;原因可能有很多&#xff0c;包括代码错误、资源不足、进程冲突等。本文将为大家介绍IIS应用程序池崩溃的问题分析和解决方…

目标检测损失函数:IoU、GIoU、DIoU、CIoU、EIoU、alpha IoU、SIoU、WIoU原理及Pytorch实现

前言 损失函数是用来评价模型的预测值和真实值一致程度&#xff0c;损失函数越小&#xff0c;通常模型的性能越好。不同的模型用的损失函数一般也不一样。损失函数主要是用在模型的训练阶段&#xff0c;如果我们想让预测值无限接近于真实值&#xff0c;就需要将损失值降到最低…

机器学习系列--R语言随机森林进行生存分析(1)

随机森林&#xff08;Breiman 2001a&#xff09;&#xff08;RF&#xff09;是一种非参数统计方法&#xff0c;需要没有关于响应的协变关系的分布假设。RF是一种强大的、非线性的技术&#xff0c;通过拟合一组树来稳定预测精度模型估计。随机生存森林&#xff08;RSF&#xff0…

HTML与CSS

目录 1、HTML简介 2、CSS简介 2.1选择器 2.1.1标签选择器 2.1.2类选择器 2.1.3层级选择器(后代选择器) 2.1.4id选择器 2.1.5组选择器 2.1.6伪类选择器 2.2样式属性 2.2.1布局常用样式属性 2.2.2文本常用样式属性 1、HTML简介 超文本标记语言HTML是一种标记语言&…

Python 从入门到精通之通俗易懂学闭包

系列 Python从入门到精通之安装与快速入门-CSDN博客 Python从入门到精通之基本数据类型和变量-CSDN博客 Python从入门到精通之集合&#xff08;List列表、Tuple元组、Dict字典、Set&#xff09;-CSDN博客 Python从入门到精通之条件语句、循环语句和函数-CSDN博客 Python从…

中央集成式架构量产时代,openVOC方案将引发软件开发模式变革

2024年&#xff0c;中央计算区域控制架构正式进入规模化量产周期&#xff0c;汽车智能化正式迈入2.0时代&#xff0c;产业生态、应用创新、开发模式都将迎来巨大变革。 同时&#xff0c;随着ChatGPT引发的AIGC领域的爆发式增长&#xff0c;人工智能技术掀起全球万亿级信息化应…