使用CLR会造成内存方面的问题吗

http://tech.ddvip.com   2008年01月23日    社区交流

内容摘要:我老是担心使用CLR会造成内存方面的问题,比如内存不能回收。其实想一想也许我过滤了,毕竟.NET Framework能够自己回收托管内存。既然在应用服务器上能使用,数据库上似乎也可以使用。

try
      {
        ofile.WriteLine("gcDemo Class Destructor: {0}", ++dtor_cnt);
      }
      catch(Exception ex)
      {
        Console.WriteLine(ex.Message);
      }

  每次都要等把gcDemo Class Destructor:写了以后才会收回资源,由此产生了很大的效率浪费。所以系统提供了另一种方法,就是IDisposable接口,使用Dispose()来把非托管代码进行清空。

  比如

  gcDemo.c1.Dispose();

  在执行完毕以后,就对ofile这个StreamWriter对象进行了关闭,那么折构函数中的ofile.WriteLine方法就全部失效了!但是有个问题就是,需要程序人员手动进行设置,由此可能出现没有设置到,或者因为程序出错而出现的非托管垃圾驻留。因此微软提供了上面的双重方法来提供保险,对于程序员来说可以利用,但是也要根据情况来定了。

  还有,就是如果要安全起见的话,那么也可以采用IDisposable接口,然后用using来调用有非托管代码的语句。如

using System;
using System.IO;
using System.Windows.Forms;
  namespace nameSpace1
{
  class myTest:IDisposable
  {
    static public StreamWriter ofile;
  private string stPath;
  public myTest()
    {
      stPath = Application.StartupPath;
      ofile = new StreamWriter(new FileStream(stPath+@"fx2.txt", FileMode.OpenOrCreate));
  ofile.WriteLine("This is a test file!");
    }
    #region IDisposable 成员
  public void Dispose()
    {
      // TODO: 添加 myTest.Dispose 实现
      ofile.Close();
    }
  #endregion
  }
  class EntryPoint
  {
    static void Main()
    {
      using(myTest my = new myTest())
      {
        myTest.ofile.WriteLine("这是我的第二次的写入!");
      }
  
      try
      {
        myTest.ofile.WriteLine("这是我的第三次写入!");
      }
      catch(Exception ex)
      {
        Console.WriteLine(ex.Message);
      }
    }
  }
}

  在该程序中,This is a test file!和这是我的第二次的写入都可以被写入到文件,但是由于using语句包裹的语句具有限制范围,必须在{}和里面有效果,因此出了using以后就自动调用了Dispose()了。由此,这是我的第三次写入就发生了错误。但是要注意的是,对象一定要有Dispose()方法,要不不会被资源管理器给收回了的,比如,我把//ofile.Close()屏蔽了后,添加ofile.Flush()方法,那么就会把三条语句一并写入。

来源:IT专家网    作者:Peak Wong    责编:豆豆技术应用

正在加载评论...