介绍

从.NET4.5发布到现在已经有一年多了。但问题是针对最近微软发布的版本信息中,大部分的.NET开发人员所讨论交流的只是其中的一两个特性。其他的特性仅仅停留在MSDN中或者沦为简介文档。
例如:现在问一个.NET开发人员:.NET4.5的核心框架是什么?他们大多数将只能说出异步和等待(至少,我接触的人中,只谈论过这些特性)
再次,浏览所有特性确实是一件非常困难的事情。因为,从你所从事的方面来看,有些特性听起来不是那么让你感兴趣。
因此,在这篇文章中,我挑选了.NET 4.5中介绍的五个我喜欢的特性。再次声明:不排除在我所喜欢的特性中,你一个都不感兴趣。但是写这篇文章之前,我时刻谨记更大.NET社区中提到的特性,并且我希望可以满足你的预期。

注意:这篇文章仅涉及核心特性,ASP.NET,WCF,WPF,WWF等等不在讨论范围之内。

特性1:异步和等待(代码标记)

这个特性已经快被讨论滥了,而且几乎每一个.NET技术狂人都会谈论此特性。但是此特性依旧是我的最爱。稍后您将明白为什么我会以这些话作为开场白。

异步(async)和等待(await )是用来标记代码在一个任务(线程)完成后,需要继续执行代码的所在位置的标记量。
让我们通过理解下面的代码来尽量理解上面的描述。如果你明白下面的代码流程:

  1. 在静态无返回值的主函数Static void main()入口处调用Method()函数。

  2. Method()方法生成一个延时10秒的任务(线程)LongTask。

  3. 同时,任务被调用结束,程序执行到返回 Method()函数执行剩余代码。也就是说:调用是多线程的,等待10秒的任务LongTask 和 Method()方法中剩余代码同时在运行。

现在,在上述情况下,若我们想要以另一种方式实现第三步的操作。那么异步和等待这两个关键字可以帮助我们。

现在,关于异步和等待有三点需要重点注意:

  1. 异步和等待是一对关键字,你不能单独使用。

  2. 异步在一个方法中做标记,这个关键字只是一个用来标记这个方法有等待(await)关键字的指示器。

  3. 这个等待关键字标记了任务重新开始的位置。所以,你要在task这个线程中始终寻找等待(await)这个关键字。

下面是前面应用了异步(async)和等待(await)的代码一个修改后的版本。所有步骤都保留不变,除了第三步是完成第二步之后才执行。 简而言之,就是程序完成任务(线程)的操作后,回到Method()方法,继续执行。

现在你读完了“异步”和“等待”的讨论。让我们一起讨论一个问题:上述代码的行为,也可以用Task.Wait或者 Task.ContinueWith 来实现。那么它们有什么区别?我把这个问题留作家庭作业,请自行完成。

特性2:Zip 附属功能(Zip压缩)

Zip是一个被广泛接受的档案文件格式之一。Zip压缩格式以***.Zip固定格式为大多数的操作系统所支持。

  • 在Windows操作系统中,被称作“压缩文件”.

  • 在MAC OS(苹果专用系统)中则被称为“档案公用程序”

现在,在.NET中我们还没有嵌入对Zip解压程序的支持。很多开发人员第三方组件如:DotnetZip。在.NET4.5当中Zip特性已经融入了framework当中,且命名空间为:System.IO.Compression.

第一步,你需要参考两个命名空间:

  • System.IO.Compression.FileSystem 

  • System.IO.Compression

下一步是:引入下面两个命名空间:

1
using System.IO.Compression;

如果你想要将一个文件压缩为Zip格式文件,你可以用如下所示的CreateFromDirectory方法。

1
ZipFile.CreateFromDirectory(@"D:\data",@"D:\data.zip");

特性3:正则表达式超时

“Regex”
在数据验证方面最受欢迎。考虑到您可能对“Regex”完全陌生的。请参考我介绍Regex如何运作的视频。
But because of the typical parsing logic of regex it is exposed to DOS attacks. Let us try to understand in detail what I mean by that.
但是由于正则表达式典型的逻辑解析是暴露在DOS攻击之下的。让我们尝试了解一下细节来明白我为什么这么说。
例如,我们来看一下这个规则表达式-“^(\d+)$”。这个正则表达式的规则是只有数字符合条件。你也可以看一看下面描述正则表达式如何评估输入信息的符号图。现在,假设我们想要验证“123456x”。正如下图所示,正则表达式将走六条路径。

但是如果我们再扩展一位输入参数,它将有七条路径。也就是说,随着输入参数长度的增加,正则表达式的验证需要更多地时间来验证。即:验证所需时间和输入参数的长度为线型关系。

现在让我们把前面的表达式“^(\d+)$”复杂化为“^(\d+)+$”。如果你意识到了这个正则表达式写的非常复杂。而且我们想验证“123456x”。它将执行32条路径。 如果你再添加一个字符,它遍历的路径将变成64条。

也就是说,对上述正则表达式而言,验证输入参数的长度与消耗时间是指数关系。

