我有一个函数(见下面的代码片段)。
我启用了代码分析,但我收到了 CA2202 规则违规。
( 编辑 :我在 pdfStamper 上添加了关闭,否则 PDF 将被损坏)
在 CA2202 MSDN 页面 ( here ) 中,建议的修复不起作用。
如何在不必抑制这种违规的情况下重写代码?
private byte[] DoGenerateFinishedGamePdf(int gameSessionLogId)
{
var finishedGameCertificatePdfFile = httpServerUtilityWrapper.MapPath(ConfigurationManager.AppSettings["FinishedGameCertificateFile"]);
var pdfReader = new PdfReader(finishedGameCertificatePdfFile); // note that PdfReader is not IDisposeable
using (MemoryStream memoryStream = new MemoryStream())
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, memoryStream))
{
var fields = pdfStamper.AcroFields;
fields.SetField("CityName", "It works!");
pdfReader.Close();
pdfStamper.FormFlattening = true;
pdfStamper.FreeTextFlattening = true;
pdfStamper.Close();
return memoryStream.ToArray();
}
}
最佳答案
啊,大家最喜欢的警告!在这个实例中 MemoryStream.Dispose 是幂等的(当前的实现什么都不做)所以这不是一个真正的问题,但是“修复”如下:
MemoryStream memoryStream = null;
try
{
memoryStream = new MemoryStream();
using (PdfStamper pdfStamper = new PdfStamper(pdfReader, memoryStream))
{
memoryStream = null;
var fields = pdfStamper.AcroFields;
fields.SetField("CityName", "It works!");
pdfReader.Close();
pdfStamper.FormFlattening = true;
pdfStamper.FreeTextFlattening = true;
pdfStamper.Close();
return memoryStream.ToArray();
}
}
finally
{
if (memoryStream != null) memoryStream.Dispose();
}
由于 PdfStamper“拥有”MemoryStream,它会在调用 PdfStamper.Dispose 时处理它,所以如果我们不处理 PdfStamper,我们只需要在 MemoryStream 上调用 Dispose,这只有在 PdfStamper 的构建失败时才会发生.
关于c# - 我无法修复代码分析规则 CA2202,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15829877/