C#提升(一、泛型)

article/2025/10/13 20:10:49

一、什么是泛型

泛型,即“参数化类型”

我们来看以下代码,目的很明确,就是显示参数类型,这种类似的代码或者说只有参数类型不同,但是功能相同时,我们如何让代码写的更优雅?
在这里插入图片描述
在泛型没有出现的.Net FrameWork 1.0时代,可以这样来写:

在这里插入图片描述
我们来看这样子写的,确实更优雅了许多,但是这样子写会有两个问题,至于哪两个问题,看完全文你将得到答案
在这里插入图片描述
为了代码更加优雅,在.Net FrameWork 2.0时代,出现了泛型
在这里插入图片描述

二、泛型的种类

2.1 泛型类

在这里插入图片描述

2.2 泛型接口

在这里插入图片描述

2.3 泛型方法

在这里插入图片描述

2.4 泛型委托

在这里插入图片描述

三、泛型的继承

3.1 基类和接口

在这里插入图片描述

3.2 普通类

在这里插入图片描述

3.3 泛型类

在这里插入图片描述

四、泛型的约束

4.1 定义三个类使用

在这里插入图片描述

4.2 不使用泛型

在这里插入图片描述
在这里插入图片描述
可以看到 前两个正常打印,第三个抛异常,这就是object什么都可以传,导致的一个问题:传参不安全,很明显Japanese没有相对应的属性
在这里插入图片描述

4.3 使用泛型

可以看到这里我们对 输入进行的约束必须为People或其子类
在这里插入图片描述
所以,当我们再传Japanese时,直接提示不过
在这里插入图片描述

