当前位置: 首页 > news >正文

商场网站建设公司/网络销售是干嘛的

商场网站建设公司,网络销售是干嘛的,网站没被百度收录,网页设计软件dw免费下载文章目录 18.1 什么是泛型18.2 C# 中的泛型18.3 泛型类18.3.1 声明泛型类18.3.2 创建构造类型18.3.3 创建变量和实例18.3.4 使用泛型的示例18.3.5 比较泛型和非泛型栈 18.4 类型参数的约束18.4.1 Where 子句18.4.2 约束类型和次序 18.5 泛型方法18.5.1 声明泛型方法18.5.2 调用…

文章目录

    • 18.1 什么是泛型
    • 18.2 C# 中的泛型
    • 18.3 泛型类
      • 18.3.1 声明泛型类
      • 18.3.2 创建构造类型
      • 18.3.3 创建变量和实例
      • 18.3.4 使用泛型的示例
      • 18.3.5 比较泛型和非泛型栈
    • 18.4 类型参数的约束
      • 18.4.1 Where 子句
      • 18.4.2 约束类型和次序
    • 18.5 泛型方法
      • 18.5.1 声明泛型方法
      • 18.5.2 调用泛型方法
      • 18.5.3 泛型方法的示例(*)
    • 18.6 扩展方法和泛型类
    • 18.7 泛型结构
    • 18.8 泛型委托
    • 18.9 泛型接口
      • 18.9.1 使用泛型接口的示例(*)
      • 18.9.2 泛型接口的实现必须唯一
    • 18.10 协变和逆变
      • 18.10.1 协变(out)
      • 18.10.2 逆变
      • 18.10.3 协变和逆变的不同
      • 18.10.4 接口的协变和逆变
      • 18.10.5 关于可变性的更多内容

18.1 什么是泛型

​ 泛型可以将重构代码并且额外添加一个抽象层,是专门为多段代码在不同的数据类型上执行相同指令而设计的。

18.2 C# 中的泛型

​ 泛型不是类型,而是类型的模板。

image-20231210150031003
图 18.1 泛型是类型的模板

​ C# 提供了以下 5 种泛型:

  1. 结构
  2. 接口
  3. 委托
  4. 方法

​ 其中 1 ~ 4 是类型,5 是成员。

image-20231210150222598
图 18.2 泛型和用户定义类型

18.3 泛型类

​ 泛型类不是实际的类,而是类的模板,因此必须先从它们构建实际的类,然后创建类的引用和实例。

  1. 在某些类型上使用一个占位符来声明一个类。
  2. 为占位符提供真实类型(构造类型)。
  3. 创建构造类型的实例。
image-20231210150450484
图 18.3 从泛型类创建实例

18.3.1 声明泛型类

  1. 在类名之后放置一组尖括号。
  2. 在尖括号中用逗号分隔占位符字符串,用于表示需要提供的类型(类型参数)。
  3. 在泛型类声明的主体中使用类型参数来表示替代类型。
image-20231210150748033

18.3.2 创建构造类型

​ 声明泛型类后,就可以告诉编译器使用哪些真实类型来替代占位符,编译器将获取这些真实类型并创建构造类型(用来创建真实类对象的模板)。

image-20231210150946452 image-20231210151000389
图 18.4 为泛型类的所有类型参数提供类型实参,让编译器产生一个可以用来创建真实类对象的构造类
  • 泛型类声明上的类型参数用作类型的占位符。
  • 在创建构造类型时提供的真实类型是类型实参。
image-20231210151124508
图 18.5 类型参数与类型实参

18.3.3 创建变量和实例

image-20231210151238224

​ 和非泛型类一样,引用和实例可以分开创建。

image-20231210151335389
图 18.6 使用构造类型来创建引用和实例

18.3.4 使用泛型的示例

image-20231210151445515
图 18.7 从泛型类创建的两个构造类

18.3.5 比较泛型和非泛型栈

表 18.1 非泛型栈和泛型栈之间的区别
image-20231210151551792 image-20231210151645921
图 18.8 非泛型栈和泛型栈

18.4 类型参数的约束

​ 要让泛型更加有用,需要提供额外的信息让编译器直到参数可以接受哪些类型,这些额外的信息称为约束

18.4.1 Where 子句

  • 每个有约束的类型参数都有自己的 where 子句。
  • 如果形参有多个约束,则使用逗号分隔。
