public string ToXML()  

        {  

            string strXml = string.Empty;  

            try  

            {  

                MemoryStream ms = new MemoryStream();  

                XmlSerializer xml = new XmlSerializer(this.GetType());  

                xml.Serialize(ms, this);  

                byte[] arr = ms.ToArray();  

                strXml = Encoding.UTF8.GetString(arr, , arr.Length);  

                return strXml;  

            }  

            catch  

            {  

                return "";  

            }  

        }  

象MemoryStream这类资源,应该用using包起来自动释放资源,否则会有内存泄漏问题。在using的使用上,我也同意应该使用using,但由于这类风格的代码在原项目中非常多(有一部分历史原因),如果一一修改,工作量太大,时间不允许。于是我就在内心评估:如果不改,现在这种代码的风险到底有多大?

我想很多人都知道using(Resource res = new Resrouce){},其实相当于

Resource res = new Resrouce

try{}

catch{}

finally{res.Dispose();}

对比与现有代码的区别,无非就是资源没有调用Dispose()释放,但是CLR有强大的GC(垃圾回收)机制,方法调用完成后,方法体中创建的托管资源如果不再被使用,也一并会被GC列为可回收对象,所以就算开发人员没有手动调用Dispose,其实CLR也会帮我们做这件事情,只是时机可能会晚一些而已。

于是有了下面的测试:

1.先创建一个示例用的Class

using System;  

using System.Collections.Generic;  

using System.Linq;  

using System.Text;  

using System.IO;  

using System.Xml.Serialization;  

namespace Model  

{  

    public class SampleClass  

    {  

        public string Name { set; get; }  

        public string ToXMLNoUsing()  

        {  

            string strXml = string.Empty;  

            try  

            {  

                MemoryStream ms = new MemoryStream();  

                XmlSerializer xml = new XmlSerializer(this.GetType());  

                xml.Serialize(ms, this);  

                byte[] arr = ms.ToArray();  

                strXml = Encoding.UTF8.GetString(arr, , arr.Length);  

                return strXml;  

            }  

            catch  

            {  

                return "";  

            }  

        }  

        public string ToXMLWithUsing()  

        {  

            string strXml = string.Empty;  

            try  

            {  

                using (MemoryStream ms = new MemoryStream())  

                {  

                    XmlSerializer xml = new XmlSerializer(this.GetType());  

                    xml.Serialize(ms, this);  

                    byte[] arr = ms.ToArray();  

                    strXml = Encoding.UTF8.GetString(arr, , arr.Length);  

                }  

                return strXml;  

            }  

            catch  

            {  

                return "";  

            }  

        }  

    }  

}   

这其中的ToXML为了测试方便,故意分成了二个版本(一个不用using,一个用using)

2.再创建一个Console程序(命名为WithUsing),写一段测试代码:

using System;  

using System.Diagnostics;  

using Model;  

namespace WithUsing  

{  

    class Program  

    {  

        static void Main(string[] args)  

        {  

            Console.WriteLine("开始折腾-WithUsing...");  

            Stopwatch watch = new Stopwatch();  

            int max = ;  

            watch.Reset();  

            watch.Start();  

            for (int i = ; i < max; i++)  

            {  

                SampleClass c = new SampleClass() { Name = i.ToString().PadLeft(, '') };  

                c.ToXMLWithUsing();  

            }  

            watch.Stop();  

            Console.WriteLine("完成,{0}次操作共耗时:{1}毫秒,平均{2}毫秒/次!", max, watch.ElapsedMilliseconds, watch.ElapsedMilliseconds /(decimal)max);  

            Console.ReadKey();  

        }  

    }  

}  

3.再创建一个Console程序(命名为NoUsing),写一段测试代码:

using System;  

using System.Diagnostics;  

using Model;  

namespace NoUsing  

{  

    class Program  

    {  

        static void Main(string[] args)  

        {  

            Console.WriteLine("开始折腾-NoUsing...");  

            Stopwatch watch = new Stopwatch();  

            int max = ;  

            watch.Reset();  

            watch.Start();  

            for (int i = ; i < max; i++)  

            {  

                SampleClass c = new SampleClass() { Name = i.ToString().PadLeft(, '') };  

                c.ToXMLNoUsing();  

            }  

            watch.Stop();  

            Console.WriteLine("完成,{0}次操作共耗时:{1}毫秒,平均{2}毫秒/次!", max, watch.ElapsedMilliseconds, watch.ElapsedMilliseconds / (decimal)max);  

            Console.ReadKey();  

        }  

    }  

}  

编译后,同时运行这二个程序,同时利用任务管理器观察内存使用情况:

反复多次运行比较,发现其实二者占用的内存几乎完全相同,这说明GC还是很给力的!

而且从执行时间上看,不用Using,反而更快,这也容易理解:用Using相当于每次都要调用Dispose()方法,这会带来一些系统开销;而不用Using,GC会在适当的时机批量回收资源,性能反而更好。(当然:这个结论不是要误导大家不用using,对于using还是推荐使用的!我的用意在于大家对于一些具体问题要具体分析,不可纯教条主义,一味迷信某些主流的观点)

作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
 
 

