C#:在被调用的方法中,Streams 应该是 closed/disposed 吗?

C#: Should Streams be closed/disposed in called method?

我有一个用 C# 编写的方法,它接受一个包含 XML 文档的字符串,以及一个 XSD 的流数组。字符串文档根据 XSDs:

进行验证
private static XmlValidationResult ValidateDocumentInternal(string document, params Stream[] xsdStreams)
{
    XmlReaderSettings settings = new XmlReaderSettings
    {
        ValidationType = ValidationType.Schema
    };

    foreach (var xsdStream in xsdStreams)
    {
        using (xsdStream)
        {
            XmlReader xmlReader = XmlReader.Create(xsdStream);

            try
            {
                settings.Schemas.Add(null, xmlReader);
            }
            finally
            {
                xmlReader.Close();
            }
        }
    }

    var validationErrors = new List<string>();

    settings.ValidationEventHandler += (object sender, System.Xml.Schema.ValidationEventArgs e) =>
    {
        validationErrors.Add($"({e.Exception.LineNumber}): {e.Message}");
    };

    using (var stream = document.ToStream())
    {
        var reader = XmlReader.Create(stream, settings);

        while (reader.Read())
        {
        }
    }

    return new XmlValidationResult
    {
        Success = validationErrors.Count == 0,
        ValidationErrors = validationErrors
    };
}

我的问题是,此方法应该处理 XSD 流还是应该由调用者负责?想象下面的代码传入文档和 XSD 并期望 ValidateDocumentInternal 处理 XSD 流:

var document = GetDocument();
Stream xsd = GetXSD();
var validationResult = ValidateDocumentInternal(document, xsd);

或者应该像(不处理 ValidateDocumentInternal 中的流):

var document = GetDocument();
using (Stream xsd = GetXSD()) {
    var validationResult = = ValidateDocumentInternal(document, xsd);
}

或者我应该只传递一个 bool 说明是否处置?

我认为这是调用者的责任——它是其他人从函数中给出的参数。该函数不知道它是否在另一个上下文中使用,并且它所做的更改实际上是一个 "side effect"... 我个人强烈试图避免