image-20231211151758652

​ 有关 where 子句的要点如下:

  1. 在类型参数列表的关闭尖括号后列出。
  2. 不使用分隔符。
  3. 可以随意次序列出。
  4. where 是上下文关键字,可以在其他上下文使用。
image-20231211151935353 image-20231211151956737

18.4.2 约束类型和次序

表 18.2 约束类型
image-20231211152026863
  • 最多只能有一个主约束,必须放在第一位。
  • 可以有任意个接口名称约束。
  • 如果存在构造函数约束,必须放在最后。
image-20231211152225282
图 18.9 如果类型参数有多个约束,则必须遵守的顺序

18.5 泛型方法

​ 泛型方法可以在泛型 / 非泛型类、结构和接口中声明。

image-20231211152327633
图 18.10 泛型方法可以声明在泛型类型和非泛型类型中

18.5.1 声明泛型方法

  • 泛型方法有两个参数列表。
    • 方法参数列表(圆括号内)。
    • 类型参数列表(尖括号内)。
  • 方法参数列表后放置可选的约束子句。
image-20231211152624577

18.5.2 调用泛型方法

image-20231211152655620

​ 编译器使用每个构造函数实例产生方法的不同版本。

image-20231211152734084
图 18.11 有两个实例的泛型方法

​ 编译器有时可以从方法参数推断类型参数。例如,对于如下的方法声明:

image-20231211152909431

​ 编译器可以从 myInt 参数的类型推断出 T 为 int,因此可以省略尖括号。

image-20231211153008926 image-20231211153019653

18.5.3 泛型方法的示例(*)

18.6 扩展方法和泛型类

​ 和非泛型类一样,泛型类的扩展方法必须满足如下条件:

  1. 声明为 static。
  2. 是静态类的成员。
  3. 第一个参数类型中必须有关键字 this,后面是扩展的泛型类的名字。

18.7 泛型结构

​ 泛型结构的规则和条件与泛型类一致。

18.8 泛型委托

image-20231211153322516

​ C# LINQ 特性大量使用泛型委托。

18.9 泛型接口

​ 泛型接口的声明和非泛型接口的声明类似,但是要在接口名称后的尖括号中放置类型参数。

18.9.1 使用泛型接口的示例(*)

18.9.2 泛型接口的实现必须唯一

​ 必须保证类型实参的组合不会在类型中产生两个重复的接口。

​ 例如,对于下面的泛型接口,会产生潜在的冲突:S 可能用作 int 类型,此时会有两个相同类型的接口,这将不被允许。

image-20231211153927361
  • 泛型结构的名称不会和非泛型冲突。

18.10 协变和逆变

18.10.1 协变(out)

​ 给出如下例子:

image-20231211154403483 image-20231211154417119

​ 我么知道,Dog 类型的变量可以作为 Animal 类型的引用,因为 DogAnimal 派生而来,这里发生了隐式类型转换。

image-20231211154436251
图 18.12 赋值兼容性意味着可以将派生类型的引用赋值给基类变量

​ 进行扩展,添加 Factory 泛型委托、MakeDog 方法,并且 MakeDog 方法可以匹配 Factory 委托。

image-20231211154720158 image-20231211154740443

​ Main 函数的第二行尝试将 Factory<Dog> 类型赋给 Factory<Animal>类型,这将产生报错。

​ 问题的原因在于,委托 Factory<Dog> 并没有从 Factory<Animal> 派生得到。

image-20231211155355402
图 18.13 赋值兼容性不使用,因为两个委托没有继承关系

​ 我们仅希望传递 DogFactory<Animal> 委托时,代码对 Dog 类型中的 Animal 部分进行操作,这并不会发生越界访问,是完全合理的。为了完成我们的期望,可以通过添加 out 关键字改变委托声明。

image-20231211155754380 image-20231211155838829
图 18.14 协变关系允许程度更高的派生类型处于返回及输出位置

18.10.2 逆变

​ 与协变相反,如果类型参数只用于方法中的输入参数,那么可以传入更高程度的派生类引用,因为委托的方法中只对其基类部分进行操作。

image-20231211160307185

​ 调用委托时,调用代码为方法 ActOnAnimal 传入的 Dog 类型的变量,而其期望的是 Animal 对象,因此可以进行操作。

image-20231211160540377
图 18.15 逆变允许程度更高的派生类型作为输入参数

