当前位置: 首页 > news >正文

C# 泛型

目录

一、前言

二、相关内容

1、什么是泛型?

2、泛型类

3、泛型方法 

4、限定类型参数

4.1、 类型参数的基本约束

4.2、接口约束

4.3、基类约束

4.5、泛型参数与限定类型参数的关系

4.6、自定义约束

5、使用泛型的好处

5.1、代码复用性

5.2、类型安全性

5.3、性能优化

5.4、代码清晰可读

5.5、减少维护成本

5.6、支持多种数据类型

5.7、提升开发效率

三、总结


一、前言

泛型是C#中的一个强大特性,它使我们能够编写更具通用性和可复用性的代码,同时保持类型安全。通过泛型,我们可以在不同的数据类型上执行相似的操作,而无需为每种数据类型编写重复的代码。在本篇博客中,我们将深入探讨C#泛型的相关概念、用法和实际代码示例。

二、相关内容

1、什么是泛型?

泛型是一种参数化类型的机制,它允许我们在定义类、方法或接口时使用占位符来代表类型。这些占位符类型在实际使用时会被具体的类型替代,从而实现代码的通用性。泛型能够让我们编写更加灵活、安全和高效的代码。

2、泛型类

在C#中,我们可以创建泛型类来处理不同类型的数据。下面是一个简单的泛型堆栈(Stack)类示例:

public class Stack<T>
{private List<T> items = new List<T>();public void Push(T item){items.Add(item);}public T Pop(){if (items.Count == 0){throw new InvalidOperationException("Stack is empty");}T item = items[items.Count - 1];items.RemoveAt(items.Count - 1);return item;}
}

在这个示例中,T 是一个类型参数,代表着我们在实际使用时会传递的具体类型。通过使用泛型,我们可以创建一个通用的堆栈类,它可以存储任意类型的数据。

3、泛型方法 

除了泛型类,我们还可以创建泛型方法。泛型方法允许我们在方法内部使用类型参数来处理不同类型的数据,而无需为每种数据类型编写不同的方法。以下是一个泛型方法的例子,用于交换两个变量的值:

public class Utility
{public static void Swap<T>(ref T a, ref T b){T temp = a;a = b;b = temp;}
}

这个 Swap 方法可以在不同的数据类型(如整数、浮点数、字符串等)上进行交换操作。 

4、限定类型参数

在C#中,通过类型参数的约束(constraint),我们可以限定泛型类型参数必须满足特定的条件。这些约束使得泛型在处理数据时更具有针对性,同时能够保证泛型的灵活性和类型安全性。以下是关于如何限定类型参数的详细介绍:

4.1、 类型参数的基本约束

通过使用基本约束,我们可以限制泛型类型参数必须是特定的类、结构体或引用类型。基本约束有三种:

- `where T : class`:类型参数 `T` 必须是引用类型,可以是类、接口、委托等。
- `where T : struct`:类型参数 `T` 必须是值类型,通常是结构体。
- `where T : new()`:类型参数 `T` 必须具有无参数的公共构造函数。
public class Example<T> where T : class
{// ...
}
```

4.2、接口约束

通过接口约束,我们可以要求泛型类型参数实现一个或多个特定的接口。这使得我们可以在泛型代码中调用接口定义的方法或属性。

public class Example<T> where T : IComparable
{// ...
}

4.3、基类约束

通过基类约束,我们可以要求泛型类型参数必须是指定的基类或派生自特定基类的类。

public class Example<T> where T : MyBaseClass
{// ...
}

4.4、多重约束

我们可以在同一个泛型类型参数上使用多个约束,通过逗号分隔它们。

public class Example<T> where T : IComparable, new()
{// ...
}

4.5、泛型参数与限定类型参数的关系

使用限定类型参数能够确保泛型代码在处理数据时具有一定的结构和功能,这有助于在代码中调用特定类型的成员。例如,如果我们需要在泛型类中调用特定接口的方法,就可以使用接口约束来实现。如果我们希望泛型类型参数必须是值类型,就可以使用结构体约束。

4.6、自定义约束

除了基本的类、结构体、引用类型、接口和基类约束,C#还允许我们使用自定义的泛型参数约束。这可以通过使用 `where T : 约束类型` 的形式来实现,其中约束类型可以是任何我们定义的类、接口或基类。

public class Example<T> where T : MyCustomClass
{// ...
}

使用自定义约束可以在代码中施加特定的规则,以适应特定的业务逻辑需求。

通过限定类型参数,我们能够在泛型代码中使用特定类型的成员,确保类型安全性并避免不必要的类型转换。这为泛型带来了更大的灵活性和实用性,有助于编写更加强大和可靠的代码。

5、使用泛型的好处

使用泛型带来了许多好处:

5.1、代码复用性

使用泛型可以创建通用的代码逻辑,可以在不同的数据类型上重复使用相同的代码片段。这样可以减少代码的冗余,避免为每种数据类型都编写相似的代码,提高了代码复用性。例如,在集合类中,可以编写一个通用的排序算法,而不需要为不同类型的集合分别编写排序方法。

5.2、类型安全性

泛型在编译时执行类型检查,这意味着编译器会确保在使用泛型类型时只允许合法的类型操作。这减少了在运行时可能出现的类型错误,提高了代码的安全性。与使用非泛型的代码相比,泛型能够在更早的阶段捕获潜在的类型问题。

5.3、性能优化

泛型代码可以避免装箱和拆箱操作,这是将值类型转换为引用类型的过程,会产生一定的性能开销。泛型在运行时直接操作实际的数据类型,因此通常比使用非泛型版本的代码更高效。这在处理大量数据时尤为重要,可以显著提升程序的性能。

5.4、代码清晰可读

使用泛型可以使代码更加清晰和可读。泛型代码通常避免了繁琐的类型转换和重复的逻辑,使代码更具表达力。相比于使用不同的方法或类来处理不同类型的数据,使用泛型可以将相似的逻辑集中在一起,使代码结构更加简洁和易于理解。

5.5、减少维护成本

泛型代码具有更高的可维护性。当需要对代码进行修改或添加新功能时,只需在一个地方进行更改,即可应用于所有泛型类型的实例。这减少了重复修改的风险,使维护过程更加高效。此外,泛型还有助于减少错误,因为修改逻辑只需在一个地方完成。

5.6、支持多种数据类型

在处理不同类型的数据时,泛型能够提供更灵活的支持。无论是基本数据类型还是自定义类型,都可以在泛型代码中使用。这使得泛型成为处理多种数据类型的强大工具,特别是在编写通用库或框架时非常有用。

5.7、提升开发效率

泛型可以显著提升开发效率。通过减少重复的代码编写,减少类型转换以及提供更清晰的代码结构,开发人员可以更快速地完成任务并减少错误。此外,使用泛型还可以减少调试时间,因为类型错误在编译阶段就能被发现。

总的来说,泛型是一项强大的编程特性,它为程序员提供了一种更高效、更灵活、更安全的方式来处理不同类型的数据。通过充分利用泛型,开发人员可以编写更具通用性和可维护性的代码,从而在软件开发过程中获得诸多好处。

三、总结

C#泛型是一项强大的特性,它为我们提供了一种优雅的方式来编写通用、类型安全且高效的代码。无论是泛型类、泛型方法还是类型参数约束,都使我们能够更好地组织和管理代码,从而提高了开发效率和代码质量。

泛型允许延迟编写类或方法中的编程元素的数据类型的规范,直到实际在程序中使用它的时候。换句话说,泛型允许您编写一个可以与任何数据类型一起工作的类或方法。

可以通过数据类型的替代参数编写类或方法的规范。当编译器遇到类的构造函数或方法的函数调用时,它会生成代码来处理指定的数据类型。下面这个简单的实例将有助于您理解这个概念:

using System;
using System.Collections.Generic;namespace GenericApplication
{public class MyGenericArray<T>{private T[] array;public MyGenericArray(int size){array = new T[size + 1];}public T getItem(int index){return array[index];}public void setItem(int index, T value){array[index] = value;}}class Tester{static void Main(string[] args){// 声明一个整型数组MyGenericArray<int> intArray = new MyGenericArray<int>(5);// 设置值for (int c = 0; c < 5; c++){intArray.setItem(c, c*5);}// 获取值for (int c = 0; c < 5; c++){Console.Write(intArray.getItem(c) + " ");}Console.WriteLine();// 声明一个字符数组MyGenericArray<char> charArray = new MyGenericArray<char>(5);// 设置值for (int c = 0; c < 5; c++){charArray.setItem(c, (char)(c+97));}// 获取值for (int c = 0; c < 5; c++){Console.Write(charArray.getItem(c) + " ");}Console.WriteLine();Console.ReadKey();}}
}

接下来看一看结果如何:

0 5 10 15 20
a b c d e

相关文章:

C# 泛型

目录 一、前言 二、相关内容 1、什么是泛型&#xff1f; 2、泛型类 3、泛型方法 4、限定类型参数 4.1、 类型参数的基本约束 4.2、接口约束 4.3、基类约束 4.5、泛型参数与限定类型参数的关系 4.6、自定义约束 5、使用泛型的好处 5.1、代码复用性 5.2、类型安全…...

servlet,Filter,责任的设计模式,静态代理

servlet servlet是前端和数据库交互的一个桥梁 静态网页资源的技术&#xff1a;在前端整个运行的过程中 我们的网页代码不发生改变的这种情况就称为静态的网页资源技术动态网页资源的技术&#xff1a;在前端运行的过程中 我们的前端页面代码会发生改变的这种情况就称为 动态的网…...

C++中的运算符总结(5):按位运算符(上)

C中的运算符总结&#xff08;5&#xff09;&#xff1a;按位运算符&#xff08;上&#xff09; 9、按位运算符 NOT&#xff08; &#xff5e;&#xff09;、 AND&#xff08; &&#xff09;、 OR&#xff08; |&#xff09;和 XOR&#xff08; ^&#xff09; 逻辑运算符和…...

8.Oracle中多表连接查询方式

表连接分类&#xff1a; 内连接、外连接、交叉连接、自连接 1 内连接 内连接是一种常见的多表关联查询方式&#xff0c;一般使用关键字INNER JOIN来实现。其中&#xff0c;INNER关键字可以省略&#xff0c;当只使用JOIN关键字时&#xff0c;语句只表示内连接操作。在使用内连…...

Linux 安装mysql(ARM架构)

添加mysql用户组和mysql用户 安装依赖libaio yum install -y libaio* 下载Mysql wget https://obs.cn-north-4.myhuaweicloud.com/obs-mirror-ftp4/database/mysql-5.7.27-aarch64.tar.gz安装mysql 解压Mysql tar xvf mysql-5.7.27-aarch64.tar.gz -C /usr/local/ 重命名 …...

git:git clone报错提示permissions xxxx for xxxxxx are too open

问题&#xff1a; 如题 参考&#xff1a; [密钥权限过大错误]ssh “permissions are too open” error 解决办法&#xff1a; 将id_rsa和id_rsa.pub的权限改为600...

elasticSearch数据的导入和导出

http://wget https://nodejs.org/dist/v10.13.0/node-v10.13.0-linux-x64.tar.gz 解压即可&#xff1a; 1、将索引中的数据导出到本地 myindex 是我的索引 elasticdump --inputhttp://localhost:9200/myindex--output/home/date/myindex.json2、将本地数据导入es中 elasticdum…...

DDR PHY

1.ddr phy架构 1.pub&#xff08;phy unility block&#xff09; 支持特性&#xff1a; &#xff08;1&#xff09;不支持SDRAM的DLL off mode &#xff08;2&#xff09;数据位宽是以8bit逐渐递增的&#xff08;这样做的目的是因为可能支持16/32/64bit的总线位宽&#xff…...

XSS攻击是怎么回事?记录一下

title: XSS攻击 date: 2023-08-27 19:15:57 tags: [XSS, 网络安全] categories: 网络安全 今天学习了一个网络攻击的手段&#xff0c;XSS攻击技术&#xff0c;大家自建网站的朋友&#xff0c;记得看看是否有此漏洞。 &#x1f388; XSS 攻击 全称跨站脚本攻击 Cross Site Sc…...

FFmpeg支持多线程编码并保存mp4文件示例

之前介绍的示例&#xff1a; (1).https://blog.csdn.net/fengbingchun/article/details/132129988 中对编码后数据保存成mp4 (2).https://blog.csdn.net/fengbingchun/article/details/132128885 中通过AVIOContext实现从内存读取数据 (3).https://blog.csdn.net/fengbingchun/…...

一文搞懂深度信念网络!DBN概念介绍与Pytorch实战

目录 一、概述1.1 深度信念网络的概述1.2 深度信念网络与其他深度学习模型的比较结构层次学习方式训练和优化应用领域 1.3 应用领域图像识别与处理自然语言处理推荐系统语音识别无监督学习与异常检测药物发现与生物信息学 二、结构2.1 受限玻尔兹曼机&#xff08;RBM&#xff0…...

MyBatis:使用注解让数据库操作更简单

目录 一、简介 二、配置 三、基于注解的基本使用 四、测试 总结 一、简介 在Java开发中&#xff0c;数据库操作是一个常见而重要的任务。为了方便地执行SQL语句&#xff0c;获取结果集&#xff0c;处理异常等&#xff0c;我们通常需要使用JDBC&#xff08;Java Database …...

基于PyTorch深度学习遥感影像地物分类与目标检测、分割及遥感影像问题深度学习优化

我国高分辨率对地观测系统重大专项已全面启动&#xff0c;高空间、高光谱、高时间分辨率和宽地面覆盖于一体的全球天空地一体化立体对地观测网逐步形成&#xff0c;将成为保障国家安全的基础性和战略性资源。未来10年全球每天获取的观测数据将超过10PB&#xff0c;遥感大数据时…...

4.网络设计与redis、memcached、nginx组件(一)

网络组件系列文章目录 第四章 网络设计与redis、memcached、nginx组件 文章目录 网络组件系列文章目录文章的思维导图前言一、网络相关的问题&#xff0c;网络开发中要处理那些问题&#xff1f;网络操作IO连接建立连接断开消息到达消息发送网络操作IO特性 二、网络中IO检测IO函…...

leetcode分类刷题:矩阵顺时针模拟

1、这种题目是对代码熟练度考察&#xff0c;模拟顺时针建立或访问矩阵&#xff0c;需要注意矩阵是否为方阵 2、具体思路&#xff1a;以圈数为循环条件&#xff0c;每一圈都坚持左闭右开的区间规则&#xff1b;当小的行列值为奇数&#xff0c;最后一圈为一行或一列或一个数字的不…...

Java8新特性整理记录

1、list实体集合根据某个属性分组后求和 方法一&#xff1a; list.stream().collect(Collectors.groupingBy(e -> e.getId())).values().stream().map(d -> {DemoEntity sampleData d.get(0);sampleData.setPremium(d.stream().map(s -> new BigDecimal(s.getPrem…...

43.227.196.1 RAID技术有什么意义?

RAID&#xff08;Redundant Array of Inexpensive Disks&#xff09;技术是一种数据存储技术&#xff0c;它通过将多个硬盘组合在一起&#xff0c;来提高数据存储的性能、可靠性和容错性。 RAID技术的主要意义包括&#xff1a; 提高数据读写性能&#xff1a;RAID技术可以将多…...

c++ qt--信号与槽(一) (第三部分)

c qt–信号与槽(一) &#xff08;第三部分&#xff09; 一.用qt自带的方法添加信号槽 1.第一种 1.如何添加 2.在何处进行绑定 2.第二种 1.如何添加 2.在何处进行绑定 而且会在mainwindow.h中添加槽函数的声明&#xff0c;在mainwindow.cpp中添加槽函数的定义 在mainwindow…...

LLM学习《Prompt Engineering for Developer》

Prompt 如何构造好的Prompt 分割符&#xff1a;分隔符就像是 Prompt 中的墙&#xff0c;将不同的指令、上下文、输入隔开&#xff0c;避免意外的混淆。你可以选择用 &#xff0c;“”"&#xff0c;< >&#xff0c; &#xff0c;: 等做分隔符&#xff0c;只要能明确…...

nginx-获取客户端IP地址

上有服务器与客户端中间是有nginx代理服务器的&#xff0c;上游服务器如何获取客户端真实ip地址&#xff1f; nginx代理服务器设置X-Forwarded-For的header参数&#xff0c;代理服务器通过remote_addr获取客户端ip地址&#xff0c;将ip地址写入nginx代理服务器的X-Forwarded-Fo…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

黑马Mybatis

Mybatis 表现层&#xff1a;页面展示 业务层&#xff1a;逻辑处理 持久层&#xff1a;持久数据化保存 在这里插入图片描述 Mybatis快速入门 ![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/6501c2109c4442118ceb6014725e48e4.png //logback.xml <?xml ver…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

【第二十一章 SDIO接口(SDIO)】

第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2

每日一言 今天的每一份坚持&#xff0c;都是在为未来积攒底气。 案例&#xff1a;OLED显示一个A 这边观察到一个点&#xff0c;怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 &#xff1a; 如果代码里信号切换太快&#xff08;比如 SDA 刚变&#xff0c;SCL 立刻变&#…...

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在离线机器上运行软件&#xff0c;所以得把软件用docker打包起来&#xff0c;大部分功能都没问题&#xff0c;出了一个奇怪的事情。同样的代码&#xff0c;在本机上用vscode可以运行起来&#xff0c;但是打包之后在docker里出现了问题。使用的是dialog组件&#xff0c;…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

算法岗面试经验分享-大模型篇

文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer &#xff08;1&#xff09;资源 论文&a…...