如何处置对象

时间:2015-12-28 06:47:03

标签: c# winforms dispose idisposable

如何处置我的物体?我是这样做的。什么是错的? Obj.Dispose()功能似乎不正确。

class MainclassForm : Form, IDisposeable
{
    public void createanddispose()
    {
        A obj = new A();
        obj.dowork();
        obj.Dispose();//does not appear as a function
    }
}

3 个答案:

答案 0 :(得分:2)

您可以更好地使用using语句。像

这样的东西
using (MyIDisposableObject obj = new MyIDisposableObject())
{
    // object here
}

检查MSDN的一个很好的参考:Avoiding Problems with the Using Statement

  

C#“using”语句导致调用Dispose()。这是   与Close()相同,它可能在网络错误时抛出异常   发生。因为对Dispose()的调用是隐式发生的   关闭“使用”块的大括号,这个例外来源是   人们写代码和阅读代码时可能会被忽视   码。这代表了应用程序错误的潜在来源。

答案 1 :(得分:1)

要在对象上调用Dispose(),您的类必须从IDisposeable接口继承并具有它的实现:

class A : IDisposable
{
   public void Dispose()
   { 
      GC.Collect();           
   }
}

答案 2 :(得分:0)

这里有一些问题,但我认为根源是你可能会IDisposable混淆Garbage Collector

IDisposable是一个接口,在您的示例中,类型A可以实现。在这种情况下,您可以确定A的任何实例都有您正在寻找的方法Dispose()。这对于需要关闭的Stream s这样的东西非常有用,但对于没有未完成资源的ComplexNumber类型(仅作为示例)它没有用。

在这些情况下,您的托管 C#代码将处理需要发生的所有“处置”。它将摆脱对象正在使用的内存。该功能免费提供(有点),您不需要(或想要)做任何事情来显式调用它。这是托管(C#,Java等)和非托管(C ++)代码之间的主要区别。

基本上,如果一个对象使用的不仅仅是内存(就像打开的文件一样),IDisposable将非常有用。如果它只是内存(例如FormDateTime,或大多数其他内容),则无需使用它。

对于您的特定代码,您已将IDisposable应用于包含您的功能的类型。就像你无法调用this.AddMinutes(1)来获取DateTime的方法一样,你无法得到这个方法。

如果您确实需要实施IDisposable的附加功能,则必须在A上执行此操作。将IDisposable与任何其他接口一样应用于MainclassForm将告诉编译器您在该类上有一个Dispose()方法,这只是因为Windows窗体对象有一个。如果没有,这将引发编译器错误,您必须添加一个。