B.1 接口
几乎所有要学习的接口都位于 System.Collections.Generic 命名空间。图B-1展示
了.NET4.5以前主要接口间的关系,此外还将非泛型的 IEnumerable 作为根接口包括了进来。为
避免图表过于复杂,此处没有包含.NET 4.5的只读接口。
正如我们已经多次看到的,最基础的泛型集合接口为 IEnumerable<T> ,表示可迭代的项的
序列。 IEnumerable<T> 可以请求一个 IEnumerator<T> 类型的迭代器。由于分离了可迭代序列
和迭代器,这样多个迭代器可以同时独立地操作同一个序列。如果从数据库角度来考虑,表就是
IEnumerable<T> ,而游标是 IEnumerator<T> 。本附录仅有的两个可变(variant)集合接口
为.NET 4中的 IEnumerable<out T> 和 IEnumerator<out T> ;其他所有接口的元素类型值均
可双向进出,因此必须保持不变。
接下来是 ICollection<T> ,它扩展了 IEnumerable<T> ,添加了两个属性( Count 和
IsReadOnly )、变动方法( Add 、 Remove 和 Clear )、 CopyTo (将内容复制到数组中)和 Contains
(判断集合是否包含特殊的元素)。所有标准的泛型集合实现都实现了该接口。
IList<T> 全都是关于定位的:它提供了一个索引器、 InsertAt 和 RemoveAt (分别与 Add
和 Remove 相同,但可以指定位置),以及 IndexOf (判断集合中某元素的位置)。对 IList<T>
进行迭代时,返回项的索引通常为0、1,以此类推。文档里没有完整的记录,但这是个合理的假设。
同样,通常认为可以快速通过索引对 IList<T> 进行随机访问。
IDictionary<TKey, TValue> 表示一个独一无二的键到它所对应的值的映射。值不必是唯
一的,而且也可以为空;而键不能为空。可以将字典看成是键/值对的集合,因此
IDictionary<TKey, TValue> 扩展了 ICollection<KeyValuePair<TKey, TValue>> 。获
取值可以通过索引器或 TryGetValue 方法;与非泛型 IDictionary 类型不同,如果试图用不存
在的键获取值, IDictionary<TKey, TValue> 的索引器将抛出一个 KeyNotFoundException 。
TryGetValue 的目的就是保证在用不存在的键进行探测时还能正常运行。
ISet<T> 是.NET 4新引入的接口,表示唯一值集。它反过来应用到了.NET 3.5中的
HashSet<T> 上,以及.NET 4引入的一个新的实现—— SortedSet<T> 。
在实现功能时,使用哪个接口(甚至实现)是十分明显的。难的是如何将集合作为API的一
部分公开;返回的类型越具体,调用者就越依赖于你指定类型的附加功能。这可以使调用者更轻
松,但代价是降低了实现的灵活性。我通常倾向于将接口作为方法和属性的返回类型,而不是保
证一个特定的实现类。在API中公开易变集合之前,你也应该深思熟虑,特别是当集合代表的是
对象或类型的状态时。通常来说,返回集合的副本或只读的包装器是比较适宜的,除非方法的全
部目的就是通过返回集合做出变动。
B.1 接口的更多相关文章
- App开发:模拟服务器数据接口 - MockApi
为了方便app开发过程中,不受服务器接口的限制,便于客户端功能的快速测试,可以在客户端实现一个模拟服务器数据接口的MockApi模块.本篇文章就尝试为使用gradle的android项目设计实现Moc ...
- 干货来袭-整套完整安全的API接口解决方案
在各种手机APP泛滥的现在,背后都有同样泛滥的API接口在支撑,其中鱼龙混杂,直接裸奔的WEB API大量存在,安全性令人堪优 在以前WEB API概念没有很普及的时候,都采用自已定义的接口和结构,对 ...
- 12306官方火车票Api接口
2017,现在已进入春运期间,真的是一票难求,深有体会.各种购票抢票软件应运而生,也有购买加速包提高抢票几率,可以理解为变相的黄牛.对于技术人员,虽然写一个抢票软件还是比较难的,但是还是简单看看123 ...
- Java基础Map接口+Collections工具类
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- Java基础Map接口+Collections
1.Map中我们主要讲两个接口 HashMap 与 LinkedHashMap (1)其中LinkedHashMap是有序的 怎么存怎么取出来 我们讲一下Map的增删改查功能: /* * Ma ...
- java基础_集合List与Set接口
List接口继承了Collection的方法 当然也有自己特有的方法向指定位置添加元素 add(索引,添加的元素); 移除指定索引的元素 remove(索引) 修改指定索引的元素 set ...
- 【WCF】自定义错误处理(IErrorHandler接口的用法)
当被调用的服务操作发生异常时,可以直接把异常的原始内容传回给客户端.在WCF中,服务器传回客户端的异常,通常会使用 FaultException,该异常由这么几个东东组成: 1.Action:在服务调 ...
- PHP以接口方式实现多重继承(完全模拟)--学习笔记
1.UML类图: 2.PHP代码: <?php /** * Created by PhpStorm. * User: andy * Date: 16-11-23 * Time: 下午7:57 ...
- 【微框架】Maven +SpringBoot 集成 阿里大鱼 短信接口详解与Demo
Maven+springboot+阿里大于短信验证服务 纠结点:Maven库没有sdk,需要解决 Maven打包找不到相关类,需要解决 ps:最近好久没有写点东西了,项目太紧,今天来一篇 一.本文简介 ...
- 【接口开发】浅谈 SOAP Webserver 与 Restful Webserver 区别
接口,强大,简单,交互,跨越平台 下面简单阐述这两大接口思想 一 REST: REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性. ...
随机推荐
- CloudEngine 6800基础配置-01_常见密码操作
由于工作原因,现在从事公有云. 这简直就是个笑话,12年后又回来学网络知识. # 设置系统的日期.时间和时区 <HUAWEI> clock timezone BJ add 08:00: ...
- ios8--加载图片
// // ViewController.m // 06-资源存放问题 #import "ViewController.h" /** 加载图片的方式: 1. imageNamed: ...
- POJ3090 Visible Lattice Points 欧拉函数
欧拉函数裸题,直接欧拉函数值乘二加一就行了.具体证明略,反正很简单. 题干: Description A lattice point (x, y) in the first quadrant (x a ...
- shell脚本-循环选择语句
shell脚本-循环选择语句 过程式编程语言: 顺序执行 选择执行 循环执行 注:条件中的变量,可以在执行语句中使用,不用在加上"$". if语句 根据命令的退出状态来执行命令 单 ...
- PCB genesis 大孔扩孔(不用G84命令)实现方法
PCB钻孔时,当钻刀>6.3mm时,超出钻孔范围,钻孔工序是没有这么大的钻刀,当这种情况,工程CAM会都采用G84命令用小孔扩孔的方式制作, 在这里介绍一种如果不用G84命令,用程序实现将大孔生 ...
- Counterfeit Dollar
http://poj.org/problem?id=1013 #include<stdio.h> #include<string.h> #include<math.h&g ...
- Akka源码分析-local-DeathWatch
生命周期监控,也就是死亡监控,是akka编程中常用的机制.比如我们有了某个actor的ActorRef之后,希望在该actor死亡之后收到响应的消息,此时我们就可以使用watch函数达到这一目的. c ...
- HDU2564 词组缩写
2019-06-03 15:00:38 感觉有有种被坑了的感觉,这道题不难,就是一再的W,
- JavaScript--控制类名(className 属性)
className 属性设置或返回元素的class 属性. 语法: object.className = classname 作用: 1.获取元素的class 属性 2. 为网页内的某个元素指定一个c ...
- Java学习-异常2
1.异常处理的第一种方式是:上抛[throws] 2.异常处理的第二种方式是:try....catch..如果不想让调用程序知道该异常发生了,被调用的程序应该使用try...catch..进行异常捕捉 ...