我正在编写一个ASP.NET Web API。作为其中的一部分,我有一个课程,我在测试过程中发现需要实施IDisposable
以确保管理资源的释放。C#在超出范围时自动“处置”IDisposable对象吗?
因此,我在我的班级实施了IDisposable
,并将必要的代码释放到Dispose()
方法中。
在我的代码中有很多地方(数百)我实例化这个对象,并在同一行中调用新实例的方法。我只需要该实例即可调用单一方法。
下面是一个例子:
// 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不会自动处理是正确的。所以现在我的问题变成了 - 我如何强制处置而不必重构数百种方法?
实际上'处置'如果为释放**非托管**资源,而不是**管理**。这就是为什么你必须手动调用它。 –
@ kirill不,这不是真的。每个实现'IDisposable'的类都是一个托管对象,并且仍然需要释放。也许它内部使用了非托管代码,但这是最重要的。 – CodingYoshi
@CodingYoshi - > https://msdn.microsoft.com/en-us/library/fs2xkftw(v=vs.110).aspx –