这个IDisposable是从正确处理的函数返回的吗?

时间:2016-11-21 15:09:55

标签: c# .net idisposable

我有一个使用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被处置?在这种情况下,代码分析器是不正确的吗?

1 个答案:

答案 0 :(得分:2)

看起来这是Code Cracker工作人员的慎重决定。通常,对象的整个寿命都是未知的,因此它们会引发CC0022诊断。请参阅其错误跟踪器上的this discussion

显然,在这种情况下,您可以知道该对象的所有调用的生命周期,但可能正在实现,在代码分析器中只考虑了一个步骤......