C# 泛型函数

news2024/11/26 6:47:35

在这里插入图片描述

1.非约束

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyGeneirc
{
    public class GeneircMethod
    {
        /// <summary>
        /// 泛型方法解决,一个方法,满足不同参数类型,做相同的事情
        /// </summary>
        /// <typeparam name="T">类型名称</typeparam>
        /// <param name="tParam">参数对象</param>
        public static void Show<T>(T tParam)
        {
            Console.WriteLine("当前类:{0},参数类型名称:{1}, 值:{2}",
                typeof(GeneircMethod), tParam.GetType().Name, tParam.ToString());
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyGeneirc
{
    internal class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // 变量定义
                int iValue = 123;
                string strValue = "456";
                DateTime dtValue = DateTime.Now;
                object oValue = "Mr Sorry";

                // 泛型方法调用 
                Console.WriteLine("****************Geneirc***********************");
                // 泛型方法解决,一个方法,满足不同参数类型,做相同的事情
                GeneircMethod.Show<int>(iValue);
                GeneircMethod.Show<string>(strValue);
                GeneircMethod.Show<DateTime>(dtValue);
                GeneircMethod.Show<object>(oValue);

                // 泛型类
                GenericClass<int> genericInt = new GenericClass<int> { _t = 19 };

                // 约束
                Console.WriteLine("****************约束非约束***********************");

                People people = new People() { Id = 123, Name = "张三" };
                Chinese chinese = new Chinese() { Id = 234, Name = "李四" };
                Hubei hubei = new Hubei() { Id = 456, Name = "王五" };
                Japanese japanese = new Japanese() { Id = 678, Name = "田中" };

                // 无意义显示
                GeneircMethod.Show<People>(people);
                GeneircMethod.Show<Chinese>(chinese);
                GeneircMethod.Show<Hubei>(hubei);
                GeneircMethod.Show<Japanese>(japanese); 

            }
            catch(Exception ex) 
            {
                Console.WriteLine(ex.ToString());
            }

            Console.ReadLine();
        }
    }
}

在这里插入图片描述

