C#在流中使用关键字

时间:2012-10-12 08:36:55

标签: c# stream

我是否应该使用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会自动处理/关闭流吗?)

5 个答案:

答案 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