泛型


1.泛型概述

泛型是C#的部分与中间语言IL集成。创建的类或方法指定了类型,在实例化和调用时必须指定类型进行操作。

泛型可以用于类、方法、接口和委托以及结构。

泛型也是结构,同时是运行库CLR定义也可以进行互操作。

使用泛型的优化是:

提供性能

类型安全

二进制代码重用

利于扩展

命名约定

性能

装箱是将值类型转换为值类型,拆箱就是将己转换为引用类型的值类型转换回来,装箱和拆箱是非常影响程序性能的,在代码中应避免装箱和拆箱的操作。使用泛型为实例化类型对象和调用时进行类型指定。就避免了这一操作。

上图中就使用了拆箱操作。强制转换为int类型,如果使用List<T>泛型集合则

直接获取值即可。

类型安全

泛型另一个特性是类型安全。在我们使用集合时,如果集合可以添加任意类型。那么在遍历集合元素时,很难获取到元素的类型,因此会造成类型转换失败。

上图中遍历,就会发生运行时异常。

如果使用int集合泛型,使用泛型添加其他类型的集合元素。则再编译时会提示异常。避免了运行时无法获知的错误。

二进制代码重用

泛型更好的重用二进制代码,泛型类通过一次定义,实现不同类型的实例化。

代码的扩展

在使用泛型进行不同类型实例化时,在IL代码中,JIT编译器会把泛型类编译为本地代码,会给每一个类型创建一个新类,引用类型共同享用同一个本地类中的所有相同的实现代码。

命名约定

泛型类型名称使用T作为前缀。List<T>,Dictionary<TKey,TValue>

2.创建泛型类

    

    

     

    

    

如果我们使用泛型进行创建:

    

    

    

    

    

    

3.泛型类的特性

泛型类型创始化赋值时,不能给null值;使用default(T)关键字。

    

如果泛型类需要调用泛型类型中的方法。则需要添加约束。

在使用泛型时,还可以合并多个约束

    

泛型类型可以实现泛型接口、也可以派生类,可以派生自泛型基类。要求是必须重复或指定基类的类型。

    

泛型类可以包含静态成员,泛型类的静态成员只能在类的一个实例中共享。

    

4.泛型接口

    

如果泛型类型用out关键字标注,那么泛型接口就是协变的。就是说返回类型只能是T

    

    

    

如果泛型类型用in关键字标注,那么泛型接口就是抗变得,就是说输入参数只能是T

    

    

5.泛型结构

与类相似,接口也可以是泛型的,在.NET中泛型结构是Nullable<T>,数据库的int字段是可以为空的,但是C#int字段是不能为空的。Nullable<T>支持了可以为null,可以根据hasValue来判断是否null,如果是null则抛出异常。Nullable<T>可空类型,它除了能定义null,它还能转换为基本类型,比如Nullable<int>可以转为int型。int型也可以转Nullable<int>.

    

    

    


    

    

    

6.泛型方法

泛型方法,方法名后面加上<T>,调用时传入类型。

带约束的泛型方法。

泛型类型可以使用where限制,同样方法也可以。

     

带委托的泛型方法。

     

      

