C# 泛型函数

在这里插入图片描述

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.mfbz.cn/a/656263.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙ArkUI-X跨平台开发:【资源分类与访问】

资源分类与访问 应用开发过程中&#xff0c;经常需要用到颜色、字体、间距、图片等资源&#xff0c;在不同的设备或配置中&#xff0c;这些资源的值可能不同。 应用资源&#xff1a;借助资源文件能力&#xff0c;开发者在应用中自定义资源&#xff0c;自行管理这些资源在不同…

蓝桥楼赛第30期-Python-第三天赛题 提取电影信息题解

楼赛 第30期 Python 模块大比拼 提取电影信息 介绍 JSON&#xff08;JavaScript Object Notation, /ˈdʒeɪsən/&#xff09;是一种轻量级的数据交换格式&#xff0c;最初是作为 JavaScript 的子集被发明的&#xff0c;但目前已独立于编程语言之外&#xff0c;成为了通用的…

深入理解MySQL索引下推优化

在MySQL中&#xff0c;索引的使用对于查询性能至关重要。然而&#xff0c;即使有合适的索引&#xff0c;有时查询性能仍然不尽如人意。索引下推&#xff08;Index Condition Pushdown&#xff0c;ICP&#xff09;是一项能够进一步优化查询性能的技术。本文将详细讲解索引下推的…

人工智能与区块链技术:开启未来科技的双引擎

在当今科技飞速发展的时代&#xff0c;人工智能和区块链技术如同两颗璀璨的明星&#xff0c;照亮了人类通往未来的道路。 人工智能&#xff0c;以其强大的学习和分析能力&#xff0c;正悄然改变着我们的生活。它能够处理海量的数据&#xff0c;为我们提供精准的预测和个性化的…

STM32系列-STM32介绍

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” STM32介绍 STM32介绍 ST&#xff1a;指的是意法半导体 M&#xff1a;指定微处理器 32&#xff1a;表示计算机处理器位数 ARM分成三个系列&#xff1a; Cortex-A&#xff1…

Javascript--词法作用域

词法作用域 词法阶段 大部分标准化语言编辑器的第一个工作阶段叫做词法化&#xff0c;词法化会对源代码中的字符进行检查&#xff0c;如果是有状态的解析过程&#xff0c;还会赋予单词语义。 简单来说&#xff0c;词法作用域就是在词法阶段的作用域&#xff0c; function fo…

前端API: IntersectionObserver的那一二三件事

IntersectionObserver 基础 IntersectionObserver 可以监听一个元素和可视区域相交部分的比例&#xff0c;然后在可视比例达到某个阈值的时候触发回调。比如可以用来处理图片的懒加载等等 首先我们来看下基本的格式&#xff1a; const observer new IntersectionObserver(c…

SQLServer2012实例下某个数据库处于恢复挂起状态

由于机房电源线路故障&#xff0c;导致部分服务器飞正常状态下关机&#xff0c;电源线路重新恢复后&#xff0c;启动服务器后实例下有个数据库都显⽰“恢复挂起”状态&#xff0c;应用程序也⽆法对数据库的正常访问操作。 1、解决关键⽅法&#xff1a; run DBCC CHECKDB on t…

gin框架精通篇(二)

原生数据库使用 导入模块&#xff1a;go get -u github.com/go-sql-driver/mysql 安装 mysql 数据库 安装数据库可能遇到的问题&#xff1a;&#xff08;网上的方法基本可以解决&#xff09; ERROR 1045 (28000): Access denied for user ‘-root’‘localhost’ (using passwo…

ROS基础学习-话题通信机制研究

研究ROS通信机制 研究ROS通信机制 0.前言1.话题通信1.1 理论模型1.2 话题通讯的基本操作1.2.1 C++1.2.2 Python中使用自己的虚拟环境包1.2.2.1 参考11.2.2.2 参考21.2.2.3 /usr/bin/env:“python”:没有那个文件或目录1.2.3 Python1.2.2.1 发布方1.2.2.2 订阅方1.2.2.3 添加可执…

