这个 IDisposable 是否从被正确处理的函数中返回?
Is this IDisposable returned from a function being disposed of properly?
我有一个 class,它使用 SqlConnection
执行数据访问,众所周知,它实现了 IDisposable,应该在 finally 块中或通过 using 语句处理.我在使用块中有它们,但我的 IDisposable
实际上是在一个单独的函数中创建的。像这样:
public class DataRepository
{
private readonly SqlConfiguration _configuration;
public DataRepository(SqlConfiguration configuration)
{
_configuration = configuration;
}
public void Save(Model someModel)
{
using(var connection = CreateSqlConnection())
{
// Use connection here
}
}
public Model Get(int id)
{
using(var connection = CreateSqlConnection())
{
// Use connection here
}
}
private SqlConnection CreateSqlConnection()
=> new SqlConnection(_configuration.ConnectionString);
}
如您所见,我已经使用语句处理我所有的 SqlConnection
。在 using 语句之外没有地方调用 CreateSqlConnection
。但是,我正在使用 Code Cracker Roslyn Analyzers,它在我的 CreateSqlConnection
中给我一个 CC0022 警告:
SqlConnection should be disposed.
我是否已妥善确保我的 SqlConnection
得到处理?在这种情况下,代码分析器是否不正确?
看起来这是 Code Cracker 工作人员深思熟虑的决定。通常无法知道对象的整个生命周期,因此他们提出了 CC0022 诊断。在他们的错误跟踪器上查看 this discussion。
很明显,在这种情况下,您可以知道该对象的所有调用的生命周期,但它可能在代码分析器中实现它被认为只是一步太多了.. .
我有一个 class,它使用 SqlConnection
执行数据访问,众所周知,它实现了 IDisposable,应该在 finally 块中或通过 using 语句处理.我在使用块中有它们,但我的 IDisposable
实际上是在一个单独的函数中创建的。像这样:
public class DataRepository
{
private readonly SqlConfiguration _configuration;
public DataRepository(SqlConfiguration configuration)
{
_configuration = configuration;
}
public void Save(Model someModel)
{
using(var connection = CreateSqlConnection())
{
// Use connection here
}
}
public Model Get(int id)
{
using(var connection = CreateSqlConnection())
{
// Use connection here
}
}
private SqlConnection CreateSqlConnection()
=> new SqlConnection(_configuration.ConnectionString);
}
如您所见,我已经使用语句处理我所有的 SqlConnection
。在 using 语句之外没有地方调用 CreateSqlConnection
。但是,我正在使用 Code Cracker Roslyn Analyzers,它在我的 CreateSqlConnection
中给我一个 CC0022 警告:
SqlConnection should be disposed.
我是否已妥善确保我的 SqlConnection
得到处理?在这种情况下,代码分析器是否不正确?
看起来这是 Code Cracker 工作人员深思熟虑的决定。通常无法知道对象的整个生命周期,因此他们提出了 CC0022 诊断。在他们的错误跟踪器上查看 this discussion。
很明显,在这种情况下,您可以知道该对象的所有调用的生命周期,但它可能在代码分析器中实现它被认为只是一步太多了.. .