有两种不同的情况:
1. 对象通过构造函数参数或属性获得一个对象引用,并且该对象实现了IDisposable接口。
2. 对象构造了一个实现了IDisposable接口的对象实例。
在第二种情况下,您的对象负责涉及的资源,所以您的对象必须实现IDisposable接口,在处理完后应该释放您构造的对象。
您的DbConnection属于第二种情况,因此是的,您的对象应该实现IDisposable接口,并释放连接。
在第一种情况下,您需要决定以下三个解决方案:
1. 您的对象只引用外部对象。您的对象不应该释放这个外部对象。对于这种情况,您不需要为此特定对象实现IDisposable接口(如果您还在内部构造可释放对象,则回到上述第二种情况)。
2. 您的对象负责外部对象。在这种情况下,即使您的对象没有构造此外部对象,您也会回到第二种情况。在这里,您实现IDisposable接口,并释放给您的对象。
3. 您需要实现一种方式,让外界告诉您选择哪种解决方案。例如,构造函数可能会提供连接和布尔参数(或理想情况下是枚举值),告诉构造函数是否拥有提供的连接。在这里,您还需要实现IDisposable接口,但在Dispose方法中,您需要检查所有权,并仅在拥有连接时才释放提供的连接。
总之:
1. 您拥有的对象需要释放。
2. 您不拥有的对象不需要释放。
还有第三种情况,听起来似乎您没有遇到过,但是无论如何。
在单个方法内局部构造、使用和丢弃对象,而不传递或将其存储在类字段中时,您需要使用using语句,如下所示:
using (IDbConnection conn = ....())
{
}