首页 > 编程语言 >C#知识整理-泛型

C#知识整理-泛型

时间:2024-12-26 16:44:15浏览次数:7  
标签:Exception C# ReturnResult 知识 ClassA 泛型 null public

泛型是为所存储或使用的一个或多个类型具有占位符(类型形参)的类、结构、接口和方法。泛型集合类可以将类型形参用作其存储的对象类型的占位符;类型形参呈现为其字段的类型和其方法的参数类型。 泛型方法可将其类型形参用作其返回值的类型或用作其形参之一的类型。 泛型的优点包括:代码的可重用性增加,类型安全性提高。 泛型方法 先从一个简单的例子开始 两个数字相加,如果不适用泛型,我们需要使用重载的方式定义方法,比如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 ClassA
    This 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}}
 */

  

 

标签:Exception,C#,ReturnResult,知识,ClassA,泛型,null,public
From: https://www.cnblogs.com/terry841119/p/18633453

相关文章

  • 详细讲解一下Rust中package、crate、module的概念
    在Rust中,package、crate和module是三个层次不同但又相互关联的概念,它们共同组成了Rust的代码组织和管理体系。以下是它们的详细介绍:1.Package(包)定义:一个package是一个由Cargo(Rust的构建工具和包管理器)管理的项目,包含一个或多个crate。核心文件:每个package至少......
  • C#知识整理-文件处理(基础)
    C#中提供处理文件的类库集中在System和System.IO,所以在处理文件之前需要引入对应类库VisualStudio提供nuget来安装对应的包搜索System.IO并进行安装,安装前请先检查支持的版本varfolder="d:\\testfolder";varfile="d:\\testfolder\\test.txt......
  • ftp与sftp server docker部署
    目录ftpserver配置项forwindowssftpserver配置项ftpserverversion:'3.9'services:vsftpd:image:fauria/vsftpdcontainer_name:vsftpdenvironment:-FTP_PASS=ftp-FTP_USER=ftp-LOG_STD......
  • VMware——mac下设置虚拟机共享文件夹
    前言按着VMware软件给的提示,设置好共享文件夹之后,在linux目录下没有看到文件夹,就想到了可能是没挂载的原因。内容基本的操作直接参考官方的即可,这里不做描述,直接贴图了,官方给的教程缺少了比较关键的一步,不过可能认为这个是常识,就没有放在文档里吧。基础步骤挂载步骤我这里......
  • VMware——mac下设置虚拟机共享文件夹
    前言按着VMware软件给的提示,设置好共享文件夹之后,在linux目录下没有看到文件夹,就想到了可能是没挂载的原因。内容基本的操作直接参考官方的即可,这里不做描述,直接贴图了,官方给的教程缺少了比较关键的一步,不过可能认为这个是常识,就没有放在文档里吧。基础步骤挂载步骤我这里......
  • 密码学领域三大经典难题:DLP、IFP 与 ECDLP
    离散对数问题(DLP)基本概念:在有限循环群\(G\)(通常是整数模\(p\)乘法群\(Z_p^*\),其中\(p\)为素数)中,给定一个生成元\(g\)和元素\(h=g^x\)(\(x\)为整数),离散对数问题是求出整数\(x\)。例如,在群\(Z_{17}^*\)中,生成元\(g=3\),如果\(h=12\),要求出满足\(3^x\equiv12\(mod\17)\)的\(......
  • centos 7修改网卡名称
    CentOS7修改网卡名称为eth模式目录CentOS7修改网卡名称为eth模式1、[root@localhost]#vi/etc/sysconfig/grub增加如下红色的字段2、修改完毕后,执行如下的命令:CentOS7之后版本的系统网卡名称默认为en开头的格式,某些情况下需要我们修改此格式为eth格式。1、[root@localhost......
  • CentOS7的udev的绑定规则
    CentOS7的udev的绑定规则说明因为udev绑定使用磁盘设备名称的时候,如果设备名称改变了,那么绑定可能会出现问题,考虑到这种场景,我们使用scsi_id绑定udevscsi_id无论你的磁盘设备名称如何改变,它都不会改变,可以唯一确定一个磁盘centos6及以前的版本语法实际上直接使用这些盘也是可......
  • Docker镜像优化
    1、概述Docker作为一款广受欢迎的容器化技术,为开发者提供了极大的便利。它能够将应用程序以及其全部的依赖项整合并打包,形成一个标准化的独立单元——镜像。对Docker镜像进行优化意义非凡,一方面可以显著降低镜像的存储空间占用,进而大幅提升其下载与部署的速率;另一方面,还......
  • Microsoft GraphRAG: Token使用量とコストの簡易分析
    MicrosoftGraphRAG:Token使用量とコストの簡易分析背景前提条件サンプルテキストChunk分割方法抽出するエンティティ・タイプ使用するLLMとコスト設定分析結果1.CreateBaseTextUnits2.ExtractGraph3.CreateFinalCommunityReports4.GenerateTextEmbedding......