簡體   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