gpt4 book ai didi

C#:是否应该在调用的方法中关闭/处置 Streams?

转载 作者:太空宇宙 更新时间:2023-11-03 21:10:43 28 4
gpt4 key购买 nike

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

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 来说明是否要处理?

最佳答案

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

关于C#:是否应该在调用的方法中关闭/处置 Streams?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37941668/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com