教材部分代码:
  定义GetTable:
      /// <summary>
        /// 使用此方法可以得到数据集
        /// </summary>
        /// <param name="sql">SQL语句</param>
        /// <returns>方法返回数据集</returns>
        public DataSet GetTable(string sql)
        {
            SqlDataAdapter sda = new SqlDataAdapter(sql, conn);//创建数据适配器对象
            DataSet ds = new DataSet();//创建数据集
            sda.Fill(ds);//填充数据集
            ds.Dispose();//释放资源
            return ds;//返回数据集
        }
  调用GetTable:
         public partial class frmMain : Form
    {
        public frmMain()
        {
            InitializeComponent();
        }
        public string User;//声明用户名称字段
        public string Logintime;//声明登陆时间字段
        DBOperate operate = new DBOperate();//创建数据库操作对象
        private void frmMain_Load(object sender, EventArgs e)
        {
            toolStripStatusLabel2.Text = User;//显示用户名
            toolStripStatusLabel5.Text = Logintime;//显示登陆时间
            toolStripMenuItem1.Text = DateTime.Now.ToLongTimeString();//显示系统时间
            string sql = "select * from tb_User where UserName='"+User+"'";//设置数据库查询字符串
            DataSet ds = operate.GetTable(sql);//得到数据集
            string power = ds.Tables[0].Rows[0][3].ToString();//得到用户权限字符串
            if (power == "一般用户")//判断用户权限
            {
                系统管理ToolStripMenuItem.Enabled = false;//停用系统管理菜单
                操作员管理ToolStripMenuItem.Enabled = false;//停用操作员管理菜单
            }
        }
     ......
     }
在主窗体代码中调用GetTable,结果显示能得到具体的数据集,说明运行方法GetTable时,ds.Dispose()语句并没有
立马释放资源,没有对ds做任何处理,而是将此任务交给GC。对于Dispose(),教材上所谓的“释放资源”,实际上只
针对非托管资源,会立马释放资源。而对托管资源调用Dispose(),实际上是无效的,最后还得由GC全权处理!
个人觉得,上述代码(ds.Dispose())是无实际意义的

解决方案 »

  1.   

    .NET就是非托管的,dispose只是告知需要回收了,然后自动回收机制根据你的使用情况自动回收,很有意义,就像你告诉他我不用该对象了,请给我内存,他主动解决你问题。
    而不通过该方法,那么就会等到垃圾回收扫描到这个引用不存在了才回收,这个时间和资源效率上都不如上面的。
      

  2.   

    晕了常见的一类非托管资源有:Container,Context,CursorFileStream,OdbcDataReader,OleDBDataReader, 
    StreamWriter,DataTable.DataSet等为什么有这种说法?http://topic.csdn.net/t/20060815/17/4951582.html关注中、、、一个睡觉去