none
using()的用法问题 RRS feed

  • 问题

  • using System;
    using System.IO;
    class DirAppend
    {
        public static void Main(String[] args)
        {
            using (StreamWriter w = File.AppendText("log.txt"))
            {
                Log ("Test1", w);
                Log ("Test2", w);
                // Close the writer and underlying file.
                w.Close();
            }
            // Open and read the file.
            using (StreamReader r = File.OpenText("log.txt"))
            {
                DumpLog (r);
            }
        }
        public static void Log (String logMessage, TextWriter w)
        {
            w.Write("\r\nLog Entry : ");
            w.WriteLine("{0} {1}", DateTime.Now.ToLongTimeString(),
                DateTime.Now.ToLongDateString());
            w.WriteLine("  :");
            w.WriteLine("  :{0}", logMessage);
            w.WriteLine ("-------------------------------");
            // Update the underlying file.
            w.Flush(); 
        }
        public static void DumpLog (StreamReader r)
        {
            // While not at the end of the file, read and write lines.
            String line;
            while ((line=r.ReadLine())!=null)
            {
                Console.WriteLine(line);
            }
            r.Close();
        }
    }
    ----------------------------------------------------------------------
    上段代码中的 using (StreamWriter w = File.AppendText("log.txt"))和 using (StreamReader r = File.OpenText("log.txt"))两句,把using()去掉后,也能正常运行。
    请问使用using()的作用是什么?有什么好处?
    2010年5月17日 7:16

答案

  • 例子:

    using(Ojbect NotDispose_or_DisponseRightNow=new Object()){

    ..................

    }

    解释:

    当程序执行完using的花括弧里面的程序代码 会自动释放被实例化的NotDispose_or_DisponseRightNow这个资源。

    作用:

    .net的所有类有些如socket,io(file,sound)等一些非托管资源和一些比较紧缺的资源不会及时的被释放掉。

    当并发量大的时候这样会严重的影响系统的性能和稳定性.所以简单的解决办法就是把对象写入using(){}代码库内部。

    懂了吗?

    2010年5月17日 7:26

全部回复

  • 例子:

    using(Ojbect NotDispose_or_DisponseRightNow=new Object()){

    ..................

    }

    解释:

    当程序执行完using的花括弧里面的程序代码 会自动释放被实例化的NotDispose_or_DisponseRightNow这个资源。

    作用:

    .net的所有类有些如socket,io(file,sound)等一些非托管资源和一些比较紧缺的资源不会及时的被释放掉。

    当并发量大的时候这样会严重的影响系统的性能和稳定性.所以简单的解决办法就是把对象写入using(){}代码库内部。

    懂了吗?

    2010年5月17日 7:26
  • using(){}释放实例化的NotDispose_or_DisponseRightNow这个资源。与上段代码中的w.Close()是什么关系,有没有重复执行资料释放?
    2010年5月17日 8:13
  • 一样的效果

    释放一次后 不会被再次释放

    手动释放的效果更精确 但是也存在不可预知的风险 比如Log方法异常了 或者一些不能控制的或目前你想不到的原因

     

     

    2010年5月17日 8:36
  • 在上段代码中using(){}除了释放实例对象w的资源外,还释放什么资源?
    2010年5月17日 9:06
  • 你好!

         using只释放你在他后面括号中声明的实例占用的资源!

         另外,实际上使用这个关键字会在编译的时候生成一个try...finally结构,释放资源的代码放在finally语句中,保证即使抛出异常,也可以释放资源!


    周雪峰
    2010年5月17日 14:20
    版主
  • 从 C# 语言本身来讲,using 其实什么都不做。它是一个语法糖。当它被编译后,会把 using 的代码变成类似于下面的:

    using (MemoryStream stream = new MemoryStream()) { ... }

    变成

    MemoryStream stream = new MemoryStream();
    try { ... }
    finally
    {
        IDisposable dispose = (IDisposable)stream;
        dispose.Dispose();
    }

    可以看到,实际上,using 就是帮我们执行了 IDisposable.Dispose() 方法,资源回收的事情都是 Dispose() 去做的。

    上面的代码同样说明,只有实现了 IDisposable 接口的类型,才可以放在 using 中。


    Mark Zhou
    2010年5月18日 10:08
  • 释放资源作用

    2010年5月19日 9:26