DotNET 4.0 新增内容总结(一)

本文总结了DotNET 4.0的主要新特性,包括新的CLR4、新增的类如BigInteger、Complex和Tuple,根据契约设计的Code Contracts以及Type Equivalence。通过实例展示了如何使用这些新特性,如使用Tuple简化不同类型对象存储,利用MemoryMappedFiles提升大文件处理效率,以及合同式编程确保代码质量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       1. 新的CLR4

       2. 新加的类

       3. 根据契约设计(Design By Contract)

       4. Type Equivalence

1. 新的CLR4

2. 新加的类

    a. BigInteger:System.Numerics.BigInteger.
一个可以代表任意长度整数的类型. 尝试运行这段代码,看两者的差别:
   BigInteger b = BigInteger.Pow(2, 64);

   Console.WriteLine(b.ToString("N"));

   Double d = Math.Pow(2, 64);

   Console.WriteLine(d.ToString("N"));

参考:http://blogs.microsoft.co.il/blogs/pavely/archive/2009/05/26/biginteger-in-net-4-0.aspx

     

     b. Complex, 参看:

http://msdn.microsoft.com/en-us/library/bb738466(VS.100).aspx

 

     c. Tuple, 用来存放不同类型对象的集合,并且,提取对象的时候不需要类型转换,和数组做一个对比.

用数组存储对象:

    object[] o = new object[2]{"Hello",4};

    Console.WriteLine((string)o[0]+" "+(int)o[1]);

用Tuple存储对象:

    Tuple<string, int> t = new Tuple<string, int>("Hello", 4);

    Console.WriteLine(t.Item1+" "+t.Item2);

 

 

Tuple 还有其他有趣的功能,请参看

http://msdn.microsoft.com/en-us/magazine/dd942829.aspx

 

     d. SortedSet, 使用平衡二叉数来保持节点有序,SortedSet<T>实现(implement)ISet<T>接口.

加入SortedSet<T>里的类型要实现 IComparable 接口. 更多请参考:

http://msdn.microsoft.com/en-us/library/dd412070(VS.100).aspx

 

     e. MemoryMappedFiles:System.IO.MemoryMappedFiles.

把硬盘的文件映射到内存里,根据Salvador Patuel 的说法,这个类型能带来两个好处

  •      避免了频繁了IO操作,方便了大文件的处理,尤其在现在这个内存越来越大的时代.
  •   方便多核处理器共享数据.

关于第二点,为多核处理器带来的好处,看下图:

 

具体使用请参看:Salvador Patuel 的一篇博文:

http://blogs.msdn.com/salvapatuel/archive/2009/06/08/working-with-memory-mapped-files-in-net-4.aspx

 

    f. Unified Cancellation Model, 请参看 Parallel Programming with.NET 的一篇文章:

http://blogs.msdn.com/pfxteam/archive/2009/05/22/9635790.aspx

 

3. 根据契约设计(Design By Contract)

 
为什么要根据契约设计?
在运行例子之前,到下面地址下载Code Contract 插件(现在.Net 4.0&VS2010 还在Beta 阶段)
http://msdn.microsoft.com/en-us/devlabs/dd491992.aspx#2
一个比较不错的例子:
http://www.codeproject.com/KB/dotnet/CodeContract.aspx
原文里Contract.Result()>0 应该改为Contract.Result<int>()>0, 完整的测试代码为: 

    using System.Diagnostics.Contracts;

    using System.Diagnostics;

    class Program {

        static void Main(string[] args) {

            SimpleCalculate sc = new SimpleCalculate(4,8);

            Console.WriteLine(sc.Divide());

        }

    }

 

    class SimpleCalculate {

        private int num1;

        private int num2;

 

        public SimpleCalculate(int numberone, int numbertwo) {

            num1 = numberone;

            num2 = numbertwo;

        }

 

        [ContractInvariantMethod]

        protected void ObjectInvariant() {

            Contract.Invariant(this.num2>0);

        }

 

        public int Divide() {

            Contract.Ensures(Contract.Result<int>() > 0);

            if (num2 > 0)

                return num1 / num2;

            return num1;

        }

    }

上文的作者在文章最后提出了一个很有意思的问题,程序中Divide() 方法都还没运行完,Contract 居然就告诉你结果有问题了,相当的有意思。

 

更多关于Code Contract 的信息,请参考:

http://blogs.msdn.com/somasegar/archive/2009/02/23/devlabs-code-contracts-for-net.aspx

 

4. Type Equivalence

.NET 4.0 使得Managed Code 和COM 的交互更加方便,以往的做法简直让人有晕厥的倾向.更多关于 Type Equivalence. 让权威人士 Misha Shneerson 给我们讲一堂课(PDC 的时候,讲到中途有人离场,她很郁闷) 

 

一个视频Demo - CLR4, Inside Type Equivalence
 
另外一篇相关文章 PDC Day 1: No-PIA, or Type Equivalence and Type Embedding
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值