【C#】泛型

【C#】泛型

泛型是什么

泛型是将类型作为参数传递给类、结构、接口和方法,这些参数相当于类型占位符。当我们定义类或方法时使用占位符代替变量类型,真正使用时再具体指定数据类型,以此来达到代码重用目的。

泛型特点

  1. 提高代码重用性
  2. 一定程度避免装箱拆箱

泛型分类

声明 泛型类 基本语法:

class 类名<泛型占位字母>

声明 泛型结构 基本语法:

struct 结构名<泛型占位字母>

声明 泛型接口 基本语法:

interface 接口名<泛型占位字母>

声明 泛型函数 基本语法:

函数名<泛型占位字母>(参数列表)
注意:泛型占位字母可以有多个,用逗号分开

代码展示

1. 泛型类

class TestClass<T>
{public T value;
}
class TestClass2<T1, T2, K, J>
{public T1 value1;public T2 value2;public K value3;public J value4;
}
class Program
{static void Main(string[] args){//使用时必须指定具体数据类型,如:int类型TestClass<int> t = new TestClass<int>();t.value = 5;Console.WriteLine(t.value);//输出:5//再创建一个对象,将泛型指定为string类型,这里说明泛型可以提高代码重用性TestClass<string> t2 = new TestClass<string>();t2.value = "123456";Console.WriteLine(t2.value);//输出:123456//创建一个有多个泛型类的对象TestClass2<int, string, bool, TestClass<float>> t3 = new TestClass2<int, string, bool, TestClass<float>>();Console.ReadLine();}
}

2. 泛型结构体

struct TestStruct<T>
{public T value;
}
class Program
{static void Main(string[] args){//创建结构体对象TestStruct<bool> ts = new TestStruct<bool>();Console.WriteLine(ts.value);//输出:FalseConsole.ReadLine();}
}

3. 泛型接口及类继承

interface TestInterface<T>
{T value{get;set;}
}class Test : TestInterface<int>
{private int myValue;public int value {get{return myValue;}set{myValue = value;}}
}
class Program
{static void Main(string[] args){//创建接口实例,Test类是实现 指定泛型为int类型的接口 的类,所以创建接口实例时,泛型指定类型必须与Test类指定的泛型类型一致 即int类型TestInterface<int> it = new Test();it.value = 100;Console.WriteLine(it.value);//输出:100Console.ReadLine();}
}

创建接口实例时,泛型指定类型必须与Test类指定的泛型类型不一致时,会报错。
在这里插入图片描述

4. 泛型方法

