簡體   English   中英

WPF 代碼分析:CA2202 不要多次處置對象對象

[英]WPF code analyze : CA2202 Do not dispose objects multiple timesObject

在我的 WPF 應用程序代碼中,我收到以下警告:

CA2202 不要多次處置對象 可以在方法“MainWindow.TestResults_Click(object, RoutedEventArgs)”中多次處置對象“fs”。 為避免生成 System.ObjectDisposedException,您不應在一個對象上多次調用 Dispose。 :行:429 yesMonitor MainWindow.xaml.cs 429

對於代碼:

FileStream fs = new FileStream(System.AppDomain.CurrentDomain.BaseDirectory + "TestResult.htm", FileMode.Create);
using (fs)
{
    using (StreamWriter w = new StreamWriter(fs, Encoding.UTF8))
    {
        w.WriteLine(GetTestResultsHtml());
    }
}

這些警告的原因應該是什么?

嵌套 using 語句可能會導致違反 CA2202 警告。 如果嵌套內部 using 語句的 IDisposable 資源包含外部 using 語句的資源,則嵌套資源的 Dispose 方法釋放所包含的資源。 發生這種情況時,外部 using 語句的 Dispose 方法會嘗試再次釋放其資源。 在下面的示例中,在包含流對象的 StreamWriter 對象的 Dispose 方法中,在內部 using 語句的末尾釋放在外部 using 語句中創建的 Stream 對象。 在外部 using 語句結束時,流對象被第二次釋放。 第二個版本違反了 CA2202。

using (Stream stream = new FileStream("file.txt", FileMode.OpenOrCreate))
{
    using (StreamWriter writer = new StreamWriter(stream))
    {
        // Use the writer object...
    }
}

要解決此問題,請使用 try/finally 塊而不是外部 using 語句。 在 finally 塊中,確保流資源不為空。

Stream stream = null;
try
{
    stream = new FileStream("file.txt", FileMode.OpenOrCreate);
    using (StreamWriter writer = new StreamWriter(stream))
    {
        stream = null;
        // Use the writer object...
    }
}
finally
{
    if(stream != null)
        stream.Dispose();
}

在這種情況下,我個人會使用:

public StreamWriter(
    string path,
    bool append
)

使用默認編碼和緩沖區大小為指定文件初始化 StreamWriter 類的新實例。 如果文件存在,它可以被覆蓋或附加到。 如果文件不存在,則此構造函數創建一個新文件。

但是沒有好的解決辦法,看CA2202,這種情況怎么解決

暫無
暫無

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

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