4.4 约束的种类

  1. 引用类型约束
    (T : class), 即T必须是一个引用类型。必须放在第一个。
  2. 值类型约束
    (T : struct) 。 必须放在第一个。
  3. 无参构造函数约束
    new() , 必须放在最后一个。
  4. 转换类型约束(基类约束、接口约束)
    class Sample where T : Stream
    class Sample<T1, T2> where T1: T2 (如Sample<Stream, IDisposable>
    class Sample where T : Stream, IEnumerable, IComparable 可以多个接口,但是只能一个class.

指定的类不能是结构,密封类比如string,或者这些特殊类型:
System.Object
System.Enum
System.ValueType
System.Delegate

五、泛型的性能

5.1 测试代码

定义三个方法
分别是直接类型、Object、泛型
在这里插入图片描述
每个方法循环1亿次,判定性能
在这里插入图片描述

5.2 测试结果

在这里插入图片描述
我们可以很清楚的看出
直接类型≈泛型<Object

原因很明显
使用Object 涉及装箱和拆箱的过程
而泛型是延迟声明,使用的时候直接类型替换占位符,所以基本和直接类型性能一致

六、协变逆变

6.1 错误示范

在这里插入图片描述
在这里插入图片描述

6.2 协变

为了解决上述的问题,增加了协变的概念 ,在声明时增加out关键字,只能作为返回值使用
在这里插入图片描述
用它就可以这样写

IEnumerable<Bird> birds3 = new List<Bird>();
IEnumerable<Bird> birds4 = new List<Sparrow>();

在这里插入图片描述
委托可以这样写

Func<Bird> func = new Func<Bird>(() => null);
Func<Bird> func2 = new Func<Sparrow>(() => null);

6.3 逆变

逆变 :协变的逆过程,只能作为传参使用 关键字in
在这里插入图片描述

协变的逆过程

ICustomerIn<Sparrow> customerIn = new CustomerIn<Sparrow>();
ICustomerIn<Sparrow> customerIn2 = new CustomerIn<Bird>();Action<Sparrow> action = new Action<Sparrow>((Sparrow i) => { });
Action<Sparrow> action2 = new Action<Bird>((Bird i) => { });

七、泛型的缓存

不同的类型在调用泛型时

  1. 每一个类型都会创建一份副本
  2. 每一个类型只会创建一次

http://chatgpt.dhexx.cn/article/beDtVqbg.shtml

相关文章

深度学习提高泛化能力的技术

LeetCode题目记录 1.泛化能力&#xff08;generalization&#xff09; 2.正则化&#xff08;regularization&#xff09;2.1 正则化方法 1.泛化能力&#xff08;generalization&#xff09; 对于模型&#xff0c;我们不仅要求它对训练数据集有很好的拟合&#xff08;训练误差&a…

lecture9-提高模型泛化能力的方法

HInton第9课&#xff0c;这节课没有放论文进去。。。。。如有不对之处还望指正。话说hinton的课果然信息量够大。推荐认真看PRML《Pattern Recognition and Machine Learning》。 摘自PRML中22页。 正文&#xff1a; 一、提高泛化方法的概述 在这部分中&#xff0c;将会介绍…

思考深度学习的泛化能力

神经网络通过记忆学习 传统观点论文观点论文实验 神经网络 不 通过记忆学习参考资料 深度神经网络往往带有大量的参数&#xff0c;但依然表现出很强的泛化能力&#xff08;指训练好的模型在未见过的数据上的表现&#xff09;。 深度神经网络为何会拥有如此强的泛化能力&…

SQL提升(一)

Sql不常见关键字提升 一、前言 Sql是最重要的关系数据库操作语言&#xff0c;现在基本上任何与数据库相关的操作都离不开sql。所以说sql功能是很强大的。 我们常用的sql关键字不外乎 group by;in; where; from; update……等&#xff0c;这些关键字有时组成sql的基础。 但是…

越大的数据集训练,网络泛化能力越强

虽然这个直观很好理解&#xff0c;但我想找这个论点的论文支持&#xff0c;如果再能找张图就好了&#xff0c;下面是过程 首先是On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima这篇经典文章&#xff0c;里面的这张flat minima和sharp minim…

浅谈深度学习泛化能力

谷歌最近出品的82页论文《ON THE GENERALIZATION MYSTERY IN DEEP LEARNING》&#xff0c;在此我简单归纳下论文的思想&#xff0c;有兴趣的看看原论文。论文链接&#xff1a;github.com/aialgorithm/Blog 一、DNN泛化能力的问题 论文主要探讨的是&#xff0c; 为什么过参数的…

深入理解泛化

文章目录 1.引言2.泛化的定义3.数据集分类4.泛化能力分类5.从训练过程来理解泛化参考资料 1.引言 什么是泛化呢&#xff1f; 先举个栗子&#xff1a; 小明和小李都上了高三。小明头脑机灵&#xff0c;一边刷着五年高考三年模拟一边总结做题规律&#xff0c;而小李一门心思刷题…

机器学习-泛化能力

目录 1.什么是泛化能力 2.什么是好的机器学习模型的提出 3.泛化误差 4.模型泛化能力的评价标准 4.提高泛化能力 5.举例 6.相关引用文献 1.什么是泛化能力 百度百科解释&#xff1a;机器学习算法对新鲜样本的适应能力。 更加具体的解释&#xff1a;学习到的模型对未知…

机器学习中的泛化能力

模型的泛化能力&#xff1a;指机器学习算法对新鲜样本的适应能力。 学习的目的&#xff1a;学到隐含在数据背后的规律&#xff0c;对具有同一规律的学习集以外的数据&#xff0c;经过训练的网络也能给出合适的输出&#xff0c;该能力称为泛化能力。 由此可见&#xff0c;经训练…

神经网络泛化的能力因素,神经网络泛化的能力差

1、BP神经网络当中 所提到的泛化能力是指什么&#xff1f; 就是外推的能力。 很多时候训练的网络对于训练的数据能很好的拟合&#xff0c;但是对于不在训练集内的数据拟合就很差强人意了。这种情况就叫泛化能力----差。也就是说可能你的网络存在过拟合的现象。 谷歌人工智能写…

【深度学习】常见的提高模型泛化能力的方法

前言 模型的泛化能力是其是否能良好地应用的标准&#xff0c;因此如何通过有限的数据训练泛化能力更好的模型也是深度学习研究的重要问题。仅在数据集上高度拟合而无法对之外的数据进行正确的预测显然是不行的。本文将不断总结相关的一些方法。 一、模型角度 Dropout 首先随…

TCP/IP报文格式

1、IP报文格式    IP协议是TCP/IP协议族中最为核心的协议。它提供不可靠、无连接的服务&#xff0c;也即依赖其他层的协议进行差错控制。在局域网环境&#xff0c;IP协议往往被封装在以太网帧&#xff08;见本章1.3节&#xff09;中传送。而所有的TCP、UDP、ICMP、IGMP数据…

TCP首部报文段格式

最近《计算机网络》这本书看到了传输层的 TCP 协议&#xff0c;因为TCP 的全部功能都体现在它的首部中&#xff0c;因此觉得有必要将这些知识梳理一下。 首先TCP 是面向字节流的。这个流指的是流入到进程或从进程流出的字节序列。面向字节流的含义是&#xff1a;应用程序与 TC…

ARP报文格式详解

ARP 协议包&#xff08;ARP 报文&#xff09;主要分为 ARP 请求包和 ARP 响应包&#xff0c;本节将介绍 ARP 协议包的格式。 ARP 报文格式 ARP 协议是通过报文进行工作的&#xff0c;ARP 报文格式如图所示。 ARP 报文总长度为 28 字节&#xff0c;MAC 地址长度为 6 字节&…

CAN的报文格式

CAN的报文格式 在总线中传送的报文&#xff0c;每帧由7部分组成。CAN协议支持两种报文格式&#xff0c;其唯一的不同是标识符&#xff08;ID&#xff09;长度不同&#xff0c;标准格式为11位&#xff0c;扩展格式为29位。 在标准格式中&#xff0c;报文的起始位称为帧起始&am…

IPv4报文格式详解和报文示例

目录 一&#xff0c;IP数据报文的组成 二&#xff0c;IP报文格式 三&#xff0c;IPv4报文示例 作者&#xff1a;柒烨带你飞 一&#xff0c;IP数据报文的组成 一个IP数据报文都是由首部和数据两部分组成。 每个 IP 数据报都以一个 IP 报头开始。IP 报头中包含大量信息&#…

ICMP报文格式解析

ICMP报文的格式类型总共分为三大类&#xff1a; 1、差错报文 2、控制报文 3、查询报文 上图是ICMP报文的基本格式&#xff0c;上面提到的三种ICMP报文均有“类型&#xff0c;代码和校验和”三个字段&#xff0c;后面还有4个字节是根据不同的报文类型而有不同的格式&#xff…

常见网络报文数据包格式

当我们应用程序用TCP传输数据的时候&#xff0c;数据被送入协议栈中&#xff0c;然后逐个通过每一层&#xff0c;知道最后到物理层数据转换成比特流&#xff0c;送入网络。而再这个过程中&#xff0c;每一层都会对要发送的数据加一些首部信息。整个过程如下图。 以太网帧格式 以…

网络中的常见的各种协议--报文格式总结学习

网络中的各种协议总结学习 以太网帧结构IP报文格式ARP协议ICMP协议UDP用户数据包协议DNS TCP协议FTP协议HTTP协议SMTP协议POP协议SSH协议 以太网帧结构 注&#xff1a; 当LLC-PDU中携带的是数据的时候&#xff0c;那么左侧的2字节表示的就是长度&#xff1b;当然&#xff0c;以…

网络基础知识之报文格式介绍

1.以太网数据帧头部 DMAC&#xff1a;目的MAC地址&#xff0c;长度6个字节。 SMAC&#xff1a;源MAC地址&#xff0c;长度6个字节。 TYPE&#xff1a;类型字段&#xff0c;表明上层是哪种协议&#xff0c;IP协议是0x800&#xff0c;ARP协议是0x0806。 DATA&#xff1a;数据字…