簡體   English   中英

無法擺脫CA2202警告

[英]Cannot get rid of CA2202 warning

我已閱讀以下內容的MSDN頁面: https : //msdn.microsoft.com/en-us/library/ms182334.aspx

還有這個答案: https : //stackoverflow.com/a/32554589/2257227

但是以下代碼仍然為我生成2條CA2202警告:

FileStream fileStream = null;
BufferedStream bufferedStream = null;
try
{
    fileStream = File.Open(...);
    bufferedStream = new BufferedStream(fileStream);

    using (StreamReader streamReader = new StreamReader(bufferedStream))
    {
        ...
    }
}
finally
{
    if (bufferedStream != null)
    {
        bufferedStream.Dispose();
    }

    if (fileStream != null)
    {
        fileStream.Dispose();
    }
}

“ bufferedStream.Dispose()”行仍然給出以下兩個警告:

嚴重性代碼說明項目文件行抑制狀態警告CA2202在方法'Loader.UpdateIndex()'中可以多次處理對象'bufferedStream'。 為了避免生成System.ObjectDisposedException,您不應在對象上調用Dispose多次。:行:930 Loader C:\\ Users \\ user \\ Loader \\ Loader.cs 930有效

嚴重性代碼說明項目文件行抑制狀態警告CA2202在方法'Loader.UpdateIndex()'中可以多次處理對象'fileStream'。 為了避免生成System.ObjectDisposedException,您不應在對象上調用Dispose多次。:行:930,935 Loader C:\\ Users \\ user \\ Loader \\ Loader.cs 930有效

大概是因為fileStream可以被處置多次? 但是如何將bufferedStream處理一次以上呢?

編輯:我已將@Damien_The_Unbeliever的答案標記為正確。 實際上,您也可以縮小它,因為正如下面提到的那樣,您不需要bufferedReader變量。 這就是我最后得到的。 有點丑陋,但是可以用:

FileStream fileStream = null;
try
{
    fileStream = File.Open("iaushdiuh", FileMode.Open);

    fileStream = null;

    using (StreamReader streamReader = new StreamReader(fileStream))
    {
        streamReader.ReadLine();
    }
}
finally
{
    if (fileStream != null)
    {
        fileStream.Dispose();
    }
}

如果您已將這些對象的“所有權”傳遞給其他對象后不使用基礎流,則可以像這樣靜默警告:

        FileStream fileStream = null;
        BufferedStream bufferedStream = null;
        try
        {
            fileStream = File.Open(...);
            bufferedStream = new BufferedStream(fileStream);

            fileStream = null;

            using (StreamReader streamReader = new StreamReader(bufferedStream))
            {

                bufferedStream = null;

                ...
            }
        }
        finally
        {
            if (bufferedStream != null)
            {
                bufferedStream.Dispose();
            }

            if (fileStream != null)
            {
                fileStream.Dispose();
            }
        }

您將希望分配為null在構造函數調用“立即擁有”一次性對象之后立即發生。 這樣,您可以確保如果構造函數throw ,則可以處置內部對象,並且如果構造函數成功,則它將安排發生處置。

暫無
暫無

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

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