18.10.3 协变和逆变的不同

image-20231211160808224
图 18.16 协变和逆变

18.10.4 接口的协变和逆变

​ 相同的原则也适用于接口。

18.10.5 关于可变性的更多内容

​ 前面的内容讲解了显式的协变和逆变。实际上,编译器可以自动识别某个已构建的委托是协变还是逆变,并且自动进行类型强制转换,但这通常发生在没有为对象的类型赋值的时候。

  • Main 第一行创建了 Factory<Animal> 类型的委托,并直接将方法 MakeDog 赋值给它。由于没有创建 Factory<Dog> 委托,因此编译器清楚这是协变关系,允许这种赋值,哪怕委托中没有 out 标识符。
  • 到 Main 第三行时,由于第二行已经创建了 Factory<Dog> 委托,因此后面的协变关系赋值需要 out 标识符才能完成。
image-20231211161116413 image-20231211161140827
  • 可变性只适用于引用类型,不使用与值类型。
  • in、out 关键字的显式变化只适用于委托和接口,不适用于类、结构和方法。
  • 不使用 int、out 关键字的委托和接口类型参数是不变的。
image-20231211161921422

相关文章:

C# 图解教程 第5版 —— 第18章 泛型

文章目录 18.1 什么是泛型18.2 C# 中的泛型18.3 泛型类18.3.1 声明泛型类18.3.2 创建构造类型18.3.3 创建变量和实例18.3.4 使用泛型的示例18.3.5 比较泛型和非泛型栈 18.4 类型参数的约束18.4.1 Where 子句18.4.2 约束类型和次序 18.5 泛型方法18.5.1 声明泛型方法18.5.2 调用…...

保障事务隔离级别的关键措施

目录 引言 1. 锁机制的应用 2. 多版本并发控制&#xff08;MVCC&#xff09;的实现 3. 事务日志的记录与恢复 4. 数据库引擎的实现策略 结论 引言 事务隔离级别是数据库管理系统&#xff08;DBMS&#xff09;中的一个关键概念&#xff0c;用于控制并发事务之间的可见性。…...

Docker导入导出镜像、导入导出容器的命令详解以及使用的场景

一、Docker 提供用于管理镜像和容器命令 1.1 docker save 与 docker load 这是一对操作&#xff0c;用于处理 Docker 镜像。这个操作会将所有的镜像层以及元数据打包到一个 tar 文件中。然后&#xff0c;你可以使用 docker load 命令将这个 tar 文件导入到任何 Docker 环境中…...

虚拟化嵌套

在理论上,可以在虚拟机(VM)内运行一个hypervisor,这个概念被称为嵌套虚拟化: 我们将第一个hypervisor称为Host Hypervisor,将VM内的hypervisor称为Guest Hypervisor。 在Armv8.3-A发布之前,可以通过在EL0中运行Guest Hypervisor来在VM中运行Guest Hypervisor。然而,这…...

【XILINX】记录ISE/Vivado使用过程中遇到的一些warning及解决方案

前言 XILINX/AMD是大家常用的FPGA&#xff0c;但是在使用其开发工具ISE/Vivado时免不了会遇到很多warning&#xff0c;(大家是不是发现程序越大warning越多&#xff1f;)&#xff0c;并且还有很多warning根据消除不了&#xff0c;看着特心烦&#xff1f; 我这里汇总一些我遇到的…...

Tableau进阶--Tableau数据故事慧(20)解构Tableau的绘图逻辑

官网介绍 官网连接如下&#xff1a; https://www.tableau.com/zh-cn tableau的产品包括如下&#xff1a; 参考:https://zhuanlan.zhihu.com/p/341882097 Tableau是功能强大、灵活且安全些很高的端到端的数据分析平台&#xff0c;它提供了从数据准备、连接、分析、协作到查阅…...

45.0/HTML 简介(详细版)

目录 45.1 互联网简介 45.2 网页技术与分类 45.3 HTML 简介 45.3.1 什么是 HTML?(面试题) 45.3.2 HTML 文件结构 45.3.3 HTML 语法 45.3.4 实例演练步骤(面试题) 45.4 head 中的常用标签 45.4.1 title 标记 45.4.2 meta 标记 45.4.3 45.4.4 45.4.4(面试题)总结: 45…...

Python 如何进行游戏开发?

