C#的变迁史 - C# 5.0 之其他增强篇
1. 内置zip压缩与解压
Zip是最为常用的文件压缩格式之一,也被几乎所有操作系统支持。在之前,使用程序去进行zip压缩和解压要靠第三方组件去支持,这一点在.NET4.5中已有所改观,Zip压缩和解压功能已经内置于框架本身。这个功能使用起来很简单,三步即可:
第一步:在当前工程中添加两个Reference:
System.IO.Compression.FileSystem
System.IO.Compression
第二步:引用命名空间:
using System.IO.Compression;
第三步:使用ZipFile提供的静态方法完成压缩和解压:
// 如果你想要从文件夹压缩文件你可以调用如下所示的CreateFromDirectory函数。
ZipFile.CreateFromDirectory(@"D:\data",@"D:\data.zip");
// 如果你想要解压,你可以调用如下代码所示的ExtractToDirectory函数。
ZipFile.ExtractToDirectory(@"D:\data.zip", @"D:\data\unzip");
2. 正则表达式匹配可设置超时
之前的正则表达式匹配是没有时间限制的,这样对网站来说就可能存在漏洞。假设一个黑客要攻击一个含有正则表达式验证的网站(几乎每个网站应该都使用了)的时候,他可以设置一个超长的字符串去让服务器匹配,这样就可以永远的让服务器无法响应别的请求,这就是通常所说的DOS(拒绝服务)攻击。在.NET 4.5中,我们可以给正则表达式设置超时时间,使用起来很简单:
try
{
var regEx = new Regex(@”^(\d+)+$”, RegexOptions.Singleline, TimeSpan.FromSeconds());
var match = regEx.Match(“123453109839109283090492309480329489812093809x”);
}
catch (RegexMatchTimeoutException ex)
{
Console.WriteLine(“Regex Timeout”);
}
3. 可以设置app domain的culture info
在之前版本中,如果想设置culture info,是需要在每个线程中设置的。下面的示例程序演示了在线程级别设置culture info的痛苦,特别是当我们有大量多线程的时候:
CultureInfo cul = new CultureInfo(strCulture);
Thread.CurrentThread.CurrentCulture = cul;
Thread.CurrentThread.CurrentUICulture = cul;
在.NET 4.5中我们可以在应用程序域级别设置culture info,并且所有在这个应用程序域当中的线程都会继承这个culture info。看一个简单的例子:
CultureInfo culture = CultureInfo.CreateSpecificCulture("fr-FR");
CultureInfo.DefaultThreadCurrentCulture = culture;
4. 后台垃圾回收
垃圾回收在.NET应用中是一项繁重的任务,特别是在ASP.NET应用中,它更加繁重。ASP.NET应用在服务器端运行,当许多客户端向服务器发送请求时就会产生大量的零时对象,这使得垃圾回收需要不断的启用回收功能。
在之前的版本中,当垃圾回收运行清理的时候,所有的应用程序线程要暂停等待垃圾回收结束,因为回收垃圾以后,相关的引用类型对象会有新的地址信息。这对于服务器来说,就是此时服务器不响应客户端的请求。
为了克服上述问题,服务器垃圾回收机制被加入到.NET 4.5中。在服务器垃圾回收机制中,CLR多创建了一个运行在后台的线程。这个线程在后台运行并持续清理2代对象,从而降低主垃圾回收线程的开销。由于双垃圾回收线程的执行,主应用程序线程很少被暂停,进而增加了应用程序吞吐量。使用服务器垃圾回收也很简单,就是在config文件中配置一下:
<configuration>
<runtime>
<gcServer enabled="true"/>
</runtime>
</configuration>
5. 多核处理器下程序启动性能改善
我们都知道.NET代码编译后是以IL代码的形式存在。在程序首次运行时,JIT(Just-in-Time)编译器才会将IL代码编译为机器码。对JIT最大的抱怨之一就是当.NET程序首次运行的时候,它运行得比较慢。
为了降低这个启动时间,微软在.NET4.5中加入了“优化配置文件”特性。配置文件是一个记录了程序在启动运行中需要的方法列表的简单文件。当程序开始运行后,后台的JIT执行并且开始转换这些方法的IL代码为机器码。
这个后台JIT在多个处理器上可以并行的编译启动方法所以可以降低启动时间。请注意,因为这里是并行执行的,所以是利用了多核处理器来实现优化的。如果你的机器没有多核处理器(这种机器应该不存在了),那么这个设定会被忽略。
为了创建“配置文件”这个文件,首先你需要引入System.Runtime命名空间。然后你可以调用静态类ProfileOptimization的SetProfileRoot和StartProfile方法。现在当应用启动后台JIT,它将会读取配置文件并且在后台编译启动方法从而降低启动时间。
using System.Runtime; ProfileOptimization.SetProfileRoot(@"D:\ProfileFile");
ProfileOptimization.StartProfile("ProfileFile");
需要注意:ASP.NET 4.5和Silverlight 5应用默认支持了Profileoptimization。所以编写这两种程序无需编写任何Code。
6. 应用程序级别的增强
这个是一个比较大的课题,包括ASP.NET程序中HTML5技术的支持,WPF,WCF,WF类库的增强,这个就不多说了。需要的同学参见MSDN上的详细列表:http://msdn.microsoft.com/zh-cn/library/ms171868(v=vs.110).aspx。
C#的变迁史 - C# 5.0 之其他增强篇的更多相关文章
- C#的变迁史 - C# 4.0 之线程安全集合篇
作为多线程和并行计算不得不考虑的问题就是临界资源的访问问题,解决临界资源的访问通常是加锁或者是使用信号量,这个大家应该很熟悉了. 而集合作为一种重要的临界资源,通用性更广,为了让大家更安全的使用它们, ...
- C#的变迁史 - C# 5.0 之调用信息增强篇
Caller Information CallerInformation是一个简单的新特性,包括三个新引入的Attribute,使用它们可以用来获取方法调用者的信息, 这三个Attribute在Sys ...
- C#的变迁史 - C# 5.0 之并行编程总结篇
C# 5.0 搭载于.NET 4.5和VS2012之上. 同步操作既简单又方便,我们平时都用它.但是对于某些情况,使用同步代码会严重影响程序的可响应性,通常来说就是影响程序性能.这些情况下,我们通常是 ...
- C#的变迁史 - C# 4.0 之并行处理篇
前面看完了Task对象,这里再看一下另一个息息相关的对象Parallel. Parallel对象 Parallel对象封装了能够利用多核并行执行的多线程操作,其内部使用Task来分装多线程的任务并试图 ...
- C#的变迁史 - C# 4.0篇
C# 4.0 (.NET 4.0, VS2010) 第四代C#借鉴了动态语言的特性,搞出了动态语言运行时,真的是全面向“高大上”靠齐啊. 1. DLR动态语言运行时 C#作为静态语言,它需要编译以后运 ...
- C#的变迁史 - C# 4.0 之多线程篇
在.NET 4.0中,并行计算与多线程得到了一定程度的加强,这主要体现在并行对象Parallel,多线程Task,与PLinq.这里对这些相关的特性一起总结一下. 使用Thread方式的线程无疑是比较 ...
- C#的变迁史 - C# 3.0篇
C# 3.0 (.NET 3.5, VS2008) 第三代C#在语法元素基本完备的基础上提供了全新的开发工具和集合数据查询方式,极大的方便了开发. 1. WPF,WCF,WF 这3个工程类型奠定了新一 ...
- C#的变迁史 - C# 2.0篇
在此重申一下,本文仅代表个人观点,如有不妥之处,还请自己辨别. 第一代的值类型装箱与拆箱的效率极其低下,特别是在集合中的表现,所以第二代C#重点解决了装箱的问题,加入了泛型.1. 泛型 - 珍惜生命, ...
- C#的变迁史 - C# 1.0篇
C#与.NET平台诞生已有10数年了,在每次重大的版本升级中,微软都为这门年轻的语言添加了许多实用的特性,下面我们就来看看每个版本都有些什么.老实说,分清这些并没什么太大的实际意义,但是很多老资格的. ...
随机推荐
- JavaScript正则表达式下——相关方法
上篇博客JavaScript 正则表达式上——基本语法介绍了JavaScript正则表达式的语法,有了这些基本知识,可以看看正则表达式在JavaScript的应用了,在一切开始之前,看看RegExp实 ...
- C++虚函数表
大家知道虚函数是通过一张虚函数表来实现的.在这个表中,主要是一个类的虚函数的地址表,这张表解决了继承.覆盖的问题,其内容真是反应实际的函数.这样,在有虚函数的类的实例中,这个表分配在了这个实例的内存中 ...
- make file教程(转)
最近在学习Linux下的C编程,买了一本叫<Linux环境下的C编程指南>读到makefile就越看越迷糊,可能是我的理解能不行. 于是google到了以下这篇文章.通俗易懂.然后把它贴出 ...
- node.js小结 2
下载node安装npm什么的就不说了 入门总结 http://www.cnblogs.com/Darren_code/archive/2011/10/31/nodejs.html 进入node_HOM ...
- flex swf和movieclip之前的微妙关系
开始不清楚, 一直尝试想load图片一样加载一个swftools转换的swf,然后在尝试转换成movieclip的时候,总是报错, avmiMovieClip 不能转换成movieclip之类的. 但 ...
- NodeJS实例系列~环境搭建,Hello world归来!
回到目录 1 安装Node.js服务端程序 https://github.com/Microsoft/nodejstools/wiki/Install-Node.js-and-get-started- ...
- 状态栏 a.getBoolean(1, false) 报错
状态栏 a.getBoolean(1, false) 报错 这个错误在编译运行时候并不会出现,但是当需要编译打包的时候,就会报出这个异常. TypedArray a = mContext.obtain ...
- atitit agt sys 设置下级代理功能设计.docx
atitit agt sys 设置下级代理功能设计.docx 显示界面1 先查询显示 set_sub.js1 设置代理2 /atiplat_cms/src/com/attilax/user/Agent ...
- 《轻量级Java Web整合开发入门SSH》 - 快速理解Java框架的又一积木
学习JAVA不难,难的是没有多余的时间给你仔细学习. 伴随着项目的不断跟进,责任重于泰山,必须快速提升. 我不能期望把一本书或者一个项目完全吃透,只希望能用数量去 ...
- iOS 屏幕适配:autoResizing autoLayout和sizeClass
1. autoResizing autoresizing是苹果早期的ui布局适配的解决办法,iOS6之前完全可以胜任了,因为苹果手机只有3.5寸的屏幕,在加上手机app很少支持横屏,所以iOS开发者基 ...