我有这个代码,我担心它“不安全” 我在使用语句结束之前使用了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();
}
}
答案 0 :(得分:14)
IDisposable.Dispose
州的文档:
如果多次调用对象的Dispose方法,则该对象必须忽略第一个之后的所有调用。如果多次调用Dispose方法,则该对象不得抛出异常。除了Dispose之外的实例方法可以在已经处理资源时抛出ObjectDisposedException。
假设IDisposable
已正确实施,此用法是安全的。 Dispose
将被第二次召唤,第二次不会做任何事情。
答案 1 :(得分:1)
正如@hvd所说,这种使用是安全的;但不建议如果您在代码示例中实现Microsoft Fxcop
,则会抛出Fxcop警告/错误CA2202: Do not dispose objects multiple times
其中说
方法实现包含可能导致多个的代码路径 调用IDisposable.Dispose或Dispose等效项,例如 某些类型的Close()方法,在同一个对象上。