Base Class Library是.NET开发平台的核心。不管你使用了何种配置或者前端技术,都会在应用程序中找到使用BCL的地方。以下是期望在.NET 4.5中做出改善的地方:
System.IO
对于耗费大量资源的操作,Stream、TextReader和TextWriter类都拥有了新的async方法。这里的消耗我们指的是“可能会 在一次操作中做大量工作”。而像TextReader.Peek之类的方法不会获得async版本的方法。背后的原因在于,坦率地说,async操作并不 会节省资源。它们需要分配Task对象,可能还需要做上下文切换,处理缓存可能失效的情况,因此总体上不适合用于严格的循环中。Immo Landwerth接着说到,
一般的指导原则是: 让你的异步操作尽可能地厚重。例如,如果你想要使用BinaryReader从流中读取1000个Int32的数据,最好运行并等待一个任务同步地读取所有1000条数据,而不是分别运行并等待1000个任务,每个任务都只读取一条Int32数据。
说到BinaryReader,你现在可以告诉它不要自动关闭它所包装的流。这个特性对BinaryWriter、StreamReader和StreamWriter同样适用。
Immo还提到,.NET BCL现在使用了开源程序库zlib来实现System.IO.Compression命名空间。这包括对DeflateStream性能的修正,以及新的ZipArchive类。这并非是zlib第一次被微软使用,它还用于Windows的Zip文件支持和WPF中。
System.Collection
我们已经谈到了.NET 4.5中的只读集合,到现在为止其中并没有显著改变。值得注意的一种被遗漏的特性是IReadOnlySet,它被用于匹配HashSet和ISet。
抽象类Comparer使用了一些函数式编程的优势。你不能显式地实现这个类,而是需要调用Comparer.Create,在一个比较函数中传递它,然而让它来负责其他处理。
很少有人知道ArraySegment结构,它也获得了重大改进,第一次真正实现了让它变得有用的接口,像IEnumerable和IList。然而,它只对裸数组(naked arrays)有效,大多数开发者更喜欢使用更高级别的集合类,像List。
杂项
AssemblyMetadataAttribute现在是对集合赋予任意键值对的标准方式。你可能不清楚为什么会使用它,而不是定义自定义的属性,但是如果你想的话就可以那样用。
Console现在让你知道输入、输出或者错误流是否被重定向。你可能最多是使用它来禁用依赖于设置鼠标位置或者改变屏幕颜色的特性。如果你需要支持额外的字符,还可以把编码变更为Encoding.Unicode。
WeakReference提供了替换WeakReference的类型安全的方法。为了消除长期存在的竞争条件,WeakReference不再提供单独的IsAlive和TryGetTarget方法。取而代之的是,它们被组合到TryGetTarget之中。
不幸的是,看起来我们不会有相匹配的WeakDelegate,如果存在的话,会让实现弱事件更容易。
Regex现在支持Timeout属性。这是很重要的工具,当允许用户注入任意的正则表达式的时候,可以避免拒绝服务攻击。