C#泛型委托,约束

news2024/9/20 23:22:02

一、泛型委托

泛型的委托有很多,但掌握常见的泛型委托应用即可

委托可以定义它自己的类型参数。

引用泛型委托的代码可以指定类型参数以创建封闭式构造类型。

public delegate void Del<T>(T t);//Del<T> 是一个泛型委托
public static void Notify(int t) { }//通过 Del<int> 将 T 指定为 int,就是创建了一个封闭的构造类型。
Del<int> m1 = new Del<int>(Notify);//实例化 Del<int>

常见的委托有Action,Func,Predicate,Converter等等。

Action特点:没有参数,没有返回值。只要没有参数,没有返回值的方法都可以满足委托。

Action action = () => {
    Console.WriteLine("委托");
};
// 必须调用,才会执行
action();

Action<in T>泛型委托,in是关键字,转到定义查看

// 泛型委托
Action<int> action = (int arg) =>
{
    Console.WriteLine(arg);
};
action(10);

Func<out TResult>泛型委托,out是关键字,转到定义查看

Func<string> func1 = () =>
{
    return "hello";
};
Console.WriteLine(func1());

 Predicate<in T>泛型委托,in是关键字,转到定义查看

Predicate<string> predicate = (string arg) =>
{
    return arg == "hello";
};
Console.WriteLine(predicate("hello"));

 Converter<in TInput, out TOutput>这个有两个关键字

Converter<int, string> converter = (int i) =>
{
    return i.ToString("C2");
};
Console.WriteLine(converter(200));//¥200.00

其实用法都是一样的 ,结构也是一样的,只是传的关键字和参数不同罢了

委托名<in T或out T> 变量名=()=>{ }

二、泛型约束

泛型的目的:相同的业务逻辑,支持了不同类型。但一味的滥用,则对代码安全性不利。

所谓的泛型约束,实际上就是约束的类型T 。使T必须遵循一定的规则。比如T必须继承自某个类,或者T必须实现某个接口等等。

约束泛型为引用类型

static void Main(string[] args)
{
    //演示约束泛型为引用类型
    //int是结构,值类型都是结构,而泛型类MyClass有约束 where:class,因此如下报错。
    //MyClass<int> myClass = new MyClass<int>();

    //string引用类型,用类来实现
    MyClass<string> myClass1 = new MyClass<string>();
}
// 约束泛型类T必须是引用类型
public class MyClass<T> where T : class
{

}

约束泛型为结构体 

static void Main(string[] args)
{
   // 演示约束泛型为结构体
 MyClass1<double> myClass = new MyClass1<double>();
 MyClass1<DateTime> myClass1 = new MyClass1<DateTime>();
 MyClass1<Sex> myClass2 = new MyClass1<Sex>();
} 

// 约束泛型类中T必须是结构体
public class MyClass1<T> where T: struct
{
}

 约束无参构造函数

static void Main(string[] args)
{
    // 演示约束有无参构造函数
    MyClass2<int> myClass5 = new MyClass2<int>();
    //MyClass2<string> myClass51 = new MyClass2<string>();//string本身没有公共的无参构造函数。
    MyClass2<Person> myClass52 = new MyClass2<Person>();
} 

 // 类默认带有一个无参构造函数。
 // 有参构造函数可以重载,有多个
 // where T: new()约束泛型类型T必须有公共无参数构造函数
 public class MyClass2<T> where T : new()
 {
 }

基类约束

static void Main(string[] args)
{
    MyClass3<Animal> myClass6 = new MyClass3<Animal>();
    MyClass3<Person> myClass7 = new MyClass3<Person>();
} 
// 基类约束:Animal这个类型,或者由Animal类型派生的子类型都可以替代泛型类中的T。
// 密封类不能当成泛型约束。
public class MyClass3<T> where T : Animal
{
}

约束类必须实现某个接口

static void Main(string[] args)
{
    // int没有实现IMyInterface1,如下报错
    //MyClass4<int> myClass8 = new MyClass4<int>();

    // 由于Person实现了IMyInterface1,满足了泛型约束成某个接口的条件。
    MyClass4<Person> myClass9 = new MyClass4<Person>();
} 
// 约束类必须实现某个接口
// T必须实现MyInterface1
public class MyClass4<T> where T : IMyInterface1
{
}

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

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

