【C#基础教程】第二十一章、泛型

SAP-PLM传输MBOM传输至SAP BOM 项目文本 (行 2)PLM创建及修改BOM接口。PLM 创建BOM接口抬头。BOM 项目文本(行1)PLM 创建BOM接口抬头。PLM BOM 错误消息。PLM BOM接口组件。组件数量 (BTCI) 阅读详情

目录

泛型

1.泛型(generic)

2.泛型详解

2.1 类型参数T

2.2 泛型中的静态字段和静态函数问题

2.3类型参数的约束(where关键字)

2.3.1 引用类型约束

2.3.2 值类型约束

2.3.3 构造函数类型约束

2.3.4 转换类型约束


泛型

1.泛型(generic)

  泛型的意义:委托可以让方法参数化,泛型可以让类型参数化。泛型代表的是通用类型,它可以代替任意的数据类型,使类型参数化,从而达到只实现一个方法就可以操作多种数据类型的目的。

  使用泛型的好处:泛型可以避免不同类型转换时带来的数据损失,提供了更好的性能和类型安全特性。

  泛型的定义:泛型将方法实现行为与方法操作的数据类型分离,实现代码重用。

  用.NET类库声明并初始化泛型的语法:        List<T>  变量名  =  new List<T>();

  泛型类声明并初始化的语法:                class  类名1<T>  where T:类名2{...}

  泛型方法声明并初始化的语法:          static  T  方法名(T 形参, ...){...}

  泛型语法解读:

  • List<T> 是.NET类库中实现的泛型类型
  • T是泛型参数(可以理解为形参)
  • 类名<T>是泛型类
  • where是类型参数的约束,它用来使类型参数可以适用于类型2中的方法。

  泛型的示例:

class Program
{
    static void Main(string[] args)
    {
        //用int作为实际参数来初始化泛型类型
        List<int> intList=new List<int>();
        //从int列表添加元素3
        intList.Add(3);

        //用string作为实际参数来初始化泛型类型
        List<string> stringList=new List<string>();
        //从string列表添加元素3
        stringList.Add("3");
    }
}

  泛型的使用:用泛型来写比较两数大小的方法

//泛型类
public class Compare<T> where T:ICompare
{
    //泛型方法
    public static T compareGeneric(T a1,T a2)
    {
        if(a1.CompareTo(a2)>0)
        {
            return a1;
        }
        else
            return a2;
    }
}
public class Program
{
    static void Main(string[] args)
    {
        //调用泛型方法
        Console.WriteLine(Compare<int>.compareGeneric(1,3));
        Console.WriteLine(Compare<string>.compareGeneric("a","as"));
    }
}

2.泛型详解

2.1 类型参数T

  类型参数T的定义:类型参数T是泛型参数(可以理解为形参)。它是一个可被数据类型替代的参数,当我们调用泛型时,我们需要初始化T,替代T的数据类型(如int、string等)可以被看做实参。

  使用类型参数T时的两种情况:

  • 泛型分为两类:未绑定的泛型、已构造的泛型
    • 未绑定的泛型:没有T被替代
    • 已构造的泛型:有T被替代
  • 已构造的泛型分为两种:开放类型、封闭类型
    • 开放类型:有T被替代,但未全被替代。
    • 封闭类型:T全被替代。

  注意:当你用 数据类型1 替代 类型参数T 后,泛型数组中的列表不能容纳 数据类型1 以外的数据类型变量。

2.2 泛型中的静态字段和静态函数问题

问:静态数据类型是属于类型的。对于静态数据而言,一个类只有一份。对于泛型类型,静态类也只有一份吗?

答:不,每个封闭的泛型类型都有仅属于自己的静态数据。

2.3类型参数的约束(where关键字)

  类型参数约束的意义:当我们需要在泛型类中从别的类调用方法的时候,我们的类型参数T未为任意类型,而有的类型并没有提供想要调用的方法,此时编译器会报错。而where的存在可以把T类型的范围控制在可以调用方法的类型中。

  where关键字的作用:限制某个类型实参的类型。

  C#的四种约束:引用类型约束、值类型约束、构造函数类型约束、转换类型约束。

2.3.1 引用类型约束

  引用类型约束的语法:        T:class

   引用类型约束的作用:它确保传递的类型实参必须是引用类型。

2.3.2 值类型约束

  值类型约束的语法:        T:struct

    值类型约束的作用:它确保传递的类型实参必须是值类型。(包括枚举,不包括可空类型     )

