.NET Framework 4.5 五个很棒的特性

  转自http://news.cnblogs.com/n/192958/

  英文原文: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

转载于:https://www.cnblogs.com/xianglf/p/3420635.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259169.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

group by很多字段是不是会很慢_女生回复我总很慢,怎么办?

原标题&#xff1a;女生回复我总很慢&#xff0c;怎么办&#xff1f;Hello&#xff0c;大家好&#xff0c;我是情圣老司机。有一种问题&#xff0c;可能属于年轻人才会遇到的问题年轻的兄弟总想控制一切&#xff0c;一切都掌控在自己手上包括今天这个主题&#xff1a;女生总是回…

大众点评网2016校招试题选录

大众点评网的校招题还真有特点&#xff0c;分四部分&#xff0c;第一部分是行测的数字规律类题目&#xff0c;第二部分是行测的图形规律题&#xff0c;第三部分是C、Java的基础选择题&#xff0c;第四部分是四个编程题。 题目都有时间限制&#xff0c;第一二部分皆是普通的行测…

天堂avatar

2010年2月2日晚上12看完期待已久的AVATAR&#xff0c;普通3D。说实在的&#xff0c;没有预想中的那么好&#xff0c;可能是由于过于期待导致要求太高的缘故。影片故事比较俗套&#xff0c;一如既往的美式英雄主义&#xff0c;最后一分钟力挽狂澜。但想想它毕竟是一部商业片&…

BZOJ 1012: [JSOI2008]最大数maxnumber(线段树)

裸的线段树...因为数组开小了而一直RE..浪费了好多时间..--------------------------------------------------------------------------#include<cstdio>#include<algorithm>#include<cstring>#include<cctype>#include<iostream>#define rep(i…

如何利用循环代替递归以防止栈溢出(译)

摘要&#xff1a;我们经常会用到递归函数&#xff0c;但是如果递归深度太大时&#xff0c;往往导致栈溢出。而递归深度往往不太容易把握&#xff0c;所以比较安全一点的做法就是&#xff1a;用循环代替递归。文章最后的原文里面讲了如何用10步实现这个过程&#xff0c;相当精彩…

python环境搭建_Python开发环境搭建安装开发软件

0.学习路径示意图各位小伙伴大家好&#xff0c;这次楼主分享的是Ubuntu上安装开发软件。包含以下这几个软件&#xff1a;PycharmAnaconda3GitVim远程登录软件RangerPS&#xff1a;因为以下安装包都是以root身份安装的因此&#xff0c;要使用它们必须以root身份登录su # 以root…

2023首届溪口冬笋节开幕 掀起溪口竹笋产业新浪潮

今年冬至&#xff0c;龙游县溪口镇迎来阵势浩大的“新气象”。 2023年12月22日&#xff0c;由龙游县溪口镇人民政府主办&#xff0c;“美好冬至 竹梦未来”首届溪口冬笋节于溪口老街正式开幕&#xff0c;展开为期一周的竹笋产业文化、经济活动宣传&#xff0c;龙游县领导、及社…

离散卷积的C语言实现

卷积公式可以去wiki上搜索&#xff0c;这里就不贴出了&#xff0c;具体的算法要参考MATLAB help中查看conv函数。根据conv的定义&#xff0c;我写出下面的程序&#xff0c;可以直接在MATLAB进行验证。唉&#xff0c;虽然程序是写出来&#xff0c;可心里对卷积还是有一种抓不住的…

最常见的读入数据方法集锦

我在程序编写过程中&#xff0c;经常会遇到读入数据的问题&#xff0c;大概这类问题分为两种&#xff0c;一种是从控制台读取&#xff0c;一类是从文件读取&#xff0c;我这里收集了一些常见的读取方法&#xff0c;以供参考。 控制台读取&#xff1a; 情景一、有一个程序要求…

【翻译自mos中文文章】重建控制文件的方法

重建控制文件的方法 參考原文&#xff1a; How to Recreate a Controlfile (Doc ID 735106.1) 适用于&#xff1a; Oracle Database - Enterprise Edition - Version 9.0.1.0 and later Information in this document applies to any platform. 解决方式&#xff1a; 警告&…