相关文章

音频剪辑怎么剪?这4种裁剪方法快学起来

无论是音乐创作、播客录制还是专业的声音设计&#xff0c;高质量的音频剪辑都是创造引人入胜作品的关键。 然而&#xff0c;对于初学者或是专业人士而言&#xff0c;找到合适的音频剪辑工具&#xff0c;并掌握其使用方法&#xff0c;是通往成功道路上的第一步。 那么&#xf…

Python数据库操作必备:事务隔离级别全解析

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在数据库操作中&#xff0c;事务隔离是保证数据一致性和并发控制的重要机制。事务隔离级别决定了一个事务可以看到其他事务的哪些更改&#xff0c;常见的隔离级别包括未提交读&#xff08;Read Uncommitted&…

Java海康门禁设备 对接人脸下发API

海康门禁机设备API接口对接 引言&#xff1a; 我本人在对接海康门禁机设备的时候遇到了两个 问题1&#xff1a;人脸下发失败的问题&#xff0c;是根据官方的Demo&#xff0c;遇到的问题&#xff0c;可以参考一下 这个问题我排查了很久&#xff0c;最终发现是海康给的Demo里面…

EasyX自学笔记3(割草游戏2)

在上一篇笔记之中我们还留有许多bug&#xff0c;如派蒙不会转头、派蒙是鬼没影子、斜向速度过快、会跑出界外的问题在此一并处理。 在上一章里我们知道需要玩家类、敌人类、子弹类三种&#xff0c;但是其包含的是他们的运行逻辑和变量。而播放动画帧也有许多函数我们也将其封装…

学习Java的日子 Day68 jQuery操作节点,Bootstrap

jQuery 1.jQuery操作DOM DOM为文档提供了一种结构化表示方法&#xff0c;通过该方法可以改变文档的内容和展示形式 在访问页面时&#xff0c;需要与页面中的元素进行交互式的操作。在操作中&#xff0c;元素的访问是最频繁、最常用的&#xff0c;主要包括对元素属性attr、内容…

《Hadoop大数据技术与实践》+ 数仓版本

基础概念 随着数字化时代的到来&#xff0c;数据量的爆炸性增长使得传统的数据处理和分析方法变得不够高效&#xff0c;因此大数据技术应运而生。 数据分类 结构化数据&#xff1a;固定格式的SQL数据库等半结构化数据&#xff1a;json非结构化数据&#xff1a;图片、音视频 …

探索sqlmap的奥秘:Python中的强大SQL注入检测工具

文章目录 **探索sqlmap的奥秘&#xff1a;Python中的强大SQL注入检测工具**第一部分&#xff1a;背景介绍第二部分&#xff1a;sqlmap是什么&#xff1f;第三部分&#xff1a;如何安装sqlmap&#xff1f;第四部分&#xff1a;简单库函数使用方法第五部分&#xff1a;场景应用第…

Grafana+Influxdb(Prometheus)+Apache Jmeter搭建可视化性能测试监控平台

此性能测试监控平台&#xff0c;架构可以是&#xff1a; GrafanaInfluxdbJmeterGrafanaPrometheusJmeter Influxdb和Prometheus在这里都是时序性数据库 在测试环境中&#xff0c;压测数据对存储和持久化的要求不高&#xff0c;所以这里的组件可以都通过docker-compose.yml文件…

制氧机在造纸工业中的作用

在现代造纸工业中&#xff0c;制氧机扮演着至关重要的角色&#xff0c;为整个生产流程带来了诸多显著的优势和改进。 制氧机能够优化纸浆的漂白过程。传统的漂白方法可能效果不佳&#xff0c;且对环境造成较大压力。而通过制氧机制备的高纯度氧气参与漂白反应&#xff0c;能大大…

Langchain pandas agent - Azure OpenAI account

题意&#xff1a;Langchain pandas代理 - Azure OpenAI账户 问题背景&#xff1a; I am trying to use Langchain for structured data using these steps from the official document. 我正在尝试使用 Langchain 处理结构化数据&#xff0c;按照官方文档中的这些步骤进行操作…

