8

我有这段代码,我担心在 using 语句结束之前使用 Dispose() 是“不安全的”,对我来说这有点不合逻辑,但它工作得很好。那么,它安全吗?

using (FileStream stream = new FileStream(SfilePath, FileMode.Open))
{
    try
    {
        XmlSerializer deserializer = new XmlSerializer(typeof(HighscoresViewModel));
        HVM = deserializer.Deserialize(stream) as HighscoresViewModel;
    }
    catch (InvalidOperationException) 
    {
        stream.Dispose();
        (new FileInfo(SfilePath)).Delete();
        HVM = new HighscoresViewModel();
    }
}
4

2 回答 2

14

状态的文档IDisposable.Dispose

如果多次调用对象的 Dispose 方法,则对象必须忽略第一次调用之后的所有调用。如果多次调用其 Dispose 方法,则该对象不得引发异常。当资源已被释放时,除 Dispose 之外的实例方法可能会引发 ObjectDisposedException。

假设IDisposable正确实施,这种使用是安全的。Dispose将被第二次调用,并且第二次不会做任何事情。

于 2013-08-11T18:42:44.413 回答
1

正如@hvd 所说,这种使用是安全的;但不建议这样做,因为如果您Fxcop在代码示例中实现 Microsoft,它将引发 Fxcop 警告/错误CA2202: Do not dispose objects multiple times

看这里

哪个说

方法实现包含可能导致对同一对象的 IDisposable.Dispose 或 Dispose 等效项(例如某些类型的 Close() 方法)的多次调用的代码路径。

于 2013-08-11T18:49:40.057 回答