+ -
当前位置:首页 → 问答吧 → 关于对托管资源DataSet对象ds调用Dispose()的结论--新手

关于对托管资源DataSet对象ds调用Dispose()的结论--新手

时间:2011-12-07

来源:互联网

教材部分代码:
  定义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())是无实际意义的

作者: jianghai2008100   发布时间: 2011-12-07

.NET就是非托管的,dispose只是告知需要回收了,然后自动回收机制根据你的使用情况自动回收,

很有意义,就像你告诉他我不用该对象了,请给我内存,他主动解决你问题。
而不通过该方法,那么就会等到垃圾回收扫描到这个引用不存在了才回收,这个时间和资源效率上都不如上面的。

作者: Tsapi   发布时间: 2011-12-07

晕了

常见的一类非托管资源有:Container,Context,CursorFileStream,OdbcDataReader,OleDBDataReader, 
StreamWriter,DataTable.DataSet等

为什么有这种说法?

http://topic.csdn.net/t/20060815/17/4951582.html

关注中、、、mark一个睡觉去

作者: MKing0412   发布时间: 2011-12-07

热门下载

更多