如何处置我的物体?我是这样做的。什么是错的? Obj.Dispose()
功能似乎不正确。
class MainclassForm : Form, IDisposeable
{
public void createanddispose()
{
A obj = new A();
obj.dowork();
obj.Dispose();//does not appear as a function
}
}
答案 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
将非常有用。如果它只是内存(例如Form
或DateTime
,或大多数其他内容),则无需使用它。
对于您的特定代码,您已将IDisposable
应用于包含您的功能的类型。就像你无法调用this.AddMinutes(1)
来获取DateTime
的方法一样,你无法得到这个方法。
如果您确实需要实施IDisposable
的附加功能,则必须在A
上执行此操作。将IDisposable
与任何其他接口一样应用于MainclassForm
将告诉编译器您在该类上有一个Dispose()
方法,这只是因为Windows窗体对象有一个。如果没有,这将引发编译器错误,您必须添加一个。