介绍

从.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. Delphi经验总结(1)

    先人的DELPHI基础开发技巧 ◇[DELPHI]网络邻居复制文件 uses shellapi; copyfile(pchar('newfile.txt'),pchar('//computername ...

  2. MongoDB副本集学习(二):基本测试与应用

    简单副本集测试 这一节主要对上一节搭建的副本集做一些简单的测试. 我们首先进入primary节点(37017),并向test.test集合里插入10W条数据: . rs0:PRIMARY> ;i ...

  3. 毫秒数转换为指定格式日期的js代码

    var format = function(time, format){ var t = new Date(time); var tf = function(i){return (i < 10 ...

  4. PHP---TP框架---添加数据-----有三种方式

    添加数据 添加数据有三种方式: 第一种: <?php namespace Home\Controller;//这个文件的命名空间 use Think\Controller;//use使用哪一个而 ...

  5. apple配置WIFI热点

    打开AirPort打开设置偏好-共享,找到WIFI相关

  6. 【图文详解】scrapy爬虫与动态页面——爬取拉勾网职位信息(2)

    上次挖了一个坑,今天终于填上了,还记得之前我们做的拉勾爬虫吗?那时我们实现了一页的爬取,今天让我们再接再厉,实现多页爬取,顺便实现职位和公司的关键词搜索功能. 之前的内容就不再介绍了,不熟悉的请一定要 ...

  7. linux常见问题集锦

    本文转自 http://bbs.chinaunix.net/thread-3668921-1-1.html,在此感谢作者分享 一.填空题: 1. 在Linux系统中,以 文件 方式访问设备 . 2. ...

  8. hdu 1012:u Calculate e(数学题,水题)

    u Calculate e Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  9. ActiveMQ Exception: java.io.EOFException: Chunk stream does not exist

    解决办法: 方法1. 去掉延迟功能:<broker xmlns="http://activemq.apache.org/schema/core " brokerName=&q ...

  10. NDK开发

    1 CDT 是 Eclipse 插件,它将把 Eclipse 转换为功能强大的 C/C++ IDE. C/C++在Eclipse平台下的开发工具.它提供的功能包括:C/C++编辑器(一些基本的功能:语 ...