2.3.3 构造函数类型约束

  构造函数类型约束的语法:        T:new()

    构造函数类型约束的作用:它确保传递的类型实参必须是构造函数类型。

    使用构造函数类型约束的要求:

  • 若有多个约束,则此约束必须放在最后。

2.3.4 转换类型约束

  转换类型约束的语法:        T:基类名、T:接口名、T:U

  转换类型约束语法解读: 

  • T:基类名:确保传递的类型实参必须是基类或其基类的派生类
  • T:接口名:确保指定的类型实参必须是接口或实现了该接口的类
  • T:U        :确保指定的类型实参必须是U提供的类型实参或派生于U提供的类型实参

示例:

AI智能体丨使用Coze一键生成爆款书单视频,3个月内获赞131.1w!(附保姆级教程) 这篇教程详细介绍了如何使用扣子(Coze)平台的AI智能工作流批量制作爆款书单视频。通过自动化流程,只需1-2分钟即可生成45-50秒的书单视频,效率提升近百倍。工作流包含文案生成、音频合成、图片素材获取、视频剪辑等全流程,支持随机生成8本书单、自动提取金句、智能配音等功能。教程提供了完整的操作步骤,包括剪映草稿配置、特效添加等细节,并附体验链接和示例效果。最终生成的视频包含书单展示、金句字幕、背景音乐等元素,适合书单号运营者快速批量产出内容。 阅读详情

相关推荐

STM32C8T6HAL库实战:MAX30102心率血氧检测与OLED多级菜单一体化方案

本文详细介绍了基于STM32C8T6和HAL库的MAX30102心率血氧检测与OLED多级菜单一体化方案。内容涵盖硬件连接、CubeMX工程配置、传感器驱动移植、数据滤波算法、OLED显示驱动以及高效的多级菜单系统设计,旨在提供一个稳定、实用且易于移植的嵌入式健康监测项目参考。

weixin_29256771的博客 397

图解C#高级教程(三):泛型

在使用泛型类创建变量时,可以使用关键字var,让编译器根据右边的类型自动推断变量的类型。set;set;// 让编译器推断类型103.14Hellotrue需要注意的是,为具体类分配的内存是存储在堆上的。

聚焦C++/Python编程语言、大模型应用开发 4706

2022北京高考数学压轴题21题:Python暴力枚举验证k≥7的5种反例

本文探讨了2022北京高考数学压轴题21题的编程解法,通过Python暴力枚举验证k≥7的5种反例。文章详细介绍了m-连续可表数列的定义、问题转化与约束条件,并提供了暴力枚举算法设计和优化技巧,帮助读者理解如何用编程思维解决数学问题。

weixin_33552698的博客 233

C#学习教程09——泛型

C#学习教程,适合新手小白,附带学习源码。

Kint的博客 776

sentaurus学习笔记(HFET_pGate_GaN仿真)(五)

`(sdedr:define-constant-profile`和`(sdedr:define-constant-profile-region`命令用于定义并应用一个恒定的活性硼掺杂浓度剖面`"ndop_GaN_gate_const"`到氮化镓栅极层上,其值为`NpGaN_gate`。- `"Oxide"`指定了这一层的材料名称(在这里代表氧化层),而`"nucleation"`是这一层在仿真中的标识名称。- `"GaN"`指定了这一层的材料名称,而`"GaN_gate"`是这一层在仿真中的标识名称。

qq_52640792的博客 940

保姆级教程:用Comsol Multiphysics仿真你的第一个SAW滤波器(含压电材料参数设置)

本文提供了一份详细的COMSOL Multiphysics教程,指导读者完成表面声波滤波器(SAW)的压电仿真全流程。从压电材料参数设置、叉指换能器建模到多物理场耦合分析,特别强调了实际应用中容易出错的细节和解决方案,帮助工程师快速掌握SAW滤波器仿真技术。

weixin_42665255的博客 592

泛型数据格式判断

方法可以用T接收泛型类型,我们可以通过泛型统一方法,根据数据类型来处理一样的流程。

qq_43826626的博客 452

OpenCV中SGBM中BT代价计算

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

qq_27606639的博客 5977

C#——泛型相关

【代码】C#——泛型相关。

qq_37233070的博客 156

【信创-k8s】银河麒麟V10国防版+鲲鹏/飞腾(arm64架构)在线/离线部署k8s1.30+kubesphere

银河麒麟作为国家核高基专项的重要成果,国防版凭借其卓越的安全性和可靠性,已成为军工领域的首选操作系统。之前我们在适配麒麟V4国防版的过程中已发现诸多安全性要求,而麒麟V10国防版在安全防护等级上又达到了更高的级别。本文将主要演示离线部署,因为军工项目基本不会出现联网场景。即使在线,也可以按离线方式部署,且离线部署由于有私有仓库,不会存在镜像获取不到和丢失情况。

