簡體   English   中英

為什么我不能擺脫CA2000警告?

[英]Why can't I get rid of a CA2000 warning?

我正在編寫一種重置日志記錄系統的方法。 我需要獲取CsvFileLogWriter(自定義類)的實例,並將其傳遞給reset方法。 CsvFileLogWriter是一次性的,因此我得到一個CA2000警告,告訴我:

Warning 2   CA2000 : Microsoft.Reliability : In method 'Logger.InitializeCsvLogger
(string)', call System.IDisposable.Dispose on object 'tempWriter'
 before all references to it are out of scope.

我遵循了與CA2000有關的說明,最終得到了以下方法。 但是,我仍然收到CA2000警告。

public static void InitializeCsvLogger(string path)
{
    ILogWriter tempWriter = null;

    try
    {
        tempWriter = new CsvFileLogWriter(path);
        ResetWriter(tempWriter);
        tempWriter = null;
    }
    finally
    {
        if (tempWriter != null)
            tempWriter.Dispose();
    }
}

有人可以發現我的錯誤嗎?

編輯

我不希望處置被tempWriter引用的writer-這不是臨時對象,而只是臨時引用。 我只會在try塊內發生故障時進行處理(因此tempWriter永遠不會設置為null,並且finally塊中的if語句會清除資源。)我不希望tempWriter進行處理,除非發生此故障-由ResetWriter(tempWriter)在屬性中設置對象后,對象本身必須繼續使用。 這是按照CA2000規則進行的-請參見http://msdn.microsoft.com/zh-cn/library/ms182289.aspx?queryresult=true

為了清楚起見,這里是ResetWriter做什么- Writer是一個靜態屬性。 該方法處理舊的作家並設置新的作家。

private static void ResetWriter(ILogWriter newWriter)
{
    if (Writer != null)
        Writer.Dispose();
    Writer = newWriter;
}

編輯

我認為正如SLaks所說的那樣,這是錯誤的肯定。 如果我將ResetWriter的內容替換為對ResetWriter的調用(本質上是對提取方法的重構進行了逆向操作),則CA2000將消失。

換句話說,以下內容不會給出CA2000警告:

public static void InitializeCsvLogger(string path)
{
    ILogWriter tempWriter = null;

    try
    {
        tempWriter = new CsvFileLogWriter(path);
        if (Writer != null)
            Writer.Dispose();
        Writer = tempWriter;
        tempWriter = null;
    }
    finally
    {
        if (tempWriter != null)
            tempWriter.Dispose();
    }
}

當您為tempWriter分配null時:

tempWriter = null;

tempWriter不再引用您創建的對象。 因此,您無法處置該對象。

在這種情況下,您實際上應該使用using塊:

using(var tempWriter = new CsvFileLogWriter(path))
{
    ResetWriter(tempWriter);
}

這樣,您不必擔心調用Dispose(或將引用設置為null)。

通過寫 tempWriter = null可以防止它被處置,因為 finally塊僅在此之后運行。

\n

您應該改為使用 using語句。

這個答案是正確的,但與您的實際意圖相矛盾

此警告是誤報。

代碼分析引擎沒有意識到ResetWriter需要ResetWriter保持活動,因此它希望您在所有情況下都將其處置。

您應該禁止顯示警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM