如果在使用语句结束之前调用Dispose()会发生什么?

时间:2013-08-11 18:41:00

标签: c# using-statement

我有这个代码,我担心它“不安全” 我在使用语句结束之前使用了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();
    }
}

2 个答案:

答案 0 :(得分:14)

IDisposable.Dispose州的文档:

  

如果多次调用对象的Dispose方法,则该对象必须忽略第一个之后的所有调用。如果多次调用Dispose方法,则该对象不得抛出异常。除了Dispose之外的实例方法可以在已经处理资源时抛出ObjectDisposedException。

假设IDisposable已正确实施,此用法是安全的。 Dispose将被第二次召唤,第二次不会做任何事情。

答案 1 :(得分:1)

正如@hvd所说,这种使用是安全的;但不建议如果您在代码示例中实现Microsoft Fxcop,则会抛出Fxcop警告/错误CA2202: Do not dispose objects multiple times

See here

其中说

  

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