在csdn上提问释放资源:讨论Dispose和析构函数的使用,下面是结论:
使用using语句
下面是msdn上的原文

备注
在 using 语句中创建一个实例,确保退出 using 语句时在对象上调用 Dispose。当到达 using 语句的末尾,或者如果在语句结束之前引发异常并且控制离开语句块,都可以退出 using 语句。
实例化的对象必须实现 System.IDisposable 接口。
示例
// cs_using_statement.cs
// compile with /reference:System.Drawing.dll
using System.Drawing;
class a
{
   public static void Main()
   {
      using (Font MyFont = new Font("Arial", 10.0f), MyFont2 = new Font("Arial", 10.0f))
      {
         // use MyFont and MyFont2
      }   // compiler will call Dispose on MyFont and MyFont2

      Font MyFont3 = new Font("Arial", 10.0f);
      using (MyFont3)
      {
         // use MyFont3
      }   // compiler will call Dispose on MyFont3

   }
}

posted on 2004-07-22 11:19 Sandy 阅读(829) 评论(6)  编辑 收藏 收藏至365Key

评论

# re: 释放资源:讨论Dispose和析构函数的使用  回复   

可是如果在using中又申明了新的对象,会不会也将这些新的对象给释放掉呢???
using (Font MyFont = new Font("Arial", 10.0f), MyFont2 = new Font("Arial", 10.0f))
      {
         // use MyFont and MyFont2
        DataSet  ds = new DataSet();//在退出using时,会不会也将这个对象给释放掉呢???
        ........

      }   // compiler will call Dispose on MyFont and MyFont2
2004-07-23 08:55 | yunyun

# re: 释放资源:讨论Dispose和析构函数的使用  回复   

我的理解是:不会释放调。我对using释放资源的推测:当你使用using的时候,如果在括号内初始化变量,系统会把这个变量注册到某个地方。当{}里的内容运行完后,系统自动释放已注册的变量。如果变量不是在using中申明的,也就没有注册到系统中,自然不会释放。当然,这是我的推测,没有验证过。你自己可以验证。
2004-07-23 11:58 | Sandy

# re: 释放资源:讨论Dispose和析构函数的使用  回复   

using中的申明的对象确实不可能被释放,譬如:
using(DataSet ds = new DataSet()){
Session["dataSet"] = ds;
}
Session仍然存在但是用try{}catch{}却可以捕获一个线程终止的异常,但是却没有黄页出现
2004-07-23 14:30 | yunyun

# re: 释放资源:讨论Dispose和析构函数的使用  回复   

using中的申明的对象确实可以释放,可以参考示例。

using System;

namespace ConsoleApplication7
{
    
/// <summary>
    
/// test 的摘要说明。
    
/// </summary>

    public class Test:IDisposable
    
{
        
public Test(string name)
        
{
            
this.name = name;
        }


        
private string name;

        
public string Name
        
{
            
get{return name;}
            
set{name = value;}
        }


        
public static void Main()
        
{
            Console.WriteLine(
"Programme Start!");

            Test test1 
= new Test("1");
            
using(test1)
            
{
            }

            
using(Test test2 = new Test("2"), test3 = new Test("3")) 
            
{
                Test test4 
= new Test("4");
            }


            Console.WriteLine(
"Programme Over!");
            Console.ReadLine();
        }


        
IDisposable 成员
    }


}

证明这个方法是可行的
2004-07-23 15:55 | Sandy

# re: 释放资源:讨论Dispose和析构函数的使用  回复   

至于你的问题,查阅msdn得知,DataSet的Dispose方法从 MarshalByValueComponent 继承,释放由 MarshalByValueComponent 使用的资源。也就是说,DataSet的Dispose方法并没有销毁本身,当然你的Session是存在的。
2004-07-23 16:06 | Sandy

# re: 释放资源:讨论Dispose和析构函数的使用  回复   

有一点要明白,我所说的释放资源指的是释放非托管资源,至于托管资源,由GC帮你回收。而非托管资源的回收,依靠Dispose的显示调用或者析构函数。我个人喜欢用Dispose的方法。对于你的问题,可以自己做个小测试。自己写一个类继承DataSet,然后重写Dispose方法。
public override void Dispose()
{
Console.WriteLine("正在释放资源");
base.Dispose();
}
在控制台程序下测试一下!
2004-07-23 16:17 | Sandy