游戏开发是一个广泛的领域&#xff0c;Python 作为一门灵活的编程语言&#xff0c;可以用于不同类型的游戏开发。以下是一些建议和步骤&#xff0c;帮助你开始使用 Python 进行游戏开发&#xff1a; 1、选择游戏开发库/框架&#xff1a; Pygame&#xff1a; Pygame 是一个用于…...

到底什么是DevOps

DevOps不是一组工具&#xff0c;也不是一个特定的岗位。在我看来DevOps更像是一种软件开发文化&#xff0c;一种实现快速交付能力的手段。 DevOps 强调的是高效组织团队之间如何通过自动化的工具协作和沟通来完成软件的生命周期管理&#xff0c;从而更快、更频繁地交付更稳定的…...

Keil生成bin文件

Keil生成bin文件_keil5生成bin文件-CSDN博客...

【STM32】USART串口协议

1 通信接口 通信的目的&#xff1a;将一个设备的数据传送到另一个设备&#xff0c;扩展硬件系统 通信协议&#xff1a;制定通信的规则&#xff0c;通信双方按照协议规则进行数据收发 USRT&#xff1a;TX是数据发送引脚&#xff0c;RX是数据接受引脚&#xff1b; I2C&#xf…...

淋雨试验箱

产品概述 KDZD-IPX34淋雨试验箱是对户外电子电工产品的防水性能测试的一种装置。该设备通过不同尺寸的喷嘴喷水&#xff0c;产品外壳表面淋水冲洗来检测防水性能。在测试物品时&#xff0c;将样品放在转台上&#xff0c;试验启动时&#xff0c;水流通过压力计和流量计控制水…...

02-MQ入门之RabbitMQ简单概念说明

二&#xff1a;RabbitMQ 介绍 1.RabbitMQ的概念 RabbitMQ 是一个消息中间件&#xff1a;它接受并转发消息。你可以把它当做一个快递站点&#xff0c;当你要发送一个包裹时&#xff0c;你把你的包裹放到快递站&#xff0c;快递员最终会把你的快递送到收件人那里&#xff0c;按…...

敏感信息泄漏怎么破?来试试极狐GitLab 的密钥检测吧

前言 在应用程序开发过程中&#xff0c;一个很常见的问题就是&#xff1a;开发人员为了本地 debug 方便&#xff0c;会 hardcode 一些信息&#xff0c;比如连接数据库的用户名、密码、连接第三方 app 的 token、certificate 等&#xff0c;如果在提交代码的时候没有及时删除 ha…...

go学习之网络编程

文章目录 网络编程1、网络编程的基本介绍2.网络编程的基础知识1&#xff09;协议(tcp/ip)2&#xff09;OSI与TCP/ip参考模型3&#xff09;ip地址4&#xff09;端口(port)介绍5&#xff09;tcp socket编程的客户端和服务器端 3.socket编程快速入门4.经典项目-海量用户即时通讯系…...

将数组中的数逆序存放

本题要求编写程序&#xff0c;将给定的n个整数存入数组中&#xff0c;将数组中的这n个数逆序存放&#xff0c;再按顺序输出数组中的元素。 输入格式: 输入在第一行中给出一个正整数n&#xff08;1≤n≤10&#xff09;。第二行输入n个整数&#xff0c;用空格分开。 输出格式:…...

Unity Web 浏览器-3D WebView中有关于CanvasWebViewPrefab

一、CanvasWebViewPrefab默认设置 这个是在2_CanvasWebViewDemo示例场景文件中可以可以查看得到&#xff0c;可以看出CanvasWebViewPrefab的默认配置如下。 二、Web 浏览器网页和Unity内置UI的渲染顺序 1、如果你勾选了以下这个Native 2D Mode选项的话&#xff0c;那么Unit…...

一款计算机顶会爬取解析系统 paper info

一款计算机顶会爬取解析系统 paper info 背景项目实现的功能 技术方案架构设计项目使用的技术选型 使用方法本地项目部署使用ChatGPT等大模型创建一个ChatGPT助手使用阿里云 顶会数据量 百度网盘pfd文件json文件 Q&A github链接 &#xff1a;https://github.com/codebricki…...

CommonJs模块化实现原理ES Module模块化原理

CommonJs模块化实现原理 首先看一个案例 初始化项目 npm init npm i webpack -D目录结构如下&#xff1a; webpack.config.js const path require("path"); module.exports {mode: "development",entry: "./src/index.js",output: {path: p…...