android 蓝牙通讯编程 备忘

1.启动App后: 判断->蓝牙是否打开&#xff08;所有功能必须在打牙打开的情况下才能用) 已打开: 启动代码中的蓝牙通讯Service 未打开: 发布 打开蓝牙意图(系统)&#xff0c;根据Activity返回进场操作 打开成功,启动代码中的蓝牙通讯Service 用户点back或失败 退出App 2.蓝牙…

java 程序执行后 强制gc_GC 设计与停顿

(给ImportNew加星标&#xff0c;提高Java技能)编译&#xff1a;唐尤华链接&#xff1a;shipilev.net/jvm/anatomy-quarks/3-gc-design-and-pauses/1. 写在前面“[JVM 解剖公园][1]”是一个持续更新的系列迷你博客&#xff0c;阅读每篇文章一般需要5到10分钟。限于篇幅&#xff…

除BUG记

我负责一个模块&#xff0c;功能比较简单&#xff0c;就是测量环境温、湿度&#xff0c;外加控制空调开/关、温度设定。就是这么几个功能&#xff0c;就反复试验、修改&#xff0c;才达到稳定。在调试时&#xff0c;出现各种各样的BUG&#xff0c;一些是编程时候出现的语法错误…

正则表达式语法(转)

正则表达式是一种文本模式&#xff0c;包括普通字符&#xff08;例如&#xff0c;a 到 z 之间的字母&#xff09;和特殊字符&#xff08;称为“元字符”&#xff09;。模式描述在搜索文本时要匹配的一个或多个字符串。 正则表达式示例 表达式匹配 /^\s*$/ 匹配空行。 /\d{2}-…

迎战校招训练题

一、双空 编译器可以根据硬件特性选择合适的类型长度&#xff0c;但要遵循如下限制&#xff1a;short与int类型至少为___C___位&#xff0c;long至少为__D____位&#xff0c;并且short类型不长于int类型&#xff0c;int类型不得长于long类型。 A. 4 B.8 C.16 D. 32 E. 64…

【ASP.NET Web API2】初识Web API

Web Api 是什么&#xff1f; MSDN&#xff1a;ASP.NET Web API 是一种框架&#xff0c;用于轻松构建可以访问多种客户端&#xff08;包括浏览器和移动设备&#xff09;的 HTTP 服务 百度百科&#xff1a;Web API是网络应用程序接口。 个人理解&#xff1a;Web API 是提供给多种…

三星s8怎么分屏操作_三星手机该怎么玩?了解完这几点用机技巧,可以轻车熟路了!...

其实对于三星这个手机品牌&#xff0c;我还是很佩服的。虽然近些年来&#xff0c;三星在国内的市场份额日渐变少&#xff0c;但是在国内的影响力依然尚存。毕竟三星手机在某些方面还是很有优势的&#xff0c;特别是旗舰系列机型深受消费者喜爱。接下来&#xff0c;笔者就跟大家…

关于条件编译的问题

这两天来忙活ucos-II在PIC18fxxx系列上的移植。在编译的时候老出现变量被多重定义的错误。花费了一天的功夫才成功编译通过&#xff0c;错误何在&#xff1f;&#xff1f;就是因为没有搞明白条件编译的原理&#xff0c;二是对mcc18编译器的特点无知。下面学习条件编译方面的知识…

二维数组的指针复习

最近一次的考试都是指针&#xff0c;真是给我深深上了一课&#xff0c;所以我特此复习一下指针方面的知识。二维数组的指针 int a[3][4] {{1,3,5,7},{9,11,13,15},{17,19,21,23}}; 下面通过一个表来做详细的说明&#xff1a; 访问二维数组&#xff0c;有两种方法&#xff0c;一…

称重的问题

给你8颗小石头和一架托盘天平。有7颗石头的重量是一样的&#xff0c;另外一颗比其他石头略重&#xff1b;除此之外&#xff0c;这些石头完全没有分别。你不得假设那颗重头到底比其他的石头重了多少。请问&#xff1a;最少要称量几次&#xff0c;你才能把那颗较重的石头找出来&a…