美文网首页
C#泛型方法

C#泛型方法

作者: gangjian | 来源:发表于2018-11-22 16:18 被阅读0次

下面一段代码用于判断某个输入值是否落在最大值和最小值的区间范围内,如果是就返回这个输入值,否则返回控件原来的值.

输入值可能有两种类型(int或float),

我想如果是像Python这样的弱类型语言,解释器应该可以自动推断出变量类型,直接写一次比较逻辑的代码就可以了.

但是像C/C++, C#/Java这样的强类型语言,因为比较操作涉及的变量类型不同,如果不使用泛型的话,就要为每种类型各写一遍比较逻辑代码.

代码如下,除了类型不一样,上下两种类型的处理逻辑是一模一样的.

1

要消除这种代码重复,就要用到泛型.平时在实际中用到的也不多,正好借这个机会复习一下.

决定采用泛型方法(还有泛型类,泛型接口,泛型代理等),把重复的比较逻辑代码提出到共通的泛型方法中去,具体的变量类型作为参数传递.

代码如下:

<T>跟在方法名的后面表示类型的占位符, 后面参数列表中对应的参数类型用T替代.

但是直接这样写还不行,有编译error,因为代码用到了变量对象的比较操作.而此时在泛型方法内编译器并不知道如何比较两个T类型变量对象.

2

所以还要额外指明类型T的约束条件,也就是让编译器知道:类型T的变量实现了IComparable<T>接口.

这样编译器就知道T类型的变量可以用.CompareTo方法来比较大小.

而int,float显然都是实现了这个接口的类型.

于是借这个机会又复习了一下接口的概念.

其实我本来以为实现了IComparable<T>接口就可以直接用大于号小于号比较大小了(运算符重载).

然而实际上并不是,还是得调用.CompareTo方法才能比较大小.

泛型的类型约束用where子句表示, 代码如下:

3

将比较逻辑提出到泛型方法中以后,原来的代码如下:

虽然用了泛型,但还是要先判断变量的类型,再分别调用两次.

因为泛型方法只是声明,在实际调用的时候,编译器实际上还是要根据传入的实际类型分别构造出两个不同参数类型的方法.

4

Python应该不会遇到这种问题吧?应该直接写一次相关的逻辑处理代码就可以了.

但是我还没实际动手试一下,回去有时间试一下.如果不出所料果真如此的话.

那Python一直以来宣传的简洁优雅的优点,我之前却一直都没怎么看出来(相较于C#),现在看至少在这个问题上,确实也还是有一定道理的.

相关文章

  • C#基础提升系列——C#泛型

    C# 泛型(Generics) 泛型概述 泛型是C#编程语言的一部分,它与程序集中的IL(Intermediate...

  • C#泛型方法

    下面一段代码用于判断某个输入值是否落在最大值和最小值的区间范围内,如果是就返回这个输入值,否则返回控件原来的值. ...

  • Java 泛型

    泛型类 例如 泛型接口 例如 泛型通配符 泛型方法 类中的泛型方法 泛型方法与可变参数 静态方法与泛型 泛型上下边...

  • C#---API-02(Application Programm

    一、泛型概述 1. 泛型 1.1 泛型是什么? 泛型(generic)是C#语言2.0和通用语言运行时(CLR)得...

  • TS 笔记九 泛型

    参考C# 泛型 泛型与非泛型集合[https://www.jianshu.com/p/e45e7573f928] ...

  • 泛型的使用

    泛型有三种使用方式,分别为:泛型类、泛型接口、泛型方法 泛型类 泛型接口 泛型通配符 泛型方法 静态方法与...

  • C# 泛型 泛型与非泛型集合

    一、为什么使用泛型编程? 参考C#泛型编程[https://zhuanlan.zhihu.com/p/401837...

  • C#基础提升系列——C#集合

    C#集合 有两种主要的集合类型:泛型集合和非泛型集合。 泛型集合被添加在 .NET Framework 2.0 中...

  • Java泛型

    泛型有三种实现方式,分别是泛型接口、泛型类、泛型方法。下面通过泛型方法来介绍什么是类型参数。 泛型方法声明方式:访...

  • 重走安卓进阶路——泛型

    ps.原来的标题 为什么我们需要泛型? 泛型类、泛型接口和泛型方法(泛型类和泛型接口的定义与泛型方法辨析); 如何...

网友评论

      本文标题:C#泛型方法

      本文链接:https://www.haomeiwen.com/subject/vbilqqtx.html