首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我无法将代码分析规则CA2202修复

我无法将代码分析规则CA2202修复
EN

Stack Overflow用户
提问于 2013-04-05 09:05:11
回答 2查看 674关注 0票数 4

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

我已经启用了代码分析,并且违反了CA2202规则。

(编辑:我在pdfStamper上添加了闭包,否则PDF将被破坏)

CA2202:不要多次释放对象 方法实现包含代码路径,这些路径可能导致对同一对象上的IDisposable.Dispose或Dispose等效的多次调用,例如对某些类型的Close()方法。

在CA2202 MSDN页面(这里)中,建议的修补程序不起作用。

如何才能重写代码而不必阻止这种违反呢?

代码语言:javascript
复制
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();
   }
}
EN

回答 2

Stack Overflow用户

发布于 2013-04-05 09:11:38

啊,大家最喜欢的警告!在这个实例中,MemoryStream.Dispose是幂等的(当前的实现什么也不做),所以它并不是真正的问题,但是“修复”如下:

代码语言:javascript
复制
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的情况下调用dispose,只有在PdfStamper的构造失败时才会发生。

票数 2
EN

Stack Overflow用户

发布于 2013-04-05 16:13:03

之所以会发生这种情况,是因为PdfStamper正在处理流,尽管它不应该这样做。它没有创建它,也没有拥有它,所以它没有处理它的必要。

您的代码确实创建了流并且它拥有它,所以它应该处理它是非常自然的。如果PdfStamper没有不适当地处理流,那么嵌套用法就会很好。

您的第一步可能是提交错误报告/特性请求,删除流的PdfStamper处理,或者至少使其成为可以避免的。一旦您这样做了,您就可以相当安全地抑制CA2202违规行为,因为MemoryStream的双重处理不会产生有害的后果。

顺便说一下,PdfStamper.Dispose()调用PdfStamper.Close() (至少在5.4.0版本中是这样),所以您应该能够删除PdfStamper.Close()调用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15829877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档