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

时间:2017-07-26 08:27:48

标签: c# io filesystems

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

TextView txt1 = (TextView) findViewById(R.id.textview);
int[] color = {Color.DKGRAY,Color.CYAN};
float[] position = {0, 1};
TileMode tile_mode = TileMode.MIRROR; // or TileMode.REPEAT;
LinearGradient lin_grad = new LinearGradient(0, 0, 0, 50,color,position, tile_mode);
Shader shader_gradient = lin_grad;
txt1.getPaint().setShader(shader_gradient);

这只是我遇到的几个例子,可能还有更多。

1 个答案:

答案 0 :(得分:0)

在标准库中,按设计,将IDisposable对象作为参数的所有内容都不会处置该对象。但是,由于您已经提到static方法没有将任何IDisposable对象作为输入并返回任意“非一次性”对象,因此在该调用中也会使用和处理。 / p>

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;
}

您可以看到它没有处理参数传递的流。