C#之using什么时候使用?

众所周知C#语言包含有开发人员体验良好的垃圾回收机制,通过引用跟踪算法和基于代的垃圾回收器能很好对不可达对象回收其内存。但是有些需要使用本机资源的类型就无法正常地释放其内存,例如常见的通过FileStream类读写本机文件资源,使用using就显得非常必要。

它可以简化代码并很好的清理引用本地资源的类型。using语句初始化一个对象,并将它的引用保存到一个变量中。然后在using语句的大括号内访问该变量。编译器自动生成try块和finally块。在finally块中,编译器生成代码会将变量转型为一个IDispoable并调用Dispose方法。

这也就说明了什么时候使用using,用于那些实现了IDisposable接口的类型。

以下两段代码时等效的,编译生成的IL代码是一致的,这就能看出using的方便之处。

        static void WriteFileWithoutUsing()
        {
            // 创建要写入临时文件的字节
            Byte[] bytesToWrite = new byte[] { 1, 2, 3, 4, 5 };
            // 创建临时文件
            FileStream fs = new FileStream("Temp.dat", FileMode.Create);
            try
            {
                // 将字节写入临时文件
                fs.Write(bytesToWrite, 0, bytesToWrite.Length);
            }
            finally
            {
                // 写入字节后显示关闭文件
                if (fs != null) fs.Dispose();
            }

            // 删除临时文件
            File.Delete("Temp.dat");
        }

 

        static void WriteFileWithUsing()
        {
            // 创建要写入临时文件的字节
            Byte[] bytesToWrite = new byte[] { 1, 2, 3, 4, 5 };
            // 创建临时文件
            using (FileStream fs = new FileStream("Temp.dat", FileMode.Create))
            {
                // 将字节写入临时文件
                fs.Write(bytesToWrite, 0, bytesToWrite.Length);
            }

            // 删除临时文件
            File.Delete("Temp.dat");
        }

通过查询IL代码,也可以发现的确如上面所言,using语句会自动添加try finally块,并在finally块中执行Dispose方法。

 

posted @ 2022-03-09 10:58  业荒于嬉  阅读(267)  评论(0编辑  收藏  举报