this.hide(),this.close(),this.dispose(),以及this.Hide()与this.Visible、Application.Exit与this.Close()区别

首先,假设你所说的 this 是指一个 WinForm 窗体。

this.Hide()隐藏窗体后还可用 this.Show()重新显示其。而且 Hide 一旦执行不能被中止。

this.Close() 若关闭成功,则 this 也就变为垃圾内存,等待垃圾内存自动回收器(GC)回收。但 Close 操作是可以被终止的,通过 Closing 事件检查是否真的可以退出,如果不行,请设置 CanceEventArgs 的 e.Cancel = true;后即可中止 Close 操作,这样你的 WinForm 依然保持。

(注意对于 WinForm 是如此,但对于像 FileStream 这样的类,Close 就是实现 Dispose 功效的方法哦,是风马牛不相及的一回事)。^Q^

this.Dispose() 用来(提前)释放非托管资源,注意,仅是非托管资源。调用此操作时,你必须确保 Dispose 方法中释放的非托管资源确实不再有用了,以后的代码执行不会再访问已被释放的非托管资源,否则将引发异常(ObjectDisposedException)。

!!!(以下讨论,不限于 WinForms)

为什么,.NET 要提供此 Dispose 操作呢?这与 GC 的垃圾内存回收算法有关。

譬如说,在一个数据访问的方法中,建立一个到数据库的连接 connection1 以访问数据,此时.NET 就使用了一个非托管资源,访问结束后,在退出数据访问方法前,你可以不调用 connection1.Close() 方法。等到内存堆的第 0 代内存满了后,GC 回收 connection1 的内存时,会自动释放绑定的非托管资源。

然而,离开数据访问方法到第 0 代内存堆满时,这期间的时间是不可预计的。而如果 connection1 已位于第 1 代或第 2 代的内存堆上时,而且运行机器上的内存相当富裕,被回收的时间可能就是“遥遥无期”了。因为第 1 代的回收周期远远大于第 0 代的回收周期,第 2 代的回收周期又远远大于第 1 代的回收周期。^Q^

如果每次非托管资源都要等到 GC 回收时才释放,那么应用程序长时间的占用着非托管资源,会严重影响性能的。本例中,数据库连接就是一个好例子,如果数据库服务器限制最大连接数为 10, 在一个数据访问的高峰期,如果在离开数据访问方法不及时调用 connetion1.Close(),那么性能就会差得很离谱了。

接口 IDispozable 的 Dispose 方法就是用来让程序员显式地控制非托管资源的释放操作。

对于 FCL 类,有的只提供了 Dispose 方法,有的只提供 Close 方法,有的两者都提供。要仔细阅读文档加以区别,有时是一回事,有时却不是一回事。这种类通常会占用非托管资源,而且都实现 IDispozable 接口。

举以下二个例子分析:
<1>
譬如,FileStream 并没有显式提供 Dispose 方法,而只提供了 Close 方法,此 Close 方法实现了通常意义上的 Dispose 功能。
然而,FileStream (显式)实现了 IDisposable 接口,能够通过 ((IDisposable)fileStream).Dispose() 来达到与 fileStream.Close() 相同的功效。只是不能fileStream.Dispose() 罢了。

<2>
譬如,SQLConnection 同时提供了 Dispose 和 Close 方法,它们都可用来释放非托管资源,但两者功效并不完全相同。Dispose 仅仅释放非托管的数据库连接资源。

而 Close 方法可以回滚任何挂起的事务,然后,它将连接释放到连接池,或者在连接池被禁用的情况下释放非托管的 DB 连接资源。所以,微软一般建议程序员尽量使用 SQLConnection 的 Close 方法。



首先明确this.Hide()和this.Visible作用完全一样,都是隐藏当前窗体,使其不可见;Application.Exit与this.Close()虽然都有关闭当前应用的作用,但作用不同。

(1)this.Hide()与this.Visible

对于.net平台窗体开发,当由代码 Form f=new Form();f.show()创建窗体时,需要隐藏当前窗体,我们第一想到的就是this.Close();然而这样是关闭当前进程,相当于Application.Exit();正确的处理方法是f.Hide()或f.Visible=false;前者的作用和后者没任何差别,只是hide函数通过函数体修改Visible属性而已。

public void Hide()

{

this.Visible=false;

}

(2)Application.Exit与this.Close()

Application.Exit   方法:通知所有消息泵必须终止,并且在处理了消息以后关闭所有应用程序窗口。 

Form.Close   方法:关闭窗体。

如果该窗体是应用程序的主启动窗体,则調用窗体的Close()方法,跟調用Application.Exit的效果差不多。

如果该窗体非主启动窗体,则只是关闭该窗体而不关闭整个应用程序。 

同时要注意它们在多线程应用程序中的用法,注意线程的关闭工作,此处不详细展开。


  • 7
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值