我有一个使用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。
我是否已正确确保我SqlConnection
被处置?在这种情况下,代码分析器是不正确的吗?
答案 0 :(得分:2)
看起来这是Code Cracker工作人员的慎重决定。通常,对象的整个寿命都是未知的,因此它们会引发CC0022诊断。请参阅其错误跟踪器上的this discussion。
显然,在这种情况下,您可以知道该对象的所有调用的生命周期,但可能正在实现,在代码分析器中只考虑了一个步骤......