C#高级编程9-第5章 泛型的更多相关文章

  1. 读《C#高级编程》第1章问题

    读<C#高级编程>第1章 .Net机构体系笔记 网红的话:爸爸说我将来会是一个牛逼的程序员,因为我有一个梦,虽然脑壳笨但是做事情很能坚持. 本章主要是了解.Net的结构,都是一些概念,并没 ...

  2. C#高级编程9 第18章 部署

    C#高级编程9 第18章 部署 使用 XCopy 进行部署 本主题演示如何通过将应用程序文件从一台计算机复制到另一台计算机来部署应用程序. 1.将项目中生成的程序集复制到目标计算机,生成的程序集位于项 ...

  3. C#高级编程9 第17章 使用VS2013-C#特性

    C#高级编程9 第17章 使用VS2013 编辑定位到 如果默认勾选了这项,请去掉勾选,因为勾选之后解决方案的目录会根据当前文件选中. 可以设置项目并行生成数 版本控制软件设置 所有文本编辑器行号显示 ...

  4. C#高级编程9 第16章 错误和异常

    C#高级编程9 第16章 错误和异常 了解这章可以学会如何处理系统异常以及错误信息. System.Exception类是.NET运行库抛出的异常,可以继承它定义自己的异常类. try块代码包含的代码 ...

  5. C#高级编程笔记之第二章:核心C#

    变量的初始化和作用域 C#的预定义数据类型 流控制 枚举 名称空间 预处理命令 C#编程的推荐规则和约定 变量的初始化和作用域 初始化 C#有两个方法可以一确保变量在使用前进行了初始化: 变量是字段, ...

  6. C#高级编程9 第14章 内存管理和指针

    C#高级编程9 内存管理和指针 后台内存管理 1) 值数据类型 在处理器的虚拟内存中有一个区域,称为栈,栈存储变量的浅副本数据,通过进入变量的作用域划分区域,通过离开变量的作用域释放. 栈的指针指向栈 ...

  7. python高级编程(第12章:优化学习)1

    # -*- coding: utf-8 -*-# python:2.x__author__ = 'Administrator'#由于5,6,7,8,9,10,11主要是在包,测试之类的学习所以这边就不 ...

  8. ASP.NET MVC5 高级编程-学习日记-第一章 入门

    1.1 ASP.NET MVC 简介 ASP.NET是一种构建Web应用程序的框架,它将一般的MVC(Model-View-Controller)模式应用于ASP.NET框架. 1.1.1 MVC模式 ...

  9. C#高级编程9 第11章 Linq

    Linq 1.Linq概述 列表和实体 准备数据: public class Championship { public int Year { get; set; } public string Fi ...

  10. C# 高级编程9 第30章MEF C#可扩展编程之MEF第2章(抄录)

    Managed Extensibility Framework (MEF) 什么是 MEF?   Managed Extensibility Framework 即 MEF 是用于创建轻量.可扩展应用 ...

随机推荐

  1. 一步一步搭建oracle 11gR2 rac+dg之环境准备(二)【转】

    一步一步在RHEL6.5+VMware Workstation 10上搭建 oracle 11gR2 rac + dg 之环境准备 (二) 一步一步搭建oracle 11gR2 rac+dg之环境准备 ...

  2. linux系统iostat命令详解

    iostat  -k 3 5  (以KB为单位,每3秒统计一次,共统计5次) • avg-cpu: 总体cpu使用情况统计信息,对于多核cpu,这里为所有cpu的平均值    %user    用户空 ...

  3. CF 983B 序列函数

    CF 983B 序列函数 一道本校神仙wucstdio出的毒瘤签到题. 题意: 给你一段序列,求出它们的最大异或和. 解法: 其实这道题并不很难,但读题上可能会有困难. 其实样例我是用Python 3 ...

  4. 通过field:global给子元素添加css样式

    {dede:arclist row=5 typeid=200} <li [field:global runphp=’yes’ name=autoindex](@me==1)?@me=”class ...

  5. C#socket编程序(二)

    在上一篇中,我列了一些常用的方法,可以说这些方法是一些辅助性的方法,对于分析网络中的主机属性非常有用.在这篇中,我将会介绍一下面向连接(TCP)socket编程,其中辅以实例,代码可供下载. 对于TC ...

  6. MapReduce的原理及执行过程

    MapReduce简介 MapReduce是一种分布式计算模型,是Google提出的,主要用于搜索领域,解决海量数据的计算问题. MR有两个阶段组成:Map和Reduce,用户只需实现map()和re ...

  7. hdoj1203 I NEED A OFFER!(DP,01背包)

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1203 思路 求最少能收到一份offer的最大概率,可以先求对立面:一份offer也收不到的最小概率,然 ...

  8. 基于 Laravel 开发博客应用系列 —— 设置 Linux/Mac 本地开发环境

    1.不同 Linux 发行版本的区别 不同的 Linux 发行版本之间有一些细微区别,尤其是包管理器:CentOS 和 Fedora 使用 yum 作为包管理器,而Ubuntu 使用  apt,在 O ...

  9. MapReduce与批处理------《Designing Data-Intensive Applications》读书笔记14

    之前的文章大量的内容在和大家探讨分布式存储,接下来的章节进入了分布式计算领域.坦白说,个人之前专业的重心侧重于存储,对许多计算的内容理解可能不是和确切,如果文章中的理解有所不妥,愿虚心赐教.本篇将和大 ...

  10. Java中面向对象的理解

    按照惯例,先做一个简单的介绍,现在开始学习 Thinging in Java 4 ,一边看,一边记录,我都不想给自己设定时间安排了,毕竟很少实现过.所以就这样吧!不定期的更新,我都会放到博客中的. 所 ...