软件测试第2章 黑盒测试和白盒测试对比

目录 一、黑盒测试 二、白盒测试 三、黑盒测试 VS 白盒测试 一、黑盒测试 1、它只检查程序功能是否能按照需求规格说明书的规定正常使用&#xff0c;程序是否能适当地接受输入数据而产生正确的输出信息。 2、黑盒测试也称功能测试&#xff0c;通过测试来检测每个功能是否能…

《熬夜整理》保姆级系列教程-玩转Wireshark抓包神器教程(4)-再识Wireshark

1.简介 按照以前的讲解和分享路数&#xff0c;宏哥今天就应该从外观上来讲解WireShark的界面功能了。 2.软件界面 由上到下依次是标题栏、主菜单栏、主菜单工具栏、显示过滤文本框、打开区、最近捕获并保存的文件、捕获区、捕获过滤文本框、本机所有网络接口、学习区及用户指…

文件上传漏洞(三,靶场详解)

前言&#xff1a; 本文基于github上的upload-labs&#xff0c;PHP study以及bp抓包软件进行操作。 靶场环境搭建及pass-1.pass-2请转到&#xff1a;文件上传漏洞&#xff08;二&#xff0c;靶场搭建及漏洞利用&#xff09; 一&#xff0c;pass-3。 查看源码可知&#xff0c…

OJ-0815

题目 示例1 输入 bb1234aa 输出 10示例2 输入 bb12-34aa 输出 -31示例3 输入 bb0012-0034aa 输出 -31题解 import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner scanner new Scanner(System.in);long res 0;String s scanner…

在WinCC(TIA Portal)项目中,如何正确的使用面板,模板,弹出窗口和滑入窗口?

WinCC(TIA Portal)中提供了许多设计元素和组态对象,使得组态工作变得简单,文档中简要介绍了这些内容. WinCC(TIA Portal) 中提供了许多设计元素和组态对象&#xff0c;使得组态工作变得简单,文档中简要介绍了这些内容。 在 WinCC(TIA Portal) 中使用以下选项有助于提高组态过程…

git是什么/基本指令

git作用 去中心化&#xff0c; 分布式版本控制器 新增术语&#xff1a;仓库区&#xff0c; 工作区&#xff0c; 暂存区 具体见下板书 常用git命令 git clone 仓库网址 git status 查看仓库状态 git add newfile 临时添加到git仓库 git commit -m 正式添加git仓库 g…

电商SaaS聚水潭上市“求解”

时隔半年之后&#xff0c;电商ERP龙头聚水潭&#xff0c;再次向港交所递交主板上市申请&#xff0c;中金公司、摩根大通成为其联席保荐人。作为辅助电商商家运营的SaaS&#xff0c;其所提供的服务&#xff0c;主要包括库存分配、店铺管理、客户服务等诸多项目。作为国内最大的电…

机械行业数字化生产供应链产品解决方案(七)

在机械行业的数字化生产供应链产品解决方案中&#xff0c;通过全面部署物联网&#xff08;IoT&#xff09;传感器、智能分析平台和自动化控制系统&#xff0c;实现对生产设备的实时监控和数据采集&#xff0c;并结合大数据和人工智能技术进行深度分析&#xff0c;从而优化生产调…

AI绘画Stable Diffusion可以帮我做室内设计啦!把AI出图 应用到工作当中已经是人人必备的技能啦!

哈喽大家好&#xff0c;我是画画的小强 今天给大家带来个有意思教程&#xff0c;就是AI绘画Stable Diffusion 辅助帮我做室内设计&#xff01; 在本篇文章中我们可以把Stable Diffusion 当做一个小的渲染器来用&#xff0c;帮助我们快速出图&#xff0c;以及快速的出概念的创…

【网络】应用层协议-http协议

应用层协议-http协议 文章目录 1.Http协议1.1什么是http协议1.2认识URL1.3urlencode和urldecode1.4HTTP请求协议格式1.5HTTP响应协议格式1.6HTTP常见的Header1.7HTTP常见状态码1.8HTTP的方法1.8根据url调取对应的服务 2.cookie和session2.1cookie2.2session 3.HTTPS协议3.1对称…