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

C# 泛型详解

C# 泛型详解

      • 1、泛型概述
      • 2、定义泛型
      • 3、泛型的特性
      • 4、泛型委托
      • 5、泛型的优点

在 C# 中,泛型(Generic)是一种规范,它允许我们使用占位符来定义类和方法,编译器会在编译时将这些占位符替换为指定的类型,利用泛型的这一特性我们可以定义通用类(泛型类)或方法(泛型方法)。

1、泛型概述

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

2、定义泛型

定义通用类需要使用尖括号<>,这里的尖括号用于将类或方法声明为泛型。下面通过一个简单的示例来帮助您理解这个概念:

using System;
using System.Collections;
namespace c.biancheng.net
{// 定义泛型类class GenericClass<T>{// 泛型方法public GenericClass(T msg){Console.WriteLine(msg);}}class Demo{static void Main(string[] args){GenericClass<string> str_gen = new GenericClass<string>("薪薪代码");GenericClass<int> int_gen = new GenericClass<int>(1234567);GenericClass<char> char_gen = new GenericClass<char>('C');Console.ReadKey();}}
}

结果:

薪薪代码
1234567
C

3、泛型的特性

可以将泛型看作是一种增强程序功能的技术,泛型类和泛型方法兼具可重用性、类型安全性和效率,这是非泛型类和非泛型方法无法实现的。泛型通常与集合以及作用于集合的方法一起使用,System.Collections.Generic 命名空间下就包含几个基于泛型的集合类。下面总结了一些关于泛型的特性:
使用泛型类型可以最大限度地重用代码、保护类型的安全性以及提高性能;
泛型最常见的用途是创建集合类;
.NET 类库在 System.Collections.Generic 命名空间中包含几个新的泛型集合类,您可以使用这些类来代替 System.Collections 中的集合类;
您可以创建自己的泛型接口、泛型类、泛型方法、泛型事件和泛型委托;
您也可以对泛型类进行约束以访问特定数据类型的方法;
在泛型数据类型中所用类型的信息可在运行时通过使用反射来获取。
泛型方法

在上面的示例中我们已经使用了泛型类,除此之外我们可以通过类型参数声明泛型方法。下面通过示例程序来演示一下:

using System;
using System.Collections.Generic;
namespace c.biancheng.net
{class Demo{static void Swap<T>(ref T lhs, ref T rhs){T temp;temp = lhs;lhs = rhs;rhs = temp;}static void Main(string[] args){int a, b;char c, d;a = 10;b = 20;c = 'I';d = 'V';// 在交换之前显示值Console.WriteLine("调用 swap 之前的 Int 值:");Console.WriteLine("a = {0}, b = {1}", a, b);Console.WriteLine("调用 swap 之前的字符值:");Console.WriteLine("c = {0}, d = {1}", c, d);// 调用 swapSwap<int>(ref a, ref b);Swap<char>(ref c, ref d);// 在交换之后显示值Console.WriteLine("调用 swap 之后的 Int 值:");Console.WriteLine("a = {0}, b = {1}", a, b);Console.WriteLine("调用 swap 之后的字符值:");Console.WriteLine("c = {0}, d = {1}", c, d);Console.ReadKey();}}
}

结果:

调用 swap 之前的 Int 值:
a = 10, b = 20
调用 swap 之前的字符值:
c = I, d = V
调用 swap 之后的 Int 值:
a = 20, b = 10
调用 swap 之后的字符值:
c = V, d = I

4、泛型委托

我们还可以使用类型参数定义泛型委托,如下例所示:

delegate T NumberChanger<T>(T n);

【示例】下面通过示例演示泛型委托的使用:

using System;
using System.Collections.Generic;
namespace c.biancheng.net
{class Demo{delegate T NumberChanger<T>(T n);static int num = 10;public static int AddNum(int p){num += p;return num;}public static int MultNum(int q){num *= q;return num;}public static int getNum(){return num;}static void Main(string[] args){// 创建委托实例NumberChanger<int> nc1 = new NumberChanger<int>(AddNum);NumberChanger<int> nc2 = new NumberChanger<int>(MultNum);// 使用委托对象调用方法nc1(25);Console.WriteLine("Num 的值为: {0}", getNum());nc2(5);Console.WriteLine("Num 的值为: {0}", getNum());Console.ReadKey();}}
}

结果:

Num 的值为: 35
Num 的值为: 175

5、泛型的优点

在公共语言运行时和 C# 语言的早期版本中,通用化是通过在类型与通用基类型 Object 之间进行强制转换来实现的,泛型提供了针对这种限制的解决方案。通过创建泛型类,您可以创建一个在编译时类型安全的集合。
使用非泛型集合类的限制可以通过编写一小段程序来演示,该程序使用 .NET Framework 类库中的 ArrayList 集合类。 ArrayList 是一个使用起来非常方便的集合类,无需进行修改即可用来存储任何引用或值类型。

// The .NET Framework 1.1 way to create a list:
System.Collections.ArrayList list1 = new System.Collections.ArrayList();
list1.Add(3);
list1.Add(105);System.Collections.ArrayList list2 = new System.Collections.ArrayList();
list2.Add("It is raining in Redmond.");
list2.Add("It is snowing in the mountains.");

相关文章:

C# 泛型详解

C# 泛型详解1、泛型概述2、定义泛型3、泛型的特性4、泛型委托5、泛型的优点在 C# 中&#xff0c;泛型&#xff08;Generic&#xff09;是一种规范&#xff0c;它允许我们使用占位符来定义类和方法&#xff0c;编译器会在编译时将这些占位符替换为指定的类型&#xff0c;利用泛型…...

数据仓库相关术语

数据仓库数据集市事实维度级别数据清洗数据采集数据转换联机分析处理(OLAP OnlineAnalytical Processing )切片切块星型模式雪花模式粒度度量度量值口径指标 原子指标&#xff1a;派生指标衍生指标标签自然键持久键代理键退化维度下钻上卷T0与T1数据挖掘数据科学家总线架构总线…...

【IDEA】常用快捷键

代码补全 快捷键说明sout快速输出System.out.println();psvm快速输出public static void main(String[] args) {}Ctrl Alt Space代码补全 编辑类 快捷键说明Shift Enter向下键入一行&#xff0c;并将光标移到下一行的开头Ctrl Alt Enter当前行上方生成空行&#xff0c;并…...

【调试】sysRq按键使用方法

SysRq键简介 SysRq键是一个魔术案件&#xff0c;只要在内核没有完全卡死的情况下&#xff0c;内核都会相应SysRq 键的输入&#xff0c;使用这些组合键都可以搜集包括系统内存使用、CPU任务处理、进程运行状态等系统运行信息。 配置 内核配置选项中要使能CONFIG_MAGIC_SYSRQ选…...

Jenkins Pipeline 语法

官网 ## https://www.jenkins.io/doc/book/pipeline/ 参考文章 ## https://www.jianshu.com/p/215584419f3d 根据Jenkins官网Pipeline给出的解释&#xff0c; 流水线语法分为两种&#xff0c; 一种是声明式流水线&#xff08;Declarative Pipeline&#xff09;另一种是脚本…...

rust语言实现超级简单的杀毒软件,通过哈希扫描病毒。

以下是一个简单的rust语言程序&#xff0c;用于扫描病毒文件并使用哈希表进行比较。该程序可以扫描指定目录中的所有文件&#xff0c;并查找其中是否包含特定的病毒文件。程序可以通过计算文件哈希值并将其与已知的病毒哈希值进行比较来确定文件是否是病毒。注意&#xff0c;这…...

Git仓库中的常用命令

1.第一次使用Git软件前&#xff0c;告诉Git你是谁 git config --global user.name "自定义用户名" git config --global user.email "用户邮箱" 2.查看配置列表 git config --list 3.初始化一个Git仓库&#xff0c;用来管理当前项目 git i…...

arduino和stm32和51和TSM32的区别,树莓派和jetson nano的区别

本科时段接触过很多嵌入式的微处理器和微控制器&#xff0c;但对其使用场景和区别一直没有一个总结&#xff0c;这次收集了一些信息在这总结一下。 Arduino、STM32、51、TMS320和树莓派和jetson nano都是不同的嵌入式系统&#xff0c;它们之间有以下的区别&#xff1a; 开发难度…...

如何进行nginx的负载配置

示例&#xff1a;//多机负载策略&#xff1a;加权轮询(适用于服务器无状态,并且服务器硬件配置不均衡的场景)upstream setServ { server 47.100.110.58:80 weight1; server 47.100.110.59:8080 weight4; }location / {//转发到负载服务上proxy_pass http://setServ;}注意&#…...

从功能测试进阶自动化测试,熬夜7天整理出这一份3000字超全学习指南

一、为什么要学习自动化测试&#xff1f; 如果在前两年&#xff0c;可能10个测试员有6个都是做的功能测试&#xff0c;但随着测试技术的发展以及测试工作的深入&#xff0c;传统的手工测试已经无法满足多模块的测试需求&#xff0c;所以为了提高测试效率和测试质量&#xff0c…...

[NOIP2011 提高组] 铺地毯

[NOIP2011 提高组] 铺地毯 题目描述 为了准备一个独特的颁奖典礼&#xff0c;组织者在会场的一片矩形区域&#xff08;可看做是平面直角坐标系的第一象限&#xff09;铺上一些矩形地毯。一共有 n 张地毯&#xff0c;编号从 1 到 n。现在将这些地毯按照编号从小到大的顺序平行于…...

mac下ElasticSearch 集群搭建,使用Kibana配置和管理集群

Elasticsearch如果做集群的话Master节点至少三台服务器或者三个Master实例加入相同集群&#xff0c;三个Master节点最多只能故障一台Master节点&#xff0c;如果故障两个Master节点&#xff0c;Elasticsearch将无法组成集群.会报错&#xff0c;Kibana也无法启动&#xff0c;因为…...

【软件测试】自动化测试的追求,水土不服?看看资深测试咋说的......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 大部分测试初学者入…...

Mac mini 外接移动硬盘无法显示,磁盘工具装载报错显示 com apple diskmanagement disenter

使用“启动安全性实用工具”可确保 Mac 始终从您指定的启动磁盘以及合法的受信任操作系统启动。 如果您使用的是配备 Apple T2 安全芯片的 Mac&#xff0c;则“启动安全性实用工具”提供以下三项功能来帮助保护您的 Mac 免受未经授权的访问&#xff1a;固件密码保护、安全启动…...

【图像处理OpenCV(C++版)】——4.6 限制对比度的自适应直方图均衡化

前言&#xff1a; &#x1f60a;&#x1f60a;&#x1f60a;欢迎来到本博客&#x1f60a;&#x1f60a;&#x1f60a; &#x1f31f;&#x1f31f;&#x1f31f; 本专栏主要结合OpenCV和C来实现一些基本的图像处理算法并详细解释各参数含义&#xff0c;适用于平时学习、工作快…...

设计模式--工厂模式

这种类型的设计模式属于创建型模式&#xff0c;它提供了一种创建对象的最佳方式。在工厂模式中&#xff0c;我们在创建对象时不会对客户端暴露创建逻辑&#xff0c;并且是通过使用一个共同的接口来指向新创建的对象。   工厂模式主要使用了C的多态特性。将存在继承关系的类&a…...

算法笔记(十三)—— 树形DP及Morris遍历

树形DP&#xff1a; Question1: 以X为头结点的树&#xff0c;最大距离&#xff1a; 1. X不参与&#xff0c;在左子树上的最大距离 2. X不参与&#xff0c;在右子树上的最大距离 3. X参与&#xff0c;左树上最远的结点通过X到右树最远的结点 最后的结果一定是三种情况的最大…...

【Classical Network】EfficientNetV2

原文地址 原文代码 pytorch实现1 pytorch实现2 详细讲解 文章目录EfficientNet中存在的问题NAS 搜索EfficientNetV2 网络结构codeEfficientNet中存在的问题 训练图像尺寸大时&#xff0c;训练速度非常慢。train size 512, batch 24时&#xff0c;V100 out of memory在网络浅…...

索引类型FULLTEXT、NORMAL、SPATIAL、UNIQUE的区别

SQL索引的创建及使用请移步另一篇文章 (188条消息) SQL索引的创建及使用_sql索引的建立与使用_t梧桐树t的博客-CSDN博客 索引的种类 NORMAL 表示普通索引&#xff0c;大多数情况下都可以使用 UNIQUE 表示唯一索引&#xff0c;不允许重复的索引&#xff0c;如果该字段信息…...

稳定、可控、高可用:运维最应该加持哪些技术 buff?

如何保障开发需求高效交付&#xff0c;系统高峰扛得住、长期平稳&#xff0c;是项目组中的每位技术人必须面对的问题。 本文大纲 1、强稳定性Buff 2、风控服务实时性Buff 3、高资源利用率Buff 1.强稳定性Buff 强稳定性背后有三大挑战&#xff0c;其一是应对发布变更引起故障问…...

2026年上海,这些行业内正规的GEO企业,你知道有哪些吗?

在上海这座充满活力与创新的城市&#xff0c;GEO&#xff08;地理信息&#xff09;行业发展得如火如荼。随着科技的不断进步&#xff0c;地理信息技术在各个领域的应用越来越广泛&#xff0c;众多正规的GEO企业也如雨后春笋般涌现。今天&#xff0c;就让我们一起来了解一下上海…...

2026-04-03期 AI最新资讯

2026年4月3日 AI资讯日报 每日精选人工智能领域最新动态&#xff0c;带你快速掌握技术突破、产品发布与行业趋势。&#x1f680; 技术突破 Meta 发布 Llama 4 系列开源大模型 Meta 今日正式推出 Llama 4 系列&#xff0c;包含三个版本&#xff1a;Llama 4 Mini、Llama 4 Base 和…...

想搞懂AI智能体?小白也能看懂的四大核心模块,速收藏!

想搞懂AI智能体到底是怎么工作的&#xff1f;其实不用死磕复杂的技术文档&#xff0c;今天就用通俗的话&#xff0c;把它的核心架构拆明白&#xff0c;新手也能轻松看懂。 不管是我们常听说的LLM&#xff08;大语言模型&#xff09;驱动的智能体&#xff0c;还是各类自主决策AI…...

12306高铁票API预定接口开发文档

接口地址: http://接口域名/train/queryLeftTicket 返回格式: json 请求方法: get/post 请求示例: http://接口域名/train/queryLeftTicket?appKey=您申请的APPKEY&fromStation=苏州&toStation=昆山&fromDate=2023-12-15 请求参数: 参数名称 类型 必填 说明 …...

解锁论文写作新境界:书匠策AI——学术探索的智能导航灯

在学术的浩瀚海洋中&#xff0c;每一位研究者、学生乃至教育博主&#xff0c;都如同勇敢的航海家&#xff0c;驾驶着知识的船只&#xff0c;追寻着真理的彼岸。然而&#xff0c;论文写作这一航程中的关键环节&#xff0c;往往让许多人感到迷茫与挑战重重。今天&#xff0c;就让…...

开源工具cursor-free-vip:突破Cursor API限制的无限制使用指南

开源工具cursor-free-vip&#xff1a;突破Cursor API限制的无限制使用指南 【免费下载链接】cursor-free-vip [Support 0.45]&#xff08;Multi Language 多语言&#xff09;自动注册 Cursor Ai &#xff0c;自动重置机器ID &#xff0c; 免费升级使用Pro 功能: Youve reached …...

三千年的欲望、痕迹与自感:资本批判与伦理中间件

三千年的欲望、痕迹与自感&#xff1a;资本批判与伦理中间件岐金兰 丙午神农---引言&#xff1a;被命名的与未命名的在人类文明的长河中&#xff0c;有一个东西从未缺席&#xff0c;却长期被剥夺了命名的权利。它比语言更古老&#xff0c;比理性更顽强&#xff0c;比任何社会制…...

PHP 8新特性盘点

PHP 8 新特性概览PHP 8 引入了多项重大改进和新功能&#xff0c;以下为关键特性总结&#xff1a;JIT 编译器即时编译&#xff1a;通过 JIT&#xff08;Just-In-Time&#xff09;编译器提升性能&#xff0c;尤其适用于 CPU 密集型任务。配置选项&#xff1a;在 php.ini 中可通过…...

零基础友好:跟着快马生成的交互式脚本轻松完成openclaw安装入门

作为一个刚接触编程的新手&#xff0c;第一次安装openclaw这样的工具时&#xff0c;面对复杂的命令行操作和可能出现的各种错误&#xff0c;确实容易感到手足无措。最近我在InsCode(快马)平台上发现了一个特别适合新手的交互式安装教程项目&#xff0c;它把整个安装过程变成了一…...

Kimi-VL-A3B-Thinking实战教程:Chainlit中集成历史对话与文件上传功能

Kimi-VL-A3B-Thinking实战教程&#xff1a;Chainlit中集成历史对话与文件上传功能 1. 引言&#xff1a;让图文对话模型真正“好用”起来 如果你已经用vllm部署了Kimi-VL-A3B-Thinking这个强大的图文对话模型&#xff0c;并且通过Chainlit搭建了前端界面&#xff0c;那么恭喜你…...