现在,你可能会问:这些有关系吗?但是我要说的是:当正则表达式执行线性相关的验证时,这个特点可能被黑客利用,以实现DOS攻击。他们可以输入非常长的字符串,使你的应用永远处于挂起状态(始终处于正则验证状态)。
一个比较合适的解决方法是:设置正则操作的超时限制。好消息是,在.NET4.5中,你可以像下面所示代码那样,为正则验证添加一个超时属性。所以,如果你收到任何类型的恶意注入时,你的应用不会陷入死循环。

1
2
3
4
5
6
7
8
9
try
{
  var regEx = new Regex(@”^(\d+)+$”, RegexOptions.Singleline, TimeSpan.FromSeconds(2));
  var match = regEx.Match(“123453109839109283090492309480329489812093809x”);
}
catch (RegexMatchTimeoutException ex)
{
  Console.WriteLine(“Regex Timeout”);
}

特性4:配置文件的优化(提升启动时性能)

众所周知,.NET代码处于半编译格式。在运行时,JIT编译器才会运行和解释半编译的IL代码为本机的机器码。由于第一次运行.NET程序的时候JIT忙于把IL编码解释为机器代码,因此程序运行的会非常慢。这也是JIT被很多.NET程序员诟病的一个问题。
为了缩减启动时间,在.NET4.5中。我们有了一个叫做“配置文件优化”的一个利器。文件中只包含了程序启动时所需方法的列表。所以,当程序启动时,后台的JIT将会把这些方法翻译成机器语言/本地编码并运行。
后台运行的JIT将跳过多数控制器,直接编译启动项配置文件里的方法,因此可以大大缩减所需时间。需要注意的是:你需要多核硬件的支持,否则的话,可以直接忽略此特性了。


了创建“配置文件”这个文件,你首先需要引入System.Runtime这个命名空间。第二步,你要调用静态类
ProfileOptimization 中的SetProfileRoot和StartProfile 方法。现在,当程序启动后台JIT时,它将通过
后台读取配置文件并编译启动方法来缩短启动时间。

1
2
3
4
5
6
using System.Runtime;
  
// Call the Setprofilerroot and Startprofile method
ProfileOptimization.SetProfileRoot(@"D:\ProfileFile");
  
ProfileOptimization.StartProfile("ProfileFile");

注意:ASP.NET 4.5和Silverlight的应用程序默认采用Profileoptimization  静态类进行处理。因此上述代码不必再此类项目中再写一遍。

特性5:垃圾回收器(GC后台清理)

垃圾回收器在一个.NET程序中是一项非常繁重的任务。并且,在ASP.NET应用程序中表现更为明显。ASP.NET的应用程序在服务器端运行,而且许多客户端会向服务器发送请求来创建对象。这使得GC清理非必要对象的工作更加繁重。

在.NET4.0
中,当GC清理垃圾时,所有应用程序的线程是被中止的。你可以在上图中看到,我们有三个应用程序的线程正在运行,我们有两个GC分别运行在不同的线程。一
个GC线程对应一个本地进程。现在,应用程序的线程正在正常执行。现在,随着这些程序的线程执行它们任务的过程中,它们也创建了托管对象。
在某些事件节点上,后台的GC运行并开始清理。当这些后台的GC开始清理时,它们将中止所有应用程序的线程,这将导致在此时间节点上服务器和应用程序间的响应时间将会拉长。


了解决以上问题,服务器端的GC应运而生。服务器GC会多开启一个后台运行的线程。这个线程将在后台运行,并且持续清理二代对象。因此,减少了主GC线程
的负载。由于GC采用双线程运行,主程序的线程被中止的频率将大大境地。从而提高了应用程序的运行效率。为了使用服务器GC,我们需要在配置文件中将添加
gcServer  XML标签,并使之有效。如下所示

1
2
3
4
5
<configuration>
<runtime>
<gcServerenabled="true"/>
</runtime>
</configuration>

三个有待探索的特性

为程序设置特定区域性的信息

在以往的.NET版本中。如果我需要设置特定区域性的信息。我需要在很多地方重复操作。羡慕的代码就是展示在多个线程级别中设置特定区域性的信息的纠结与痛苦。在多线程应用程序的开发中,更是让人苦不堪言。

1
2
3
CultureInfo cul = new CultureInfo(strCulture);
Thread.CurrentThread.CurrentCulture = cul;
Thread.CurrentThread.CurrentUICulture = cul;

在.NET4.5中。我们可以在应用程序里设置特定区域性的信息的级别。而且所有内部的线程将继承此信息。下面是演示如何使用DefaultThreadCurrentCulture 的代码。

1
2
CultureInfo culture = CultureInfo.CreateSpecificCulture("fr-FR");
CultureInfo.DefaultThreadCurrentCulture = culture;

数组支持超过2G字节的规模

我无法想象在什么情况下我们会用到2GB的集合。所以我本人不知道我们在什么地方可以用到该特性。曾经,我需要一个大量数据的集合时,我将把大量数据分解为几部分。但是我相信,.NET中添加此特性是有一定原因的。

