1. 简化的异步编程
C#和VB都支持了新的async & await语法以简化异步编程,.Net Framework中也相应增加了相关的函数以辅助。一个比较醒目的变化就是在IO操作中多了许多XXXAsync的函数,另外,线程操作的Task类中也新增了不少静态函数。
2. 只读集合接口
长期以来,BCL中提供的只读集合只有IEnumerable<T>,它主要存在如下问题:
- 每次访问都需要迭代,如果多次访问则导致性能较差。
- 不支持统计元素个数
- 不支持随机访问或查询访问
由于C#不像C++那样能返回const只读对象,如果直接返回List或Dictionary引用的话又有集合被调用方修改的风险,有的时候,为了防止集合被修改,我们甚至通过ToArray这种比较低效的方法返回一个副本。
.Net 4.5中增加了IReadOnlyList<T>和IReadOnlyDictionary<TKey, TValue>两个只读集合接口(它们有公共的父接口IReadOnlyCollection),它们是支持协变的,这样我们返回集合的时候就可以直接返回只读集合了。
3. zip存档支持
.Net 4.5中增加了类实现对Zip文件的管理,由于考虑到了Metro程序不支持文件系统,它的功能被拆分到了两个Dll。
- System.IO.Compression.dll 此程序集包含通用 .zip 功能, 它不支持文件路径。 此程序集中的主类是 ZipArchive。
- System.IO.Compression.FileSystem.dl 此程序集提供 ZipFile 静态类以定义扩展方法和静态帮助程序。
PS:个人感觉这个设计比较蛋疼,用个Zip还需要引用两个Dll,完全可以合并成一个或全部塞到mscrolib里面去,对于Metro程序直接把不支持的给裁剪了即可。另外,这个库不支持带密码的zip文件,不知道设计者是怎么想的。
4. HttpClient
.Net 4.5中新增了一个类专门用于Http操作,十分小巧好用,我以前写过一篇文章介绍他-- ,这里就不多说了。
5. WebSocket
.Net 4.5中,在System.Web.WebSockets和System.Net.WebSocket名字空间实现了对WebSocket的支持,其中前者主要用于Asp.net框架。通过它可以快速建立自己的webSocket服务,我在文章中也介绍过。不过它不支持win7,只能在win8上工作,这个限制使得它的工作范围变得有限了不少。
6. WeakReference<T>
新提供的泛型WeakReference<T>解决了以前的WeakReference存在的两个问题:1. 需要类型转换,2. 不可靠的IsAlive属性(WeakReference<T>就把它给直接去掉了)。有了WeakReference<T>后,老版本的WeakReference该下岗了。
7. ArraySegment<T>
这个类本身在.Net 2.0中就已经有了,主要用于提供一个数组的子集,而无需复制副本。但它之前没有什么接口方法,导致只能遍历,限制太大。现在实现了IList接口,用起来方便多了。
8. Comparer<T>.Create
到了.Net 4.5,我们终于可以通过一个lambda表达式构造一个IComparer<T>对象了,一直以为这个应该是在.Net 2.0时代就应该提供的功能。
9. SemaphoreSlim.WaitAsync
这个是系统内置的唯一一个异步锁,如果觉得不够用,请参看我以前的文章--。
10. StreamReader、StreamWriter等不释放基础流的选项
BinaryReader、BinaryWriter、StreamReader、StreamWriter等流读写类的构造函数中增加了leaveOpen参数,以控制它们放弃对基础流的托管。也就是说,在StreamReader关闭的时候,可以选择不关闭其基础流。
11. Regex.Timeout
正则表达式终于支持超时了,虽然用到的地方感觉不是很多,但还是比较有用的。
12. CancellationTokenSource支持超时自动取消
不多介绍了,请参考我以前的文章--。
其他两个非BCL中的类库
1. TPL Dataflow (TDF)
是微软面向高并发应用而推出的新程序库,很好很强大,不知道为什么微软没有把它合并到BCL中,而是单独做一个库发行,可以通过NUGET或在TDF的官网下载。这个库接口不多,但非常好用,有空的话我专门写几篇文章来描述一下他,不过目前对它的资料不是很多,有的细节还是了解的不清楚。
2. Roslyn
编译器即服务(Compiler as a Service)是C# 5.0的核心功能之一,我以前在文章介绍过它的部分功能。不过的开发进度好像赶不上VisualStudio的发布,目前还是CTP版本(Anders大牛忙着搞TypeScript去了? O(∩_∩)O~),不过实现的功能已经比较全了,想尝鲜的朋友可以在微软的网站或NUGET上下载。
参考文章: