C#知识整理-泛型

news/2024/12/26 16:34:28/文章来源:https://www.cnblogs.com/terry841119/p/18633453
泛型是为所存储或使用的一个或多个类型具有占位符(类型形参)的类、结构、接口和方法。泛型集合类可以将类型形参用作其存储的对象类型的占位符;类型形参呈现为其字段的类型和其方法的参数类型。 泛型方法可将其类型形参用作其返回值的类型或用作其形参之一的类型。
泛型的优点包括:代码的可重用性增加,类型安全性提高。
泛型方法
先从一个简单的例子开始
两个数字相加,如果不适用泛型,我们需要使用重载的方式定义方法,比如float,double,decimal,int,都需要单独写一个重载
使用泛型只需要定义一个泛型方法,接受对应的形参就可以完成
    internal static class Math{public static T Add<T>(T a, T b) where T:INumber<T> {return a + b;}public static int Add(int a , int b) {  return a + b; }public static decimal Add(decimal a, decimal b) { return a + b; }}Console.WriteLine($"1+4={Math.Add<int>(1, 4)}");
Console.WriteLine($"1.1+4.5={Math.Add<decimal>(1.1m, 4.5m)}");
Console.WriteLine($"1+4={Math.Add(1, 4)}");
Console.WriteLine($"1.1+4.5={Math.Add(1.1m, 4.5m)}");
/*
* output:
1+4=5
1.1+4.5=5.6
1+4=5
1.1+4.5=5.6
*/

  

泛型类/泛型接口
类和接口也可以是泛型
internal class ClassA: InterfaceA
{ public ClassA() { }public void ShowMessage(){Console.WriteLine("This is ClassA");}
}
internal class ClassA<T> : ClassA,InterfaceA
{public T Data;public ClassA() { }public ClassA(T arg){Data = arg;}public void ShowMessage() {Console.WriteLine($"This is Generic ClassA, with data:{Data}");}
}internal interface InterfaceA
{void ShowMessage();
}ClassA a1=new ClassA();
a1.ShowMessage();
ClassA<int> a2=new ClassA<int>(2);
a2.ShowMessage();
/** output:This is ClassAThis is Generic ClassA, with data:2*/

  

下面做一个个人觉得比较实际的泛型使用方式
定义一个通用的返回值泛型类,作为一个实例,应该很多项目里都有类似的结构
public class ReturnResult
{public bool Success { get; set; }public string Code { get; set; }public string Message { get; set; }public Exception Exception { get; set; }public ReturnResult(){Success=false;}
}public class ReturnResult<T> : ReturnResult {/// <summary>/// default constructor/// </summary>public ReturnResult() : base(){}/// <summary>/// Data/// </summary>public T Data { get; set; }
}public class Person {public string Name { get; set; }public int Age { get; set; }public override string ToString(){return $"this is person {Name}, age:{Age}";}
}public class PersonService { public ReturnResult<Person> GetPerson(string name, int age) {var result = new ReturnResult<Person>();result.Data= new Person() { Name = name, Age = age };result.Success = true;return result;}public ReturnResult<Person> GetPersonFailure(){var result = new ReturnResult<Person>();try {throw new Exception("Exception in GetPersonFailure");} catch (Exception ex) { result.Exception= ex;}return result;}
}var _personService=new PersonService();
var getPersonResult1 = _personService.GetPerson("PersonA", 20);
var getPersonResult2 = _personService.GetPersonFailure();
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(getPersonResult1));
Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(getPersonResult2));
/** output:{"Data":{"Name":"PersonA","Age":20},"Success":true,"Code":null,"Message":null,"Exception":null}{"Data":null,"Success":false,"Code":null,"Message":null,"Exception":{"ClassName":"System.Exception","Message":"Exception in GetPersonFailure","Data":null,"InnerException":null,"HelpURL":null,"StackTraceString":"   at Learn.CSharp.Generic.PersonService.GetPersonFailure() in D:\\Learn\\C#Learning\\Learn.CSharp.Basic\\Learn.CSharp.Generic\\ReturnResult.cs:line 59","RemoteStackTraceString":null,"RemoteStackIndex":0,"ExceptionMethod":null,"HResult":-2146233088,"Source":"Learn.CSharp.Generic","WatsonBuckets":null}}*/

  

 

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

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

相关文章

适合小团队协作的开源在线项目管理系统推荐【任务管理与进度追踪】