2.泛型约束

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyGeneirc
{

    public class Constraint
    {

        /// <summary>
        /// 泛型约束
        /// 1.权利 可以使用基类的一切属性方法
        /// 2.义务 强制保证T 一定是People 或 其子类(不能是密封类,)
        /// </summary>
        public static void Show<T>(T tParam)
            where T : People, ISports // 基类约束
        {
            Console.WriteLine("当前类:{0},ID:{1}, Name:{2}",
                typeof(Constraint), tParam.Id, tParam.Name);

            tParam.Hi();

        }

        // 泛型约束相比父类 可以叠加,更加灵活
        public static void ShowBase(People tParam)
        {
            Console.WriteLine("当前类:{0},ID:{1}, Name:{2}",
                typeof(Constraint), tParam.Id, tParam.Name);

            tParam.Hi();
        }

        public static T Get<T>(T t)
            where T : ISports // 接口约束
        {
            t.Pinpang();
            return t;
        }

        public static T GetClass<T>(T t)
                where T : class // 引用类型约束
        {
            T tNew = null; // T 必须是引用类型
            return t;
        }

        public static T GetStruct<T>(T t)
                where T : struct // 值类型约束
        {
            // 默认类型 根据T的不同 赋予默认值
            T tNew = default(T); // T 必须是值类型
            return t;
        }

        public static T GetNew<T>(T t)
            where T : new() // 无参数构造函数约束
        {
            // new 对象
            T tNew = new T(); // T 类必须有构造函数(无参数)
            return t;
        }
    }
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace MyGeneirc
{
    internal class Program
    {
        static void Main(string[] args)
        {
            try
            {

                People people = new People() { Id = 123, Name = "张三" };
                Chinese chinese = new Chinese() { Id = 234, Name = "李四" };
                Hubei hubei = new Hubei() { Id = 456, Name = "王五" };
                Japanese japanese = new Japanese() { Id = 678, Name = "田中" };



                Console.WriteLine("****************约束基类***********************");
                //Constraint.Show<People>(people);
                Constraint.Show<Chinese>(chinese);
                Constraint.Show<Hubei>(hubei);
                //Constraint.Show<Japanese>(japanese); // 编译报错

                Console.WriteLine("****************约束接口***********************");
                Constraint.Get<Chinese>(chinese);

            }
            catch(Exception ex) 
            {
                Console.WriteLine(ex.ToString());
            }

            Console.ReadLine();
        }
    }
}

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

08、SpringBoot 源码分析 - 自动配置深度分析一

SpringBoot 源码分析 - 自动配置深度分析一 refresh和自动配置大致流程如何自动配置SpringBootApplication注解EnableAutoConfiguration注解AutoConfigurationImportSelector自动配置导入选择器DeferredImportSelectorHandler的handleDeferredImportSelectorGroupingHandler的r…

NSSCTF | [SWPUCTF 2021 新生赛]no_wakeup

打开题目后&#xff0c;点击三个&#xff1f;&#xff0c;发现是一个php序列化脚本 <?phpheader("Content-type:text/html;charsetutf-8"); error_reporting(0); show_source("class.php");class HaHaHa{public $admin;public $passwd;public function…

互联网应用主流框架整合之数据库事务管理

在互联网系统中同时运行着成千上百个线程是十分常见的事情&#xff0c;尤其当一个热门出现时&#xff0c;用户几乎同时打开手机、电脑、平板灯设备进行访问&#xff0c;这样就会导致数据库处在一个多事务访问的环境中&#xff0c;从而引发数据丢失或者数据不一致的现象&#xf…

2024.05.28学习记录

1. 小林coding 计网复习 2.代码随想录刷题. 图论.和复习数组.链表 3.rosebush完成select组件

3DEXPERIENCE DELMIA Role: RFP - Fabrication Robot Programmer

Discipline: Robotics Role: RFP - Fabrication Robot Programmer 在虚拟工厂中定义、验证和编程机器人弧焊和密封剂沉积系统 模拟和验证完整的焊接、密封剂沉积和搬运机器人系统&#xff0c;以消除代价高昂的碰撞并优化生产率提供精确的生产就绪型机器人程序&#xff0c;同…

医疗图像处理2023:Transformers in medical imaging: A survey

医学成像中的transformer:综述 目录 一、介绍 贡献与安排 二、CNN和Transformer 1.CNN 2.ViT 三、Transformer应用于各个领域 1.图像分割 1&#xff09;器官特异性 ①2D ②3D 2&#xff09;多器官类别 ①纯transformer ②混合架构 单尺度 多尺度 3&#xff09;…

养老院管理系统基于springboot的养老院管理系统java项目

文章目录 养老院管理系统一、项目演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 养老院管理系统 一、项目演示 养老院管理系统 二、项目介绍 基于springboot的养老院管理系统 角色&#xff1a;超级…

【乐吾乐3D可视化组态编辑器】相机与视角

系统默认的相机为环绕旋转相机&#xff0c;它可以环绕一个中心点做上下左右的旋转&#xff0c;来从不同角度观察场景。当然&#xff0c;您也可以把一些特定角度的信息保存下来&#xff0c;在系统中我们把这个信息称作视角。通过交互中的切换视角动作&#xff0c;您就可以实现把…

【OpenGL手册14】实例化

目录 一、说明 二、实例化 三、实例化数组 四、小行星带 五、完整代码 六、结论 一、说明 实例化渲染&#xff0c;是用少数数据做模板&#xff0c;实现海量物体渲染的手段方法。用实例化渲染&#xff0c;需要对每个实例产生一定描述数据。如何实现&#xff1f;请看本文下…

攻击同学网络,让同学断网

技术介绍&#xff1a;ARP欺骗 ARP欺骗&#xff08;ARP spoofing&#xff09;是一种网络攻击技术&#xff0c;它通过伪造ARP&#xff08;地址解析协议&#xff09;响应包来欺骗目标设备&#xff0c;使其将网络流量发送到攻击者指定的位置。具体操作步骤如下&#xff1a; 攻击者…

你的手机是如何控制你的手表之广播篇

前言 要让手机能够控制手表&#xff0c;第一步当然要让手机能够“看见”手表&#xff0c;人类作为上帝视角&#xff0c;我们是能够通过眼睛直接看见手机和手表的&#xff0c;但要让手机“看见”手表&#xff0c;就需要一端把自己的信息通过电磁波的形式发往空中&#xff0c;另…

ADIL简单测试实例

参考资料&#xff1a;https://blog.csdn.net/geyichongchujianghu/article/details/130045373这个连接是Java的代码&#xff0c;我根据它的链接写了一个kotlin版本的。 AIDL&#xff08;Android Interface Definition Language&#xff09;是Android平台上用于进程间通信&…

redis 主从复制薪火相传 哨兵sentinel配置以及底层原理

薪火相传 我们知道redis的主从复制还有一个常见的架构 ---薪火相传 使用这种结构可以有效减轻master节点的复制数据同步压力 注意这里的6380节点仍然是slave节点 可以理解为一个中间节点,仍然是不可以写只可以读取的 我们只需要使用 slaveof ip port 这里可能访问节点的时候出…

电力电子技术03 (1)---电路稳态分析方法

学习来源&#xff08;只用于个人学习笔记&#xff0c;建议对着老师视频学习理解更深入&#xff09;&#xff1a;2.2稳态分析的基本方法_哔哩哔哩_bilibili 一、Buck降压电路 Buck电路&#xff0c;也称为降压转换器&#xff0c;是一种DC-DC电压转换器&#xff0c;用于将输入电…

7个靠谱的副业赚钱方法,宝妈,上班族,学生党可以做的兼职副业

你是否也曾面临过这样的困境&#xff1a;生活费紧张&#xff0c;想要找份兼职来补贴家用或是满足自己的小心愿&#xff1f;别担心&#xff0c;今天我将带领你踏入这个丰富多彩的兼职世界&#xff0c;助你轻松达成月入过千的小目标&#xff01; 在我漫长的兼职探索旅程中&#…

Java GC问题排查的一些个人总结和问题复盘

个人博客 Java GC问题排查的一些个人总结和问题复盘 | iwts’s blog 是否存在GC问题判断指标 有的比较明显&#xff0c;比如发布上线后内存直接就起飞了&#xff0c;这种也是比较好排查的&#xff0c;也是最多的。如果单纯从优化角度&#xff0c;看当前应用是否需要优化&…

C++的算法:枚举法的原理及应用

在C++编程中,枚举法,又称穷举法或暴力法,是一种非常基础和常见的算法解题方法。它的核心思想在于:通过遍历所有可能的情况,然后逐一检查每个情况是否满足问题的要求,从而找到问题的解决方案。 一、枚举法的原理 枚举法的核心在于穷举和验证。它将问题的所有可能性一一列举…

高铁VR虚拟全景展示提升企业实力和形象

步入VR的神奇世界&#xff0c;感受前所未有的汽车展示体验。VR虚拟现实技术以其独特的沉浸式模拟&#xff0c;让你仿佛置身于真实展厅之中&#xff0c;尽情探索汽车的每一处细节。 一、定制化展示&#xff0c;随心所欲 VR汽车虚拟展厅打破空间束缚&#xff0c;让汽车制造商能够…

官宣|HelpLook现已入驻钉钉应用市场,助力企业知识管理知识

前一阵子OpenAI公司最新的GPT-4o技术震撼发布&#xff0c;人工智能的实际应用前景再次引起行业瞩目&#xff0c;或者被GPT4o的数据分析等特色功能折服。如您正寻求将AI技术融入企业知识管理&#xff0c;不要错过HelpLook&#xff01;HelpLook AI知识库已经正式入驻钉钉应用市场…

go语言初识别(五)

本博客内容涉及到&#xff1a;切片 切片 1. 切片的概念 首先先对数组进行一下回顾&#xff1a; 数组定义完&#xff0c;长度是固定的&#xff0c;例如&#xff1a; var num [5]int [5]int{1,2,3,4,5}定义的num数组长度是5&#xff0c;表示只能存储5个整形数字&#xff0c…