我有一个函数(见下面的代码片段)。

我启用了代码分析,但我收到了 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/

10-10 01:06