VS2010正式版发布了,从海报中我们可以看到.NET 4在BCL上的改进还是很大的,这一次主要讨论比较Core的变化。

就照海报的顺序说吧。

System.Collections.Generic

.NET 4中新加入了名为SortedSet<T>的结构,这是一个很有用的结构,它在内部维护一个集合,使用Add()SortedSet中添加已存在的项时会被忽略,并且返回false

SortedSet sortedSetDemo = new SortedSet { 8, 2, 1, 5, 10, 5, 10, 8 };

SortedSet和HashSet均实现了新引入的ISet接口,其实可以看下ISet的签名:

public interface ISet<T> : ICollection<T>, IEnumerable<T>, IEnumerable

于是可以知道SortedSet是一个集合,同时可遍历,可……

System.IO.MemoryMappedFiles

这个结构的作用在于将一个文映射到内存中,以达到快速“IO”的目的。其实MemoryMappedFiles的真正作用是用作进程间或应用程序间的通信,在内存映射文件中存储相关的信息然后传递。下面这个例子简单演示了如何使用MemoryMappedFiles

using System.IO;
using System.IO.MemoryMappedFiles;

using (MemoryMappedFile MemoryMappedFile = MemoryMappedFile.CreateNew("MemoryMappedFileDemo", 100)){
	MemoryMappedViewStream stream = MemoryMappedFile.CreateViewStream();
	using (BinaryWriter writer = new BinaryWriter(stream)){
		writer.Write("hello cnblogs");
	}
}

这样我们就将一个名为MemoryMappedFileDemo的“文件”写入到了内存,下面的代码说明怎样将它读出来,要注意的是,两段代码不要写在一个应用程序内,否则会报错。

using (MemoryMappedFile MemoryMappedFile = MemoryMappedFile.OpenExisting("MemoryMappedFileDemo"))
{
	using (MemoryMappedViewStream Stream = MemoryMappedFile.CreateViewStream())
	{
		BinaryReader reader = new BinaryReader(Stream);
		Console.WriteLine(reader.ReadString());
	}
}

难能可贵的是,VS2010对MemoryMappedFileDemo提供Debug支持。

Debug Support

System.Numerics

.NET 4新加入的命名空间,里面包含了两个数据结构:BigIntegerComplexBigInteger提供了比整型长度更长的数值表示范围,默认值为0,且为不可变类型,如果一些比较特殊的场景整型满足不了需求,可以考虑使用BigInteger,相关的辅助方法也会加快的开发效率。

需要注意的是,很多情况下需要手动的引用System.Numberics所在的程序集:

Debug Support

BigInteger bigIntegerDemo = new BigInteger(9999999999999999);
if (bigIntegerDemo.IsZero) {
	Console.WriteLine("Equal 0");
}
Console.WriteLine(bigIntegerDemo);

Complex则是我们常说的复数类。就像平学数学中的定义一样,一个复数由一个实部与虚部构成:

Complex n1 = new Complex(8, 2);
Complex n2 = new Complex(8, 2);
Complex n3 = n1 + n2;

System.Tuple结构

Tuple(元组)是一个大小固定的集合主要被设计为与F#IronPython等互操作。

var primes = Tuple.Create(2, 3, 5, 7, 11, 13, 17, 19);

这是一个MSDN官方的例子,完整的元组使用应该是这样:

Tuple<int, int, int, int, int, int, int, Tuple<int>> primes = Tuple.Create(2, 3, 5, 7, 11, 13, 17, 19);

因为一个元组最大为6,所以想扩展元组必须在最后一个位置上再加一个元组。有了var关键字,便使整个过程更简单了:

var multiTuple = new Tuple<int, int, int, int, int, int, int,Tuple<int,int,int>>(
	2, 4, 6, 8, 10, 12, 14,
	new Tuple<int,int,int>(3,6,9));

访问也简单:

primes.Item1;//2
primes.Item2;//3
//...
multiTuple.Rest.Item1;//3

System.Runtiime.InteropServices

新提供的TypeIdentifierAttribute特性,可以为一些在类型库中没有GUID的类型提供等价类型支持,只需在类型上加[TypeIdentifier]即可。

关于.NET 4中Parallel的部分在这个系列的第一篇有部分介绍,我打算将详细的部分例如PLINQ,放到后面的系列来具体讨论。

已有类的改进

  • Stopwatch: Stopwathc中新加入了Restart()方法,方便我们重置计时器。
  • Environment: 加入了关于CPU和OS是否为64位的属性:Is64BitProcessIs64BitOperatingSystem,并且为了便于使用系统文件夹,新增了一个名为SpecialFolder的枚举类型,Environment.SpecialFolder.Desktop则表示桌面,Environment.SpecialFolder.CommonMusic表示公用音乐文件夹。
  • Stream: 加入CopyTo方法,可以快捷的从一个流拷贝数据到另一个流。
  • Enum: 过去判断一个[Flag]枚举是否包含某个标志时,通常会使用&运算判断是否为空,.NET 4为Enum提供了一个更为简便的方法:HasFlag(),例如:
[Flags]
public enum DataOptions
{
	Data1 = 1,
	Data2 = 2,
	Data3 = 4
}

然后可以使用HasFlag()来判断是否存在某个标志:

DataOptions data = DataOptions.Data1 | DataOptions.Data2 | DataOptions.Data3;
Console.WriteLine("Have Data2? {0}", data.HasFlag(DataOptions.Data2));
  • GuidVersionEnum: 现在均增加了对应的TryParse方法。
  • String: 新增支持IEnumerableConcat()Join()方法,使用LINQ更加的方便,IsNullOrWhiteSpace()方法的加入也使对字符串的判断上更加的严谨。
  • File: 新增支持IEnumerableReadLines()方法,WriteAllLines()AppendAllLines()也做为配合而出现,接受IEnumerable参数。有理由相信Directory是否也有相关的变化,答案是有,具体参见MSDN。

.NET 4的变化很多,一些新特性有待大家一起发掘,更多的内容还是需要在实际的实用中慢慢的体会。下一次如果机会恰当,将研究一些.NET 4特定的技术例如PLINQ等等,不完全局限于CLR和BCL,因为这个话题真正写起来了才发现很空泛,很寂寞……