.NET Framework 4.5 特性

此文为转载!面试

英文原文:Five Great .NET Framework 4.5 Features正则表达式

  简介数组

  自 .NET 4.5 发布已通过了差很少 1 年了。可是随着最近微软大多数的发布,与 .NET 开发者交流的问题显示,开发者仅知道一到两个特性,其余的特性仅仅停留在 MSDN 并以简单的文档形式存在着。服务器

  好比说,当你问一个 .NET 开发者 .NET 框架内核中有什么新东西的时候,他们中的大多数仅仅会说异步与等待(至少和我交谈的人们仅仅谈到了这些特性)。多线程

  另外也很难贯通全部的新特性。由于这些特性可能对于你目前正在开发的工做并不如听上去那么有趣。框架

  因此在这篇文章中我想说起我喜欢的 5 个在 .NET4.5 内核中的特性。固然,这可能只是我喜欢的而并非你的。可是我所作的是当我选择这些特性时我也想着较大的 .NET 社区,我但愿我知足了这种指望。异步

aehtrhthjtyj

  提示:这篇文章没有讨论在 ASP.NET, WCF, WPF, WWF 等中的新特性。仅仅讲了关于内核的新特性。函数

   特性1:异步与等待(代码开发者)性能

  这个特性已经被吹嘘过分而且每一个 .NET 布道者都谈论它。可是这仍然是我喜欢的而且你会知道为何从这里只有几行。优化

atrhrtjrt2

  异步和等待是标记,它们标记当任务(线程)结束时控制应该恢复到代码的位置。

  让咱们尝试经过下面的代码来搞清上面声明的含义。若是你明白下面代码的流程:

  1. Static void main ()从开始处调用 Method ()方法。
  2.  Method ()方法产生一个名为 LongTask 的任务(线程),线程将等待 10 秒。
  3.  同时,在调用了任务以后,控制又回到 Method ()方法继续执行剩下的代码。换句话说,正如调用时多线程的(Task.Run…),LongTask 仍在运行。例如,等待 10 秒而且 Method ()方法剩下的代码也在执行。

  如今在相同的情景下,咱们想要第 3 步执行得不同。咱们想要在 LongTask ()执行完成后,控制应该回到 Method 方法执行接下来的代码。“异步”和“等待”关键字可以帮助实现上面的功能。

agfhgfnhgm3

  这里有三个关于关键字“异步”和“等待”的重点须要记住:

  1. 异步和等待是一对关键字。你不能独立使用它们。
  2. 异步应用于方法。这个关键字是一个标志,是说该方法会有一个等待关键字。
  3. 等待关键字标记了任务恢复执行的位置。因此你老是发现这个关键字与 Task 关联。

  下面是前面讨论的代码的修订版本,这里咱们应用了异步与等待。全部其余的步骤仍然如前所述,可是“步骤3”将在“步骤2”完成以后执行。简单来讲就是控制在任务完成以后回到 Method ()方法。

arhtrh4

  如今你已经阅读了“异步”与“等待”的内容,让我来提个问题。上面的代码一样也能经过 Task.Wait 或者 Task.ContinueWith 实现,那么它们有什么不一样?我把这个问题留做给你的家庭做业。

  特性2:便利 Zip 压缩(Zip 压缩)

sawfwsfa5

  Zip 是最为人所接受的文件格式之一。Zip 格式以某些内置的名字被几乎全部操做系统支持。

  • 在 Windows 操做系统中,它以“压缩文件”的名称实现。
  • 在 MAC 操做系统中,它以“文档实用程序”的名称实现。

  如今在 .NET 中咱们对执行 Zip 压缩没有内置的支持。许多开发者实用第三方组件如“DotnetZip”。在 .NET4.5 中,Zip 属性内置于框架自己,以 System.IO.Compression 的命名空间内置。

  第一步你须要引用两个命名空间:

  • System.IO.Compression.FileSystem
  • System.IO.Compression

  接下来引用以下两个命名空间:

using System.IO.Compression;

  若是你想要从文件夹压缩文件你能够调用以下所示的 CreateFromDirectory 函数。

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

  若是你想要解压,你能够调用以下代码所示的 ExtractToDirectory 函数。

ZipFile.ExtractToDirectory (@"D:\data.zip", @"D:\data\unzip");

  特性3:正则表达式超时(超时)

ewfjdnvlgdklgv

  “正则表达式”一直是作验证首选的方式。若是你是正则表达式的新手,请看正则表达式,我解释了正则表达式是如何执行的。可是正由于正则表达式的典型逻辑解析使得它暴露于 DOS 攻击下。让咱们试着理解刚才我说的。

  做为例子请考虑这样的正则表达式-“^(\d+)$”。这个正则表达式代表只能有数字。你也能够看正则表达式符号图,它标明了这个正则表达式会如何求值。如今让咱们假设要验证“123456X”。这将有 6 条路径以下图所示。

afnhjgfnhgm7

  但若是咱们再多加一个数字进去,将会有 7 条路径。换句话说,随着字符长度的增长,正则表达式将会花更多时间执行。也就是说,求值时间与字符长度成线性比例。

agnhgm8

  如今让咱们把以前定义的正则式从“^(\d+)$”变为“^(\d+)+$”。若是你看正则表达式符号图它将至关复杂。若是咱们如今试着验证“123456X”,将会有 32 条路径。若是你再增长一个字符,路径数将会增长到 64。