jiaworld的博客 730

用业务语义织就企业数据之网:SAP Datasphere 的定位、架构与落地场景全解析

SAP Datasphere作为SAP业务数据云的核心组件,通过语义层整合企业内外部数据,支持实时分析与AI应用。其核心功能包括数据集成、语义建模、虚拟化与仓库能力,通过Spaces实现资源隔离,Data Builder和Business Builder分别面向技术和业务建模。该平台与SAP HANA Cloud、SAC等深度集成,支持财务统一分析、供应链可视化等典型场景,并可通过BW bridge实现传统BW资产云化迁移。Datasphere强调开放互联,能与Databricks等生态伙伴协同,为企业提供

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1362

不能将类型“T”用作泛型类型或方法“XXX”中的类型形参“T”。没有从“T”到“XXX”的装箱转换或类型形参转换

C#编程时遇到如下错误: 错误 3 不能将类型“T”用作泛型类型或方法“XXX”中的类型形参“T”。没有从“T”到“XXX”的装箱转换或类型形参转换 代码如下: public List<T> getData<T>(string queryID, string version, int startPage, int perPageRowCount) where T:BaseEntity { QueryMessageParam param = new QueryMessage

一花一世界 4510

R语言实战应用精讲50篇(二)-多重线性回归系列之稳健回归