  1. 普通类中的泛型方法
class Test2
{//泛型作为参数传递public void TestFun<T>(T value){Console.WriteLine(value);}//泛型作为返回值public T TestFun<T>(bool v){return default(T);}//泛型既不作为参数传递 也不作为返回值public void TestFun<T>(){//用参数类型在里面进行逻辑处理,例如:T t = default(T);//获得类型的默认值方法:default()Console.WriteLine(t);}//多个泛型作为参数传递public void TestFun<T, K, M>(T t, K k, M m){}
}
class Program
{static void Main(string[] args){//创建Test2对象Test2 tt = new Test2();tt.TestFun<float>(12.5f);//作为参数传递时 输出:12.5tt.TestFun<string>(true);//作为返回值tt.TestFun<int>();//既不作为参数传递 也不作为返回值  输出:0tt.TestFun<int, double, bool>(1, 8.888888, false);//多个作为参数传递Console.ReadLine();}
}
  1. 泛型类中的泛型方法
//Test2 与 Test2<T> 名字一样但是后者有泛型,就相当于新的类,两个类是不一样的
class Test2<T>
{public T value;//这个不叫泛型方法 因为 T是泛型类声明的时候 就指定的 在使用这个函数的时候 不能进行动态变化public void TestFun(T t){Console.WriteLine("No :" + t);}//这个才是泛型方法 一直是方法名后面加了尖括号并且有占位符public void TestFun<K>(K k){Console.WriteLine("YES :" + k);}
}class Program
{static void Main(string[] args){Test2<int> tt2 = new Test2<int>();//这两个不是同一个方法tt2.TestFun(156);//输出:No :156tt2.TestFun<int>(156);//输出:YES :156//这两个同一个方法tt2.TestFun<string>("123");//输出:YES :123tt2.TestFun("789");//输出:YES :789}
}

tt2.TestFun(156); 与 tt2.TestFun(156); 调用的方法如下:
在这里插入图片描述
tt2.TestFun(“123”); 与 tt2.TestFun(“789”); 调用的方法如下:
在这里插入图片描述

【tt2】是一个泛型为【int类型】的【Test2】对象,使用tt2.TestFun()方法时,传入的参数与对象的泛型一致时,则会调用【public void TestFun(T t)】。传入的参数与对象的泛型不一致时,则会调用同名的泛型方法【public void TestFun<K>(K k)】,且调用时可以省略尖括号【<>】,通过参数直接判断该方法的泛型数据类型。

小结

  1. 声明泛型时,就是一个任意类型的占位符,真正起作用是在使用它时。
  2. 泛型占位符至少有一个,可以有无数个,多个时用逗号分隔开。
  3. 文章提到的default目的是用来获取任意类型的默认值的。

因为作者精力有限,文章中难免出现一些错漏,敬请广大专家和网友批评、指正。

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

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

相关文章

1.初识爬虫

爬虫是批量模拟网络请求的程序&#xff0c;想百度谷歌这种搜索类网站本质上就是爬虫 使用爬虫的时候不应该对别人的网站有严重的影响&#xff0c;比如你爬的频率太高了&#xff0c;让人家的网站崩溃了。不应该爬取网页上显示不到的内容&#xff0c;比如有一个直播的网站&#…

点云从入门到精通技术详解100篇-伪雷达点云预测

前言 近年来,“自动驾驶”已经成为一个耳熟能详的词语,它是一种通过车载计 算实现无人驾驶的智能汽车系统。自动驾驶汽车依靠人工智能、视觉计算、视觉 传感器、控制设备和定位系统协同合作,让系统可以在无人主动操作的情况下, 自动安全地操作机动车辆。其中视觉传感器作…

MySQL误删数据 回滚

前言 生产环境数据库不允许删除表&#xff0c;可以将表修改成 XXX_to_delete 如果误删简单数据&#xff0c;可以考虑使用binlog恢复 一、查看命令 1.查看binlog是否开启 show variables like log_bin;切换到MySQL安装目录,查看mysqlbinlog日志文件 2.查看所有 binlog 日志…

MySQL之MHA高可用配置及故障切换

目录 一、什么是MHA 二、MHA的组成 1、MHA Node&#xff08;数据节点&#xff09; 2、MHA Manager&#xff08;管理节点&#xff09; 三、MHA的特点 四、MHA工作原理总结 五、MHA实验演示 一、什么是MHA MHA&#xff08;MasterHigh Availability&#xff09;是一套优秀的…

正方实践系统打卡

Use HTTP (已完成) &#x1f4dc; 使用指南 &#x1f6d6; 项目结构 log 日志文件 use 使用情况 (待) data.py 数据 log.py 日志 main.py 主函数 只需要修改data.py文件内容即可&#xff1a; header ——> 头文件 User-AgentCookieAccept user ——> 用户信息 ZFT…

GRU门控循环单元

GRU 视频链接 https://www.bilibili.com/video/BV1Pk4y177Xg?p23&spm_id_frompageDriver&vd_source3b42b36e44d271f58e90f86679d77db7Zt—更新门 Rt—重置门 控制保存之前一层信息多&#xff0c;还是保留当前神经元得到的隐藏层的信息多。 Bi-GRU GRU比LSTM参数少 …

手写Spring:第13章-把AOP扩展到Bean的生命周期

文章目录 一、目标&#xff1a;把AOP扩展到Bean的生命周期二、设计&#xff1a;把AOP扩展到Bean的生命周期三、实现&#xff1a;把AOP扩展到Bean的生命周期3.1 工程结构3.2 AOP动态代理融入Bean的生命周期类图3.3 定义Advice拦截器链3.3.1 定义拦截器链接口3.3.2 方法拦截器链接…

Python综合案例(动态柱状图)

一、基础柱状图 基本代码&#xff1a; """ 演示基础柱状图的开发 """ from pyecharts.charts import Bar from pyecharts.options import LabelOpts # 使用Bar构建基础柱状图 bar Bar() # 添加x轴的数据 bar.add_xaxis(["中国", &q…

js如何实现数组去重的常用方法

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 使用 Set&#xff08;ES6&#xff09;⭐ 使用 filter 和 indexOf⭐ 使用 reduce⭐ 使用对象属性⭐ 使用 includes 方法&#xff08;ES6&#xff09;⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方…

前端开发从 0 到 1 掌握 docker

文章目录 前端从 0 到 1 掌握 docker一、docker 的一些基础概念概念定义question&#xff1a;什么是docker&#xff1f; 为什么要使用docker&#xff1f; 二、实战操作 (墙裂建议读者实操一遍)Part1 - Linux CentOS 服务安装 DockerPart2 - 启动、使用、查看等命令Part3 - 示例…

探索多线程编程:线程的本质、状态和属性

目录 什么是线程线程状态新建线程可运行线程阻塞和等待线程终止线程 线程属性优先级线程名守护线程中断线程未捕获异常的处理器 在现代计算机编程中&#xff0c;多线程是一个重要而强大的概念。它使得我们能够更有效地利用多核处理器、提高程序性能并实现并发操作。 什么是线程…

route命令小结

Destination: 如果不满足该列的任何一个ip,则走默认的default Gataway: *是 不指定gateway.有的系统是0.0.0.0,与*意义相同 Genmask: 0.0.0.0是不指定掩码, 255.255.0.0掩码了16位,172.17 开头的ip,会走这个网关 255.255.255.0掩码了16位,192.168.0 开头的ip都会走这个网关 当是…