学习《深入理解C#》—— 泛型 (第三章3.1---3.2)
泛型是什么?
泛型(generic)是C# 2.0和通用语言运行时(CLR)的一个新特性。泛型为.NET框架引入了类型参数(type parameters)的概念。类型参数使得设计类和方法时,不必确定一个或多个具体参数,其具体参数可延迟到客户代码中声明、实现。
为什么需要泛型?
在C#1中,我们的代码中存在大量的强制转换,特别是那些大量使用集合中,几乎每次使用foreach都要隐式的强制转换。只要将 object 作为参数类型或返回类型使用时,就可能涉及强制类型转换。比如下面的需求:
假如我们要写一个比较两个整数大小的方法时,我们可能很快会写出下面的代码:
public static int ComparerInt(int i, int j)
{
if (i.CompareTo(j) > )
{
return i;
}
return j;
}
如果我们需求改变了,又要比较两个字符串的大小时,我们不得不又要编写一个比较字符串的方法。
public static string ComparerString(string str1, string str2)
{
if (str1.CompareTo(str2) > )
{
return str1;
}
return str2;
}
如果我们的需求又改了,比较两个double类型的大小,那我们又编写一个比较double类型的方法吗? 从上面的代码中可以看出,方法比较的只是比较的类型不一样,比较的方式都是一样的,这时我们想一想有没有一种通用的比较方式呢?可以把任何类型当做参数传入到这个类型中去实例化为具体类型的比较,同时微软在C#2.0中也想到了这个问题,所以就导致了C#2.0中添加了泛型这个新的特性,泛型就是——通用类型,有了泛型之后就可以很好的帮助我们解决上述的问题。
public class CompareGeneric<T> where T : IComparable
{
public static T Compare(T t1, T t2)
{
if (t1.CompareTo(t2) > )
{
return t1;
}
else
{
return t2;
}
}
}
这样我们就不需要针对每个类型实现一个比较方法,我们可以通过下面的方式在主函数中进行调用的:
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Compare<int>.CompareGeneric(, ));
Console.WriteLine(Compare<string>.CompareGeneric("qwer", "tyu"));
Console.Read();
}
}
泛型类型和类型参数
泛型有两种形式:泛型类型(包括类、接口、委托和结构——没有泛型枚举)和泛型方法。类型参数是真实类型的占位符。在泛型声明中,类型参数要放在一对尖括号内,并以逗号分隔。在 Dictionary <TKey,TValue> 中,类型参数是 TKey 和 TValue 。使用泛型类型或方法时,要用真实的类型代替。这些真实的类型称为类型实参(type argument)。我们已习惯于方法的参数和返回值有固定的类型,而且已看到了泛型类型如何在它的方法声明中使用类型参数。泛型方法则更进一步,即使你已经确切地知道要操作哪一个已构造类型,泛型方法也可以有类型参数。
这篇就写到这里。下篇我们将继续学习《深入理解C#》的相关知识。谢谢!
学习《深入理解C#》—— 泛型 (第三章3.1---3.2)的更多相关文章
- 深入理解Java虚拟机 第三章 垃圾收集器 笔记
1.1 垃圾收集器 垃圾收集器是内存回收的具体实现.以下讨论的收集器是基于JDK1.7Update14之后的HotSpot虚拟机.这个虚拟机包含的所有收集器有: 上图展示了7种作用于不同分代的收集 ...
- [Note][深入理解Java虚拟机] 第三章 垃圾收集器与内存分配策略笔记
书上关于GCTimeRatio的讲解有点难以理解,查看Oracle的文档后重新理解了下 -XX:GCTimeRatio 运行时间 / GC时间 当GCTimeRatio为19时,运行时间是GC时间的1 ...
- 使用java理解程序逻辑 第三章 选择结构一
if 选择结构: if(条件){ 代码块 //条件成立后要执行的代码.可以是一条语句,也可以是一组语句 } 可以处理单一或组合条件的情况. if-else 选择结构: if(条件){ ...
- 深入理解计算机系统_3e 第三章家庭作业 CS:APP3e chapter 3 homework
3.58 long decode2(long x, long y, long z) { int result = x * (y - z); if((y - z) & 1) result = ~ ...
- 深入理解java虚拟机-第三章
1.概述 2.对象已死吗? 引用计数器 给对象添加一个引用计数器,每当有引用时,计数器加1,引用失效时,计数器减1:任何时刻计数器为0的对象就是不可能再被使用的. 若对象是循环引用,则无法处理.JVM ...
- 《C++Primer》第五版习题答案--第三章【学习笔记】
[C++Primer]第五版[学习笔记]习题解答第三章 ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/10 第三章:字符串,向量和数组 ...
- 3-Spark高级数据分析-第三章 音乐推荐和Audioscrobbler数据集
偏好是无法度量的. 相比其他的机器学习算法,推荐引擎的输出更直观,更容易理解. 接下来三章主要讲述Spark中主要的机器学习算法.其中一章围绕推荐引擎展开,主要介绍音乐推荐.在随后的章节中我们先介绍S ...
- 07.C#泛型的限制和可空类型的简单说明(三章3.5-四章4.1)
自己在写文章的同时,也是在学习,对于书中的语句很多其实没有太好的理解,读一本书,要消化!!!三章都是讲泛型的,最后写一下泛型的限制,对于本章学习的完结,one end,one begin. 看下面的代 ...
- Android系统移植与驱动开发--第三章 Git使用入门及在学习中有感
第三章 Git使用入门 使用Git的目的是减少各种版本的Linux的压缩大小,提供源代码在Linux上进行编译. 在这一个章节中,其实就是关键步骤的操作,虽然Git与我们学习的android没有很大的 ...
随机推荐
- 项目启动时 Exception in thread "HouseKeeper" java.lang.NullPointerException
首先查看是否是端口冲突引起,在日志信息该错误位置往上找,如果再无错误信息,而只有该错误,则原因可能如下: 原因: This is because Proxool is not being shutdo ...
- web普通项目映射为maven项目
localhost:8080/yourWebLocation 访问 前一个插件是映射项目路径成maven的格式 后一个插件是映射访问网址所需要的东西 <build> <!-- 发布 ...
- Linux的内存映像导出接口—kcore
发表于 2012-4-10 15:00 /proc/kcore文件提供了整个机器的内存映像,和vmcore不同的是,它提供了一个运行时的内存映像,为此和vmcore一样,内核提供了一个类似的但是稍 ...
- python ichat使用学习记录
1.OSError: [WinError -2147221003] 找不到应用程序: 'D:\\python\\ichat\\qrcode.jpg' 原因是该库中没有windows系统如何打开二维码图 ...
- PHP自学,第一阶段,基础学习
环境搭建OS X系统上 Win7执行OS X虚拟机 在 OS X上安装MAMP执行环境 IDE使用 Netbeans PHP版本号开发 数据库使用mysql 自学资料使用:PHP从入门到精通.pdf ...
- eclipse 10个常用 快捷键
Eclipse中10个最有用的快捷键组合 一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升. ...
- MySQL Subquery
Summary: in this tutorial, we will show you how to use the MySQL subquery to write complex queries a ...
- hdoj4864 Task (贪心)
题目来源: 2014 Multi-University Training Contest 1--by FZU 题意:有N个机器和m个工作.机器和工作都有一个时间xi和价值yi,一个工作仅仅有满足xi和 ...
- iconv 解决乱码问题
[root@NGINX-APACHE-SVN pro]# file 林.txt 林.txt: ISO-8859 text, with no line terminators #在LINUX下显示乱码 ...
- 53. Reverse Words in a String【easy】
Given an input string, reverse the string word by word. For example, Given s = "the sky is blue ...