C#基础学习--泛型

news2025/6/20 3:59:42

目录

C#中的泛型

 泛型类

 声明泛型类

创建构造函数

 创建变量和实例

 类型参数的约束

Where 子句

 泛型方法

声明泛型方法

 ​编辑

 调用泛型方法 

 扩展方法和泛型类

泛型结构

 泛型委托

 泛型接口

 协变

逆变

接口的协变和逆变


C#中的泛型

泛型允许我们声明  类型参数化 的代码,可以用不同的类型进行实例化

 C#提供了5钟泛型:类,结构,接口,委托和方法  前面四个是类型,而方法是成员

↑  这张图看不懂什么意思

 泛型类

 泛型类不是实际的类,而是类的模板,所以我们必须先从他们构建实际的类类型,然后创建这个构建后的类类型的实例

 声明泛型类

创建构造函数

 

 创建变量和实例

 类型参数的约束

要让泛型变得更有用,我们需要提供额外的信息让编译器直到参数可以接受那些类型。这些额外的信息叫做约束。只有符合约束的类型才能替代给定的类型参数,来产生构造函数

Where 子句

约束使用where子句列出

 泛型方法

方法是成员不是类型,泛型方法可以在泛型和非泛型类以及结构和接口中声明

声明泛型方法

 

 调用泛型方法 

 扩展方法和泛型类

using System;
using System.Collections.Generic;
using System.Text;

namespace Csharpzuoye
{

    static class ExtendHolder
    {
        public static void Print<T>(this Holder<T> h)
        {
            T[] vals = h.GetValues();
            Console.WriteLine("{0},\t{1},\t{2}", vals[0], vals[1], vals[2]);
        }
    }
    class Holder<T>
    {
        T[] vals = new T[3];

        public Holder(T v0,T v1,T v2)
        { vals[0] = v0; vals[1] = v1; vals[2] = v2; }

        public T[] GetValues() { return vals; }
    }

    class Program
    {
        static void Main()
        {
            var intHolder = new Holder<int>(3, 5, 7);
            var stringHolder = new Holder<string>("a1", "b2", "c3");
            intHolder.Print();
            stringHolder.Print();
        }
    }
}

 

泛型结构

与泛型类相似,泛型结构可以有类型参数和约束。泛型结构的规则和条件与泛型类是一样的

 泛型委托

类型参数决定了能接受什么样的方法

 

 泛型接口

泛型接口允许我们编写参数和接口成员返回类型是泛型类型参数的接口。

using System;
using System.Collections.Generic;
using System.Text;

namespace Csharpzuoye
{
    interface IMyIfc<T>
    {
        T ReturnIt(T invalue);
    }

    class Simple<S>: IMyIfc<S>
    {
        public S ReturnIt(S invalue)
        { return invalue; }
    }
    

    class Program
    {
        static void Main()
        {
            var trivInt = new Simple<int>();
            var trivString = new Simple<string>();

            Console.WriteLine("{0}", trivInt.ReturnIt(5));
            Console.WriteLine("{0}", trivString.ReturnIt("Hi,there."));
        }
    }
}

 

 实现泛型类型接口时,必须保证类型参数组合不会在类型中产生两个重复的接口

 协变

可变性:  协变,逆变,不变

每一个变量都有一种类型,你可以将派生类对象的实例赋值给基类的变量,这叫做赋值兼容性

其中Dog 是 Animal的派生类,但是对于Animal的委托不接受Dog的引用,虽然Dog的引用也等于Animal的引用

如果派生类只是用于输出值,那么这种结构化的委托有效性之间的常数关系叫做协变。为了让编译器知道这是我们的期望,必须使用out关键字标记委托声明中的类型参数

逆变

接口的协变和逆变

 

 

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

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

相关文章

Jetpack Compose大师乘势而上,创建引人入胜和直观的UI;实用技巧和技术

