.net资源释放问题

iwalk 2009-09-25 09:07:47
.net winform应用。
form中定义的变量所占用的资源,在form dispose的同时会被自动释放吗?
如果不是,那么是否应该手工释放这些资源呢?在form的哪个事件里面处理比较合适?
...全文
437 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
caoliang 2009-09-27
  • 打赏
  • 举报
回复
ddddddddddddddddddddddd
V68V6 2009-09-26
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 findcaiyzh 的回复:]
变量占用的内容由GC收集。

但是如果你的类中使用了非托管的资源,还是需要手动释放的。
[/Quote]

说的很清楚了
托管代码的开发,你不用操心资源回收。.NETFramework会在它认为合适的时候帮你完成。
非托管代码的开发,你必须自己指定资源回收的方式和时机。
wuyq11 2009-09-26
  • 打赏
  • 举报
回复
托管代码是指用.net framework支持的语言写的代码
非托管代码 在公共语言运行库环境的外部,由操作系统直接执行的代码。非托管代码必须提供自己的垃圾回收、类型检查、安全支持等服务

GC的是.NET中对内存管理的一种功能。垃圾回收器跟踪并回收托管内存中分配的对象,定期执行垃圾回收以回收分配给没有有效引用的对象的内存。当使用可用内存不能满足内存请求时,GC会自动进行。
托管代码的堆上的垃圾内存可由GC自动回收,非托管代码中堆上的垃圾内存必须程序员自己负责释放、回收
在.NET的对象中实际上有两个用于释放资源的函数:Dispose和Finalize。Finalize的目的是用于释放非托管的资源,而Dispose是用于释放所有资源,包括托管的和非托管的。
http://topic.csdn.net/u/20090228/22/d8b98e1d-fe73-48f2-9e63-f86e0a4601ea.html

huming_h 2009-09-26
  • 打赏
  • 举报
回复
托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,它们包括:C#, J#, Microsoft Visual Basic .NET, Microsoft JScript .NET, 以及C++。所有的语言共享统一的类库集合,并能被编码成为中间语言(IL)。运行库编译器(runtime-aware ompiler)在托管执行环境下编译中间语言(IL)使之成为本地可执行的代码,并使用数组边界和索引检查,异常处理,垃圾回收等手段确保类型的安全。

在托管执行环境中使用托管代码及其编译,可以避免许多典型的导致安全黑洞和不稳定程序的编程错误。同样,许多不可靠的设计也自动的被增强了安全性,例如 类型安全检查,内存管理和释放无效对象。程序员可以花更多的精力关注程序的应用逻辑设计并可以减少代码的编写量。这就意味着更短的开发时间和更健壮的程序。

这个问题csdn以前也有这样的帖子,
http://topic.csdn.net/u/20090616/09/e2f7a05d-78e5-4af4-a8d9-f825b329ba56.html?45440
iwalk 2009-09-26
  • 打赏
  • 举报
回复
哪些是托管代码,哪些是非托管代码?
程序漫步 2009-09-26
  • 打赏
  • 举报
回复
是啊,,托管代码 一般都是 GC 帮 忙做 回收了
尹成 2009-09-25
  • 打赏
  • 举报
回复



当托管对象封装了非托管资源时,为保证垃圾回收器能回收非托管资源,必须重写Finalize方法,在Finalize方法中封装能够清理非托管资源的代码。有时希望消耗大量内存的非托管资源能够在垃圾回收周期到来之前被回收以提高应用程序的性能,这时就需要手动清理非托管资源。所幸的是,.NET框架类库(FCL)提供了实现手动清理非托管资源的基本框架,这就是Dispose模式。

IDisposable接口是实现Dispose模式的核心。IDisposable接口定义如下:

public interface IDisposable

{

void Dispose();

}

在Dispose模式中,所有封装非托管资源的对象都必须实现IDisposable接口,并在Dispose方法中实现非托管资源的清理操作。这样应用程序可以通过IDisposable接口直接调用Dispose方法来释放非托管资源占用的内存,而Finalize方法则成为在没有调用Dispose方法的情况下由垃圾回收器自动启动非托管资源清理的一种防护措施。为保证由应用程序直接调用Dispose方法进行的非托管资源清理操作与垃圾回收器自动启动的非托管资源清理操作过程是一致的,在Dispose模式中,通常在析构函数(也就是重写的Finalize方法)中调用Dispose方法。

使用Dispose模式需要遵循以下原则:

1. 如果基类实现了IDisposable接口,则在派生类的Dispose方法实现中必须调用基类的Dispose方法,以保证封装在基类对象中的非托管资源能够被清理;

2. 对象必须通过在包容层次结构中传播Dispose方法的调用以确保及时释放所有保持的非托管资源。例如,如果对象A分配对象B,则A的Dispose方法实现必须调用B的Dispose方法;

3. 必须确保对象的Dispose方法只被实质调用一次,而且不得引发异常,因为异常将阻断Dispose的调用链。如果对象的Dispose方法被调用多次,必须忽略第一次调用以后的所有调用,否则当非托管资源已释放后再次调用Dispose方法必然发生资源释放错误而不得不引发异常;

4. 由于调用Finalize方法将大大减损性能,所以如果应用程序已显式调用Dispose方法完成了资源清理工作,垃圾回收器就没必要调用对象的Finalize方法了。这时应该在Dispose方法中调用GC.SuppressFinalize方法,以阻止其Finalize方法被垃圾回收器调用,从而提高应用程序性能;

5. 如果资源使用特定的约定表示其已分配状态和已释放状态,例如流或数据库连接,则封装该类资源的对象通常还应提供分配资源的Open方法和释放资源的Close方法。在Close方法中调用Dispose方法;

6. 作为资源释放的最后一道防护措施,实现IDisposable接口的对象通常应重写Finalize方法。

yixianggao 2009-09-25
  • 打赏
  • 举报
回复
.NET 对于内存管理采取垃圾回收机制,不建议用户手动回收托管资源,带对于非托管资源应手动释放!

现在已不是 386 + C 的时代,内存单位已从 KB 到 GB 了,内存管理已经被底层框架托管,
应更多关注程序结构和类设计,除非是对性能要求很高的系统!
zhouyanfss 2009-09-25
  • 打赏
  • 举报
回复
这个有GC(垃圾回收器)来处理,这就是.NET与C的区别之一
GC会定时或当系统内存不够的时候回收资源,这些被回收的资源是通过系统内部的一个hash表无法访问到的资源
具体看GC的工作原理吧
宝_爸 2009-09-25
  • 打赏
  • 举报
回复
变量占用的内容由GC收集。

但是如果你的类中使用了非托管的资源,还是需要手动释放的。

17,740

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 .NET Framework
社区管理员
  • .NET Framework社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