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

C# 泛型(泛型方法)

泛型方法

与其他泛型不一样,方法是成员,不是类型。泛型方法可以在泛型和非泛型类以及结构和接
口中声明,如图18-10所示。

泛型方法可以声明在泛型类型和非泛型类型中

声明泛型方法

泛型方法具有类型参数列表和可选的约束。

  • 泛型方法有两个参数列表。
    • 封闭在圆括号内的方法参数列表。
    • 封闭在尖括号内的类型参数列表。
  • 要声明泛型方法,需要:
    • 在方法名称之后和方法参数列表之前放置类型参数列表;
    • 在方法参数列表后放置可选的约束子句。

image

说明 记住,类型参数列表在方法名称之后,在方法参数列表之前。

调用泛型方法

要调用泛型方法,应该在方法调用时提供类型实参,如下所示:

image
图18-11演示了一个叫作DoStuff的泛型方法的声明,它接受两个类型参数。其后是两次方
法调用,每使用不同的类型参数。编译器使用每个构造实例产生方法的不同版本,如图18-11中
右边所示。

有两个实例的泛型方法

推断类型
如果我们为方法传入参数,编译器有时可以从方法参数的类型中推断出应用作泛型方法的类
型参数的类型。这样就可以使方法调用更简单,可读性更强。
例如,下面的代码声明了MyMethod,它接受了一个与类型参数同类型的方法参数。

image

如以下代码所示,如果我们使用int类型的变量调用MyMethod,方法调用中的类型参数的信
息就多余了,因为编译器可以从方法参数中得知它是int。

image

由于编译器可以从方法参数中推断类型参数,我们可以省略类型参数和调用中的尖括号,如
下所示。

MyMethod(myInt)

泛型方法的示例
如下的代码在一个叫作Simple的非泛型类中声明了一个叫作ReverseAndPrint的泛型方法。
这个方法把任意类型的数组作为其参数。Main声明了3个不同的数组类型,然后使用每一个数组
调用方法两次。第一次使用特定数组调用了方法,并显式使用类型参数,而第二次让编译器推断
类型。

class Simple                             //非泛型类
{static public void ReverseAndPrint<T>(T[] arr) //泛型方法{Array.Reverse(arr);foreach(T item in arr)                 //使用类型实例TConsole.Write($"{item.ToString()},");Console.WriteLine("");}
}class Program
{static void Main(){//创建各种类型的数组var intArray =new int[]{3,5,7,9,11};var stringArray=new string[]{"first","second,"third"};var dooubleArray=new double[] {3.567,7,891,2.345};Simple.ReverseAndPrint<int>(intArray); //调用方法Simple.ReverseAndPrint(intArray);      //推断类型并调用Simple.ReverseAndPrint<string>(stringArray); //调用方法Simple.ReverseAndPrint(stringArray);         //推断类型并调用Simple.ReverseAndPrint<double>(doubleArray);   //调用方法Simple.ReverseAndPrint(doubleArray);           //推断类型并调用}
}
http://www.lryc.cn/news/598154.html

相关文章:

  • Python中常用标准库(时间库、随机库、正则表达式)
  • pytest官方Tutorial所有示例详解(一)
  • 基于Node.js开发的开源博客平台ghost安装和使用
  • MySQL高可用部署
  • 云原生MySQL Operator开发实战(一):Operator基础与CRD设计
  • Spring MVC中常用注解_笔记
  • nuxt更改页面渲染的html,去除自定义属性、
  • 【Word Press进阶】自定义区块的行为与样式
  • go项目实战二
  • Linux应用开发基础知识——进程学习2(exec函数、system函数、popen函数)(三)
  • 数据挖掘顶刊TKDE论文分享│ST-LLM+:面向交通预测的图增强时空大语言模型
  • 第五章 Freertos物联网实战 微信小程序篇
  • 从0开始学习R语言-Day56--空间变系数模型
  • Django基础(八)———数据库外键及表关系
  • Transformer Masked loss原理精讲及其PyTorch逐行实现
  • Kubernetes 集群架构和Pod创建流程
  • 【unity游戏开发入门到精通——组件篇】unity的粒子系统力场 (Particle System Force Field)实现如旋风、吸引力、风吹效果等
  • Unity GC 系列教程第四篇:GC Alloc 优化技巧与实践(下)与 GC 调优
  • 时序数据库IoTDB的核心功能特性
  • iOS WebView 加载失败与缓存刷新问题排查实战指南
  • 【Lucene】文件概览
  • 3D Semantic Occupancy Prediction
  • Linux进程生命周期:从创建到回收的完整闭环
  • 【建模与仿真】融合共现网络特征与知识增强语义梯度提升电子邮件分类
  • Jenkins最新版本的安装以及集成Allure生成测试报告
  • 跨越学术边界的战略选择:英文专著的潜在价值发掘
  • C++11之可变参数模板
  • 不同类型的交易所交易规则有哪些区别?
  • Apache Flink 实时流处理性能优化实践指南
  • Spring中的循环依赖:解密、破局与架构启示