问题 释放不受管的资源

已加入
2019年9月24日
留言内容
5
编程经验
10+
在C#中,释放对象的析构函数中的非托管资源是一种好习惯吗?这样,垃圾收集器将做到这一点,并且对象具有一致的状态?如果需要为非托管资源提供单独的包含对象,可以吗?我不确定您为什么一定要使用IDisposable .....您觉得如何?
非常感谢和问候,TaherHassan
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,612
地点
弗吉尼亚州切萨皮克
编程经验
10+
与C ++不同,对C ++的调用"destructor" of C# object is not deterministic. It will only get called when the managed object finally gets garbage collected. The time of garbage collection is not deterministic. The IDisposable pattern gives you an opportunity to have deterministic clean up of an object. For managed objects and resources it doesn't matter, but for unmanaged resources, chance are that you'll want to guarantee that they are released and cleaned up.
 
已加入
2019年9月24日
留言内容
5
编程经验
10+
为此非常感谢。抱歉,只是为了澄清一下,我的意思是用代码覆盖对象的析构函数以释放非托管资源。然后,您可以致电GC.Collect,如果需要确定性清理,我想释放非托管资源。
 

跳伞者

工作人员
已加入
2019年4月6日
留言内容
2,612
地点
弗吉尼亚州切萨皮克
编程经验
10+
Calling 收集() directly is 灰心:
The 收集 方法被调用。在几乎所有情况下,您不必调用此方法,因为垃圾收集器会连续运行。此方法主要用于独特的情况和测试。

还要注意,这不是C#语言及其周围生态系统的设计方式。当然,您可以将螺丝刀用作凿子,有时可能会起作用,但这并不是螺丝刀真正设计的目的。
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,567
地点
悉尼,澳大利亚
编程经验
10+
If you implement the IDisposable interface in your class then the IDE should insert boilerplate code for you that indicates exactly what you should do and where. You then simply need to call the Dispose method of your type when you are finished with an instance, or create it with a using statement in the first place. That's how it's supposed to work and that's what you should do. Generally speaking, you would only need to call 收集 directly under very rare circumstances, e.g. you are replacing a large number of Image objects with new ones.
 
已加入
2019年9月24日
留言内容
5
编程经验
10+
为此非常感谢。您是对的-垃圾收集器连续运行。因此,只要您通过将其设置为null并覆盖析构函数来确保没有对该对象的引用,就可以确保我认为可以确定性地收集非托管资源。干杯,塔赫尔
 
最佳 底部