简述 Jetpack Compose 是 Android 上的一种全新的 UI 工具箱&#xff0c;旨在简化 Android UI 开发流程&#xff0c;提高开发效率和应用性能&#xff0c;并且提供更直观、更灵活、更强大的 UI 定义方式。 Jetpack Compose 提供了一套新的声明式 UI 编程模型&#xff0c;采用 …

【Redis】多级缓存(nginx缓存、redis缓存及tomcat缓存)

【Redis】多级缓存 文章目录【Redis】多级缓存1. 传统缓存的问题2. 多级缓存方案2.1 JVM进程缓存2.1.1 本地进程缓存2.1.2 Caffeine2.2 Nginx缓存2.2.1 准备工作2.2.2 请求参数处理2.2.3 nginx发送http请求tomcat2.2.3.1 封装http查询函数2.2.3.2 使用http函数查询数据2.2.4 ng…

Huffman 编码

1.Huffman编码 1952年提出一种编码方法&#xff0c;该方法完全依据字符出现概率来构造异字头的平均长度最短的码字&#xff0c;有时称之为最佳编码&#xff0c;一般就叫做Huffman编码(有时也称为霍夫曼编码)。 2.Huffman树 树是一种重要的非线性数据结构&#xff0c;它是数据元…

​2023年十大目标检测模型!

“目标检测是计算机视觉中最令人兴奋和具有挑战性的问题之一&#xff0c;深度学习已经成为解决该问题的强大工具。”—Dr. Liang-Chieh Chen目标检测是计算机视觉中的基础任务&#xff0c;它涉及在图像中识别和定位目标。深度学习已经革新了目标检测&#xff0c;使得在图像和视…

【CV大模型SAM(Segment-Anything)】真是太强大了,分割一切的SAM大模型使用方法:可通过不同的提示得到想要的分割目标

目录前言安装运行环境SAM模型的使用方法导入相关库并定义显示函数导入待分割图片使用不同提示方法进行目标分割方法一&#xff1a;使用单个提示点进行目标分割方法二&#xff1a;使用多个提示点进行目标分割方法三&#xff1a;用方框指定一个目标进行分割方式四&#xff1a;将点…

文件操作和IO—javaEE

文章目录1.文件1.1文件系统的结构1.2java中的文件操作&#xff08;metadata的操作&#xff09;2.io操作2.1定义2.2io划分2.3java的io流之输入流2.4java的io流之输出流1.文件 文件包含数据本身和文件的头信息&#xff08;metadata&#xff09;&#xff0c;文件的头信息包括文件…

VSCode的C/C++编译调试环境搭建(亲测有效)

文章目录前言1.安装VSCode和mingw642.配置环境变量3.配置VSCode的运行环境3.1设置CodeRunner3.2设置C/C4.调试环境配置前言 这片博客挺早前就写好了&#xff0c;一直忘记发了&#xff0c;写这篇博客之前自己配的时候也试过很多博客&#xff0c;但无一例外&#xff0c;都各种js…

SpringBoot(4)整合数据源

SpringBoot整合数据源数据层解决方案数据源技术持久化技术数据库技术NoSQL整合Redis整合MongDB整合ES数据层解决方案 MySQL数据库与MyBatisPlus框架&#xff0c;后面又用了Druid数据源的配置&#xff0c;所以现在数据层解决方案可以说是MysqlDruidMyBatisPlus。而三个技术分别…

一文彻底了解派克Parker无铁芯/有铁芯直线电机及其应用

一、什么是直线电机&#xff1f; 直线电机是一种将电能直接转换成直线运动机械能&#xff0c;而不需要任何中间转换机构的传动装置。它可以看成是一台旋转电机按径向剖开&#xff0c;并展成平面而成。 二、直线电机的特点 直线电机类似于一台旋转电机解剖摊开来进行运转。在一…

9、DRF实战总结:过滤(filter)与排序,以及第三方库django-filter的使用(附源码)

在前面的DRF系列教程中&#xff0c;以博客为例介绍了序列化器(Serializer), 并使用基于类的视图APIView和ModelViewSet开发了针对文章资源进行增删查改的完整API接口&#xff0c;并详细对权限、认证(含jwt认证)和分页进行了总结与演示。在本篇文章中将向演示如何在Django REST …

