关于对托管资源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())是无实际意义的
定义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一个睡觉去
常见的一类非托管资源有:Container,Context,CursorFileStream,OdbcDataReader,OleDBDataReader,
StreamWriter,DataTable.DataSet等
为什么有这种说法?
http://topic.csdn.net/t/20060815/17/4951582.html
关注中、、、mark一个睡觉去
作者: MKing0412 发布时间: 2011-12-07
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28