学习《深入理解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没有很大的 ...
随机推荐
- NowCoderG:最大平方数
求不大于 N 的最大的平方数: 思路:输入数的平方根向下取整的数的平方即为所求. Python代码: import sys import math num=int(sys.stdin.readline ...
- Ubuntu下设置redis让其他服务器访问
修改redis配置文件,将 bind 127.0.0.1to bind 0.0.0.0Then restart your service (service redis-server restart) ...
- Python 算法(2) 哈夫曼编码 Huffman Encoding
这个问题原始是用来实现一个可变长度的编码问题,但可以总结成这样一个问题,假设我们有很多的叶子节点,每个节点都有一个权值w(可以是任何有意义的数值,比如它出现的概率),我们要用这些叶子节点构造一棵树,那 ...
- AutoFac文档9(转载)
目录 开始 Registering components 控制范围和生命周期 用模块结构化Autofac xml配置 与.net集成 深入理解Autofac 指导 关于 词汇表 关系类型 Autofa ...
- IIS攻击与安全加固实例分析
IIS作为一款流行的Web服务器,在当今互联网环境中占有很大的比重,绝大多数的asp.asp.net网站都运行在它上面.因此,也引来了无数 黑客们关注的目光.目前针对IIS的攻击技术已经非常成熟,而且 ...
- 点滴积累【other】---HTTP 错误 404.13 - Not Found,请求筛选模块被配置为拒绝超过请求内容长度的请求(转载)
此文参考来源:http://blog.csdn.net/tiantian1980/article/details/6577499 问题:HTTP 错误 404.13 - Not Found,请求筛选模 ...
- (oneway void) release中oneway的意思
oneway is used with the distributed objects API, which allows use of objective-c objects between dif ...
- poj1936
非连续子串匹配题,直接模拟 /** \brief poj 1936 * * \param date 2014/8/5 * \param state AC * \return memory 804k t ...
- tornado异步web请求
1.为什么要使用异步web服务使用异步非阻塞请求,并发处理更高效. 2.同步与异步请求比较同步请求时,web服务器进程是阻塞的,也就是说当一个请求被处理时,服务器进程会被挂起直至请求完成. 异步请求时 ...
- iptables安装失败后-------------firewalld回归
yum install firewalld systemctl stop iptables; systemctl mask iptables; systemctl unmask firewalld s ...