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专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性. ...
随机推荐
- J2EE基础总结(5)——EJB
什么是EJB JB事实上就是企业Java Beans. EJB是J2EE平台的重要组成部分. J2EE平台基于组件的企业级应用架构,提供多 层次.分布式和高事务的功能特点. EJB提供 ...
- NSDate 格式化 及 互转
/* NSDateFormatter的作用 1.NSString -> NSDate 2.NSDate -> NSString */ void fmt_date_to_string(); ...
- Razor项目所感(上)
简单的说下我的Razor四旋翼飞行器项目,还没做完,要暂时搁一搁,就先总结一下. 此项目基于Raspberry Pi上的linux平台进行开发,现仍在开发中.项目地址:https://github.c ...
- 72. js EXTJS grid renderer用法
转自:https://blog.csdn.net/shancunxiaoyazhi/article/details/22156083 renderer : Function (可选的)该函数用于加工单 ...
- 腾讯云SSL证书管理
2018050608010400y5mbx15awnpwxfhdmd7zqet1i9dzaqkvb6lxzosi4qq5ezbr
- java replaceAll 忽略大小写
public static void main(String[] args) { String temp=" CLASS_path : /aaabb/"; System.out.p ...
- Sublime Text 汉化插件
https://blog.csdn.net/heyangyi_19940703/article/details/51869502 一.Sublime Text工具介绍: Sublime Text 是一 ...
- codevs3287货车运输(最小生成树+LCA)
3287 货车运输 2013年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description A 国有 ...
- Sql批量插入方法
using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...
- 实战篇之实现 OutLook 中以 EDM 形式发送通知邮件
1.写 Html5 的 EDM 模板 EDM 源代码示例: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" ...