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" 对象,因此也在内部使用和处置那个电话。
// 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;
}
可以看到没有处理参数传过来的流
如果我在系统 类 中使用本质上使用流的静态方法,我该如何在 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" 对象,因此也在内部使用和处置那个电话。
// 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;
}
可以看到没有处理参数传过来的流