我的代码中有许多地方(数百个),在这些地方我创建了这个对象的实例,并在同一行调用新实例上的方法。我只需要实例来调用单个方法。
以下是一个示例:
// MyObject, a class that needs to be disposed of.
public class MyObject : IDisposable
{
private AnObjectThatMustBeDisposed localObject;
public MyObject()
{
localObject = SomeLibrary.SomeProject.AnObjectThatMustBeDisposed.Create();
}
public void doOperationOne()
{
localObject.DoSomething(1);
}
public string getOperationTwo()
{
return localObject.DoSomething(2);
}
public string getOperationThree()
{
return localObject.DoSomething(3);
}
public bool getOperationFour(string input)
{
return localObject.DoSomethingSpecial(4,input.ToLower());
}
...
public void getOperationOneHundred(DateTime input)
{
localObject.DoSomethingElse(100,input);
}
public void Dispose()
{
localObject.CloseResources();
localObject.FreeUpMemory();
localObject.Close();
localObject.Dispose();
}
}
// A class that makes use of MyObject
public class MyLibraryThatUsesMyObject
{
public void Method1()
{
new MyObject().doOperationOne();
}
public string Method2()
{
return new MyObject().getOperationTwo();
}
public int Method3()
{
return new MyObject().getOperationThree();
}
public bool Method4(string testString)
{
if (testString.Length > 6)
{
if (new MyObject().getOperationFour(testString)) return true;
else return false;
}
else return false;
}
...
public void Method100()
{
new MyObject().doOperationOneHundred(DateTime.Now);
}
}
我的问题是:当.NET对象超出其作用域时,是否会自动
Dispose()
?还是我必须手动进行操作...public void Method1()
{
using (MyObject o = new MyObject())
{
o.DoOperationOne();
}
}
如果我只有两个或三个方法,那么这个重构并不困难。但如果我有很多方法,这个重构可能需要很长时间。
我不确定ASP.NET在处理请求完成后如何处理 - 即框架是否会给代码时间Dispose()
一些东西,还是一旦调用return
,就立即“切断”执行,不让它释放资源?
事实上,在没有自己实现IDisposable
的情况下,由于未释放资源导致泄漏,MyObject
类内部的东西无法正常工作,这表明.NET并没有自动Dispose
东西。因此,如果是这种情况,我能做些什么来避免必须重构数百个方法吗?
编辑:我尝试了简单地实现IDisposable
,但我的单元测试仍然能够产生资源泄漏。因此,我的怀疑是.NET不会自动释放,现在我的问题变成了 - 如何强制释放而不必重构数百个方法?
Dispose
是用于释放非托管资源的,而不是托管资源。这就是为什么你必须手动调用它的原因。 - Kirill PolishchukIDisposable
接口的每个类都是托管对象,仍然需要被释放。也许它内部使用了非托管代码,但这取决于类本身。 - CodingYoshiStreamReader
或SqlConnection
(托管资源),我就不需要实现IDisposable
吗?显然这是不正确的。如果我将它们作为我的类的字段,那该怎么办?不确定他们为什么会这样说... - CodingYoshiIDisposable
单独使用没有用处,你还应该使用using(...)
语句。 - slugster