实验4.1 静态路由的配置

实验4.1 静态路由的配置 一、任务描述二、任务分析三、具体要求四、实验拓扑五、任务实施1.设置交换机和路由器的基本配置。2.使用display ip interface brief命令查看接口配置信息。3.配置静态路由&#xff0c;实现全网互通。 六、任务验收七、任务小结 一、任务描述 某公司刚…...

Java网络编程-深入理解BIO、NIO

深入理解BIO与NIO BIO BIO 为 Blocked-IO&#xff08;阻塞 IO&#xff09;&#xff0c;在 JDK1.4 之前建立网络连接时&#xff0c;只能使用 BIO 使用 BIO 时&#xff0c;服务端会对客户端的每个请求都建立一个线程进行处理&#xff0c;客户端向服务端发送请求后&#xff0c;…...

ShenYu网关注册中心之HTTP注册原理

文章目录 1、客户端注册流程1.1、读取配置1.1.1、用于注册的 HttpClientRegisterRepository1.1.2、用于扫描构建 元数据 和 URI 的 SpringMvcClientEventListener 1.2、扫描注解&#xff0c;注册元数据和URI1.2.1、构建URI并写入Disruptor1.2.2、构建元数据并写入Disruptor1.2.…...

探索GameFi:区块链与游戏的未来融合

在过去的几年里&#xff0c;区块链技术逐渐渗透到各个领域&#xff0c;为不同行业带来了前所未有的变革。其中&#xff0c;游戏行业成为了一个引人注目的焦点&#xff0c;而这种结合被称为GameFi&#xff0c;即游戏金融。GameFi不仅仅是一个概念&#xff0c;更是一场区块链和游…...

Windows下使用CMake编译lua

Lua 是一个功能强大、高效、轻量级、可嵌入的脚本语言。它支持程序编程、面向对象程序设计、函数式编程、数据驱动编程和数据描述。 Lua的官方网站上只提供了源码&#xff0c;需要使用Make进行编译&#xff0c;具体的编译方法为 curl -R -O http://www.lua.org/ftp/lua-5.4.6.…...

【C语言(十一)】

C语言内存函数 一、memcpy使用和模拟实现 void * memcpy ( void * destination, const void * source, size_t num ); • 函数memcpy从source的位置开始向后复制num个字节的数据到destination指向的内存位置。 • 这个函数在遇到 \0 的时候并不会停下来。 • 如果sourc…...

系统运行占用过高

1、CPU过高的问题排查 示例代码&#xff1a; public class Test { static class MyThread extends Thread { public void run() { // 死循环&#xff0c;消耗CPU int i 0; while (true) { i; } } } public static void main(String args[]) throws InterruptedException { ne…...

HTML---初识CSS

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 一.CSS概念 CSS是层叠样式表&#xff08;Cascading Style Sheets&#xff09;的缩写。它是一种用于描述HTML文档外观样式的标记语言。通过CSS&#xff0c;开发者可以在不改变HTML标记结构的情况…...

监控pod 容器外网请求网络带宽,过滤掉内网、基于k8spacket开发、prometheus开发export

首先安装k8spacket 安装k8spacket遇到问题&#xff0c;下载插件一直能不能下载成功&#xff0c;pod不能启动。所有手动下载处理。 helm repo add k8spacket https://k8spacket.github.io/k8spacket-helm-chart helm pull k8spacket/k8spacket打开values.yaml 文件 手动下载插…...

windows下docker环境安装

开启硬件虚拟化技术 win10中开启 Hyper-V Win10 下是否开启硬件虚拟化技术&#xff0c;在控制面板&#xff0c;启用 window 功能&#xff0c;找到 Hyper-V 选项&#xff0c;点勾选确认。如图&#xff1a; Windows 11 家庭中文版新增 Hyper-V选项 注意以下的解决方案来自win1…...

Python小程序 - 表格数值统计

题设&#xff1a;Excel表格中&#xff0c;计算如下图所示不同颜色&#xff08;蓝、黄、桔&#xff09;单元格值&#xff1a;各颜色填涂的单元格值的总和条件&#xff1a; - Excle表格中 - 分色标记&#xff0c;单元格有值 - 开始列&#xff08;当前为D&#xff09;&#xff0c;…...