对于小团队而言,高效协作是项目顺利推进的关键所在,而一款契合的开源在线项目管理系统,无疑能在任务管理与进度追踪方面发挥巨大作用,助力团队成员有条不紊地开展工作,提升整体效率。当下市场上有诸多此类优秀的开源工具可供选择,本文就将为小团队推荐几款,帮助大家找到…

Centos7创建LVM磁盘管理

Centos7创建LVM磁盘管理 2019-06-02阅读 3840 环境介绍 在centos7下需要挂载两个新的磁盘。为了方便后续的扩容方便,决定将这其设置为LVM管理的方式。 查看一下当前有哪些新增的数据盘,如下: [root@runsdata-test-0004 ~]# df -h Filesystem Size Used Avail Use% Mou…

iostat命令详解

iostat命令详解 简介 iostat主要用于监控系统设备的IO负载情况,iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。用户可以通过指定统计的次数和时间来获得所需的统计信息。 iostat可以提供更丰富的IO性能状态数据,i…

学习笔记(四十九):Text常用场景

1、设置文本断行及折行Text(this.content).fontSize(14).textAlign(TextAlign.End).textOverflow({ overflow: TextOverflow.Ellipsis }).wordBreak(WordBreak.BREAK_WORD).maxLines(this.contentMaxLine) 作者:听着music睡出处:http://www.cnblogs.com/xqxacm/Android交流群…

VS2022 + OpenSSL 3.0实现DES、AES、RSA加密

​ 一、DES加密 #include <openssl/des.h> #include <cstdio> #include <iostream> #include <cstdlib> #include <iomanip> #define MAX_LINE 1024 #pragma warning(disable : 4996)using namespace std;signed main() {const_DES_cblock key …

SARscape洪水分类工具使用说明

SARscape6.1新增洪水分类工具,可以从多时相SAR数据提取洪水信息。工具主要使用了模糊分类技术——模糊C均值分类器(FCM),可加入坡度参数去除阴影的影响。 本文以洪水前后哨兵1数据为例,介绍洪水分类工具的使用。如下图为洪水发生前后两期已经经过预处理的后向散射系数图像…

汽车以旧换新政策的数字化协同解决方案

随着《汽车以旧换新补贴政策》的落地实施,汽车市场迎来了新的增长机遇。政策驱动与市场竞争的双重压力下,如何在短时间内整合资源、抢占市场先机,成为汽车经销商和销售团队的共同挑战。借助在线协同工具,企业能够打破部门与组织边界,实现从政策到执行全流程的高效管理,为…

36MT160-ASEMI开关电源整流方桥36MT160

36MT160-ASEMI开关电源整流方桥36MT160编辑:ll 36MT160-ASEMI开关电源整流方桥36MT160 型号:36MT160 品牌:ASEMI 封装:D-63 特性:插件整流方桥 正向电流:35A 反向耐压:1600V 恢复时间:>2000ns 引脚数量:5 芯片个数:4 芯片尺寸:50MIL 浪涌电流:500A 漏电流:>10…

java8--方法--格式化输出--printf

System.out.printf("%,.2f",10000.0 / 3.0); 效果图:ps: 在分隔符后可以指定字符串长度 System.out.printf("%,10.2f",10000.0 / 3.0); 效果图:

JDBC核心6步

1JDBC简介 java DataBase Connectivity,又称java数据库连接是独立于任何数据库管理系统的api java提供接口规范,由各个数据库厂商提供接口的实现,厂商提供的实现封装成jar文件,也就是我们俗称的数据库驱动jar包 学习JDBC,充分体现了面向接口编程的好处2.JDBC核心6步 1.注册…

【python应用】基于 Python 的远程管理工具:PyChi 远程管理系统

一、引言 在现代 IT 环境中,远程管理工具是开发者和运维人员必不可少的利器。本文将为大家介绍一个基于 Python 构建的多功能远程管理工具 PyChi,它能够让你轻松地对远程客户端进行管理操作,包括文件管理、系统命令执行、截图、录音等功能。二、软件简介 PyChi 是一个基于异…

Hexo-Github-pages-实现个人博客

Hexo + Github pages 实现个人博客 一、过程总览和回顾 我是新手,2024/12/21号尝试着自己搭建自己的个人博客网站,起初是只想着在自己本地电脑环境上搭建 一开始使用了Hugo,据说是世界上最快的静态网页生成器,但是捣鼓了一个下午,无功而返第一个原因:阅读官方文档不够仔细…