Boost库在windows上的使用

今天要配置一个C环境&#xff0c;被Boost库困扰了一段时间&#xff0c;在这里记录一下解决的方法。 主要是打不开 libboost_iostreams-vc143-mt-gd-x64-1_82.lib这样的问题。 操作的步骤如下&#xff1a; 下载binary包&#xff1a; 链接: https://boostorg.jfrog.io/artifac…

ChatGPT有用到知识图谱吗?它自己是这样回答...

从搜索引擎到个人助手&#xff0c;我们每天都在使用问答系统。问答系统必须能够访问相关的知识并进行推理。通常&#xff0c;知识可以隐式地编码在大型语言模型&#xff08;LLMs&#xff09;中&#xff0c;例如ChatGPT、T5 和LaMDA 等大型语言模型&#xff0c;这些模型在未结构…

如何面对人生困境至暗时刻

北方春天伊始刚好想发表下另一种境遇就是当人生面临困境或者至暗怎么样走出来&#xff0c;如果有正面临这样的情况来分享下如何走出阴霾&#xff0c;拥有更多可能性的人生&#xff0c;现在回望过去一年的自己太过牵强失去自我。 对世界的应该思维&#xff1a;为什么我总看不清现…

PHP快速入门10-图像处理,附图像大小调整、旋转、获取颜色等15个常见示例

文章目录前言一、PHP的图像处理1.1 图像处理函数二、 图像处理示例2.1 创建一个空白的图像2.2 从文件创建一个新的图像2.3 从URL创建一个新的图像2.4 调整图像大小2.5 对比度和亮度调整2.6 度数旋转2.7 模糊滤镜2.8 获取图像的颜色信息2.9. 图像合并2.10 图像旋转和裁剪2.11 图…

css补充内容

1.最好给body设置min-width,防止缩小页面时出现空白 2.让图片随着网页缩小而缩小 3.html5语义化元素 4.video与audio video是行内替换元素 默认是第一帧静态画面,需要手动调整画面大小和添加播放条,是否自动播放 大多数浏览器不支持自动播放,除非设置为muted,这是为了用户的…

小巧“抠门”的FTHR-F0140开发板

小巧“抠门”的FTHR-F0140开发板 文章目录小巧“抠门”的FTHR-F0140开发板缘起硬件电路主控芯片供电系统调试器插座LED灯按键CAN接口电路软件资源资源链接缘起 工欲善其事&#xff0c;必先利其器。调试和开发MM32F0140这种小巧的芯片&#xff0c;还是需要小巧的板子去适配&…

本科也可入行的IC模拟版图,需要学习哪些知识?

IC模拟版图是一个入门非常简单&#xff0c;但同时又是一份涉及知识面非常广阔&#xff0c;资深较难的工作。 在众多IC岗位中&#xff0c;模拟版图确实属于容易入门&#xff0c;吸引来很多想要转行IC行业的朋友&#xff0c;但需要掌握的知识点和技巧并不比设计少&#xff0c;属…

Python+Selenium+Unittest 之selenium5--元素定位4-XPath定位1(基本概念)

目录 一、简介 二、节点关系 三、绝对路径与相对路径 一、简介 Xpath定位在selenium中属于常用的定位方式&#xff0c;首先来说下Xpath的一些概念&#xff0c;Xpath即为XML路径语言&#xff08;XML Path Language&#xff09;&#xff0c;它是一种用来确定XML文档中某部分位置…

Vision Transformers for Dense Prediction论文笔记

文章目录Vision Transformers for Dense Prediction&#xff0c; ICCV&#xff0c; 2021一、背景介绍二、网络结构三、实验结果1.语义分割实验2.消融实验Vision Transformers for Dense Prediction&#xff0c; ICCV&#xff0c; 2021 一、背景介绍 本篇论文主要提出一种网络…

SpringBoot 集成webSocket

pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 …