请考虑以下代码:
namespace DisposeTest
{
using System;
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Calling Test");
Test();
Console.WriteLine("Call to Test done");
}
static void Test()
{
DisposeImplementation di = new DisposeImplementation();
}
}
internal class DisposeImplementation : IDisposable
{
~DisposeImplementation()
{
Console.WriteLine("~ in DisposeImplementation instance called");
}
public void Dispose()
{
Console.WriteLine("Dispose in DisposeImplementation instance called");
}
}
}
Run Code Online (Sandbox Code Playgroud)
即使我在Test();
调用之后放置了一个等待循环,Dispose也永远不会被调用.所以这很糟糕.我想编写一个简单易用的类,以确保清理所有可能的资源.我不想把这个责任交给我班级的用户.
可能的解决方案:使用using
或调用自己处理(基本相同).我可以强制用户使用吗?或者我可以强制调用处理吗?
呼叫GC.Collect();
后Test();
也不起作用.
把di
以null
不调用任何处置.解构器可以工作,因此对象在退出时会被解构Test()
好的,现在很清楚!
谢谢大家的答案!我会在评论中添加警告!
我有一个方法,里面有一个try/catch/finaly
块.在try块中,我声明SqlDataReader
如下:
SqlDataReader aReader = null;
aReader = aCommand.ExecuteReader();
Run Code Online (Sandbox Code Playgroud)
在finally
块中,手动处理的对象是在类级别设置的对象.因此,在该方法的对象,其实现IDisposable
,如SqlDataReader
上述,他们得到自动处理的?Close()
在aReader
执行while循环后调用,以获取阅读器的内容(应该是Dispose()
调用的内容Close()
).如果没有调用Close()
,当方法完成或对象超出范围时,是否会自动关闭/处置此对象?
编辑:我知道这个using
声明,但有些情况令我感到困惑.
创建后我是否需要处理sqldatareader?
SqlDataReader reader;
---
---
---
reader.Close();
reader.Dispose();
Run Code Online (Sandbox Code Playgroud)