在 GPT-4o 释放完整能力前,听听实时多模态 AI 创业者的一手经验 | 编码人声

「编码人声」是由「RTE开发者社区」策划的一档播客节目&#xff0c;关注行业发展变革、开发者职涯发展、技术突破以及创业创新&#xff0c;由开发者来分享开发者眼中的工作与生活。 5 月中旬 GPT-4o 的发布&#xff0c;让人与 AI 的交互&#xff0c;从对话框的文本交流加速推进…

《Ai学习笔记》自然语言处理 (Natural Language Processing):常见机器阅读理解模型(上)02

Glove 词向量&#xff1a; 在机器理解中的词的表示&#xff1a; 词袋&#xff08;bow,bag of words&#xff09; one-hot 词向量 word2vec glove 目的&#xff1a;将一个词转换成一个向量 Word2vec 是一种用于生成词向量的工具包&#xff0c;由Google在2013年开源推出…

AI视频换脸!最快的方法,100%成功,完全免费,无需配置、打开即用

这是一款百分百完全免费&#xff0c;超级好用又简单的AI视频换脸工具&#xff0c;不仅效果非常不错而且支持CPU和GPU解码&#xff0c;即使电脑上没有独立显卡&#xff0c;你也可以通过电脑上的CPU要进解码&#xff0c;虽然我之前给他介绍好几个有关AI视频&#xff0c;比如像这个…

css 渐变色边框

效果图&#xff1a; 代码&#xff1a; <style>:root{--br-radius: 12px;}.list{position: relative;}.list_tle{margin-top: 15px;margin-bottom: 5px;}.item{position: relative;display: inline-flex;} .br1 {padding: 10px 16px;clip-path: inset(0 round 6px);borde…

kafka3.6.1版本学习

kafka目录结构 bin linux系统下可执行脚本文件 bin/windows windows系统下可执行脚本文件 config 配置文件 libs 依赖类库 licenses 许可信息 site-docs 文档 logs 服务日志 启动ZooKeeper 进入Kafka解压缩文件夹的config目录&#xff0c;修改zookeeper.properties配置文件 #t…

Sqoop的安装与测试

这里写目录标题 什么是Sqoop?Sqoop的安装与配置安装测试 什么是Sqoop? Sqoop就是hadoop和mysql的一个中间介质 , 作用就是可以将hadoop中的数据传到mysql中 , 或将mysql中的数据导入到hadoop中 Sqoop的安装与配置 安装 详细代码 //解压安装 [roothadoop soft]# tar -zxv…

【光伏干货】光伏无人机巡检步骤

随着光伏产业的迅速发展和无人机技术的日益成熟&#xff0c;光伏无人机巡检已成为提高光伏电站运维效率、降低运维成本的重要手段。本文将详细介绍光伏无人机巡检的步骤&#xff0c;帮助读者更好地理解和应用这一技术。 一、前期准备 1、设备检查&#xff1a;对无人机及其相关…

13 VUE学习:组件v-model

基本用法 v-model 可以在组件上使用以实现双向绑定。 从 Vue 3.4 开始&#xff0c;推荐的实现方式是使用 [defineModel()]宏&#xff1a; <!-- Child.vue --> <script setup> const model defineModel()function update() {model.value } </script><te…

我的心情JSP+Servlet+JDBC+MySQL

系统概述 本系统采用JSPServletJDBCMySQL技术进行开发&#xff0c;包括查看我的心情列表&#xff0c; 编辑我的心情信息、新增我的心情。使用方法 将项目从idea中导入&#xff0c;然后配置项目的结构&#xff0c;包括jdk,库&#xff0c;模块&#xff0c;项目&#xff0c;工件…

分支机构多,如何确保文件跨域传输安全可控?

随着企业全球化发展&#xff0c;分支机构的分布越来越广泛&#xff0c;跨域文件传输需求也随之增加。然而&#xff0c;跨域文件传输面临的数据安全和传输效率问题&#xff0c;使得构建一个安全、可控的文件交换系统成为迫切需求。FileLink跨网文件交换系统通过综合的技术手段和…