1

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

4

5 回答 5

8

你应该使用using

using(var stream = new FileStream(@"C:\path\demo.xml", FileMode.Open))
{
    var x = Deserialize<Dog>(stream);
    // more code ...
}
于 2012-10-12T08:39:26.587 回答
3

是的,您应该处理流。例如,如果您要使用File.ReadAllText(),此静态方法将打开一个流并为您处理它。我建议使用 Using,这是因为它也会处理异常。例如在这个点头的例子中:

此版本正确处理 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();
于 2012-10-12T08:38:52.510 回答
2

如果使用using block,他执行到底治疗Dispose method

您使用 using, because FileStream is non managed object,soGarbage collector don't have informatiosn abouts this object来清理,因此开发人员必须清理资源以帮助您的 GC。

链接: http: //msdn.microsoft.com/fr-fr/library/yh598w02 (v=vs.80).aspx

于 2012-10-12T08:39:08.220 回答
2

您应该将Using与实现 IDisposable 的所有内容一起使用 :)

于 2012-10-12T08:41:27.010 回答
1

如前所述,您应该使用 using。但为什么?好吧,正如已经提到的,您应该对所有实现 IDisposable 的对象使用 using。

在您的情况下,FileStream 继承自实现 IDisposable 的 Stream 对象。在此处阅读有关 FileStream 的更多信息:msdn

于 2012-10-12T08:59:25.947 回答