举例说明.net中in与out的作用与区别
-----作用
在 .NET 中,in 和 out 是用于泛型类型参数的修饰符,它们用于指定参数类型的协变性和逆变性。
- in 修饰符:表示这个泛型类型参数是协变的。也就是说,in 类型参数可以从较特殊的类型隐式转换为较通用的类型。例如:
interface IAnimal { }
class Dog : IAnimal { }void TakeAnimals(IEnumerable<in IAnimal> animals)
{// ...
}IEnumerable<Dog> dogs = ...;
TakeAnimals(dogs);// OK, IEnumerable<Dog> 可以隐式转换为 IEnumerable<IAnimal>。
在上面的例子中,`TakeAnimals` 方法接受一个 `IEnumerable<in IAnimal>` 参数,这意味着我们可以将其传递给一个类型为 `IEnumerable<Dog>` 的变量。
- out 修饰符:表示这个泛型类型参数是逆变的。也就是说,out 类型参数可以从较通用的类型隐式转换为较特殊的类型。例如:
interface IAnimal { }
class Dog : IAnimal { }void AddDogToList(List<out Dog> dogs, Dog dog)
{dogs.Add(dog);
}List<IAnimal> animals = ...;
AddDogToList(animals, new Dog());// OK, List<IAnimal> 可以隐式转换为 List<Dog>。
在上面的例子中,`AddDogToList` 方法接受一个 `List<out Dog>` 参数,这意味着我们可以将其传递给一个类型为 `List<IAnimal>` 的变量。
需要注意的是,当使用 in 或 out 修饰符时,只能将泛型类型参数作为方法的输入参数或输出参数使用,即只能放在方法的参数列表中,而不能放在方法的返回类型中。
-------------区别
在 .NET 中,`in` 和 `out` 是用于泛型类型参数的修饰符。它们的作用是指定泛型类型参数在方法中的使用方式。
`in` 修饰符表示泛型类型参数是一个只读的输入参数。这意味着方法可以使用该参数的值,但不能修改该参数的值。例如:
public void ProcessData<T>(in T data)
{// 不能在这里修改 data 的值
}
`out` 修饰符表示泛型类型参数是一个只写的输出参数。这意味着方法必须将该参数设置为一个新值,并且无法使用该参数的当前值。例如:
public void GenerateData<T>(out T data)
{// 必须将 data 设置为一个新值data = default(T);
}
在应用方面,`in` 和 `out` 主要用于提高泛型类型参数的灵活性和安全性。使用 `in` 和 `out` 可以使得泛型类型参数更具有通用性,因为它们允许方法在不改变泛型类型参数的情况下使用该参数。同时,使用 `in` 和 `out` 还可以提高代码的安全性,因为它们限制了对泛型类型参数的访问权限,从而减少了可能导致错误的代码行为。
例如,在 .NET 中,定义了一个名为 `IReadOnlyList<out T>` 的接口,其中 `out` 修饰符指定了泛型类型参数为只读输出参数。由于 `IReadOnlyList` 接口只能读取列表中的元素,因此对列表进行修改的任何方法都将不受欢迎。使用 `out` 修饰符可以确保这些方法不会修改列表中的元素。
相关文章:
举例说明.net中in与out的作用与区别
-----作用 在 .NET 中,in 和 out 是用于泛型类型参数的修饰符,它们用于指定参数类型的协变性和逆变性。 - in 修饰符:表示这个泛型类型参数是协变的。也就是说,in 类型参数可以从较特殊的类型隐式转换为较通用的类型。例如&…...
Java常见的100道面试题(内附答案及代码示例)持续更新
什么是Java程序? Java程序是一组可执行的代码,由Java编译器编译生成,可以在Java虚拟机(JVM)上运行。 public class HelloWorld {public static void main(String[] args) {System.out.println("Hello, World!&qu…...
策略设计模式知多少
目录 目标 概述 实现 目标 熟悉策略设计模式,了解策略设计模式的使用场景、具体实现。 概述 一、行为设计模式 行为设计模式是设计模式的一种类型。该类型的设计模式关注的重点在于对象的行为(通信和交互),而非对象的创建方…...
第三十九章 配置镜像 - 配置 ISCAgent - 在 UNIX Linux 和 macOS 系统上为非根实例启动 ISCAgent
文章目录 第三十九章 配置镜像 - 配置 ISCAgent - 在 UNIX Linux 和 macOS 系统上为非根实例启动 ISCAgent在 UNIX/Linux 和 macOS 系统上为非根实例启动 ISCAgent在 Microsoft Windows 系统上启动 ISCAgent 自定义 ISCAgent 第三十九章 配置镜像 - 配置 ISCAgent - 在 UNIX Li…...
嵌入式安卓开发:使用Camera2获取相机
文章目录 Camera2介绍Camera2的主要API类介绍CameraManager通过CameraManage获取Cameracharacteristics通过CameraManage获取CameraDevice从CameraDevice获取CameraCaptureSession预览效果 参考 Camera2介绍 从Android 5.0开始,Google 引入了一套全新的相机框架 Ca…...
阿里云g8i服务器Intel Xeon(Sapphire Rapids) Platinum 8475B
阿里云服务器ECS通用型实例规格族g8i采用2.7 GHz主频的Intel Xeon(Sapphire Rapids) Platinum 8475B处理器,3.2 GHz睿频,g8i实例采用阿里云全新CIPU架构,可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固。阿里云百科分享阿里云服…...
设计模式——组件协作模式之观察者模式
文章目录 前言一、“组件协作” 模式二、Observer 观察者模式1、动机2、模式定义3、伪代码示例①、第一种方案,最朴素的方式②、第二种方案,重构使得遵循DIP原则:③、进一步的小优化:④、修改使得支持多个观察者: 4、结…...
观察者设计模式知多少
目录 目标 概述 实现 推设计模式 拉设计模式 被动观察者设计模式 目标 熟悉观察者设计模式,了解观察者设计模式的使用场景、具体实现(包括:推设计模式、拉设计模式、被动观察者设计模式)。 概述 一、行为设计模式 行为设…...
Flink之TaskManager内存解析
一、CK失败 Flink任务的checkpoint操作失败大致分为两种情况,ck decline和ck expire: (1)ck decline 发生ck decline情况时,我们可以通过查看JobManager.log或TaskManager.log查明具体原因。其中有一种特殊情况为ck cancel&…...
为何越来越多人不喜欢“试用期六个月”的公司?网友:感觉不靠谱
众所周知,任何一份工作都有试用期,一般是三月左右。但如果你遇到试用期达到半年的公司,你会不会进入? 近日,就有人遇到了此类公司,并对是否要进入该公司犹豫不决。他在论坛上发帖求助:大家是怎…...
单例模式的四种创建方式
前言 单例模式是日常开发中最常见的一种设计模式,常用来做为池对象,或者计数器之类的需要保证全局唯一的场景。 单例模式的目的是保证在整个程序中只存在一个对象实例,使用单例一个前提条件就是构造器私有化,不允许通过new 对象…...
Nginx+Keepalived 中的脑裂现象
如何解决和预防 NginxKeepalived 中会出现的脑裂现象? Nginx是一种高性能的Web服务器和反向代理服务器,可以处理大量并发请求。Keepalived是一种开源软件,用于实现IP负载均衡和故障转移。在Nginx和Keepalived结合使用时,可以通过将多个Ngin…...
04 KVM虚拟化网络概述
文章目录 04 KVM虚拟化网络概述4.1 Linux Bridge4.2 Open vSwitch 04 KVM虚拟化网络概述 为了使虚拟机可以与外部进行网络通信,需要为虚拟机配置网络环境。KVM虚拟化支持Linux Bridge、Open vSwitch网桥等多种类型的网桥。如图1所示,数据传输路径为“虚…...
110页智慧农业解决方案(农业信息化解决方案)(ppt可编辑)
本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。 第一部分 智慧农业概述 智慧农业以农业资源为基础、市场为导向、效益为中心、产业化为抓手,面向农业管理部门、农技推广部门、农业企业、农业园区和基地、农业专…...
Java知识体系及聊天室程序
Java知识体系结构梳理如下: 基础语法:Java的基本语法,包括数据类型、运算符、控制语句、数组等。 面向对象编程:Java是一种面向对象的编程语言,需要掌握类、对象、继承、多态等概念。 异常处理:Java提供了…...
java的详细发展历程
Java是一种跨平台、面向对象的编程语言,具有简单性、可移植性、安全性等特点。Java的历史可以追溯到上世纪90年代初期,以下是Java的详细发展历程: 1991年,Sun Microsystems公司的James Gosling和他的团队开始开发一种名为Oak的编程…...
丢石子
I 一堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win". 思路: 任何正整数都可以表示为不连续斐波那契…...
skywalking手动上报一些指标信息
skywalking的相关概念我就不介绍了,有兴趣可以参看官网文档 以下提供以下简单示例手工上报一些对问题排查比较有用的一些信息。当然这些内容你也可以写成探针插件的形式,怎么开发探针插件也自行参考官方文档。此处仅在项目框架层面提供一些简单的示例&am…...
NUMA详解
目录 NUMA简介 NUMA开启与关闭 查看系统是否支持 关闭方法 numactl --hardware介绍 没有安装numactl工具下查看NUMA架构节点数: 查看每个NUMA节点的CPU使用情况: 看每个NUMA节点的内存使用情况: 查看NUMA下指定进程的运行情况 创建…...
H68K在Armbina系统下开AP
背景需求替代路由器,网上找了一大堆都不行 最后成功开启了AP 参考了两篇文章, 一篇是如何创建热点, 一篇是如何开启5G 树莓派4B创建5Ghz WiFi热点 – 风声 https://www.hncldz.com/2020/02/01/%e6%a0%91%e8%8e%93%e6%b4%be4b%e5%88%9b%e5%bb%ba5ghz-wifi%e7%83%ad%e7%82%b…...
从零搭建Vulnstack内网靶场:一次完整的渗透测试实战复盘
1. 环境准备与靶场搭建 第一次接触Vulnstack靶场时,我完全被内网渗透的复杂性震撼到了。这个靶场模拟了真实企业内网环境,包含域控制器、Web服务器和普通办公主机等多种设备。搭建过程就像拼装一台精密仪器,每个部件都要准确定位。 靶机环境需…...
UG/NX Block UI Styler字符串控件避坑指南:常见问题与解决方案
UG/NX Block UI Styler字符串控件避坑指南:常见问题与解决方案 在UG/NX二次开发中,Block UI Styler作为可视化对话框设计工具,其字符串控件(String Control)是使用频率最高的交互元素之一。无论是参数输入、状态显示还…...
破解Swin Transformer部署困境:从环境适配到性能突围的全维度方案
破解Swin Transformer部署困境:从环境适配到性能突围的全维度方案 【免费下载链接】Swin-Transformer This is an official implementation for "Swin Transformer: Hierarchical Vision Transformer using Shifted Windows". 项目地址: https://gitcod…...
从零构建企业级Text2Sql应用:Vanna私有化部署与Dify工作流集成
1. 企业级Text2Sql应用的核心价值 想象一下,财务部门的同事对着Excel表格发愁:"能不能帮我找出上季度华东区销售额超过50万的所有客户?"传统做法需要找IT部门提需求,等开发人员写SQL查询,流程可能长达数三天…...
Android逆向实战:用Frida Hook自己写的APK,让1+1=88(附完整代码)
Android逆向实战:用Frida Hook自己写的APK,让1188(附完整代码) 在移动安全领域,逆向工程一直是个充满挑战又极具魅力的方向。想象一下,你能否让一个简单的计算器应用突然改变行为,比如让11的结果…...
为什么92%的Java边缘项目因Classloader泄漏失败?揭秘3层隔离沙箱设计与实时热替换机制
第一章:Java边缘计算轻量级运行时开发概览边缘计算场景对运行时环境提出严苛要求:低内存占用(通常 ≤ 64MB)、毫秒级冷启动、有限依赖、原生支持资源约束设备(如 ARM64 IoT 网关、工业 PLC)。Java 生态传统…...
conda安装cudnn避坑指南:为什么你的CUDA环境总是报错?
Conda环境下的CUDA与cuDNN版本管理实战指南 每次在终端看到CUDA相关的报错信息时,那种感觉就像是在解一道没有标准答案的数学题。特别是当深度学习框架因为CUDA版本不兼容而拒绝运行时,连最简单的import tensorflow都能变成一场噩梦。本文将带你深入理解…...
Scratch3.0离线编辑器安装指南:一步步教你轻松搞定
1. 为什么你需要Scratch3.0离线编辑器 Scratch作为全球最受欢迎的少儿编程工具,它的在线版本虽然方便,但经常会遇到网络不稳定、加载缓慢的问题。我去年给小学生上课时就遇到过这种情况——全班40个孩子同时登录在线编辑器,结果服务器直接卡死…...
探索含简易撬棒电路crowbar的双馈风机Simulink仿真模型
【含有简易撬棒电路crowbar的双馈风机simulink仿真模型】 含过电压保护电路的双馈风机模型。 此模型中的撬棍(crowbar)不是使用 IGBT 或理想开关构建的。 通过改变转子侧变换器的参考电压,对撬棒电路的切入和切出进行建模。 控制策略是最常见…...
IPD实战:如何用DCP决策点避免产品开发中的‘死亡陷阱’(附真实案例)
IPD实战:如何用DCP决策点避免产品开发中的"死亡陷阱" 在硅谷某科技公司的产品复盘会上,CTO盯着投影仪上的数据图表沉默良久——这个投入1200万美元、历时18个月的智能硬件项目,最终因为电池续航不达标而被迫终止。更令人痛心的是&a…...