asdgvdfbfgn9

  换句话说,上面的正则表达式中时间开销与字符数目为成倍关系。

adsbfdbfghrt10

  如今你可能要问的是,这很重要吗?线性上升的求值时间能够被黑客利用来进行 DOS(拒绝服务)攻击。他们能够部署一个长并且是足够长的字符串来使你的应用永远挂起。

  对于这个问题合适的解决方法是在正则表达式执行上设置超时时间。好消息是,在 .NET4.5 中你能够定义一个超时属性以下代码所示。因此若是你收到任何怀有恶意的字符串,应用不会永远在循环中执行。

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

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

asdvdbfrbngrb 11

  咱们都知道 .NET 代码是半编译的格式。在运行时,JIT(Just-in-Time)编译器执行而且转换这种半编译的 IL 代码为机器原生代码。对 JIT 最大的抱怨之一是当 .NET 应用初次执行的时候,它运行得很慢由于 JIT 在忙着转换 IL 代码到机器代码。

  为了下降这个启动时间,在 .NET4.5 中有称为“优化配置文件”的内容。配置文件不过是一个记录了应用在启动运行中须要的方法列表的简单文件。因此当应用开始后,后台的 JIT 执行而且开始转换这些方法的 IL 代码为机器/原生语言。

  这个后台 JIT 在多个处理器上编译启动方法从而进一步下降启动时间。另外请注意你须要多核处理器来实现配置文件优化。若是你没有多核处理器那么这个设定会被忽略。

afgngkmyjkytjy12

  为了建立“配置文件”这个文件,首先你须要引入 System.Runtime 命名空间。而后你能够调用静态类 ProfileOptimization 的 SetProfileRoot 和 StartProfile 方法。如今当应用启动后台 JIT,它将会读取配置文件而且在后台编译启动方法从而下降启动时间。

using System.Runtime;
// Call the Setprofilerroot and Startprofile method 
ProfileOptimization.SetProfileRoot (@"D:\ProfileFile"); ProfileOptimization.StartProfile ("ProfileFile");

  重要提示:ASP.NET 4.5 和 Silverlight 5 应用默认支持 Profileoptimization。因此上述代码在这些技术中无需编写。

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

afgjrtk5ytjytn13

  垃圾回收在 .NET 应用中是一项真正繁重的任务。当是 ASP.NET 应用的时候,它变得更繁重。ASP.NET 应用在服务器运行,许多客户端向服务器发送请求从而产生对象负荷,使得垃圾回收确实努力清理不须要的对象。

aedvgdbh4erh14

  在 .NET4.0 中,当垃圾回收运行清理的时候,全部的应用程序线程都暂停了。在上图中你能够看到咱们有 3 个应用程序线程在执行。有两个垃圾回收运行在不一样的线程上。一个垃圾回收线程对应一个逻辑处理器。如今应用程序线程运行并执行它们的任务,伴随着这些应用程序线程的执行它们也建立了操做对象。

  在某个时间点,后台垃圾回收运行开始清理。当这些垃圾回收开始清理的时候,它们暂停了全部的应用程序线程。这使得服务器/应用程序在那一刻不响应了。

afvfbrtherg15

  为了克服上述问题,服务器垃圾回收被引进了。在服务器垃圾回收机制中多建立了一个运行在后台的线程。这个线程在后台运行并持续清理 2 代对象(关于垃圾回收0,1 和 2 代的视频)从而下降主垃圾回收线程的开销。因为双垃圾回收线程的执行,主应用程序线程不多被暂停,进而增长了应用程序吞吐量。为了使用服务器垃圾回收,咱们须要使用 gcServer XML 标签而且将它置为 true。

<configuration> 
  <runtime>
    <gcServer enabled="true"/>
  </runtime>
</configuration>

  另三个值得探索的特性

  设置默认应用程序域的区域性

  在上一个版本的 .NET 中若是我想设置区域性那么我须要在每一个线程中设置。下面的示例程序演示了在线程级别设置区域性的痛苦。当咱们有大量多线程应用程序的时候这是真正的痛苦。

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

  在 4.5 中咱们能够在应用程序域级别设置区域性而且全部在这个应用程序域当中的线程都会继承这个区域性。下面就是如何实现 DefaultThreadCurrentCulture 的示例代码。

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

  数组支持超过 2GB 容量

  我不肯定在什么样的情景下咱们会须要 2GB 的容器。因此我我的并不清楚咱们将在哪用到这个特性。若是我曾须要如此之大的容器我会把它分解成小份。但我确信在框架中启用此功能应该有个很好的理由。

  控制台支持 Unicode 编码

  我把这个特性留在讨论范围以外是由于很是少的人用控制台程序工做。我曾见过有人把控制台用于学术目的。总而言之,咱们如今也对控制台应用有了 Unicode 编码支持。

  引用

  • http://msdn.microsoft.com/en-us/library/ms171868.aspx
  • Mr Sukesh marla 的精彩文章 ASP.NET 4.5 new features

  当你有空的时候,必定来看看个人网站 www.questpond.com 关于 .NET4.5 面试问和答,我已经在这方面有了很多努力。

astrhhjync

相关文章
相关标签/搜索