c#:使用using关键字自动释放资源未必一定就会有明显好处的更多相关文章

  1. Notepad++ JSON关键字自动提示

    Notepad++关键字自动提示 2017-08-31 目录 1 插件安装2 往JSON中加关键字3 智能提示 最近接口测试自动化框架的的case是json格式,用例的json的格式是固定的,定义专门 ...

  2. 帝国cms内容关键字自动加链接且设置内容关键字只替换一次

    网站上线前先设置一些内部链接对后期的优化排名很有帮助,帝国cms也可以设置文章中的关键字自动加链接,但是要注意一下关键词替换次数,最好是1次. 怎么操作呢?分两步完成 1.帝国cms文章关键字自动加链 ...

  3. java7(3)——增强的catch之自动释放资源

    跟mutilcatch一样,java7提供了自动释放资源的方法,但还是很少看到人使用,估计是麻烦去重写close方法.不过jdk内部一些类已经改成使用增强的catch来释放资源的写法,所以我们有必要了 ...

  4. using 自动释放资源示例

    我们在使用SqlConnection的时候可以加入using,那么在using语句结束后就会自动关闭连接.那么这种情况是怎么是实现的呢?我们能够自己写一个类似于SqlConnection的类来让usi ...

  5. 搜索关键字自动更正 - Oracle Endeca Server

    做了几个Oracle Endeca 电商项目.每个项目都会有搜过关键字拼写错误更正(Spelling Correction)的需求.淘宝也有类似功能. Oracle Endeca Sever提供了关键 ...

  6. XML文件中关键字自动提示和不全配置

    一.获得mybatis-3-config.dtd.mybatis-3-mapper.dtd 这两个文件. 建立一个Maven的项目 在Pom.xml文件中的Mybatis jar包的下载设置(也可以从 ...

  7. try(){}自动释放资源,AutoCloseable

    我们在使用资源的时候,必须关闭资源,比如使用jdbc连接或者inputStream的时候,必须在finally中将资源关闭.然而有的时候我们会忘记关闭资源.那么有没有更好的方法呢? SqlSessio ...

  8. Eclipse 实现关键字自动补全功能

    一般默认情况下,Eclipse ,MyEclipse 的代码提示功能是比Microsoft Visual Studio的差很多的,主要是Eclipse ,MyEclipse本身有很多选项是默认关闭的, ...

  9. Eclipse 实现关键字自动补全功能 (转)

    一般默认情况下,Eclipse ,MyEclipse 的代码提示功能是比Microsoft Visual Studio的差很多的,主要是Eclipse ,MyEclipse本身有很多选项是默认关闭的, ...

随机推荐

  1. linux shell 脚本攻略学习13--file命令详解,diff命令详解

    一.file命令详解 find命令可以通过查看文件内容来找出特定类型的文件,在UNIX/ Linux系统中,文件类型并不是由文件扩展名来决定的(windows中却正是这么做的),file命令的目的是从 ...

  2. 开发 Swift 和 Objective-C 混编的 Framework

    来源:黄文臣 blog.csdn.net/hello_hwc/article/details/58320433 前言 为什么要写这样一篇文章,因为昨天和一个朋友讨论到Swift和Objective C ...

  3. 上海租房找房建议及条件,上海IT行业开发常见公司的位置地点

    上海租房,找房条件 以2号地铁线为中心,优先选择(回家方便,重点!),交通设施较集中地铁:2,3,4 区:普陀区,静安区,长宁区,闸北区,浦东新区,闵行区,徐汇区 路:镇坪路,威宁路,娄山关路,中山公 ...

  4. Tomcat 6 部署工程总结,使用JNDI数据源配置

    工程需要用JNDI数据源方式部署到tomcat,参考网上文章后,经过配置测试,摸索出来了.     环境说明: 数据库:Oracle9i Web服务器:tomcat-6.0.33 tomcat启动方式 ...

  5. 解析form表单数据

    //解析form表单数据 function parseFormData(params) { var args = new Object(); for(var key in params){ if(!p ...

  6. 20本最好的Linux免费书籍

    前些天Neo推荐了一个网站有<超过100本的linux免费书籍>,这里,我也向大家推荐20本最好的Linux免费书籍,当然,也是英文版的. 1. Ubuntu Pocket Guide a ...

  7. Linux VFS数据结构

    先说明一下,linux内核中各种数据结构也不停的在变,所以不同版本的内核各个数据结构的定义可能会差别很大,这一组关于linux 文件系统的文章中的代码都摘自linux-2.6.34.1. VFS依赖于 ...

  8. PostgreSQL创建数据库用户

    注:版本不同,命令的执行路径可能有些不同. 一. 创建数据库用户freeswitch sudo -u postgres /usr/pgsql-9.5/bin/createuser -s -e free ...

  9. 设计模式C++实现——模板方法模式

    模式定义: 模板方法模式在一个方法中定义了一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类能够在不改变算法结构的情况下,又一次定义算法中的某些步骤. 模板就是一个方法.更详细的说.这种方法将 ...

  10. [转]SSH 原理和基本使用:ssh 安全配置 以及ssh key 认证登录

    一.什么是 SSH ? SSH全称(Secure SHell)是一种网络协议,顾名思义就是非常安全的shell,主要用于计算机间加密传输.早期,互联网通信都是基于明文通信,一旦被截获,内容就暴露无遗. ...