2016-07-27 93 views
-3

方法我在C#处置相关的一些疑虑和终结对此我下面提的确切条件: - 从非托管资源什么是我们必须调用dispose托管代码

1.Apart,什么是确切的需要使用配置方法。如果有垃圾收集器释放内存,我们为什么使用配置来释放托管代码的内存。

2.此外,为什么不推荐finalizer.Microsoft会有一些原因来开发终结器功能。在我访问过的大多数网站中,建议不建议使用终结器。是什么原因。

3.有时,我们只使用object.dispose来释放,而有时我们使用idisposable接口。为什么?

4.我们必须调用dispose方法的确切条件是什么?

+0

可能有关闭这个问题的可能性,我仍试图编辑以便于理解人们想要问什么 –

+3

感觉很宽泛。你为什么不问四个不同的问题(第一个和第二个问题已经被问到99%)?最后2个问题不清楚(考虑添加一些伪代码/实际代码来展示你的意思)。 – Sinatr

+0

由非托管代码分配的内存不由GC发布。终结者应该由非托管资源的类来实现,但客户应该立即调用Dispose,以便终结者不需要运行。没有'Object.Dispose'方法。 – Lee

回答

0

为了您#1:为你正确地对您的问题写了,主要的原因使用处置是免费资源从非托管资源(如文件句柄,数据库连接等),但有一个更在这种情况下,我们可以调用dispose来完成与托管资源相关的一些事情,这就是断开事件处理程序。关于这个here有一个很好的解释。在回答你的#2,不建议

终结,因为他们介绍的性能问题,正因为如此,你应该避免使用他们,如果你可以使用更好的解决方案。从“有效C#”由比尔·瓦格纳在这个fragment说:

终结是确保你的对象总是 有办法释放非托管资源

和防御机制,如果你继续阅读...

终结器是保证由给定类型的对象分配的非托管资源最终被释放的唯一方法。但是,终结器在非确定性时间执行,因此您的设计和编码实践应尽量减少创建终结器的需求,并且最大限度地减少执行确实存在的终结器的需求。

因此,终结器似乎是唯一可以确保非托管资源被释放的事情,所以也许这是您寻找的原因(我并不真正了解Microsoft的理由它,抱歉)。

回答您的问题#3我需要一个确切的代码示例来说明您的意思,但我会尝试猜测。我想你说的是接下来的两个不同的方案:

  • 调用myObject.Dispose()使用它,明确的方式之后。例如,我们可以创建一个实例,使用它,然后调用处置

    myObject = new MyObject() 
    
    // More code here... 
    
    myObject.Dispose(); 
    

    如果你是确保创建您的实例,并调用到之间处置方法有这将是确定在您的代码中也不例外,这可能会导致Dispose错过。使用

    try { 
        MyObject myObject = new MyObject() 
        (...) 
    
    } 
    catch (Exception) { 
        // manage exception 
    } 
    finally { 
        if (myObject != null) 
        myObject.Dispose(); 
    } 
    
  • 调用处置使用IDisposable的接口,通过:当然,你可以随时使用终于块。它基本上是相同的,与以前的finally块,但它会“自动”创建:

    using (MyObject myObject = new MyObject()) { 
        // your code here 
    } 
    

您可以检查docs here

并回答你的#4。我认为这是一个good answer,但不要忘记阅读评论。所以,总之,如果它有一个配置方法,它应该被调用。

+0

嗨,BitExodus,非常感谢你的宝贵答案。我们不能使用Dispose来显式释放托管资源的内存。我的意思是如果我想释放托管资源对象的内存,我不能使用dispose。 – Ram

+0

当对象的实例不再需要时,托管类使用的内存由垃圾收集器声明。在这种情况下调用“Dispose”方法将不起作用,因为它用于非托管资源。如果您需要释放托管实例的内存,最好的策略是让它超出范围或分配一个“空”值,以便垃圾收集器将声明该实例使用的内存。 – BitExodus

+0

嗨BitExodus,一些相关的帖子建议我们可以使用配置托管代码以及明确释放内存。 – Ram

相关问题