控制台程序支持Unicode编码

因为很少有人从事控制台程序的开发,所以我没有在上述讨论中提到此特性。我曾看到过人们在教学的时候用到了控制台程序。总而言之,控制台程序也开始支持Unicode编码格式了。

原文路径  http://www.itstrike.cn/Question/10777f22-b683-45ee-a957-c38368823a01.html

.NET Framework 4.5 的五大特性的更多相关文章

  1. Five Great .NET Framework 4.5 Features (五大特性)

    [译].Net 4.5 的五项强大新特性   本文原文:Five Great .NET Framework 4.5 Features译者:冰河魔法师 目录 介绍 特性一:async和await 特性二 ...

  2. Entity Framework 第三篇 实体特性声明

    Entity Framework中对实体的特性声明有着严格的要求 1.实体必须要有主键特性,但是如果实体没有主键特性那怎么办? public int ExecuteSqlCommand(string ...

  3. Spark之RDD的定义及五大特性

    RDD是分布式内存的一个抽象概念,是一种高度受限的共享内存模型,即RDD是只读的记录分区的集合,能横跨集群所有节点并行计算,是一种基于工作集的应用抽象. RDD底层存储原理:其数据分布存储于多台机器上 ...

  4. Entity Framework 6 Code First新特性:支持存储过程

    Entity Framework 6提供支持存储过程的新特性,本文具体演示Entity Framework 6 Code First的存储过程操作. Code First的插入/修改/删除存储过程 默 ...

  5. Spring Framework 5 中的新特性

    https://www.ibm.com/developerworks/cn/java/j-whats-new-in-spring-framework-5-theedom/index.html Spri ...

  6. Entity Framework Core 2.0 新特性

    本文翻译来自:https://docs.microsoft.com/en-us/ef/core/what-is-new/index 一.模型级查询过滤器(Model-level query filte ...

  7. HTML5 五大特性

    一.正则表达式: 相信大家都会非常喜欢这个特性,无须服务器端的检测,使用浏览器的本地功能就可以帮助你判断电子邮件的格式,URL,或者是电话格式,防止用户输入错误的信息,通过使用HTML5的patter ...

  8. AngularJS 五大特性,加快 Web 应用开发

    AngularJS 是谷歌的一个 JavaScript 框架,旨在简化前端应用程序的开发.如果你在开发单页的应用程序,我敢肯定你已经听说过它.我是 AngularJS 的忠实粉丝,在这篇文章中我将概述 ...

  9. angularJS简介及其特点—— 五大特性,加快 Web 应用开发

    AngularJS 是谷歌的一个 JavaScript 框架,旨在简化前端应用程序的开发. 一. 关于和jquery的比较 首先angular是一个mvc框架,它与jquery不同之处在于,前者致力于 ...

随机推荐

  1. 【转】打造属于自己的Android Studio神器

    本文转载自:http://www.stormzhang.com/android/2015/05/26/android-tools/,并加以修改.黄色底部分是本人添加的内容. 一晃好久没更新博客了,最近 ...

  2. 【转】Kettle集群

    本文转自:http://blog.csdn.net/dqswuyundong/article/details/5952009 Kettle集群 Kettle是一款开源的ETL工具,以其高效和可扩展性而 ...

  3. 【mysql】用navicat连接虚拟机mysql出现错误代码(10038)

    来源: http://www.cnblogs.com/ohmydenzi/p/5521121.html http://blog.csdn.net/chana1101/article/details/3 ...

  4. docke跨主机通信之gre隧道

    GRE简介 GRE可以对网络层的任何协议来进行封装,类似LVS的IPIP协议,在原有的数据报上增加GRE协议数据报.然后在网络上传输,到达对端后,解开GRE数据报头,得到真实的数据报.其中的mac地址 ...

  5. cf112a(水题)

    题目很简单..不过题意好像有点难懂... 题意:判定一个数能否被一个幸运数整除,循环一遍4到n/4,若存在i为幸运数且被n整除输出yes,反之输出no... 代码如下: #include <bi ...

  6. Windows环境下配置Vim为Python的IDE

    (一)安装Python 2.7 在官网下载Python,并安装,我的安装路径是D:\Program Files\Python.安装完成后编辑环境变量Path,在其后添加;D:\Program File ...

  7. zsh(yum装包的时候,有时候会不行)

    [root@GIT ~]# yum search zsh =============================== N/S Matched: zsh ====================== ...

  8. 设计模式学习之单例模式(Singleton,创建型模式)(4)

    假如程序中有一个Person类,我的需求就是需要在整个应用程序中只能new一个Person,而且这个Person实例在应用程序中进行共享,那么我们该如何实现呢? 第一步: 新建一个Person类,类中 ...

  9. js打印html中的内容

    js打印方法 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www. ...

  10. wp8 入门到精通 抓包

    抓包工具Fiddler的使用 Fiddler是一款免费且功能强大的数据包抓取软件.它通过代理的方式获取程序http通讯的数据.我们可以利用它来检测网页和服务器的交互情况.下面,我们以http://bl ...