C# 在 Directory.Enumerate 或 XElement.Load 上关闭流

C# Close stream on Directory.Enumerate or XElement.Load

如果我在系统 类 中使用本质上使用流的静态方法,我该如何在 finally 块中关闭它们?我什至需要吗?

try{
    List<string> fileList = Directory.EnumerateFiles(folderPath, searchString)
                                .OrderByDescending(filename => filename)
                                .where(filename => filename.ToLower().EndsWith(".xml")
                                .ToList();
}
catch(Exception e){
    throw new Exception("Could not enumerate files.", e);
}
finally{
    //Close the stream?
}

try{
    XElement data = XElement.Load(pathToFile);
}
catch(Exception e){
    throw new Exception("Could not load xml file.", e);
}
finally{
    //Close the stream? The XmlReader?
}

这只是我 运行 举的几个例子,可能还有更多。

在标准库中,根据设计,所有获取 IDisposable 对象作为参数的东西都不会处置该对象。但是,由于您已经提到 static 不将任何 IDisposable 对象作为输入的方法和 returns 任意 "non-disposable" 对象,因此也在内部使用和处置那个电话。

XElement.Load(string) 示例:

// https://referencesource.microsoft.com/#System.Xml.Linq/System/Xml/Linq/XLinq.cs,4ee76e346bed5a3a
public static XElement Load(string uri, LoadOptions options) { 
    XmlReaderSettings rs = GetXmlReaderSettings(options);
    using (XmlReader r = XmlReader.Create(uri, rs)) {
        return Load(r, options);
    }
}

如您所见,它处理 XmlReader

但是如果你选择 XElement.Load(XmlReader, LoadOptions) :

public static XElement Load(XmlReader reader, LoadOptions options) {
    if (reader == null) throw new ArgumentNullException("reader");
    if (reader.MoveToContent() != XmlNodeType.Element) throw new InvalidOperationException(Res.GetString(Res.InvalidOperation_ExpectedNodeType, XmlNodeType.Element, reader.NodeType));
    XElement e = new XElement(reader, options);
    reader.MoveToContent();
    if (!reader.EOF) throw new InvalidOperationException(Res.GetString(Res.InvalidOperation_ExpectedEndOfFile));
    return e;
}

可以看到没有处理参数传过来的流