繁体   English   中英

为什么Code Analysis会在此方法上触发CA2000?

[英]Why does Code Analysis fire CA2000 on this method?

Visual Studio代码分析在此方法的monitor变量上生成警告“丢失范围之前的对象”(CA2000)。

private void MonitorJob(IJob job, CancellationToken cancellationToken)
{
    var monitor = new JobMonitor(job, _backend);  // <- CA2000
    try
    {
        var task = monitor.Run(cancellationToken);
        _activeJobs[task] = monitor;
    }
    catch
    {
        monitor.Dispose();
        throw;
    }
}    

我理解CA2000的功能,我通常能够弄清楚为什么我的代码违反规则并进行适当的更改。

然而,在这种情况下,我很难过 - 这真的是假阳性,还是我错过了什么?

使用Visual Studio 2015 Enterprise Edition,以.NET 4.5为目标,使用C#6。

如果抛出异常,你可以泄漏这个一次性:

private void MonitorJob(IJob job, CancellationToken cancellationToken)
{
    var monitor = new JobMonitor(job, _backend);

    // <- Exception

    try
    {
        var task = monitor.Run(cancellationToken);
        _activeJobs[task] = monitor;
    }
    catch
    {
        monitor.Dispose();
        throw;
    }
}

这可能是由ThreadAbortException或运行时注入线程的任何其他异常引起的。 我建议在try块之外声明变量但是在其中分配它。 此外,将其成功分配给_activeJobs将其设置为null

private void MonitorJob(IJob job, CancellationToken cancellationToken)
{
    JobMonitor monitor;

    try
    {
        monitor = new JobMonitor(job, _backend);
        var task = monitor.Run(cancellationToken);
        _activeJobs[task] = monitor;
        monitor = null;
    }
    finally
    {
        if(monitor!=null)
        {
            monitor.Dispose();
        }
        throw;
    }
}

尽管如此,关闭警告可能还不够,此时我建议添加抑制警告。

我假设_activeJobs[task] = monitor; 是一个简单的赋值,不会抛出异常。 如果这样单独存储监视器与创建监视器。

private void MonitorJob(IJob job, CancellationToken cancellationToken)
{
    Task task;
    var monitor = CreateJobMonitor(job, _backend, out task);
    _activeJobs[task] = monitor;
} 

private JobMonitor CreateJobMonitor(IJob job, CancellationToken cancellationToken, out Task task)
{
    var monitor = new JobMonitor(job, _backend);
    try
    {
        task = monitor.Run(cancellationToken);
        return monitor;
    }
    catch
    {
        monitor.Dispose();
        throw;
    }

这样,CreateJobMonitor意味着返回有效对象或抛出异常。 没有机会返回已处置的对象引用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM