我是否应该使用using
关键字或带有以下代码的dispose方法(因为我打开了一个流):
class Program
{
static void Main(string[] args)
{
var x = Deserialize<Dog>(new FileStream(@"C:\Documents and Settings\name\Desktop\demo.xml", FileMode.Open));
}
static T Deserialize<T>(Stream s)
{
XmlSerializer ser = new XmlSerializer(typeof(T));
return (T)ser.Deserialize(s);
}
}
如果没有,你能解释一下为什么不行(新的FileStream会自动处理/关闭流吗?)
答案 0 :(得分:7)
您应该使用using
:
using(var stream = new FileStream(@"C:\path\demo.xml", FileMode.Open))
{
var x = Deserialize<Dog>(stream);
// more code ...
}
答案 1 :(得分:3)
是的,你应该处理流。例如,如果您使用File.ReadAllText(),则此静态方法将打开一个流并为您配置它。我建议使用,这是因为它也会处理异常。例如,在这个例子中:
此版本正确处理FileStream:
using(FileStream fs = FileStream(path, FileMode.Open))
{
throw new Exception();
}
此示例泄漏了FileStream使用的资源,您可以添加try / catch块,但它的可读性较差。
FileStream fs = new FileStream(path, FileMode.Open);
throw new Exception();
fs.Dispose();
答案 2 :(得分:2)
如果您使用using block
,他会在治疗结束时执行Dispose method
。
您使用,因为FileStream is non managed object
,所以Garbage collector don't have informatiosn abouts this object
为了清理,所以开发人员必须清理ressource以帮助您的GC。
链接:http://msdn.microsoft.com/fr-fr/library/yh598w02(v=vs.80).aspx
答案 3 :(得分:2)
你应该使用使用来实现IDisposable:)
答案 4 :(得分:1)
如前所述,您应该使用。但为什么?好吧,正如已经提到的,你应该使用所有实现IDisposable的对象。
在您的情况下,FileStream继承自实现IDisposable的Stream对象。在此处阅读有关FileStream的更多信息:msdn