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"... 我个人强烈试图避免
我有一个用 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"... 我个人强烈试图避免