前言 线性回归的参数估计主要采用的是最小二乘法(又称最小平方法),该法是将使观测值与模型预测值之差的平方达到最小的值作为参数估计值。如果数据存在异常点或者异方差,最小二乘法估计会存在偏差,常用的处理策略就是改用稳健回归(Robust Regression)。 稳健回归就是采用更为稳健的参数估计方法来拟合模型,所谓稳健就是数据的波动对参数估计影响不大,比如不受异常值影响,或删除某一观测后对结果影响不大。稳健估计的方法有很多,主要有这么几类:最小绝对值回归(也称最小一乘法回归,lAV),最小中位数二乘法(L

wenyusuran的专栏 3161

C#泛型入门泛型类、泛型集合、泛型方法、泛型约束、泛型委托

泛型集合和ArrayList的装箱拆箱、常见的泛型类型、泛型类和泛型方法、泛型约束、 泛型委托泛型很难理解?不然在接触的一个新的概念的时候,总会感觉难以理解,当你掌握并能熟练地使用的时候,发现这个概念其实简单的,我相信大多数码农都会有这种似曾相识的感觉。可能大多数人刚学习泛型的时候觉得很难理解,当然我也是这样的,所以便写下这篇文章加深一下对泛型的印象。

dotNet全栈开发 4万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

c#泛型使用详解:泛型特点、泛型继承、泛型接口、泛型委托

泛型:通过参数化类型来实现在同一份代码上操作多种数据类型。利用“参数化类型”将类型抽象化,从而实现灵活的复用。在.NET类库中处处都可以看到泛型的身影,尤其是数组和集合中,泛型的存在也大大提高了程序员的开发效率。更重要的是,C#的泛型比C++的模板使用更加安全,并且通过避免装箱和拆箱操作来达到性能提升的目的。因此,我们很有必要掌握并善用这个强大的语言特性。 C#泛型特点: 1、如果实例

zdhlwt2008的博客 1万+

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

C# 泛型

一.泛型所解决的问题及适用情形 假设我们声明了一个叫做MyIntStack的类,它实现了把一个int类型的值压入栈以及把它们弹出。 class MyIntStack { int StackPointer = 0; int[] StackArray; public void Push(int x) { //... } public int Pop() { //... } } 然后我们希望相同的功能应用于flo.

ฅ两脚喵ฅ的博客 3464

C#之泛型

一、概述一、概述泛型是用于处理算法、数据结构的一种编程方法。泛型的目标是采用广泛适用和可交互性的形式来表示算法和数据结构,以使它们能够直接用于软件构造。泛型类、结构、接口、委托和方法可以根据它们存储和操作的数据的类型来进行参数化。泛型能在编译时提供强大的类型检查,减少数据类型之间的显示转换、装箱操作和运行时的类型检查。泛型类和泛型方法同时具备可重用性、类型安全和效率高等特性,这是非泛型类和非泛型方法无法具备的。泛型通常用在集合和在集合上运行的方法中。泛型主要是提高了代码的重要性。

互联网底层民工的博客 2944

C#入门级——泛型、泛型类、泛型接口、泛型方法和泛型委托

C#入门级——泛型、泛型类、泛型接口、泛型方法和泛型委托

dlwlrma_516的博客 5050

C# 中泛型编程之泛型类、泛型方法、泛型约束详解

类型Type现在可以表示带有特定类型的实参(或绑定类型)或未指定类型的泛型(或称未绑定类型)。委托级别的约束只在声明委托变量和实例化委托时使用,类似于在类型和方法的作用范围中实施的其他任何约束。同时子类中的泛型方法不能重复基类泛型方法的约束,这一点和泛型类中的虚方法重写是有区别的,代码如下。////错误 重写和显式接口实现方法的约束是从基方法继承的,因此不能直接指定这些约束。类型参数必须具有无参数的公共构造函数。3.在子类重复基类的约束(在使用子类泛型参数时,必须在子类级别重复在基类级别规定的任何约束)

u011555996的博客 2886

C#中泛型

泛型(generic)是C# 2.0推出的新语法,并不是语法糖,它是专门为处理多段代码在不同的数据类型上执行相同的指令的情况而设计的。泛型定义时,是延迟声明的:即定义的时候没有指定具体的参数类型,把参数类型的声明推迟到了调用的时候才指定参数类型。比如:方法和泛型混到一起,叫泛型方法,类和泛型混在一起叫泛型类,接口和泛型混到一起,叫泛型接口,等等。只是方法签名,没有方法体,默认是公开的,不能添加修改符。在C#中应用比较广的泛型:泛型方法,泛型类,泛型接口。泛型是一个复合类型,把多个类型混合一起作用,

2401_84642440的博客 2150

[C#]C# 泛型

型是为所存储或使用的一个或多个类型具有占位符(类型形参)的类、结构、接口和方法。泛型集合类可以将类型形参用作其存储的对象类型的占位符;类型形参呈现为其字段的类型和其方法的参数类型。泛型方法可将其类型形参用作其返回值的类型或用作其形参之一的类型。例如,创建泛型类的实例时,指定用于替代类型形参的实际类型。在类型形参出现的每一处位置用选定的类型进行替代,这会建立一个被称为构造泛型类的新泛型类。将得到根据你选择的类型而定制的类型安全类。例如,//...

FL1768317420的博客 917

C# 泛型编程之泛型类,泛型方法,泛型约束

  所谓泛型,即通过参数化类型来实现在同一份代码上操作多种数据类型。   泛型编程是一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用。在定义泛型类时,在对客户端代码能够在实例化类时,可以用类型参数的类型种类施加限制。

weixin_42565127的博客 2245

C# 泛型讲解_泛型基础_C# Generic

C# 泛型讲解_泛型基础 一、C# 泛型概念 简介: 泛型是.NET Framework2.0新增的一个特性,在命名空间System.Collections.Generic,包含了几个新的基于泛型的集合类,官方建议.net 2.0 及更高版本的应用程序使用心得泛型集合类,而不使用非泛型集合类,例如ArrayList。 官方解释: 泛型是程序设计语言的一种特性。允许程序员在强类型程序设计语言中编写代码时定义一些可变部分,那些部分在使用前必须作出指明。各种程序设计语言和其编译器、运行环境对泛型的支持均不

天马3798 1639

如此强大的C#泛型

一、什么是泛型 C# 语言和公共语言运行时 (CLR) 在 2.0 版本中添加了泛型。泛型将类型参数的概念引入 .NET Framework,这样就可以设计具有相同特征的类和方法:在客户端代码声明并初始化这些类和方法之前,这些类和方法会延迟指定一个或多个类型(使用占位符~3:数字代表类型参数个数) 二、泛型有什么用 使用泛型类型可以最大限度地重用代码、保护类型安全性以及提高性能。泛型最常见的用途...

dust__的博客 950

C#泛型

文章目录C#泛型简介C#可空类型:NullableC#泛型方法的定义及使用C#泛型类的定义及使用C#泛型集合定义及使用C# IComparable、IComparer接口:比较两个对象的值 泛型是在 System.Collections.Generic 命名空间中的,用于约束类或方法中的参数类型。 泛型的应用非常广泛,包括方法、类以及集合等。 C#泛型简介 在前面《C#集合》一节中介绍了集合,集合中的项允许是 object 型的值,因此可以存放任意类型的值。 例如,在 ArrayList 中以 double

weixin_42715287的博客 825
上一篇: 【C#基础教程】第二十章、事件
下一篇: 【C#基础教程】第二十二章、可空类型、匿名方法、迭代器
Ohrkaninchen
博客等级 码龄5年 18粉丝 47原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ohrkaninchen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值