object=null 和 object.Dispose()有什么区别,它们释放了内存了吗??

bin_bin 2003-06-09 03:59:47
object=null 和 object.Dispose()有什么区别?

以下是System.Web.UI.Control.Dispose()的代码

public virtual void Dispose() {
IContainer local0;
EventHandler local1;

local0 = null;
if (this._site != null) {
local0 = (IContainer) this._site.GetService(typeof(IContainer));
if (local0 != null) {
local0.Remove(this);
local1 = this.Events.get_Item(Control.EventDisposed) as EventHandler;
if (local1 != null)
local1.Invoke(this, EventArgs.Empty);
}
}
}

没有完全看懂,大概是将自己置为null,还有自己的事件置为null,是吗?

这样做和直接将对象置为null有什么区别??
这样做能直接释放内存吗,还是和Java一样只是标记为没用的单元,等待GC处理呢??
...全文
281 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bin_bin 2003-06-10
  • 打赏
  • 举报
回复
谢谢^_^
qimini 2003-06-10
  • 打赏
  • 举报
回复
you got it.

---------------------------------------From MSDN

垃圾回收 GC 类提供 GC.Collect 方法,您可以使用该方法让应用程序在一定程度上直接控制垃圾回收器。通常情况下,您应该避免调用任何回收方法,让垃圾回收器独立运行。在大多数情况下,垃圾回收器在确定执行回收的最佳时机方面更有优势。但是,在某些不常发生的情况下,强制回收可以提高应用程序的性能。当应用程序代码中某个确定的点上使用的内存量大量减少时,在这种情况下使用 GC.Collect 方法可能比较合适。例如,应用程序可能使用引用大量非托管资源的文档。当您的应用程序关闭该文档时,您完全知道已经不再需要文档曾使用的资源了。出于性能的原因,一次全部释放这些资源很有意义。有关更多信息,请参阅 GC.Collect 方法。

在垃圾回收器执行回收之前,它会挂起当前正在执行的所有线程。如果不必要地多次调用 GC.Collect,这可能会造成性能问题。您还应该注意不要将调用 GC.Collect 的代码放置在程序中用户可以经常调用的点上。这可能会削弱垃圾回收器中优化引擎的作用,而垃圾回收器可以确定运行垃圾回收的最佳时间。

bin_bin 2003-06-10
  • 打赏
  • 举报
回复
很感谢qimini(循序渐进) 回答我那么多次

我现在的理解如下,不知对不对:

GC管理所有的资源释放,包括托管的和非托管的,但是只有非托管的才可以手动释放,对于已经没有用的资源将其置为null,交由GC释放资源
qimini 2003-06-10
  • 打赏
  • 举报
回复
.NET 框架具有两个主要组件:公共语言运行库和 .NET 框架类库。公共语言运行库是 .NET 框架的基础。您可以将运行库看作一个在执行时管理代码的代理,它提供核心服务(如内存管理、线程管理和远程处理),而且还强制实施严格的类型安全以及可确保安全性和可靠性的其他形式的代码准确性。事实上,代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。.NET 框架的另一个主要组件是类库,它是一个综合性的面向对象的可重用类型集合,您可以使用它开发包含从传统的命令行或图形用户界面 (GUI) 应用程序到基于 ASP.NET 所提供的最新创新的应用程序(如 Web 窗体和 XML Web services)在内的应用程序。

----------------------------------------------------------以上文档摘自MSDN

不过还是建议你先从基础入手,基础打得牢一点学起来会更得心应手的。
qimini 2003-06-10
  • 打赏
  • 举报
回复
你去找一本《C#入门经典》--WROX的,看看先
bin_bin 2003-06-10
  • 打赏
  • 举报
回复
什么叫做托管,什么又是托管自愿呢,那些又是非托管的呢??

能不能帮我解释一下?
lostinetdotcom 2003-06-09
  • 打赏
  • 举报
回复
dotnet下无法手动释放托管资源的。

应该显式地释放非托管资源(链)。
例如SqlConnection,FileStream,NetworkStream..
qimini 2003-06-09
  • 打赏
  • 举报
回复
.Net下是GC管理内存的,无需拥护干涉。MSDN的帮助:

ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconprogrammingessentialsforgarbagecollection.htm
bin_bin 2003-06-09
  • 打赏
  • 举报
回复
为什么不要手动释放资源那?除了它要消耗资源以外还有没有其它的原因??
qimini 2003-06-09
  • 打赏
  • 举报
回复
通常情况下,不要试图手动去释放资源,除非你用到了非托管的组件。
bin_bin 2003-06-09
  • 打赏
  • 举报
回复
那这两个方法到底用那个好呢,看过批评GC——蔡学墉先生的《垃圾》,好像GC在CPU繁忙的时候并不能达到收集垃圾的细想效果,但是Dispose又耗费资源,这个到底用那个那??

还有local0 = (IContainer) this._site.GetService(typeof(IContainer));
到底是什么意思那,没看懂阿。

这个IContainer接口在这里有什么用那?
qimini 2003-06-09
  • 打赏
  • 举报
回复
将对象设置为null时GC并不立即释放对象所占用的所有内存(内存中还保留对次对象的引用所占用的内存),而用Dispose 方法会调用GC将对象所占用的内存立刻释放掉(Dispose的动作本身也相当耗费资源)。所以你调用Dispose时,你的程序可能会出现明显的迟缓现象
xhan2000 2003-06-09
  • 打赏
  • 举报
回复
object.Dispose()释放资源
f2k 2003-06-09
  • 打赏
  • 举报
回复
我也想知道。
Posted on 2009-02-19 00:27 Frank Xu Lei 阅读(3070) 评论(41)  编辑 收藏 网摘 所属分类: .NET深入学习笔记

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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